Como esconder mensagens em todos os loops com base no valor de um campo personalizado?

Estou tentando esconder dinamicamente posts em todo o meu site se o valor de um campo personalizado chamado distribution for “1”.

Eu configurei uma checkbox de meta na canvas do editor de postagem para definir o valor do campo, mas, especialmente em posts mais antigos, o campo nem sempre será definido.

Observe que estou fazendo isso em um plugin , então a maneira fácil de editar os loops e WP_queries no tema não é uma opção para mim.

Parece pre_get_posts ou posts_where fazer o que eu quero.

 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' ); 

O código acima me dá um erro: erro do WordPress database error: [Unknown column 'wp_postmeta.distribution' in 'where clause'] .

Oque esta acontecendo aqui?

Solutions Collecting From Web of "Como esconder mensagens em todos os loops com base no valor de um campo personalizado?"

Isso deve ser feito, usando 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' ); 

Uma coisa com a qual eu não tinha certeza era o seu uso de is_single() . Você ainda quer permitir que as pessoas vejam a postagem única? Em caso afirmativo, você ainda deseja ocultá-lo de qualquer outro loop possível, como widgets?

Se você está bem mostrando as postagens em todos os lugares ao visualizar uma única publicação, então você pode remover a parte $query->is_main_query() && . Eu adicionei isso para garantir que o post principal apareceu em visualizações de uma única postagem, mas ainda as mantivera escondidas das publicações secundárias.