在首页和所有插件中隐藏帖子

时间:2019-03-07 作者:distinctly

我使用以下代码在首页上按帖子ID隐藏某些帖子(根据https://michaelkummer.com/technology/howto-hide-posts-pages-in-wordpress/ 在WordPress Codex上https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts)

function exclude_single_posts_home($query) {
     if ($query->is_home() && $query->is_main_query()) {
          $query->set(\'post__not_in\', array(69489, 69177,68878,68736));
      }
}
这段代码运行得很好,但不幸的是,我在主页上使用了一些其他插件(一个最流行的贴子小部件以及flexslider功能贴子),我隐藏的任何贴子仍然会显示在这些插件中。

有没有一种方法可以隐藏首页上的帖子,也可以防止它显示在同一页的插件上?

我正在使用Wordpress 5.0.3和主题Hueman。

希望这个问题有意义!非常感谢您的帮助

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

如果要在首页上的所有查询中隐藏某些帖子,请删除正在使用的条件并进行检查is_front_page() 而是:

function exclude_single_posts_home($query) {
     if (is_front_page()) {
          $query->set(\'post__not_in\', array(69489,69177,68878,68736));
      }
}
通常情况下,检查全局状态是过滤查询的不正确方式(您最初所做的是正常的正确方式),但在您的情况下,您实际上希望根据全局状态过滤所有查询,因此这是适当的。

要知道post__not_in 性能很差,尤其是当您同时将其应用于多个查询时。您可能需要考虑另一种方法,例如使用自定义字段或自定义分类法,您可以将其应用于要隐藏的帖子。基于这些的查询将更加高效。

添加了hide 字段到帖子使用高级自定义字段,可以通过设置元查询筛选出这些帖子:

function exclude_single_posts_home($query) {
    if (is_front_page()) {
        $original_meta_query = $query->get( \'meta_query\' );

        $new_meta_query = [
            \'relation\' => \'OR\',
            [
                \'key\'     => \'hide\',
                \'compare\' => \'NOT EXISTS\',
            ],
            [
                \'key\'     => \'hide\',
                \'value\'   => \'1\',
                \'compare\' => \'!=\'
            ],
        ];

        if ( $original_meta_query ) {
            $meta_query = [
                \'relation\' => \'AND\',
                $original_meta_query,
                $new_meta_query
            ];
        } else {
            $meta_query = $new_meta_query;
        }

        $query->set(\'meta_query\', $meta_query );
    }
}
这方面的代码要复杂得多,原因如下:

由于您只是第一次添加该字段,因此会有一些帖子没有正值或负值hide, 因此,我们需要将没有此字段的帖子视为不隐藏。这就是NOT EXISTS 查询用于。考虑到这种复杂性,我实际上不确定性能是否会有所改善。您可能希望安装查询监视器插件并比较每个插件的性能post__not_in, 所以没有费心处理冲突的可能性。然而,更有可能的是,一些现有查询已经具有meta_query 设置,因此此代码包含逻辑,该逻辑添加新的元查询,用于将帖子隐藏到其存在的任何现有查询中,而不是替换它们

相关推荐

Query posts by Post title

我使用下面的ACF查询生成一个列表,效果很好。然而,现在我想按标准WP“post title”而不是ACF自定义字段“datum”对列表进行排序我该怎么做?// args $args = array( \'posts_per_page\' => 999, \'post_type\' => \'lezing\', \'orderby\' => \'meta_value\', \'order\' => \'ASC\',