Отображение архива категорий для пользовательских типов записей

4 июл. 2012 г., 18:24:10
Просмотры: 24.9K
Голосов: 6

Я серьезно опоздал на вечеринку с 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, что является ключевым моментом.

5
Комментарии

archive-actors.php — это шаблон архива типа записи, а не шаблон архива таксономии. Это нормальное и ожидаемое поведение.

Milo Milo
4 июл. 2012 г. 19:16:42

@Milo Понял. Тогда существует ли такой шаблон как архив пользовательской таксономии?

indextwo indextwo
4 июл. 2012 г. 19:34:47

существует, но он специфичен для пользовательской таксономии. если вы просто хотите принудительно использовать archive-actors.php для категорий, смотрите мой ответ

Milo Milo
4 июл. 2012 г. 19:48:50

Не используйте get_query_var(), используйте $query->get(). И ещё - вы хотите, чтобы это влияло только на главный запрос? Если да, то вам понадобится проверка $query->is_main_query() вместе с (is_category() || is_tag()).

Stephen Harris Stephen Harris
4 июл. 2012 г. 19:53:35

6 лет спустя, это глупый вопрос, который показывает, насколько плохим было моё понимание CPT. Сейчас я очень сильно кручу глазами на самого себя.

indextwo indextwo
16 апр. 2018 г. 21:18:45
Все ответы на вопрос 4
0

Вы можете принудительно использовать ваш шаблон для категорий с помощью фильтра 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.

4 июл. 2012 г. 19:49:24
2

Это ожидаемое поведение архивов категорий. Как указано здесь на форумах поддержки, следующий сниппет должен решить вашу проблему (просто замените "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;
    }
}

ОБНОВЛЕНИЕ: Ой. Я взял не тот сниппет. Я имел в виду использовать этот.

4 июл. 2012 г. 18:34:37
Комментарии

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

indextwo indextwo
4 июл. 2012 г. 18:55:07

Ссылка на ветку содержит несколько ошибок...

Stephen Harris Stephen Harris
4 июл. 2012 г. 19:45:42
0

Альтернативно, вы можете просто добавить новое правило 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 для списка категорий, относящихся к записи пользовательского типа.
28 окт. 2012 г. 19:59:34
0

Шаблоны таксономий

https://developer.wordpress.org/themes/template-files-section/taxonomy-templates/#custom-taxonomy

Когда слаг вашей таксономии категории "actors-category":

Создайте его из шаблона категории: taxonomy-actors-category.php

23 мар. 2023 г. 21:52:36