Exclure l'ID de publication de wp_query


28

Comment puis-je exclure une publication spécifique d'une requête WP_Query? (Par exemple, affichez toutes les publications à l'exception d'une publication portant l'ID 278)

J'ai essayé l'argument post__not_in mais il supprime simplement tous les messages ..

Toute aide est la bienvenue.

Voici ma requête actuelle

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

Merci

Réponses:


13

Je suppose que c'était lourd, mais pour répondre à votre question d'origine, j'ai collecté tous les identifiants des messages dans un tableau dans la première boucle, et exclu ces messages de la deuxième boucle en utilisant 'post__not_in' qui attend un tableau d'identifiants des messages

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

La première boucle affiche tous les articles d'une catégorie et recueille les identifiants des articles dans un tableau.

La deuxième boucle affiche tous les messages, à l'exception des messages de la première boucle.


Sur une autre note, existe-t-il un moyen d'ajouter wp-pagenavi à la 2e requête?
Dean Elliott

1
Au cas où vous reverriez votre réponse: veuillez corriger le balisage / intention de votre code. Merci.
kaiser

50

Le paramètre que vous recherchez est post__not_in(kaiser a une faute de frappe dans sa réponse). Le code pourrait donc être comme:

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

WP_Query post__not_in documentation


2
Vous savez, il y a des modifications pour corriger les fautes de frappe :)
kaiser

@Ziki la virgule dans le tableau n'est pas une faute de frappe, c'est une syntaxe PHP valide, si c'est ce que vous voulez dire.
leonziyo

1
@leonziyo - non, il y avait à l'origine "posts__not_in" au lieu de "post__not_in", voir l'historique de sa réponse. Coma va bien
Ziki

9

Vous devez définir l' post__not_inargument comme un tableau. Même pour une seule valeur. Et veuillez ne pas écraser les variables de base globales avec des éléments temporaires.

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

Codes alternatifs;

Exclure les messages de catégorie

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

Supprimer les messages de la page d'accueil

<?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));
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.