问题描述
我想排除首页关闭的帖子以征求意见。这是因为这样:Show only posts which can be commented
现在,我想添加例外的可能性 – 显示某些留言的帖子。它们标有自定义字段”show_always” 。
我试过了:
function wpjj_filter_sticky( $query ) {
$meta_query = array(
'relation' => 'OR',
array(
'key' => 'show_aways',
'value' => 'yes',
'compare' => 'EXISTS'
),
array (
'comment_status' => 'open'
)
);
$query->set( 'meta_query', $meta_query );
}
add_filter( 'pre_get_posts', 'wpjj_filter_sticky' );
但它只会显示与元的帖子,而不是公开的帖子。
最佳解决方案
让我们尝试以下:
默认情况下,不管 comment_status
如何,都会返回所有帖子,所以可以正常运行主查询,即查询所有帖子,不管 comment_status
如何。
我们还将运行一个小而又非常精细的二级查询,我们将收到所有的帖子
-
封闭的
comment_status
-
它们的值不是
yes
返回的 ID 将被作为 post__not_in
传递给主查询以排除这些帖子
我认为这是一个更好的方法,因为处理自己涉及元查询的 SQL 可能会变得非常麻烦,特别是当您开始添加复杂的嵌套元查询时。让 WP_Query
为我们处理 meta_query
部件。
我们仍将使用您的链接问题中的 @TheDeadMedic 自定义过滤器支持的 comment_status
参数
add_action( 'pre_get_posts', function ( $q )
{
if ( $q->is_home()
&& $q->is_main_query()
) {
// Run our secondary query to get the posts to exclude
$args = [
'posts_per_page' => -1,
'comment_status' => 'closed',
'meta_query' => [
'relation' => 'OR',
[ // Compensate for posts which have the custom field set but not set to yes
'key' => 'show_always',
'value' => 'yes',
'compare' => 'NOT IN' // Get posts which value is not yes
],
[ // Compensate for posts which does not have the custom fields
'key' => 'show_always',
'compare' => 'NOT EXISTS' // Get posts which value is not yes
]
],
'fields' => 'ids', // Return only post ID's
'suppress_filters' => false, // Allow the comment_status filter
// Any other parameters
];
$exclude_ids = get_posts( $args );
// Now we can exclude the ID's we just queried
$q->set( 'post__not_in', $exclude_ids );
}
});
EDIT
以上代码现在已经按预期进行了测试和工作
编辑来自评论
@birgire 已经提交了一张新的 trac 票证 (trac ticket #35601) 来询问为什么 comment_status
默认不能用于 WP_Query
。希望我们能够在不久的将来将其纳入核心。一旦发生这种情况,就不再需要自定义过滤器了
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。