posts_per_page не работает в блоке

Вопрос или проблема

Я создал новый блок для редактора WordPress и пытаюсь сделать так, чтобы работал простой WP_Query, но до сих пор $args в запросе в основном игнорируются, за исключением настройки post_type. Например, я хочу установить posts_per_page равным 3, но это игнорируется. Почему так?

<?php
wp_reset_postdata();
wp_reset_query();

$latest_news_args = [
    'post_type'             => 'post',
    'posts_per_page'        => 2,
    'post_status'           => 'publish',
    'nopaging'              => true,
    'ignore_sticky_posts'   => true
];

$latest_news_query = new WP_Query($latest_news_args);

if ($latest_news_query->have_posts()) : while ($latest_news_query->have_posts()) : $latest_news_query->the_post();
    $post_id                = get_the_ID();
    $post_title             = get_the_title();
    $post_url               = get_the_permalink();
    $post_excerpt           = get_the_excerpt();
    $post_image             = get_the_post_thumbnail_url();
    $post_image_id          = get_post_thumbnail_id( $post->ID );
    $post_image_alt_meta    = get_post_meta ( $post_image_id, '_wp_attachment_image_alt', true );
    $post_image_alt         = $post_image_alt_meta ? esc_html($post_image_alt_meta) : $post_title; // Если не указан альтернативный текст, используйте название поста
    ?>
    <div class="latest-news-block__post">
        <?php if($post_image): ?>
            <img class="latest-news-block__post-image" src="https://wordpress.stackexchange.com/questions/367656/<?php echo $post_image; ?>" alt="<?php echo $post_image_alt; ?>">
        <?php endif; ?>

        <h3 class="latest-news-block__post-title">
            <a href="<?php echo $post_url; ?>"><?php echo $post_title; ?></a>
        </h3>

        <div class="latest-news-block__post-excerpt">
            <p><?php echo $post_excerpt; ?></p>
            <a href="<?php echo $post_url; ?>" class="latest-news-block__post-more more-link"><?php _e('Читать далее','site'); ?></a>
        </div>

    </div>
<?php endwhile; endif; wp_reset_postdata(); wp_reset_query(); ?>

Проблема заключалась в том, что были «прикрепленные» посты, которые переопределяли все. Убрав эти посты из закрепленных, это, похоже, решило проблему.

Также спасибо Салли CJ за совет по nopaging – я не знал, что это также приводит к игнорированию posts_per_page.

Ответ или решение

Проблема с параметром posts_per_page в вашем WP_Query действительно может быть связана с установленными «прикреплёнными» постами (sticky posts). Давайте разберем данную ситуацию более подробно.

Описание проблемы

Вы создали новый блок для редактора WordPress и пытаетесь получить данные с помощью WP_Query. Однако, несмотря на установленное значение для posts_per_page, оно не учитывается в запросе, и фактически игнорируется, кроме параметра post_type.

Причины игнорирования параметра posts_per_page

Основными факторами, которые могут влиять на выполнение данного параметра, являются:

  1. Прикрепленные посты (Sticky Posts): Если у вас есть прикрепленные посты, они всегда будут выводиться первыми в списке даже если вы указали posts_per_page. Это связано с тем, что WordPress обрабатывает их отдельно от обычных постов. Чтобы обойти это, можно установить параметр ignore_sticky_posts в true, что вы уже сделали, но, тем не менее, наличие прикрепленных постов может создать путаницу в их отображении.

  2. Параметр nopaging: Если вы устанавливаете nopaging в true, вы сообщаете системe не ограничивать количество возвращаемых постов, что фактически делает значение posts_per_page неактуальным, поскольку будет возвращено все количество постов. Убедитесь, что вы установили nopaging в false, если хотите ограничить количество выводимых постов.

Решения

Чтобы исправить проблему, вы можете попробовать следующие шаги:

  • Убедитесь, что значение nopaging установлено в false, чтобы posts_per_page работал корректно:

    'nopaging' => false,
  • Если у вас есть прикрепленные посты, и вы хотите их игнорировать, оставьте ignore_sticky_posts установленным в true, как вы это уже сделали. В противном случае, если вам нужно вывести прикрепленные посты, просто уберите это значение.

Пример корректного запроса

Вот корректированный код с учетом вышеприведённых замечаний:

$latest_news_args = [
    'post_type'           => 'post',
    'posts_per_page'      => 3,
    'post_status'         => 'publish',
    'nopaging'            => false,  // Изменено с true на false
    'ignore_sticky_posts' => true
];

$latest_news_query = new WP_Query($latest_news_args);

Заключение

Эти изменения должны помочь вашему запросу корректно учитывать все заданные параметры. Не забывайте, что если вы изменяете настройки в админке, такие как прикрепление постов, они могут повлиять на вывод запроса. Надеюсь, это решение поможет вам получать нужный результат в WordPress.

Оцените материал
Добавить комментарий

Капча загружается...