Excluir ID da postagem de wp_query

28

Como posso excluir uma postagem específica de uma consulta WP_Query? (Por exemplo, mostre todas as postagens além de uma postagem com o ID 278)

Eu tentei o argumento post__not_in, mas ele remove todas as postagens.

Qualquer ajuda seria ótimo.

Aqui está minha consulta atual

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

obrigado

Dean Elliott
fonte

Respostas:

13

Suponho que isso seja pesado, mas, para responder à sua pergunta original, coletei todos os IDs de posts em uma matriz no primeiro loop e excluí esses posts do segundo loop usando 'post__not_in', que espera uma matriz de IDs de posts.

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

O primeiro loop exibe todas as postagens em uma categoria e coleta os IDs da postagem em uma matriz.

O segundo loop exibe todas as postagens, excluindo as postagens do primeiro loop.

Ben HartLenn
fonte
Em outra nota, existe uma maneira de adicionar wp-pagenavi à 2ª consulta?
Dean Elliott
1
Caso você revise sua resposta: corrija sua marcação / intenção de código. Obrigado.
Kaiser #
50

O parâmetro que você está procurando é post__not_in(o kaiser tem um erro de digitação na resposta). Portanto, o código pode ser como:

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

Ziki
fonte
2
You know, there are edits for correcting typos :)
kaiser
@ Ziki a vírgula na matriz não é um erro de digitação, é uma sintaxe válida do PHP, se é isso que você quer dizer.
precisa saber é o seguinte
1
@leonziyo - não, ele originalmente tinha "posts__not_in" em vez de "post__not_in", veja o histórico de sua resposta. Coma está bem
Ziki
9

Você precisa definir o post__not_inargumento como array. Mesmo por um único valor. E por favor, não substitua as variáveis ​​principais globais por coisas temporárias.

<?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;
?>
kaiser
fonte
0

Códigos alternativos;

Excluir postagens de 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 ));
    }
}

Remover postagens da página inicial

<?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));
    }
}
Fatih Mert Doğancan
fonte