Несмотря на то, что всё это делается функцией register_taxonomy_for_object_type(), код для каждой таксономии будет разным — отдельно для рубрик, отдельно для меток и отдельно для произвольной таксономии.
Каждый листинг кода будет состоять из двух частей:
- Первая часть кода — основная, именно в ней и будет добавляться поддержка определенной таксономии (рубрики, метки и пр.)
- Вторая часть кода — это модификация стандартных запросов. Т.е. например вы открыли на сайте страницу архива какой-либо категории, а там отображаются и записи
post
и страницыpage
.
Как привязать рубрики к страницам?
Достаточно добавить этот код в functions.php
темы.
function true_apply_categories_for_pages(){ add_meta_box( 'categorydiv', 'Категории', 'post_categories_meta_box', 'page', 'side', 'normal'); // добавляем метабокс категорий для страниц register_taxonomy_for_object_type('category', 'page'); // регистрируем рубрики для страниц } // обязательно вешаем на admin_init add_action('admin_init','true_apply_categories_for_pages'); function true_expanded_request_category($q) { if (isset($q['category_name'])) // если в запросе присутствует параметр рубрики $q['post_type'] = array('post', 'page'); // то, помимо записей, выводим также и страницы return $q; } add_filter('request', 'true_expanded_request_category'); |
Как привязать метки к страницам?
Можно одновременно использовать с кодом для рубрик.
function true_apply_tags_for_pages(){ add_meta_box( 'tagsdiv-post_tag', 'Теги', 'post_tags_meta_box', 'page', 'side', 'normal' ); // сначала добавляем метабокс меток register_taxonomy_for_object_type('post_tag', 'page'); // затем включаем их поддержку страницами wp } add_action('admin_init','true_apply_tags_for_pages'); function true_expanded_request_post_tags($q) { if (isset($q['tag'])) // если в запросе присутствует параметр метки $q['post_type'] = array('post', 'page'); return $q; } add_filter('request', 'true_expanded_request_post_tags'); |
Окей, я вставил весь код выше (и тот, который для категорий и тот, который для тегов) «как есть» в functions.php
своей темы, и вот что у меня получилось:
Привязка таксономий к произвольным типам постов
Способ 1. register_taxonomy()
Тут всё проще — достаточно при регистрации таксономии указать все необходимые типы постов в параметре $object_type
функции register_taxonomy().
$taxonomy = ''; // название таксономии $object_type = array(); // тут и указываем все необходимые типы постов в виде массива $args = array(); // параметры таксономии register_taxonomy( $taxonomy, $object_type, $args ); |
Способ 2. register_taxonomy_for_object_type() и фильтр «request»
А что, если у нас нет доступа к параметрам функции register_taxonomy()? Что, если она является частью плагина или темы, и установленные нами параметры будут сбрасываться каждый раз при обновлении?
Тогда будем использовать такой же способ привязки, который актуален для рубрик и меток.
В данном примере привязываем рубрики к произвольному типу постов product
.
function true_apply_taxonomy_for_post_type(){ // add_meta_box() в данном случае не нужен register_taxonomy_for_object_type('category', 'product'); } add_action('admin_init','true_apply_taxonomy_for_post_type'); function true_expanded_request_custom($q) { if (isset($q['category_name'])) // для произвольных таксономий нужно использовать их название, например $q['product_category'] $q['post_type'] = array('post', 'product'); return $q; } add_filter('request', 'true_expanded_request_custom'); |
Источник: misha.blog