仅针对搜索结果页面过滤查询

时间:2017-06-28 作者:Jordan Carter

我正在尝试自定义通用搜索的搜索结果,但是only 如果它使用search.php 样板我的网站上还有其他搜索,我不希望这个过滤器干扰它们。除了is_page_template(\'search.php\').

一旦我输入了那行代码作为条件,它就会恢复到正常的搜索过滤,因为我的IF条件失败了。如果我们在search.php

    //Filter the search for only posts and parts
    function SearchFilter($query)
    {
        if ($query->is_search && is_page_template(\'search\')) {
            $query->set(\'post_type\', array(\'post\', \'parts\'));
            $query->set(\'meta_key\', \'Manufacturer\');
            $query->set(\'orderby\', \'meta_value\');
            $query->set(\'order\', \'ASC\');
        }
        return $query;
    }

    add_filter(\'pre_get_posts\', \'SearchFilter\');

2 个回复
SO网友:Tom J Nowell

让我们一步一步地将其分解:

if ($query->is_search && is_page_template(\'search\')) {

这里有三个问题

is_page_template

search.php 不是页面模板,这不是加载搜索模板的方式。所以这行不通。

但如果它真的起作用了,就会有一个新问题。功能,如is_page_template etc依赖于主查询,但我们处于pre_get_posts 筛选时,您不知道该查询是否已设置,或者是否正在筛选该查询或其他查询。

因此,我们需要:

移除is_page_template 检查,它不会做你认为它做的事添加一个$query->is_main_query() 选中此复选框,使筛选器不会干扰小部件和其他查询方法与成员变量

if ($query->is_search

这不起作用,应该为您生成PHP警告。问题是is_search 函数/方法不是变量,它应该是:

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

但是search.php?

WordPress根据主查询决定加载哪个模板。如果它是主查询,并且is_search 那是真的search.php 将加载。

因此,WordPress还没有决定在进行筛选时使用哪个模板。事实上,您可以通过修改查询变量来更改WordPress加载的模板。例如,如果您取消设置所有变量,并告诉它加载一篇文章,您将不会得到search.php, 或者一个档案single.php 相反

页面模板中的搜索查询如何

is_main_query 将为false,因此不是问题

SO网友:Johansson

有一种解决方法可能需要额外的查询。然而,@Milo曾经提到,WordPress在缓存查询方面非常聪明,所以这对你来说应该没什么大不了的。

您可以在pre_get_posts 然后做一些检查。如果情况符合您的要求,则过滤查询:

//Filter the search for only posts and parts
function SearchFilter($query)
{
    remove_action(\'pre_get_posts\', \'SearchFilter\');
    // Run the query to fetch the results
    $posts = get_posts( $query->query );
    if(!empty($posts)) {
        // Check the template for the first post 
        if( get_page_template_slug( $posts[0]->ID ) == \'YOUR SLUG HERE\' ){
            $search_template = true; 
        } else {
            $search_template = false; 
        }
    }
    // Now filter the posts
    if ($query->is_main_query() & $query->is_search && $search_template) {
        $query->set(\'post_type\', array(\'post\', \'parts\'));
        $query->set(\'meta_key\', \'Manufacturer\');
        $query->set(\'orderby\', \'meta_value\');
        $query->set(\'order\', \'ASC\');
    }
    return $query;
}

add_action(\'pre_get_posts\', \'SearchFilter\');

结束

相关推荐

JQuery对其他脚本不可用

我收到控制台错误“jQuery不是函数”,即使:a) 它正在正确排队并在标头中调用b) 它作为排队脚本的依赖项列出。我已经恢复到WordPress的旧版本(现在回到4.8),我已经禁用和启用了插件,但这些都不起作用。我不明白jQuery是如何在页面上正确调用的,但其他脚本无法将其用作函数?网站是http://www.obair.stevenkellow.com/ 供参考