Implement advanced search

时间:2016-10-26 作者:hguser

我在构建自定义wordpress主题时遇到了几个问题:

1避免在searchform.php.

典型的模板可能如下所示:

<form class="search" method="get" action="<?php echo get_search_link(); ?>" role="search">
    <input class="search-input" type="search" name="s">
    <button class="search-submit" type="submit" role="button">Search</button>
</form>
但是,请注意action="<?php echo get_search_link(); ?> 该操作是硬编码的,它假定搜索路径为http://homeurl/?s=xxx, 如果插件将搜索路径更改为http://homeurl/search?s=xxx?

2更改搜索url

我不喜欢默认设置/?s=xxx 搜索路径,我喜欢/search?s=xxx

3具有更多查询变量的高级搜索

我想用关键字+类别+标记+元值进行搜索,如下所示:

enter image description here

我必须在面板中的每个链接中设置搜索url,并在它成为当前查询变量后将其高亮显示。

这可能吗,?

(更新后的问题已在新帖子中发布here)

根据cybmeta的回答,我做了以下更改:

add_action(\'pre_get_posts\', \'include_any_post_type_in_search\');
function include_any_post_type_in_search($query)
{

    if (!is_admin() && $query->is_search && $query->is_main_query()) {

        $tax_query = array(
            \'relation\' => \'AND\'
        );

        if (isset($_REQUEST[\'c\'])) {
            $cate = $_REQUEST[\'c\'];
            array_push($tax_query, array(
                \'taxonomy\' => \'category\',
                \'terms\' => sanitize_text_field($cate)
            ));
        }


        if (isset($_REQUEST[\'t\'])) {
            $tag = $_REQUEST[\'t\'];
            array_push($tax_query, array(
                \'taxonomy\' => \'post_tag\',
                \'terms\' => sanitize_text_field($tag)
            ));
        }
        $query->set(\'tax_query\', $tax_query);

    }
}

add_filter(\'query_vars\', \'cyb_query_vars\');
function cyb_query_vars($vars)
{
    array_push($vars, "t", "c");
    return $vars;
}

function my_get_search_url($key, $val)
{
    $query = array();

    $supported = array("c", "t", "k");
    foreach ($supported as $s) {
        if ($s == $key) {
            array_push($query, "$s=$val");
        } else {
            $old_val = get_query_var($s);
            if (isset($old_val) && !empty($old_val)) {
                array_push($query, "$s=$old_val");
            }

        }
    }
    return get_search_link(join("&", $query));
}
然后像这样使用:

                <?php
                $cates = get_categories();
                foreach ($cates as $cate) { ?>
                    <li>
                        <a href="<?php echo my_get_search_url(\'c\', $cate->term_id); ?>"><?php echo $cate->name; ?></a>
                    </li>
                <?php } ?>
它生成url,如:/search/c%3D9:

1本c=9 已编码

2它呈现索引页而不是搜索结果页。

一旦我访问/?c=9&s=1 我可以使用关键字获得结果1 和第9类。

已获取的索引页/?c=9.

获得404/search?c=9

似乎有重写问题。

1 个回复
最合适的回答,由SO网友:cybmeta 整理而成

如果您使用get_search_link() 还有某人filter the search URL 改变它,get_search_link() 将返回过滤后的URL;这就是非硬编码URL的优点。您或第三方插件可以修改URL,它将始终返回正确的值。因此,问题1和2似乎不存在。

问题3有不同的方法:

1.-将搜索表单中的输入与name 等于直接接受的某个查询参数WP_Query 作为查询字符串。例如category_name:

<form class="search" method="get" action="<?php echo get_search_link(); ?>" role="search">
    <input class="search-input" type="search" name="s">
   <select name="category_name">
        <option value="">All categories</option>
        <option value="politics">Politics</option>
        <option value="economy">Economy</option>
    </select>
    <button class="search-submit" type="submit" role="button">Search</button>
</form>
2使用所需的任何查询字符串并挂钩WP_Query 在中搜索请求时pre_get_posts 措施:

HTML:

<form class="search" method="get" action="<?php echo get_search_link(); ?>" role="search">
    <input class="search-input" type="search" name="s">
   <select name="a_search_filter">
        <option value="">All categories</option>
        <option value="politics">Politics</option>
        <option value="economy">Economy</option>
    </select>
    <button class="search-submit" type="submit" role="button">Search</button>
</form>
以及行动:

add_action( \'pre_get_posts\', \'cyb_advanced_search\' );
function cyb_advanced_search( $query ) {

    if ( ! is_admin() && $query->is_search && $query->is_main_query() ) {

        // Set query parameters you need
        // For example
        $search_filter = $_REQUEST[ \'a_search_filter\' ];
        $tax_query = [
            \'taxonomy\' => \'news\',
            \'field\'    => \'slug\',
            \'terms\'    =>  sanitize_text_field( $search_filter ),
        ];
        $query->set( \'tax_query\', $tax_query );

    }
}
我会将查询字符串添加到WP重写系统:

add_filter( \'query_vars\', \'cyb_query_vars\' );
function cyb_query_vars( $vars ) {
  $vars[] = \'a_search_filter\';
  return $vars;
}
现在您使用get_query_var() 要获取自定义查询变量的值,请执行以下操作:

add_action( \'pre_get_posts\', \'cyb_advanced_search\' );
function cyb_advanced_search( $query ) {

    if ( ! is_admin() && $query->is_search && $query->is_main_query() ) {

        // Set query parameters you need
        // For example
        $search_filter = get_query_var( \'a_search_filter\' );
        $tax_query = [
            \'taxonomy\' => \'news\',
            \'field\'    => \'slug\',
            \'terms\'    =>  sanitize_text_field( $search_filter ),
        ];
        $query->set( \'tax_query\', $tax_query );

    }
}
最后,您可以获取当前请求,并将类添加/删除到链接中,并根据需要使用CSS对其进行高级化:

if( get_query_var(  \'a_search_filter\' ) ==  \'category1\' ) {
    $class = \'selected\';
}

<a href="..." class=".<?php esc_attr_e( $class ); ?>.">Category 1</a>

相关推荐

nothing happen in search form

我想创建搜索表单,但当我搜索时什么都没有发生,这是代码:索引。php: <div class=\"tech-btm\"> <?php get_search_form();?> </div> 搜索表单:<form role=\"search\" method=\"get\" id=\"searchform\" action=\"<?php echo home_url(\'/\')?>\"> &