如何根据自定义字段的值隐藏所有循环中的帖子?

时间:2017-08-02 作者:parasomnist

如果自定义字段的值distribution 为“1”。

我已经在帖子编辑器屏幕上设置了一个元框来设置字段的值,但是,尤其是在旧帖子上,不会总是设置字段。

请注意,我是在plugin, 因此,在主题中直接编辑循环和WP\\u查询的简单方法不是我的选择。

看起来像是pre_get_postsposts_where 我想做什么就做什么。

function hide_custom_filter( $where = \'\') {
  global $wpdb;
  if (!is_single() && !is_admin()) {
    $where .= " AND (($wpdb->postmeta.distribution = \'1\')) ";
  }
  return $where;
}
add_filter( \'posts_where\', \'hide_custom_filter\' );
上面的代码给了我一个错误:WordPress database error: [Unknown column \'wp_postmeta.distribution\' in \'where clause\'].

这是怎么回事?

1 个回复
SO网友:Jacob Peattie

这应该可以做到,使用pre_get_posts:

function wpse_275546_hide_distribution_post( $query ) {
    /* Don\'t filter posts in admin, or the current post when viewing a single post. */
    if ( ! is_admin() && ! ( $query->is_main_query() && is_single() ) ) {
        /**
         * Get current meta query if it exists, otherwise an empty array. 
         * This is to modifiy, so that we don\'t override any existing meta queries.
         */
        $meta_query = $query->get( \'meta_query\' ) ?: array();

        /* Add meta query to find posts that do not have distribitions set to 1. */
        $meta_query[] = array(
            \'key\'     => \'distribution\',
            \'value\'   => \'1\',
            \'compare\' => \'!=\',
        );

        /* Apply meta query. */
        $query->set( \'meta_query\', $meta_query );
    }
}
add_action( \'pre_get_posts\', \'wpse_275546_hide_distribution_post\' );
有一件事我不确定,那就是你is_single(). 是否仍要允许用户查看单个帖子?如果是这样的话,您是否仍然想对任何其他可能的循环(如小部件)隐藏它?

如果您可以在查看单个帖子时到处显示帖子,则可以删除$query->is_main_query() && 部分我补充道,为了确保主帖子出现在单帖子视图上,但仍然对次要帖子隐藏它们。

结束

相关推荐

Theme styling for plugins

我有一个插件,它有自己的CSS,用于在使用相关短代码时生成的内容。我正在尝试创建一个主题来重新设置我网站前端的样式,但由于这个插件有自己的CSS,我如何在新主题中修改它?