Отображение архива категорий для пользовательских типов записей
Я серьезно опоздал на вечеринку с Custom Post Types и начал использовать их совсем недавно, поэтому извините, если мой вопрос покажется идиотским, но я не могу найти ответ на него.
Я настроил пользовательский тип записи под названием actors с несколькими пользовательскими полями, и (что важно), я использую стандартные категории для разделения этих актеров на списки мужчин, женщин и детей:
'taxonomies' => array('category', 'post_tag')
...так как я подумал, что это будет более чистый и аккуратный способ... ну, категоризации актеров. Однако я совершенно не понимаю, как фактически отобразить эти категории каким-либо образом.
У меня есть пользовательский файл archive-actors.php
, который отображает всех актеров, но я хочу иметь возможность фильтровать их по категориям; например, отображать только мужчин. Однако если я пробую стандартный URL вроде mysite.com/category/actors/men
, я просто получаю
Извините, но в категории Мужчины пока нет записей.
То же самое происходит, если я просто пробую mysite.com/category/men
- в обоих случаях не используется шаблон archive-actors.php
.
Может кто-нибудь помочь рассеять мой туман непонимания и указать правильное направление, чтобы я мог отфильтровать этих надоедливых актеров?
Редактирование:
Как @mrwweb намекает ниже (и я забыл упомянуть, что пробовал), следующий код можно добавить в файл functions.php
:
function query_post_type($query) {
$post_types = get_post_types();
if ( is_category() || is_tag()) {
$post_type = get_query_var('actors');
if ( $post_type ) {
$post_type = $post_type;
} else {
$post_type = $post_types;
}
$query->set('post_type', $post_type);
return $query;
}
}
add_filter('pre_get_posts', 'query_post_type');
...как указано здесь, что действительно работает, поскольку отображает мои категоризированные пользовательские типы записей на обычной странице archive.php
, но не использует мой archive-actors.php
, что является ключевым моментом.

Вы можете принудительно использовать ваш шаблон для категорий с помощью фильтра category_template
:
function wpa57439_category_template( $templates = '' ){
if( !is_array( $templates ) && !empty( $templates ) ) {
$templates = locate_template( array( 'archive-actors.php', $templates ), false );
}
elseif( empty( $templates ) ) {
$templates = locate_template( 'archive-actors.php', false );
}
else {
$new_template = locate_template( array( 'archive-actors.php' ) );
if( !empty( $new_template ) ) array_unshift( $templates, $new_template );
}
return $templates;
}
add_filter( 'category_template', 'wpa57439_category_template' );
адаптировано из Filter Hierarchy в codex.

Это ожидаемое поведение архивов категорий. Как указано здесь на форумах поддержки, следующий сниппет должен решить вашу проблему (просто замените "article" на ваш тип записи):
add_filter('pre_get_posts', 'query_post_type');
function query_post_type($query) {
if(is_category() || is_tag()) {
$post_type = get_query_var('post_type');
if($post_type)
$post_type = $post_type;
else
$post_type = array('post','articles','nav_menu_item');
$query->set('post_type',$post_type);
return $query;
}
}
ОБНОВЛЕНИЕ: Ой. Я взял не тот сниппет. Я имел в виду использовать этот.

Сам по себе этот фрагмент кода ничего не делает; в конце есть лишняя скобка, и переменная $query
не определена. Я нашел ветку, на которую вы ссылались ранее, и попробовал применить это в контексте фильтра pre_get_posts
в моем файле functions.php
; это вроде бы работает, но не использует мой собственный шаблон archive-actors.php
, что раздражает.

Альтернативно, вы можете просто добавить новое правило wp_rewrite для создания новой структуры URL, чтобы отображать только записи определенного CPT и категории. Например, как в .gist, который я разместил здесь:
[примечание: невозможно встроить .gists, поэтому вот код и ссылка ]
/**
* Это можно расширить и использовать для меток или любой другой таксономии.
*/
add_action('init', 'category_cpt_rewrites');
function category_cpt_rewrites() {
$custom_post_types = array('video', 'audio', 'photo', 'file'); //некоторые примеры типов записей
foreach ( $custom_post_types as $post_type ) {
$rule = '^' . $post_type . '/category/(.+?)/?$';
$rewrite = 'index.php?post_type=' . $post_type . '&category_name=$matches[1]';
add_rewrite_rule($rule,$rewrite,'top');
}
}
//убедитесь, что вы сбрасываете правила
//это позволит использовать следующую структуру URL (например, для CPT video и категории politics) -> video/category/politics и возвращать записи, принадлежащие категории politics, которые относятся к пользовательскому типу записи "video".
//примечание: если вы хотите, чтобы это было действительно эффективно, вам нужно создать пользовательскую функцию "the_category()" или аналогичную шаблонную функцию, чтобы возвращать правильную структуру URL для списка категорий, относящихся к записи пользовательского типа.

Шаблоны таксономий
https://developer.wordpress.org/themes/template-files-section/taxonomy-templates/#custom-taxonomy
Когда слаг вашей таксономии категории "actors-category":
Создайте его из шаблона категории: taxonomy-actors-category.php
