Работа и отображение пользовательского типа записи как обычного поста

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

Я создал несколько пользовательских постов для своей страницы WordPress, и я могу нормально с ними работать. Я могу создать новый, отредактировать его и отобразить в “archive-custom_post_type_name.php” и многое другое. Я даже могу использовать ту же категорию, что и обычный пост.

Моя огромная проблема в том, что я не могу отобразить их как обычные посты на своем сайте. Я хочу отобразить их в смешанном виде с обычными постами.

Я пробовал:

add_action( 'pre_get_posts', 'my_get_posts' );

function my_get_posts( $query ) {    
    if ( is_home() && $query->is_main_query() )
         $query->set( 'post_type', array( 'post', 'actualizacion', 'notificacion' ) );    
    return $query;
}

Но ничего не происходит. Я также пробовал:

add_action( 'pre_get_posts', 'add_mi_cpt' );
/**
 * @param WP_Query $query
 * @return WP_Query
 */
function add_mi_cpt( $query ) {    
    if ( $query->is_main_query() )
         $query->set( 'post_type', array( 'post', 'LISTA_CPT' ) );    
    return $query;
}

В моем wp-admin я вижу свои пользовательские посты среди обычных постов, но моя проблема с этим фрагментом в том, что моя веб-страница затем возвращает ошибку 404.

Есть ли способ создать пользовательские типы постов и работать с ними как с обычными постами, чтобы я мог отображать их смешанными на своем веб-сайте?

Спасибо!

—ИЗМЕНЕНО—

Я изменил свой первый фрагмент, и теперь пользовательские типы постов отображаются нормально на странице “Показать все посты” в WP-Admin, но не на сайте:

function add_my_post_types_to_query( $query ) {
    if ( is_admin() && $query->is_main_query() )
        $query->set( 'post_type', array( 'post', 'My_Custom_Post_Type_List' ) );
    return $query;
}
add_action( 'pre_get_posts', 'add_my_post_types_to_query' );

—ИЗМЕНЕНО 2.0—

Может быть, следующим шагом будет изменить цикл в page.php, чтобы отобразить эти пользовательские типы постов в цикле? Мой цикл выглядит так:

<?php
    if ( have_posts() ) :
        // Начинаем цикл.
        while ( have_posts() ) : the_post();
        ?>

            <?php get_template_part( 'content','page' ); ?>

            <?php
            // Если комментарии открыты или у нас есть хотя бы один комментарий, загружаем шаблон комментариев.
            if ( comments_open() || get_comments_number() ) :
            comments_template();
            endif;
            ?>

        <?php
        endwhile;

    endif;
    ?>

Хорошо, так что я думаю, что вы могли бы применить пример из codex как есть:

function search_filter($query) {
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->is_search) {
      $query->set('post_type', array( 'post', 'actualizacion', 'notificacion' ) );
    }
  }
}
add_action('pre_get_posts','search_filter');

Я думаю, что вам просто не хватало проверки !is_admin()

Надеюсь, это поможет!

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

Для отображения пользовательских типов записей (Custom Post Types, CPT) на главной странице вашего WordPress-сайта в обычном потоке постов, вам необходимо правильно настроить запросы и петли. Давайте разберем этот процесс поэтапно.

1. Настройка запросов с помощью pre_get_posts

Прежде всего, проверьте, чтобы в функции обработчика pre_get_posts был корректно настроен запрос. Ваш код пытается изменить основной запрос на главной странице, чтобы он возвращал как обычные, так и пользовательские записи.

Вот пример правильного кода:

add_action( 'pre_get_posts', 'include_custom_post_types_in_main_query' );

function include_custom_post_types_in_main_query( $query ) {
    if ( !is_admin() && $query->is_main_query() && $query->is_home() ) {
        $post_types = array( 'post', 'actualizacion', 'notificacion' ); // Замените на ваши CPT
        $query->set( 'post_type', $post_types );
    }
}

2. Замените is_home() на is_front_page()

Если ваш сайт имеет статическую главную страницу, то используйте is_front_page() вместо is_home(). Это может улучшить работу вашего запроса:

if ( !is_admin() && $query->is_main_query() && ( $query->is_home() || $query->is_front_page() ) ) {

3. Обновление и настройки постоянных ссылок

Если после внесения изменений возникла ошибка 404, это может быть связано с кэшированием или неправильной настройкой постоянных ссылок. Чтобы решить эту проблему, выполните следующее:

  1. Перейдите в панель управления WordPress.
  2. Выберите "Настройки" > "Постоянные ссылки".
  3. Нажмите "Сохранить изменения" без внесения изменений — это обновит правила перезаписи и устранит возможные конфликты.

4. Модификация цикла WordPress

Поскольку вы хотите отображать записи разных типов в одном цикле, убедитесь, что ваш основной цикл настроен правильно. Стандартный подход подходит, вот как должен выглядеть ваш код:

if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        get_template_part( 'content', get_post_type() ); // Используйте get_post_type() для загрузки соответствующего шаблона
        if ( comments_open() || get_comments_number() ) :
            comments_template();
        endif;
    endwhile;
endif;

Здесь get_template_part() загружает шаблон в зависимости от типа записи, что позволяет вам более эффективно управлять отображением каждого типа контента.

5. Проверка на наличие ошибок

Если после всех изменений у вас все еще не отображаются записи, проверьте консоль ошибок PHP или активируйте режим отладки в wp-config.php:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

Это позволит вам увидеть все ошибки и предупреждения в файле debug.log, который будет находиться в папке /wp-content/.

Заключение

Следуя представленным шагам, вы сможете успешно вывести пользовательские типы записей на главной странице вашего WordPress-сайта рядом с обычными записями. Убедитесь в правильной настройке запросов, постоянных ссылок и цикла WordPress. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их.

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

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