ยกเว้นโพสต์ ID จาก wp_query


28

ฉันจะยกเว้นหนึ่งโพสต์เฉพาะจากแบบสอบถาม WP_Query ได้อย่างไร (ตัวอย่างเช่นแสดงโพสต์ทั้งหมดนอกเหนือจากโพสต์ที่มี ID 278)

ฉันลองอาร์กิวเมนต์ post__not_in แล้ว แต่เพิ่งลบโพสต์ทั้งหมด ..

ความช่วยเหลือใด ๆ จะดีมาก

นี่คือแบบสอบถามปัจจุบันของฉัน

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

ขอบคุณ

คำตอบ:


13

ฉันคิดว่ามันหนัก แต่เพื่อตอบคำถามเดิมของคุณฉันได้รวบรวม id โพสต์ทั้งหมดในอาร์เรย์ในลูปแรกและไม่รวมโพสต์เหล่านั้นจากลูปที่สองโดยใช้'post__not_in'ซึ่งคาดว่าอาร์เรย์ของรหัสโพสต์

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

ลูปแรกแสดงโพสต์ทั้งหมดในหมวดหมู่และรวบรวมโพสต์ไอดีลงในอาร์เรย์

ลูปที่สองแสดงโพสต์ทั้งหมดยกเว้นโพสต์จากลูปแรก


ในบันทึกอื่นมีวิธีเพิ่ม wp-pagenavi ในแบบสอบถามที่ 2 หรือไม่
Dean Elliott

1
ในกรณีที่คุณเคยทบทวนคำตอบของคุณอีกครั้ง: โปรดแก้ไขมาร์กอัปโค้ด / ความตั้งใจของคุณ ขอบคุณ
ไกเซอร์

50

พารามิเตอร์ที่คุณต้องการคือpost__not_in(ไกเซอร์มีคำสะกดผิดในคำตอบของเขา) ดังนั้นรหัสอาจเป็นดังนี้:

<?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 เอกสารประกอบ


2
คุณจะรู้ว่ามีการแก้ไขสำหรับการแก้ไขความผิดพลาด :)
Kaiser

@ Ziki เครื่องหมายจุลภาคในอาร์เรย์ไม่ใช่การพิมพ์ผิดมันเป็นไวยากรณ์ PHP ที่ถูกต้องถ้านั่นคือสิ่งที่คุณหมายถึง
leonziyo

1
@leonziyo - ไม่เขาเคยมี "posts__not_in" แทนที่จะเป็น "post__not_in" ดูประวัติคำตอบของเขา อาการโคม่าดี
Ziki

9

คุณต้องกำหนดpost__not_inหาเรื่องเป็นอาร์เรย์ แม้แต่ค่าเดียว และโปรดอย่าเขียนทับตัวแปรหลักส่วนกลางด้วยสิ่งชั่วคราว

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

รหัสทางเลือก;

ยกเว้นโพสต์หมวดหมู่

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

ลบโพสต์จากหน้าแรก

<?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));
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.