Виключити ідентифікатор публікації з wp_query


28

Як я можу виключити одну конкретну публікацію з WP_Query запиту? (Наприклад, показати всі публікації, крім посади з ідентифікатором 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-го запиту?
Дін Елліотт

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", дивіться історію його відповіді. Кома прекрасна
Зікі

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));
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.