Loại trừ ID bài đăng khỏi wp_query


28

Làm cách nào tôi có thể loại trừ một bài đăng cụ thể khỏi truy vấn WP_Query? (Ví dụ: hiển thị tất cả các bài đăng ngoài một bài đăng có ID 278)

Tôi đã thử đối số post__not_in nhưng nó chỉ xóa tất cả các bài viết ..

Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời.

Đây là truy vấn hiện tại của tôi

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

Cảm ơn

Câu trả lời:


13

Tôi cho rằng điều này rất nặng nề, nhưng để trả lời câu hỏi ban đầu của bạn, tôi đã thu thập tất cả các id của bài đăng trong một mảng trong vòng lặp đầu tiên và loại trừ các bài đăng đó khỏi vòng lặp thứ hai bằng cách sử dụng 'post__not_in' , dự kiến ​​một mảng id bài

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

Vòng lặp đầu tiên hiển thị tất cả các bài đăng trong một danh mục và thu thập id của bài đăng thành một mảng.

Vòng lặp thứ hai hiển thị tất cả các bài viết, ngoại trừ các bài đăng từ vòng lặp đầu tiên.


Một lưu ý khác, Có cách nào để thêm wp-pagenavi vào truy vấn thứ 2 không?
Dean Elliott

1
Trong trường hợp bạn từng xem lại câu trả lời của mình: Vui lòng sửa lỗi đánh dấu / dự định mã của bạn. Cảm ơn.
kaiser

50

Tham số bạn đang tìm kiếm là post__not_in(kaiser có một lỗi đánh máy trong câu trả lời của anh ấy). Vì vậy, mã có thể giống như:

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

Tài liệu WP_Query post__not_in


2
Bạn biết đấy, có những chỉnh sửa để sửa lỗi chính tả :)
kaiser

@Ziki dấu phẩy trong mảng không phải là lỗi chính tả, đó là cú pháp PHP hợp lệ, nếu đó là ý bạn.
leonziyo

1
@leonziyo - không, ban đầu anh ấy đã có "post__not_in" thay vì "post__not_in", xem lịch sử câu trả lời của anh ấy. Hôn mê vẫn ổn
Ziki

9

Bạn phải định nghĩa post__not_inarg là mảng. Ngay cả đối với một giá trị duy nhất. Và xin vui lòng không ghi đè các biến cốt lõi toàn cầu bằng các công cụ tạm thời.

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

Mã thay thế;

Không bao gồm bài viết chuyên mục

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

Xóa bài viết khỏi trang chủ

<?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));
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.