Почему is_main_query () внутри хука pre_get_posts не возвращает true, находясь внутри основного l oop? - PullRequest
0 голосов
/ 28 марта 2020

У меня есть шаблон index.php внутри моей темы, с простым l oop для отображения сообщений, например:

<section class="c-section overflow-hidden pt-0">
<div class="o-wrapper">
<?php
if ( have_posts() ) : $i=0;
?>
        <div class="row col-gutters pt-6">
            <?php while ( have_posts() ) : the_post(); ?>
                <div class="col-md-6 mb-3">
                <?php $thumb_id = get_post_thumbnail_id();
                $cardDate = get_the_date();
                $cardTitle = get_the_title();
                $cardExcerpt = get_excerpt();
                $cardLink = get_the_permalink();
                $cardExternal = get_field('external_article');
                $cardExternalLink = get_field('external_article_link');
                $cardExternalSource = get_field('external_article_source');
                    include(locate_template('_components/card-newsroom.php'));
                $i++;?>
                </div>
        <?php endwhile;?>
    </div>
  <?php endif;?>
</div>
</section>

Я пытаюсь использовать pre_get_posts в functions.php изменить количество отображаемых сообщений и удалить сообщения определенного типа.

function remove_news_posts( $query ) {
if ( $query->is_main_query() && !is_front_page() && !is_page() && !is_page_template() && !is_search() && !is_feed() && !is_tax() && !is_admin()) :

  $query->set( 'meta_query', array(
    'relation' => 'AND',
    array(
      'key' => 'external_article',
      'value' => 0,
      'compare' => 'LIKE',
    )
  ));

  $query->set( 'posts_per_page', '6');
}

add_action( 'pre_get_posts', 'remove_news_posts', 1000 );

Однако - это не работает. Количество сообщений на странице не равно 6, и мета-запрос также не влияет на отображаемые сообщения. У меня есть шаблон category.php, который почти идентичен, и фильтр pre_get_posts() там работает. Если я удаляю $query->is_main_query() из оператора pre_get_posts if, он работает нормально. Но тогда это также влияет на другие запросы, которые я не хочу затрагивать (например, на боковых панелях).

Почему is_main_query() не возвращает true, если я ожидаю, что он вернет true?

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Я в конце концов понял это! Происходили две вещи:

  1. Иерархия шаблонов. Мой индексный файл. php действительно должен был быть домашним. php, правильный шаблон для страницы индекса сообщений. Смотрите здесь: https://developer.wordpress.org/themes/basics/template-hierarchy/
  2. Система фильтрации использовала query_posts (), которая также модифицировала основной запрос. Согласно официальным документам WordPress, query_posts () не рекомендуется: «Эта функция полностью переопределяет основной запрос и не предназначена для использования плагинами или темами. Ее чрезмерно упрощенный c подход к модификации основного запроса может вызывать проблемы. c и его следует по возможности избегать. " (см. https://developer.wordpress.org/reference/functions/query_posts/)

Надеюсь, это будет полезно кому-то там. Ура!

0 голосов
/ 28 марта 2020

Потому что в вашем утверждении отметьте, если не на первой странице!

Вы можете заменить на:

if ( $query->is_main_query() && (is_home() || is_archive())){ ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...