have_posts() возвращает false на одиночном посте

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

Я немного запутался в использовании цикла. Это моя первая тема, и в данный момент я использую 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.

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

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