Почему вместо перебора заголовков всех постов я получаю заголовок страницы?
Основное задание у меня было вывести все посты и инфу в них, но все посыпалось на заголовке. Этот код вместо заголовков всех постов выдает заголовок страницы.
Как это исправить?
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <?php the_title(); ?> <?php endwhile; else: ?> <?php the_title(); ?> <?php endif; ?> |
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <?php the_title(); ?> <?php endwhile; else: ?> <?php the_title(); ?> <?php endif; ?>
Дополнительно:
Попробуй так
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php the_title(); ?>
<?php endwhile; else: ?>
Нет постов для отображения
<?php endif; ?>
Попробуйте так
<?php $args = array( 'post_type' => 'post', 'posts_per_page' => -1 ); $query = new WP_Query( $args ); while ( $query->have_posts() ) { $query->the_post(); the_title(); } wp_reset_postdata(); ?> |
<?php $args = array( 'post_type' => 'post', 'posts_per_page' => -1 ); $query = new WP_Query( $args ); while ( $query->have_posts() ) { $query->the_post(); the_title(); } wp_reset_postdata(); ?>
Цикл WordPress — универсальная штука, в зависимости от того какой раздел сайта вы просматриваете, та информация и будет подгружаться. Совершенно нормально если на обычный странице данный код выведет заголовок.
В вашем случае, подозреваю, дело в настройках сайта — для главной страницы указана статическая страница, а не последние записи. Выберете настройку Выводить последние записи и цикл будет выдавать Заголовки последних N постов
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос


Вы получаете заголовок страницы, потому что цикл
have_posts()на обычной странице перебирает текущий основной запрос. Если открыта страница WordPress, основной запрос содержит именно эту страницу, а не все записи блога. Чтобы вывести все посты, нужно создать отдельныйWP_Query.Пример:
$posts_query = new WP_Query([ 'post_type' => 'post', 'posts_per_page' => -1, 'post_status' => 'publish', ]); if ($posts_query->have_posts()) { while ($posts_query->have_posts()) { $posts_query->the_post(); echo '<h2>' . esc_html(get_the_title()) . '</h2>'; } wp_reset_postdata(); } else { echo 'Нет постов для отображения'; }
Ключевой момент — после кастомного запроса вызвать
wp_reset_postdata(). Иначе дальше по шаблону WordPress может начать выводить данные не той записи.Ваш текущий код:
if (have_posts()) { while (have_posts()) { the_post(); the_title(); } }
не означает «все записи сайта». Он означает «все записи текущего запроса». На странице это одна page, в категории — записи категории, в поиске — результаты поиска, на главной блога — последние записи.
Если нужно вывести записи определённой категории, добавьте параметр
catилиcategory_name. Если нужно вывести кастомный тип записей, заменитеpost_type. Не используйтеquery_posts()для такой задачи: он ломает основной запрос и пагинацию.Если такой блок стоит внутри шаблона страницы, не смешивайте основной Loop страницы и отдельный Loop записей. Сначала выведите контент страницы, затем отдельный
WP_Queryдля постов. Так будет понятно, какой объект сейчас активен, и вы не получите случайно заголовок текущей страницы вместо нужных записей.