Как отображать обычные записи и пользовательские типы записей, относящиеся к категории, используя только стандартный шаблон категории?
1) На моем сайте есть обычные записи и 2 пользовательских типа записей (новости и статьи) 2) Все они используют обычные категории, такие как спорт и здоровье (без пользовательских таксономий) 3) Как сделать, чтобы стандартный шаблон category.php обрабатывал все категории, отображая весь контент, относящийся к ним, независимо от типа записи.
Или проще говоря: я хочу, чтобы стандартный шаблон category.php обрабатывал отображение всех категорий, но включал также и пользовательские типы записей.
Возможно, это глупый вопрос, но я вернулся к WordPress после долгого перерыва и обнаружил, что стандартные темы WordPress стало сложнее понять для реализации этого. Сейчас я просто сбит с толку и раздражен.
Пожалуйста, помогите

Ознакомьтесь с функцией query_posts() — вашим помощником для изменения основного/стандартного запроса. Перед использованием необходимо объявить глобальную переменную $wp_query
, чтобы изменить оригинальный запрос, а не заменить его.
Вот как это можно сделать. Поместите первые четыре строки в ваш файл category.php
прямо перед началом основного цикла:
// Изменяем стандартный цикл, включаем произвольные типы записей
global $wp_query;
$args = array_merge( $wp_query->query, array( 'post_type' => 'any' ) );
query_posts( $args );
// Начало цикла выглядит так:
while ( have_posts() ) : the_post();
Если вы хотите более избирательно отображать типы записей, вместо универсального 'post_type'=>'any'
укажите массив с нужными типами записей:
$args = array_merge( $wp_query->query, array( 'post_type' => array('post','news','essays') ) );
И добро пожаловать обратно во вселенную WordPress и сообщество WPSE.
Уверен, ваше разочарование скоро пройдет ;)

Сначала я использовал решение Maugly, но затем нашел этот вариант в кодексе WordPress:
add_action( 'pre_get_posts', 'add_my_custom_post_type' );
/**
* @param WP_Query $query
* @return WP_Query
*/
function add_my_custom_post_type( $query ) {
if ($query->is_main_query())
$query->set( 'post_type', array( 'post', 'page', 'any_custom_type' ) );
return $query;
}
Надеюсь, это поможет кому-то.. Возможно, это не самое чистое решение, но немного чище, чем вариант Maugly..

► Вот моя версия предложения от @Kower. Решает пару проблем в админке.
add_action('pre_get_posts', 'add_my_custom_post_type');
/**
* @param WP_Query $query
* @return WP_Query
*/
function add_my_custom_post_type($query) {
if(
empty($query->query['post_type'])
or $query->query['post_type'] === 'post'
){
$query->set('post_type', array('post', 'my_custom_type'));
}
}

Я хотел бы добавить к этому, в связи с ответом @tivnet. (Я бы хотел оставить комментарий, но у меня недостаточно репутации)
Я обнаружил, что решения работают, но, по-видимому, они имели непреднамеренный побочный эффект, влияющий также на административную часть. Это означает, что при просмотре записей в wp-admin (wp-admin/edit.php) в общем списке записей также отображались все страницы и все пользовательские типы записей. Это может сбивать с толку других пользователей? Однако добавление:
and !is_admin()
внутри оператора if() решает эту проблему, сохраняя при этом изменение pre_get_posts для фронтенда.
add_action('pre_get_posts', 'add_my_custom_post_type');
/**
* @param WP_Query $query
* @return WP_Query
*/
function add_my_custom_post_type($query) {
if(
empty($query->query['post_type'])
or $query->query['post_type'] === 'post'
and !is_admin()
){
$query->set('post_type', 'any');
}
}

Чтобы включить пользовательский тип записи в обычный цикл (например, на странице записей), просто добавьте следующий код в index.php перед if ( have_posts() ) :
$args = array(
'post_type' => array('post', 'custom_post_type'), // Типы записей: стандартные и пользовательские
'post_status' => 'publish', // Только опубликованные записи
);
$new_post_loop = new WP_Query( $args ); // Создаем новый запрос
Затем измените следующие две строки:
if ( have_posts() ) :
замените на if ( $new_post_loop -> have_posts() ) :
и
while ( have_posts() ) : the_post();
на while ( $new_post_loop -> have_posts() ) : $new_post_loop -> the_post();
Это решение позволяет избежать проблемы, когда пользовательский тип записи отображается в списке всех записей в админке, что происходит при использовании add_action('pre_get_posts') ;)

// Функция для добавления пользовательских типов записей в категории и метки
function namespace_add_custom_types( $query )
{
// Проверяем, является ли запрос категорией или меткой, и не подавлены ли фильтры
if( is_category() || is_tag() && empty( $query->query_vars['suppress_filters'] ) )
{
// Устанавливаем типы записей, которые должны отображаться
$query->set( 'post_type', array(
'post', // Стандартные записи
'nav_menu_item', // Элементы меню
'your-custom-post-type-here' // Ваш пользовательский тип записи
));
return $query;
}
}
// Добавляем фильтр для изменения записей перед их получением
add_filter( 'pre_get_posts', 'namespace_add_custom_types' );
