Posso excluir uma postagem por meta-chave usando a função pre_get_posts?

21

Eu vejo muitas pessoas preferem usar pre_get_posts hook em vez de query_posts . O código abaixo funciona e mostra todas as postagens que têm meta-chave "em destaque"

function show_featured_posts ( $query ) {
    if ( $query->is_main_query() ) {
       $query->set( 'meta_key', 'featured' );
       $query->set( 'meta_value', 'yes' );
    }
}

add_action( 'pre_get_posts', 'show_featured_posts' );

Mas quero que as postagens com meta_key ' featured ' sejam excluídas da consulta principal. Existe uma maneira fácil para isso?

    
por Carlisle 10.11.2012 / 00:55
fonte

3 respostas

30
  

Vejo que muitas pessoas preferem usar o gancho pre_get_posts em vez de query_posts

Yay!

Portanto, pre_get_posts filtra um WP_Query object que significa qualquer coisa que você possa fazer via query_posts() você pode fazer via $query->set() e $query->get() . Em particular, podemos fazer uso do atributo meta_query (consulte Codex ):

$meta_query = array(
                 array(
                    'key'=>'featured',
                    'value'=>'yes',
                    'compare'=>'!=',
                 ),
);
$query->set('meta_query',$meta_query);

Mas ... isso substitui a "consulta meta" original (se tiver uma). Então, a menos que você queira substituir completamente a meta consulta original, sugiro:

//Get original meta query
$meta_query = $query->get('meta_query');

//Add our meta query to the original meta queries
$meta_query[] = array(
                    'key'=>'featured',
                    'value'=>'yes',
                    'compare'=>'!=',
                );
$query->set('meta_query',$meta_query);

Dessa forma, adicionamos nossa meta-consulta ao lado das meta-consultas existentes.

Você pode / não deseja definir a propriedade relation de $meta_query a AND ou OR (para retornar postagens que satisfazem todas ou pelo menos uma meta-consulta).

* Observação: Esse tipo de consulta retornará postagens com a meta-chave 'em destaque', mas cujo valor não é yes . Não incluirá posts em que a meta-chave "em destaque" não exista. Você poderá fazer isso em 3.5 .

    
por Stephen Harris 10.11.2012 / 11:32
fonte
2

Quero postar minha solução temporária para postagens em destaque caso algumas pessoas possam fazer uso dela. Eu não uso pre_get_posts hook aqui, mas não query_posts . O problema é que eu tenho que jogar com a consulta principal e ter que executar uma consulta SQL. Eu ficaria feliz se qualquer especialista pudesse verificar o código e me informar se está tudo bem e se não causará problemas de desempenho. Também será ótimo se alguém tiver uma abordagem melhor e compartilhá-la conosco.

Crie uma consulta de posts em destaque

<?php 

$featured_query = new WP_query( array(
    'meta_key'       =>'featured', 
    'meta_value'     =>'yes', 
    'posts_per_page' => 5, 
    'no_found_rows'  => true
    )
);

while ($featured_query->have_posts()) : 

    $featured_query->the_post(); 
    //Stuff...

endwhile; 
wp_reset_postdata(); 

?>

Crie a consulta principal, exclua as postagens que têm a meta_key em destaque, limite a exclusão a 5 postagens mais recentes e mostre todas as outras.

<?php 

$excludeposts = $wpdb->get_col( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = 'featured' AND meta_value != '' ORDER BY post_id DESC LIMIT 0, 5" );

$main_query = new WP_Query( array(
    'post__not_in' => $excludeposts, 
    'paged' => $paged 
    ) 
);  

while ($main_query->have_posts()) : 

    $main_query->the_post();
    //Stuff...

endwhile;

?>
    
por Carlisle 10.11.2012 / 17:27
fonte
0

Em resposta, @Carlisle, se você quiser excluir mais 5 postagens recentes marcadas como destaque, você pode fazer o seguinte. Altere posts_per_page para quantos você deseja excluir e meta_query para como você está designando a categoria em destaque.

function cmp_exclude_featured_posts($query) {
    $exclude = array();  //Create empty array for post ids to exclude
    if ( $query->is_main_query() ) {
            $featured = get_posts(array(
                'post_type' => 'post',
                'meta_query' => array(
                    array(
                        'key' => 'featured',
                        'value' => '1',
                        'compare' => '==',
                    ),
                ),
                'posts_per_page' => 2
            ));

            foreach($featured as $hide) {
                $exclude[] = $hide->ID;
            }   

            $query->set('post__not_in', $exclude);
        }
}

add_filter( 'pre_get_posts', 'cmp_exclude_featured_posts' );
    
por cpeckens 29.04.2015 / 20:21
fonte