使用pre_get_post自定义Wordpress查询

问题描述:

我已经从其他帖子示例构建了以下代码片段,这些代码片段说,以任何其他方式进行查询修改都会受到惩罚,但它不起作用。我得到的结果,其中包括未公开的文章和网页这显然是不应该发生:使用pre_get_post自定义Wordpress查询

function post_conditions($where) 
{ 
    $where .= "AND post_content NOT LIKE '%::exclude tag::%'"; 
    return $where; 
} 
add_filter('posts_where','post_conditions'); 

    function mysearch($query) 
    { 
     $query->set('post_type','post'); 
     $query->set('post_status','publish'); 
     $query->set('posts_per_page',20); 
     $query->set('paged',get_query_var('paged')); 
    } 

    add_action('pre_get_posts','mysearch'); 

    while(have_posts()){ 
     the_post(); 

     echo get_the_excerpt(); 
     the_tags(); 

    } 
    if (get_query_var('paged')) 
     my_paged_function(); 

    wp_reset_query(); 

的GET变量看起来像这样:S = mysearchterm &提交= + GO%21 +

在我的博客模板上,我使用verbotten query_posts()函数来实现相同的效果,并且完美地工作。

我不知道发生了什么问题。有任何想法吗?

+0

此代码在哪里?它在你的函数文件中吗? (它应该是)?或者在某个模板中? (不应该,这太迟了) –

+0

它在模板中。所以它必须在函数的文件中?那么我怎么才能让它只用这种方式搜索一个模板与另一个呢? –

+0

是的,模板加载的方式太晚而无法使此代码生效。您区分的方式(希望)基于*正在查询的内容*,因此我们可以检查其他值,而不是正在加载的* template *:http://wordpress.stackexchange.com/a/102885/11704 –

由于此代码位于您的模板中,因此无法及时触发pre_get_posts钩子。当模板被选择/运行时,wp_query完成设置,并且pre_get_posts结束。

您需要将此功能移动到您的functions.php文件中,并尝试使用一些其他方法来确定是否要更改查询。有很多信息可供您使用 - 包括档案,单个页面,单个帖子,帖子ID等 - 希望通过这些信息,您可以确定是否要修改查询。