Вопрос или проблема
Я создал новый блок для редактора 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
Основными факторами, которые могут влиять на выполнение данного параметра, являются:
-
Прикрепленные посты (Sticky Posts): Если у вас есть прикрепленные посты, они всегда будут выводиться первыми в списке даже если вы указали
posts_per_page
. Это связано с тем, что WordPress обрабатывает их отдельно от обычных постов. Чтобы обойти это, можно установить параметрignore_sticky_posts
вtrue
, что вы уже сделали, но, тем не менее, наличие прикрепленных постов может создать путаницу в их отображении. -
Параметр
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.