我的所有帖子都有一个名为\'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服务器已停止工作
最合适的回答,由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,感谢他们的专家建议。