仅显示可以评论或具有自定义元字段的帖子

时间:2016-01-25 作者:benutzerfreund

我想排除主页上关闭供评论的帖子。这是因为:Show only posts which can be commented

现在,我想添加例外情况的可能性,以显示某些评论已关闭的帖子。它们用自定义字段“show\\u 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\' ); 
但它只会显示带有meta的帖子,而不会显示打开的帖子。

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

让我们尝试以下操作:

默认情况下,无论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 默认情况下。让我们希望在不久的将来,我们将看到这一点纳入核心。一旦发生这种情况,就不再需要自定义筛选器