Вопрос или проблема
Я немного запутался в использовании цикла. Это моя первая тема, и в данный момент я использую index.php для отображения всех моих страниц. Это работает нормально для страниц, но have_posts возвращает false, когда я пытаюсь отобразить отдельный пост. Вот код index.php:
<?php
get_header();
?>
<div class="left">
<?php
if ( have_posts() ) :
// Начало цикла.
while ( have_posts() ) : the_post();
//echo для отладки
echo 'index<br>';
echo get_the_ID().'<br>';
//функция для отображения страницы
field_page_builder_front_display(get_the_ID(),get_post_type(get_the_ID()));
endwhile;
else :
?>
Извините, эта страница не существует
<?php
endif;
?>
</div>
<?php
//отобразить пользовательский сайдбар
get_side_bar();
get_footer();
?>
Этот index.php возвращает “Извините, это не существует” для всех моих отдельных постов (статей или пользовательских постов). Я думал, что это потому, что цикл предназначен только для отображения нескольких постов, но файл single.php темы twentfifteen также использует цикл, поэтому я не понимаю проблемы.
Спасибо заранее за вашу помощь!
Поздний ответ, но один из возможных сценариев, по которому это может происходить, это если вы регистрируете два пользовательских типа постов с одинаковым permalink slug.
Вы можете отладить это, сделав var_dump
глобальной переменной $wp_query
.
global $wp_query;
var_dump($wp_query);
Проверьте, соответствует ли post_type
в запросе типу поста страницы, которую вы в настоящее время посещаете.
Если вы обнаружите, что это не так, то следующим шагом будет проверка аргументов, где оба типа постов регистрируются. Обратите внимание на rewrite
в частности. Если slug
установлен на одно и то же значение, у вас будет конфликт между двумя пользовательскими типами постов.
Плохо
// тип поста (а)
$args_a = array(
'rewrite' => array(
'slug' => 'hello'
),
);
// тип поста (б)
$args_b = array(
'rewrite' => array(
'slug' => 'hello'
),
);
Хорошо
// тип поста (а)
$args_a = array(
'rewrite' => array(
'slug' => 'hello'
),
);
// тип поста (б)
$args_b = array(
'rewrite' => array(
'slug' => 'world' // <-- это теперь другое.
),
);
Это само по себе может не решить вашу проблему, потому что вам нужно будет сбросить постоянные ссылки. Для этого вы можете просто перейти в Административную панель > Настройки > Структура постоянных ссылок и нажать кнопку сохранить изменения
. Это сбросит постоянные ссылки, чтобы они теперь были hello
и world
соответственно для ваших пользовательских типов постов.
Вероятно, у вас не работает никакой запрос постов.
Попробуйте это (добавлен query_posts();
)
<?php
get_header();
?>
<div class="left">
<?php
query_posts( $args );
if ( have_posts() ) :
// Начало цикла.
while ( have_posts() ) : the_post();
//echo для отладки
echo 'index<br>';
echo get_the_ID().'<br>';
//функция для отображения страницы
field_page_builder_front_display(get_the_ID(),get_post_type(get_the_ID()));
endwhile;
else :
?>
Извините, эта страница не существует
<?php
endif;
?>
</div>
<?php
//отобразить пользовательский сайдбар
get_side_bar();
get_footer();
?>
Ответ или решение
Вопрос: Почему функция have_posts()
возвращает false на одиночном посте?
Проблема, которую вы описали, обычно возникает из-за неправильной работы цикла, который используется для отображения постов в вашем шаблоне. Давайте рассмотрим несколько возможных причин и решений.
1. Проверка наличия глобального $wp_query
Первое, что стоит сделать, это проверить глобальную переменную $wp_query
. Запустите функцию var_dump()
для этой переменной, чтобы увидеть, какие данные хранятся. Например:
global $wp_query;
var_dump($wp_query);
Этот вывод поможет узнать, какой тип поста запрашивается и присутствуют ли данные о постах в глобальной переменной. Убедитесь, что тип поста соответствует типу, который вы ожидаете вывести.
2. Флешинг пермалинков
Если в вашей теме или плагинах были зарегистрированы пользовательские типы постов с одинаковыми слагами, это может вызвать конфликты. Перейдите в административную панель WordPress: Настройки > Постоянные ссылки и просто нажмите "Сохранить изменения". Это обновит ваши правила для постоянных ссылок и может решить проблему.
3. Правильный запрос к постам
Вышеуказанный код не включает запрос к постам для одиночного поста. В этом случае вы можете попробовать использовать query_posts()
, но это не рекомендуется, потому что эта функция нарушает основную петлю WordPress. Вместо этого лучше воспользоваться стандартной петлёй. Однако для проверки можно использовать следующий код:
<?php
get_header();
?>
<div class="left">
<?php
// Если вы используете query_posts(), убедитесь, что это необходимо
// query_posts($args); // Не рекомендуется, если у вас нет специальных аргументов
if (have_posts()) :
while (have_posts()) : the_post();
echo 'index<br>';
echo get_the_ID() . '<br>';
field_page_builder_front_display(get_the_ID(), get_post_type(get_the_ID()));
endwhile;
else :
echo 'Извините, этот пост не существует';
endif;
?>
</div>
<?php
get_sidebar();
get_footer();
?>
Если вы хотите отобразить одиночный пост, это самый простой способ сделать это, убедитесь, что файл называется single.php
для одиночных постов или custom-post-type.php
для пользовательских типов постов.
4. Проверка пользовательских типов постов
Если вы работаете с пользовательскими типами постов, убедитесь, что они правильно зарегистрированы с уникальными rewrite
слагами. Например:
// Для пользовательского типа поста (а)
$args_a = array(
'rewrite' => array('slug' => 'hello'),
);
// Для пользовательского типа поста (б)
$args_b = array(
'rewrite' => array('slug' => 'world'), // Теперь это отличается.
);
5. Использование правильного шаблона
Также проверьте, что ваш запрос на одиночный пост действительно попадает в нужный шаблон. Например, если вы редактируете index.php
, используйте single.php
для одиночных постов, чтобы зафиксировать шаблонный вывод.
Заключение
Используя приведенные выше рекомендации, вы должны быть в состоянии решить проблему с тем, что have_posts()
возвращает false для одиночных постов. Методично проверьте все аспекты, начиная с глобального объекта $wp_query
, проверки зарегистрированных типов постов, обновления постоянных ссылок и использования корректного шаблона для одиночных постов. Если ошибка сохраняется, изучите дополнительные плагины или код, которые могут вмешиваться в цикл WordPress.