Escludere l'ID post da wp_query


28

Come posso escludere un post specifico da una query WP_Query? (Ad esempio, mostra tutti i post a parte un post con ID 278)

Ho provato l'argomento post__not_in ma rimuove solo tutti i post ..

Qualsiasi aiuto sarebbe grande.

Ecco la mia domanda attuale

<?php
    $temp = $wp_query;
    $wp_query= null;
    $wp_query = new WP_Query(array(
        'post_type' => 'case-study',
        'paged' => $paged,
    ));
    while ($wp_query->have_posts()) : $wp_query->the_post();
?>

Grazie

Risposte:


13

Suppongo che questo fosse pesante, ma per rispondere alla tua domanda originale, ho raccolto tutti gli ID dei post in un array nel primo loop ed ho escluso quei post dal secondo loop usando 'post__not_in' che prevede un array di ID post

<?php
$args1 = array('category_name' => 'test-cat-1', 'order' => 'ASC');
$q1 = new WP_query($args);
if($q1->have_posts()) :
$firstPosts = array();
    while($q1->have_posts()) : $q1->the_post();
        $firstPosts[] = $post->ID; // add post id to array
        echo '<div class="item">';
        echo "<h2>" . get_the_title() . "</h2>";
        echo "</div>";
    endwhile;
endif;
/****************************************************************************/
// array of post id's collected in first loop, can now be used as value for the 'post__not_in' parameter in second loops query $args
$args2 = array('post__not_in' => $firstPosts, 'order' => 'ASC' );
$q2 = new WP_query($args2);
if($q2->have_posts()) :
    while($q2->have_posts()) : $q2->the_post();
        echo '<div class="item">';
        echo "<h2>" . get_the_title() . "</h2>";
        echo "</div>";
    endwhile;
endif;
?>

Il primo ciclo visualizza tutti i post in una categoria e raccoglie gli ID dei post in un array.

Il secondo loop mostra tutti i post, esclusi i post dal primo loop.


In un'altra nota, c'è un modo per aggiungere wp-pagenavi alla seconda query?
Decano Elliott,

1
Nel caso in cui dovessi rivisitare la tua risposta: correggi il markup / l'intenzione del codice. Grazie.
Kaiser,

50

Il parametro che stai cercando è post__not_in(kaiser ha un refuso nella sua risposta). Quindi il codice potrebbe essere come:

<?php
$my_query = new WP_Query(array(
    'post__not_in' => array(278),
    'post_type' => 'case-study',
    'paged' => $paged,
));
while ($my_query->have_posts()) : $my_query->the_post(); endwhile;

Documentazione di WP_Query post__not_in


2
Sai, ci sono modifiche per correggere errori di battitura :)
Kaiser

@Ziki la virgola nell'array non è un refuso ma è una sintassi PHP valida, se è questo che intendi.
leonziyo,

1
@leonziyo - no, originariamente aveva "posts__not_in" invece di "post__not_in", vedi la storia della sua risposta. Il coma va bene
Ziki,

9

Devi definire post__not_inarg come array. Anche per un singolo valore. E per favore non sovrascrivere le variabili core globali con elementi temporanei.

<?php
$query = new WP_Query( array(
    'post_type'    => 'case-study',
    'paged'        => $paged,
    'post__not_in' => array( 1, ),
) );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
    $query->the_post();

    // do stuff

} // endwhile;
} // endif;
?>

0

Codici alternativi;

Escludi post di categoria

<?php
add_action('pre_get_posts', 'exclude_category_posts');
function exclude_category_posts( $query ) {
    if($query->is_main_query() && $query->is_home()) {
        $query->set('cat', array( -22, -27 ));
    }
}

Rimuovi i post dalla pagina iniziale

<?php
add_action('pre_get_posts', 'wpsites_remove_posts_from_home_page');
function wpsites_remove_posts_from_home_page( $query ) {
    if($query->is_main_query() && $query->is_home()) {
        $query->set('category__not_in', array(-1, -11));
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.