为什么Pre_Get_Posts挂钩会导致Apache停止工作?

时间:2015-06-04 作者:Mayeenul Islam

我的所有帖子都有一个名为\'validity\' 我在那里指定日期,直到帖子生效。我的分类法档案显示了所有的帖子。现在我想在那里过滤,并排除无效的帖子。

我写道:

function e_exclude_posts( $query ) {
   if( $query->is_tax(\'my_tax\') ) {
       $query->set( \'post__not_in\', array( 530 ) );
   }
}
add_action( \'pre_get_posts\', \'e_exclude_posts\' );
不包括我的帖子#530。

现在我想让查询更具动态性,因此我创建了另一个函数:

function g_get_all_the_expired_posts(){
    $this_time = date( \'Y-m-d H:i:s\', current_time( \'timestamp\' ) ); //Time now
    $args = array(
            \'post_type\'     => \'posts\',
            \'post_status\'   => \'publish\',
            \'meta_key\'      => \'validity\',
            \'meta_value\'    => $this_time,
            \'meta_compare\'  => \'<=\'
        );
    $expired_posts_array = get_posts( $args );

    $expired_posts = array();
    foreach ( $expired_posts_array as $expired_post ) {
        $expired_posts[] .= $expired_post->ID;
    }

    return $expired_posts;
}
并对我以前的函数进行了一些更改,从:

$query->set( \'post__not_in\', array( 530 ) );
收件人:

$expired = g_get_all_the_expired_posts();
$query->set( \'post__not_in\', $expired );
但只有$expired = g_get_all_the_expired_posts(); 这条线足以使它成为一个无限循环,并关闭了apache。

然后,我通过声明一个全局变量解决了这个问题:

$EXPIRED_POSTS = g_get_all_the_expired_posts(); //set it a global variable

function e_exclude_posts( $query ) {
   ...
   global $EXPIRED_POSTS;
   $query->set( \'post__not_in\', $EXPIRED_POSTS );
   ...
}
add_action( \'pre_get_posts\', \'e_exclude_posts\' );
但我不明白为什么第一种方法会导致这样一个无限循环,或者导致apache过载,或者出现错误?

Apache HTTP服务器已停止工作

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

根据this WPSE thread 实际上,您给apache带来了过载。这就是为什么它会做出这样的反应。:)

因此,让我们减少过载,使用is_main_query() 正确地,只需向pre_get_posts 挂钩功能:

function e_exclude_posts( $query ) {
   if( !is_admin() && $query->is_main_query() && $query->is_tax(\'my_tax\') ) {
       $expired = g_get_all_the_expired_posts(); //now this won\'t create a problem
       $query->set( \'post__not_in\', $expired );
   }
}
add_action( \'pre_get_posts\', \'e_exclude_posts\' );
为什么法典说:

此函数最常用于钩子中,用于区分WordPress的主查询(页面、帖子或归档)和自定义/辅助查询。

因此,通过附加这个条件,我们实际上是在说WordPress只支持主查询,而不是对所有查询都执行操作-因此,我们减少了过载,让apache松了口气

按照Pieter Goosen的建议进行编辑!is_admin() 为了只在前端修改查询,我编辑了答案并添加了条件。谢谢Pieter。

编辑#2

并添加一个全局变量是一个坏主意,因为即使不需要该全局变量的内容,全局变量也会在每次加载时加载内容——这肯定是一种过分的做法。因此,最好的方法是调用函数中的函数,如下面的答案所示。幸亏@userabuser 还有@PieterGoosen,感谢他们的专家建议。

结束

相关推荐

如何使用WP Query显示类别中的帖子数量

只是一个快速的,但我一直在做这个。我正在运行一个类别的WP\\u查询,想知道如何使用WP Query显示类别中的帖子数!这是我的WP\\u查询的开始,但我如何简单地呼出这个类别中的帖子数量?!这让我快发疯了!<?php $args = array( \'cat\' => 33, \'posts_per_page\' => 500, ); $the_query = new WP_Query( $args );&#x