Исключая липкие сообщения из цикла и из WP-запроса() в WordPress?


Следующий фрагмент взят из виджета боковой панели, в котором перечислены "последние сообщения". Поскольку он находится на домашней странице, и я размещаю свой последний липкий пост на видном месте на этой странице, я хочу пропустить липкий в этом цикле. Однако post_not_in=sticky_posts не имеет никакого эффекта.

<?php
    $the_query = new WP_Query("showposts=$number&offset=1&order=ASC&post_not_in=sticky_posts");

    while ($the_query->have_posts()) : $the_query->the_post();
        $do_not_duplicate = $post->ID; ?>
Author: Krzysiek Dróżdż, 2010-08-27

3 answers

Я взял ответ @tnorthcutt от Кодекс WordPress о query_posts() о липких параметрах и создал пример tandalone, который вы можете поместить как test.php в корневой каталог вашего веб-сайта и увидеть, как он запускается, перейдя по URL-адресу, подобному этому, с заменой вашего домена:

Http://example.com/test.php

Некоторые примечания к коду; Мне пришлось использовать массив, эквивалентный строке запроса , которую вы передали WP_Query(), потому что post__no_in аргумент не может быть передан в виде строки, разделенной запятыми (не уверен, почему, возможно, по недосмотру?).

Также я хотел убедиться, что вы знаете, что, начиная с offset=1 (вместо offset=0), вы исключаете первое сообщение, которое в противном случае было бы возвращено запросом. Конечно, вы все равно получите количество сообщений, указанное в $number, при условии, что у вас есть столько применимых сообщений +1. Итак, вот код:

<?php
header('Content-Type:text/plain');
include "wp-load.php";

$number = 5;

$the_query = new WP_Query(array(
  'showposts' => $number,
  'offset' => 1,  // This will cause the query to skip over first post
  'order' => 'ASC',
  'post__not_in' => get_option("sticky_posts"),
  ));
while ($the_query->have_posts()) : $the_query->the_post();
  the_title(); 
endwhile;
 4
Author: MikeSchinkel, 2010-08-27 17:36:52

Если вы хотите исключить все липкие записи из запроса, используйте

query_posts(array("post__not_in" =>get_option("sticky_posts")));

(из кодекса)

Похоже, что это будет работать только на версии 3.0 или выше, хотя: http://wordpress.org/support/topic/excluding-sticky-posts-using-query_posts

Редактировать: в ответ на ваш комментарий ниже, попробуйте это (я не уверен, что это сработает, но надеюсь, это поможет вам начать):

<?php 
$args=array(
    'showposts'=>'$number',
    'offset'=>'1',
    'order'=>'ASC',
    'post__not_in'=>get_option("sticky_posts")
    );
$the_query = new WP_Query($args);

    while ($the_query->have_posts()) : $the_query->the_post();

        $do_not_duplicate = $post->ID; ?>
 1
Author: Travis Northcutt, 2010-08-27 17:29:54

Ответ Трэвиса подойдет, если вы создаете свой собственный запрос, возможно, для вторичного цикла, но если вам нужно изменить свой основной запрос блога, вы можете использовать pre_get_posts для фильтрации липких сообщений.

В приведенном ниже примере я исключаю липкие сообщения только в том случае, если запрос относится к странице блога, так как я все еще хочу, чтобы липкие сообщения возвращались на страницах таксономии и поиска и т. Д. (Я показываю липкие сообщения как избранные статьи в основных новостях страница).

add_action( 'pre_get_posts', 'custom_post_archive_changes' );
function custom_post_archive_changes( $query ) {
    if ( is_home() && $query->is_main_query() ) {

        // exclude sticky posts from main news page
        $stickies = get_option("sticky_posts");
        $query->set( 'post__not_in', $stickies );

    }
}

Просто поместите фрагмент выше в свой functions.php файл.

 1
Author: crdunst, 2020-02-19 12:31:59