¿Puedo excluir una publicación por clave de metadatos usando la función pre_get_posts?

21

Veo que muchas personas prefieren usar pre_get_posts hook en lugar de query_posts . El siguiente código funciona y muestra todas las publicaciones que tienen "clave destacada"

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

Pero quiero que las publicaciones que tienen la meta_key ' featured ' se excluyan de la consulta principal. ¿Hay una manera fácil para esto?

    
pregunta Carlisle 10.11.2012 - 00:55

3 respuestas

30
  

Veo que muchas personas prefieren utilizar el enganche pre_get_posts en lugar de los query_posts

Yay!

Por lo tanto, pre_get_posts filtra un WP_Query object que significa cualquier cosa que puedas hacer a través de query_posts() puedes hacerlo a través de $query->set() y $query->get() . En particular, podemos hacer uso del atributo meta_query (consulte Codex ):

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

Pero ... esto reemplaza la 'meta consulta' original (si tuviera una). Entonces, a menos que desee reemplazar completamente la meta consulta original, sugiero:

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

De esta manera agregamos nuestra meta consulta junto con las meta consultas existentes.

Es posible que no quieras establecer la propiedad relation de $meta_query a AND o OR (para devolver publicaciones que satisfagan todas, o al menos una, meta consultas).

* Nota: Este tipo de consulta devolverá las publicaciones con la meta clave 'destacada', pero cuyo valor no es yes . No incluirá publicaciones donde no exista la clave de metadatos 'destacados'. Podrás hacer esto en 3.5 .

    
respondido por el Stephen Harris 10.11.2012 - 11:32
2

Quiero publicar mi solución temporal para publicaciones destacadas en caso de que algunas personas puedan hacer uso de ella. No uso pre_get_posts gancho aquí pero tampoco query_posts . El problema es que tengo que jugar con la consulta principal y tengo que ejecutar una consulta sql. Me alegraría si algún experto pudiera verificar el código y avisarme si está bien y no causará problemas de rendimiento. También será genial si alguien tiene un mejor enfoque y lo comparte con nosotros.

Crear consulta de publicaciones destacadas

<?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(); 

?>

Cree la consulta principal, excluya las publicaciones que tienen la meta_key presentada, limite la exclusión a las 5 publicaciones más recientes y muestre todas las demás.

<?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;

?>
    
respondido por el Carlisle 10.11.2012 - 17:27
0

En la respuesta @Carlisle, si desea excluir la mayoría de las 5 publicaciones recientes marcadas como destacadas, puede hacer lo siguiente. Cambie posts_per_page a cuántos desea excluir, y meta_query a cómo designa la categoría destacada.

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' );
    
respondido por el cpeckens 29.04.2015 - 20:21

Lea otras preguntas en las etiquetas