问题描述

我想排除首页关闭的帖子以征求意见。这是因为这样: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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。