Kecualikan ID pos dari wp_query

28

Bagaimana saya bisa mengecualikan satu pos tertentu dari kueri WP_Query? (Misalnya, tunjukkan semua pos terpisah dari pos dengan ID 278)

Saya sudah mencoba argumen post__not_in tetapi hanya menghapus semua posting ..

Bantuan apa pun akan bagus.

Ini permintaan saya saat ini

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

Terima kasih

Dean Elliott
sumber

Jawaban:

13

Saya kira ini berat, tetapi untuk menjawab pertanyaan awal Anda, saya telah mengumpulkan semua posting id dalam array di loop pertama, dan mengecualikan posting tersebut dari loop kedua menggunakan 'post__not_in' yang mengharapkan array dari postingan id

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

Loop pertama menampilkan semua posting dalam suatu kategori, dan mengumpulkan id posting ke dalam sebuah array.

Loop kedua menampilkan semua posting, tidak termasuk posting dari loop pertama.

Ben HartLenn
sumber
Pada catatan lain, Apakah ada cara untuk menambahkan wp-pagenavi ke permintaan ke-2?
Dean Elliott
1
Jika Anda pernah mengunjungi kembali jawaban Anda: Harap perbaiki markup / niat kode Anda. Terima kasih.
kaiser
50

Parameter yang Anda cari adalah post__not_in(kaiser memiliki kesalahan ketik dalam jawabannya). Jadi kodenya bisa seperti:

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

Ziki
sumber
2
Anda tahu, ada s edit untuk memperbaiki kesalahan ketik :)
kaiser
@Ziki koma dalam array bukan salah ketik itu adalah sintaks PHP yang valid, jika itu yang Anda maksud.
leonziyo
1
@leonziyo - tidak, dia awalnya ada di sana "posts__not_in" bukannya "post__not_in", lihat riwayat jawabannya. Koma baik
Ziki
9

Anda harus mendefinisikan post__not_inarg sebagai array. Bahkan untuk nilai tunggal. Dan tolong jangan menimpa variabel inti global dengan hal-hal sementara.

<?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;
?>
kaisar
sumber
0

Kode alternatif;

Kecualikan posting kategori

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

Hapus posting dari halaman beranda

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