Вопрос или проблема
Я создал несколько пользовательских постов для своей страницы 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, это может быть связано с кэшированием или неправильной настройкой постоянных ссылок. Чтобы решить эту проблему, выполните следующее:
- Перейдите в панель управления WordPress.
- Выберите "Настройки" > "Постоянные ссылки".
- Нажмите "Сохранить изменения" без внесения изменений — это обновит правила перезаписи и устранит возможные конфликты.
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. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их.