Как отображать обычные записи и пользовательские типы записей, относящиеся к категории, используя только стандартный шаблон категории?

28 авг. 2011 г., 11:37:50
Просмотры: 14.5K
Голосов: 5

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

Или проще говоря: я хочу, чтобы стандартный шаблон category.php обрабатывал отображение всех категорий, но включал также и пользовательские типы записей.

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

Пожалуйста, помогите

0
Все ответы на вопрос 6
1

Ознакомьтесь с функцией 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.
Уверен, ваше разочарование скоро пройдет ;)

28 авг. 2011 г. 12:15:11
Комментарии

Это сработало! Огромное спасибо, Maugly. Не могу выразить всю свою благодарность... это было так раздражающе. Люблю тебя... как платонический поклонник, конечно :p

damx damx
30 авг. 2011 г. 10:18:41
0

Сначала я использовал решение 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..

22 янв. 2013 г. 15:07:27
1

► Вот моя версия предложения от @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'));
    }
}
15 мар. 2013 г. 04:01:10
Комментарии

Также возможно: $query->set('post_type', 'any');

tivnet tivnet
15 мар. 2013 г. 05:53:12
0

Я хотел бы добавить к этому, в связи с ответом @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');
    }
}
13 дек. 2017 г. 18:43:37
0

Чтобы включить пользовательский тип записи в обычный цикл (например, на странице записей), просто добавьте следующий код в 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') ;)

13 дек. 2018 г. 20:10:56
0
// Функция для добавления пользовательских типов записей в категории и метки
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' );
11 янв. 2019 г. 11:08:53