scottb
  • 0
Гуру

Исключение прилепленных сообщений из The Loop и из WP_Query() в WordPress?

  • 0

Следующий фрагмент взят из виджета боковой панели, в котором перечислены «последние сообщения». Поскольку он находится на главной странице, а мой последний прилепленный пост занимает видное место на этой странице, я хочу пропустить его в этом цикле. Тем не менее, это 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; ?>
Share
  1. Я взял ответ @tnorthcutt из Кодекса WordPress query_posts() о Sticky Parameters и создал отдельный пример, который вы можете поместить 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;
    
    • 0
  2. Если вы хотите исключить все прикрепленные записи из запроса, используйте

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

    (из кодекса )

    Однако похоже, что это будет работать только в версии 3.0 или выше: http://wordpress.org/support/topic/except-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; ?>
    
    • 0
  3. Ответ Трэвиса подходит, если вы создаете свой собственный запрос, возможно, для вторичного цикла, но если вам нужно изменить свой основной запрос в блоге, вы можете использовать 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.

    • 0

Оставить ответ

You must login to add an answer.