让我们尝试以下操作:
默认情况下,无论comment_status
, 因此,让我们正常运行主查询,即查询所有帖子,而不考虑comment_status
.
我们还将运行一个小型但非常精简的二次查询,从中我们将获得所有具有
acomment_status
的已关闭
元数据为not的yes
然后,返回的ID将作为post__not_in
到主查询以排除这些帖子
我认为这是一种更好的方法,因为处理涉及元查询的SQL可能会变得非常混乱,特别是当您开始添加复杂的嵌套元查询时。允许WP_Query
处理meta_query
为我们分道扬镳。
我们仍将使用comment_status
链接问题中@TheDeadMedic自定义筛选器支持的参数
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 );
}
});
编辑上述代码现已测试完毕,并按预期工作
根据评论编辑@birgire提交了一份新的trac票据(trac ticket #35601)询问原因comment_status
在中不可用WP_Query
默认情况下。让我们希望在不久的将来,我们将看到这一点纳入核心。一旦发生这种情况,就不再需要自定义筛选器