» » » register_taxonomy() — произвольные таксономии WordPress
logotip

register_taxonomy() — произвольные таксономии WordPress

Всем привет! Сегодня на seo-mayak.com мы продолжим развивать функционал WordPress и на повестке тема — произвольные таксономии. Их еще не редко называют «пользовательскими таксономиями».

Мы подробно разберем работу функции register_taxonomy(), познакомимся с ее параметрами, пройдемся по аргументам и создадим две полноценных таксономии: древовидную (по типу стандартных рубрик) и не древовидную (по типу меток), конечно, с полным интерфейсом в админке.

Функционал произвольных записей и таксономий был внедрен разработчиками довольно давно, еще с версии 2.3, которая вышла аж в 2007 году. Именно тогда WordPress из чисто блогового движка превратился в многофункциональныю CMS, способную решать самые разные задачи.

Итак, что такое произвольные таксономии? Ну тут все просто.

Произвольные таксономии — это зарегистрированные в системе категории или метки, которые никак и ничем не связаны со стандартными рубриками или метками WordPress.

У любой таксономии есть свой уникальный идентификатор (имя). Например, у стандартных категорий — это «category». Кстати, вы никогда не задумывались откуда в урлах стандартных рубрик взялось слово «/category/»?

proizvolnye taksonomii-1

А взялось оно как раз из названия таксономии.

Также в произвольной структуре рубрик предусмотрен свой собственный цикл, который будет обрабатывает только тот тип записей, который указан в настройках функции, ну об этом чуть позже.

Несомненно, данный функционал открывает широчайшие возможности, ведь теперь можно создать неограниченное число полноценных разделов, со своими циклами обработки и структурой рубрик — это уже больше на портал похоже.

Идем далее. Для регистрации любой таксономии требуется указать тип записи, для которой эта таксономия будет создаваться. На блоге есть подробная статья о создании произвольных типов записей, поэтому сейчас я не буду вдаваться в детали и приведу лишь пример подключения.

Пример подключения произвольного типа записи

/* Регистрация произвольного типа записи kodex */

add_action('init', 'mayak_type_post_register');
function mayak_type_post_register()
{
  $labels = array(
	'name' => 'Кодекс', 
	'menu_name' => 'Кодекс',
	'singular_name' => 'Кодекс', 
	'add_new' => 'Добавить запись',
	'add_new_item' => 'Добавить новую запись',
	'edit_item' => 'Редактировать запись',
	'new_item' => 'Новая запись',
    'all_items' => 'Все записи',
	'view_item' => 'Посмотреть запись',
	'search_items' => 'Найти запись',
	'not_found' =>  'Ничего не найдено',
	'not_found_in_trash' => 'В корзине ничего не найдено'
  );
  $args = array(
	'labels' => $labels,
	'public' => true,
	'publicly_queryable' => true,
	'show_ui' => true,
	'show_in_menu' => true,
	'query_var' => true,
	'rewrite' => true,
	'capability_type' => 'post',
	'has_archive' => true,
	'hierarchical' => false,
	'menu_position' => null,
	'supports' => array('title','editor','author','thumbnail','excerpt','comments','post-formats','custom-fields')
  );
  register_post_type('kodex',$args);
}

Функция вставляется в файл functions.php. После чего в админке должен появиться блок с интерфейсом для созданного типа записи:

Как вы наверное догадались, данному типу записи я присвоил имя «kodex» (см. строчку №34). Запомним, потом оно нам еще пригодится, а сейчас давайте поближе познакомимся с функцией register_taxonomy().

Функция register_taxonomy()

Функция register_taxonomy() работает на основе класса WP_Taxonomy{}

Выглядит функция следующим образом:

register_taxonomy( $taxonomy, $object_type, $args );

Где:
$taxonomy (строка) (обязательно) — Имя регистрируемой таксономии (не допускаются пробелы и заглавные буквы).
$object_type (массив/строка) (обязательно) — Имя объекта (типа записи), для которой будет регистрироваться таксономия.
$args (массив) (необязательно) — Массив аргументов, которые может принимать функция.

Последний параметр является необязательным и если его упустить, то функция выведет стандартный интерфейс меток:

register_taxonomy('wordpress', array('kodex'));

proizvolnye-taksonomii-3

Ниже список зарезервированных выражений, которые нельзя использовать в качестве имени регистрируемой таксономии.

attachment feed pb static
attachment_id fields perm subpost
author hour post subpost_id
author_name link_category post__in tag
calendar m post__not_in tag__and
cat minute post_format tag__in
category monthnum post_mime_type tag__not_in
category__and more post_status tag_id
category__in name post_tag tag_slug__and
category__not_in nav_menu post_type tag_slug__in
category_name nonce posts taxonomy
comments_per_page nopaging posts_per_archive_page tb
comments_popup offset posts_per_page term
customize_messenger_channel order preview theme
customized orderby robots type
cpage p s w
day page search withcomments
debug page_id second withoutcomments
error paged sentence year
exact pagename showposts

Шаблон функции со всеми аргументами

Это шаблон! Не надо его никуда вставлять!

add_action( 'init', 'mayak_taxonomy_register' );
function mayak_taxonomy_register(){	
		    $labels = array(
			'name'              		 => 'Категории',
			'singular_name'       	     => 'Категория',
			'menu_name'         		 => 'Категории' ,
			'all_items'         		 => 'Все категории',
			'edit_item'         		 => 'Редактировать категорию',
			'view_item'         		 => 'Посмотреть категорию',
			'update_item'       		 => 'Сохранить категорию',
			'add_new_item'      		 => 'Добавить новую категорию',
			'new_item_name'     		 => 'Новая категория',			
			'parent_item'       		 => 'Родительская категория', 
			'parent_item_colon' 		 => 'Родительская категория:',
			'search_items'      		 => 'Поиск по категориям',
			'popular_items'     		 => 'Популярные Метки',
			'separate_items_with_commas' => 'Список Меток (разделяются запятыми)',
		    'add_or_remove_items' 		 => 'Добавить или удалить Метку',
		    'choose_from_most_used' 	 => 'Выбрать Метку',
			'add_or_remove_items' 		 => 'Добавить или удалить Метку',
			'not_found'         		 => 'Меток не найдено',
			'back_to_items'     		 => 'Назад на страницу рубрик',
		);
		$args = array(
		'labels'             	=> $labels,
		'label'              	=> 'Категории',
		'public'             	=> true,
		'publicly_queryable' 	=> true,
		'show_ui'            	=> true,
		'show_in_menu'       	=> true,
		'show_in_nav_menus'  	=> true,
		'show_in_rest'       	=> false,
		'rest_base'          	=> 'url_rest',
		'rest_controller_class' => 'WP_REST_Terms_Controller',
		'show_tagcloud'      	=> true,
		'show_in_quick_edit'    => true,
		'meta_box_cb'           => null,
		'show_admin_column'     => true,
		'description'           => '',
		'hierarchical'       	=> true,
		'update_count_callback' => '',
		'query_var'     		=> $taxonomy,		
		'rewrite'       		=> true,
		'sort'                  => true,
		'_builtin'              => false,
	);
register_taxonomy('rubriki', array('kodex'), $args);
}

Хочу обратить ваше внимание на строчку №47 — здесь мы регистрируем новую таксономию и вторым параметром array('kodex') обязательно указываем название произвольного типа записи.

Теперь аргументы и первым делом давайте разберем массив $labels.

Массив $labels

$labels = array('ключ' => 'значение') — в массиве $labels все значения должны содержать текст, который будет отображаться в админке. Это могут быть тексты кнопок, заголовки или уведомления.


name

'name' => 'Категории' — Заголовок для страницы редактирования произвольной категории.

По умолчанию: ничего не выводится.

На заметку! Если значение аргумента name окажется пустым, то на странице редактирования записи интерфейс рубрик выведен не будет.


singular_name

'singular_name' => 'Категория' — Название для одного элемента.

По умолчанию: _x( ‘Post Tag’, ‘taxonomy singular name’ ) или _x( ‘Category’, ‘taxonomy singular name’ ).

menu_name

'menu_name' => 'Категории' — Заголовок в меню админки.

По умолчанию: По умолчанию: значение аргумента name.


all_items

'all_items' => 'Все категории' — Заголовок для всего списка категорий.

По умолчанию: ‘Все рубрики’ или ‘Все метки’.


edit_item

'edit_item' => 'Редактировать категорию' — Заголовок для страницы редактирования произвольной таксономии.

По умолчанию: 'Изменить рубрику' или 'Изменить метку' .


view_item

'view_item' => 'Посмотреть категорию' — отображается на странице редактирования в админ баре (тулбаре).

По умолчанию: 'Посмотреть рубрику' или 'Посмотреть метку'.


update_item

'update_item' => 'Сохранить категорию' — используется при сохранении изменений через опцию «Свойство».

По умолчанию: 'Обновить рубрику' или 'Обновить метку'.


add_new_item

'add_new_item' => 'Добавить новую категорию' — Текст кнопок и заголовков.

По умолчанию: 'Добавить новую рубрику' или 'Добавить новую метку'.


new_item_name

'new_item_name' => 'Новая категория' — Текст для нового элемента таксономии.

По умолчанию: __( ‘Add New Tag’ ) или __( ‘Add New Category’ ).


parent_item

'parent_item' => 'Родительская категория' — Текст для опции выбора родительской категории (только для древовидных таксономий).

По умолчанию: 'Родительская рубрика'.


parent_item_colon

'parent_item_colon' => 'Родительская категория:' — То же, что parent_item, только с двоеточием на конце.

По умолчанию: null или 'Родительская рубрика:'.


search_items

'search_items' => 'Поиск по категориям' — текст для кнопки поиска.

По умолчанию: 'Поиск рубрик' или 'Поиск меток'.

popular_items

'popular_items' => 'Популярные метки' — Текст для популярных меток (только для не иерархических таксономий).

По умолчанию: 'Популярные метки' или null.


separate_items_with_commas

'separate_items_with_commas' => 'Список Меток (разделяются запятыми)' — Текст, который отображается под формой ввода новых меток на странице редактирования записи (только для не иерархических таксономий).

По умолчанию: 'Метки разделяются запятыми'.


add_or_remove_items

'add_or_remove_items' => 'Добавить или удалить метку' — Данный текст используется при отключенном javascript (только для не иерархических таксономий).

По умолчанию: 'Добавить или удалить метку'.


choose_from_most_used

'choose_from_most_used' => 'Выбрать метку' — Текст для выбора метки (только для не иерархических таксономий).

По умолчанию: 'Выбрать из часто используемых меток'.


not_found

'not_found' => 'Метки не заданы' — данный текст отображается, если не создано ни одной метки (только для не иерархических таксономий).

По умолчанию: 'Метки не найдены'.


back_to_items

'back_to_items' => 'Назад на страницу меток' — данный текст отображается если обновить изменения на странице редактирования категорий или меток.

По умолчанию: 'Назад к меткам'.

На заметку! Массив $labels также можно дополнить аргументами из функции get_taxonomy_labels().

Массив $args


label

'label' => 'Категории' — Текст для отображения в админке во множественном числе (необязательно).

По умолчанию: значение $labels->name.



public

'public' => 'true' — Возможные значения: true / false. Выводить/Не выводить интерфейс таксономии в админке. Значение автоматически передается аргументам publicly_queryable, show_ui и show_in_nav_menus (необязательно).

По умолчанию: true.



publicly_queryable

'publicly_queryable' => 'true' — Возможные значения: true / false. Отображать/Не отображать элементы таксономии на внешней стороне сайта (необязательно).

По умолчанию: значение аргумента ‘public’.



show_ui

'show_ui' => 'true' — Возможные значения: true / false. Отображать/Не отображать интерфейс таксономии в админке (необязательно).

Значение данного аргумента, в отличии от public, не распространяет свое действие на аргументы: publicly_queryable и show_in_nav_menus, тем самым предоставляя возможность более тонкой настройки.

Если при значении false попробовать перейти на страницу редактирования таксономии, wordpress выведет сообщение:

По умолчанию: значение аргумента ‘public’.



show_in_menu

'show_in_menu' => 'true' — Возможные значения: true / false. Отображать/Не отображать название таксономии в меню админки (необязательно).

При значении false редактирование таксономии не запрещается.

По умолчанию: значение аргумента ‘show_ui’.



show_in_nav_menus

'show_in_nav_menus' => 'true' — Возможные значения: true / false. Отображать/Не отображать название таксономии в интерфейсе создания произвольного меню (необязательно).

По умолчанию: значение аргумента ‘public’.



show_in_rest

'show_in_rest' => 'false,' — Возможные значения: true / false. Включать/Не включать таксономию в REST API (необязательно).

По умолчанию: false.



rest_base

'rest_base' => 'url_rest' — Ярлык в REST API (необязательно).

По умолчанию: $taxonomy.



rest_controller_class

'rest_controller_class' => 'WP_REST_Terms_Controller' — Имя класса контроллера в REST API (необязательно).

По умолчанию: 'WP_REST_Terms_Controller'.



show_tagcloud

'show_tagcloud' => 'true' — Возможные значения: true / false. Разрешить/Запретить создавать облако меток для данной таксономии (необязательно).

По умолчанию: значение аргумента 'show_ui'.



show_in_quick_edit

'show_in_quick_edit' => 'true' — Возможные значения: true / false. Разрешить/Запретить отображать таксономию в опции «Свойства» на странице всех записей (необязательно).

По умолчанию: значение аргумента 'show_ui'.



meta_box_cb

'meta_box_cb' => 'post_categories_meta_box' — Название callback функции, которая будет будет отвечать за отображение блока (метабокса) категорий на странице редактирования записи (необязательно).

На заметку! callback — это передача сценария (исполняемого кода) в качестве аргумента.

В wordpress на этот случай предусмотрены две callback функции:

post_categories_meta_box — отображать как категории.
post_tags_meta_box — отображать как метки.

Например: если выбрать функцию post_tags_meta_box, то на странице редактирования записи интерфейс категорий будет выглядеть следующим образом:

Можно указать свою функцию, если таковая имеется и изменить интерфейс блока до неузнаваемости, а можно задать false и метабокс не будет выведен вовсе.

По умолчанию: null (в зависимости от значения параметра 'hierarchical' задействуется одна из вышепредставленных функций).



show_admin_column

'show_admin_column' => 'true' — Возможные значения: true / false. Отображать/Не отображать колонку «Категории» на странице «Все записи» (необязательно).

По умолчанию: значение аргумента false.



description

'description' => '' — Описание таксономии. (необязательно).

По умолчанию: ' ' (пустая строка).



hierarchical

'hierarchical' => 'true' — Возможные значения: true / false. Задает тип таксономии (необязательно).

true — Создать древовидную таксономию.
false — Создать не древовидную таксономию.

По умолчанию: false.



update_count_callback

'update_count_callback' => '' — Название callback функции, которая будет срабатывать при изменении количества прикрепленных записей. (необязательно).

Встроенные функции:

_update_post_term_count — счетчик количества опубликованных записей закрепленных за данной таксономией.
_update_generic_term_count — для связанных типов записей (по умолчанию установлена для таксономии «link_category»).

По умолчанию: ' ' (пустая строка) — автоматически срабатывает функция _update_post_term_count().



query_var

'query_var' => $taxonomy — Возможные значения: true / false / Строка. Строка — ключ запроса query_var (необязательно). Шаблон URL запроса:

/?{query_var}={term_slug}

Можно задать свой ключ.

При значении false отключаются, как сам запрос, так и все его параметры.

По умолчанию: название таксономии ($taxonomy).



rewrite

'rewrite' => true — Возможные значения: true / false / Массив. Определяет включить или отключить перезапись постоянных ссылок. Также можно задать массив аргументов. (необязательно).

Возможные аргументы массива:

slug — Можно задать свой ярлык для таксономии.

Например: 'rewrite' => array( 'slug' => 'new_category' )

По умолчанию: название таксономии ($taxonomy);

with_front — можно задать префикс для постоянной ссылки.

По умолчанию true.

hierarchical — При значении true включиться поддержка древовидных URL, т.е, структура урла будет такая:

домен / ярлык_таксономии /категория / подкатегория

А при значении false такая:

домен / ярлык_таксономии / подкатегория

По умолчанию false;

На заметку! Массив передается в функцию add_permastruct(), поэтому дополнительно тут можно использовать аргументы из этой функции.

По умолчанию: true (включить перезапись).



sort

'sort' => null — Запоминать/Не запоминать порядок создания термов (необязательно). Шаблон URL запроса:

Например, при значении true, для не иерархической таксономии, в таблицу wp_term_relationships прописывается порядок добавления меток к записи:

Как показали эксперименты, аргумент sort, в принципе, ни на что не влияет.

По умолчанию: null (сортировка отключена).



_builtin

'_builtin' => false — Возможные значения: true / false (необязательно).

true — таксономия будет восприниматься системой как внутренняя (родная).
false — будет восприниматься как встроенная (произвольная).

По умолчанию: false.

Важно! Разработчики не рекомендуют использовать данный аргумент при регистрации произвольной таксономии!

Функция возвращает: ничего или WP_Error.

Хук register_taxonomy

В функции register_taxonomy() предусмотрен одноименный хук — register_taxonomy, с помощью которого можно изменять значения аргументов как у произвольных таксономий, так и у стандартных.

Применение:

add_action('registered_taxonomy', 'my_function', 10, 3);
function my_function($taxonomy, $object_type, $args){
	// какое-то действие
}

Поменяем заголовок в меню админки для стандартной таксономии «category». Вместо Рубрики выведем Разделы:

add_action( 'registered_taxonomy', 'mayak_taxonomy_menu_rename');
function mayak_taxonomy_menu_rename($taxonomy) {
    if ( 'category' === $taxonomy ) 
    global $wp_taxonomies;
    $wp_taxonomies[$taxonomy]->labels->menu_name = 'Разделы';
}

Результат:

Все просто. Теперь перейдем непосредственно к регистрации произвольных таксономий.

Регистрация таксономии

На примере я покажу, как зарегистрировать сразу две таксономии: древовидную (категории) и не древовидную (метки).

Из функции убрано все лишнее, хотя, конечно, ситуации бывают разные.

/* Регистрация произвольных таксономий */

add_action( 'init', 'mayak_taxonomy_register' );
function mayak_taxonomy_register(){
	
		$labels = array(
			'name'              => 'Категории',
			'singular_name'     => 'Категория',
			'menu_name'         => 'Категории' ,
			'all_items'         => 'Все категории',
			'edit_item'         => 'Редактировать категорию',
			'view_item'         => 'Посмотреть категорию',
			'update_item'       => 'Сохранить категорию',
			'add_new_item'      => 'Добавить новую категорию',		
			'parent_item'       => 'Родительская категория',
			'search_items'      => 'Поиск по категориям',
			'back_to_items'     => 'Назад на страницу категорий',
			'most_used'         => 'Популярные категории', //get_taxonomy_labels()
		);
	$args = array(
		'labels'            => $labels,
		'show_admin_column' => true,
		'hierarchical'      => true,
	);
register_taxonomy('rubriki', array('kodex'), $args);

		$labels_tag = array(
			'name'              => 'Метки для Кодекса',
			'singular_name'     => 'Метка',
			'menu_name'         => 'Метки для кодекса' ,
			'search_items'      => 'Поиск по Меткам',
			'all_items'         => 'Все Метки',
			'edit_item'         => 'Редактировать Метку',
			'view_item'         => 'Посмотреть страницу Метки',
			'update_item'       => 'Сохранить Метку',
			'add_new_item'      => 'Добавить новую Метку',
			'new_item_name'     => 'Название новой Метки',
			'not_found'         => 'Меток не найдено',
			'back_to_items'     => 'Назад на страницу меток',
		);
	$args_tag = array(
		'labels'            => $labels_tag,
		'show_admin_column' => true,
		'hierarchical'      => false,
	);
register_taxonomy('metki', array('kodex'), $args_tag);	
}

Также можно подключить к одной таксономии несколько типов записей:

register_taxonomy('Имя_таксономии', array('Тип_записи_1', 'Тип_записи_2'), $ags);

Если все сделано правильно, то в админке должен появиться интерфейс вновь созданных таксономий:

Нам осталось вывести наши таксономии на сайте. Давайте разберемся, как можно это сделать.

Вывод произвольной таксономии

Вариантов вывода таксономии думаю можно много придумать, но я хочу вам предложить несколько, на мой взгляд, самых оптимальных решений.

1. С помощью функции wp_list_categories():

<?php
$args = array(
  'taxonomy'     => 'rubriki', // Название произвольной таксономии
  'orderby'      => 'name',  // Сортируем по названия, согласно алфавиту 
  'show_count'   => 1,       // Выводим количество записей
  'exclude'   => 10,22,       // Исключаем рубрики с ID 10 и 22
  'hierarchical' => 1,       // Включаем древовидный список
  'title_li'     => '',    // Убираем заголовок списка
  'use_desc_for_title' => 1   // Выводим описание рубрик
);
?>
<ul>
<?php wp_list_categories( $args ); ?>
</ul>

2. С помощью функции get_terms():

<?php 
$terms = get_terms('rubriki');
if( $terms && ! is_wp_error($terms) ){
	echo "<ul>";
	foreach($terms as $term){
		echo '<li><a href="'.get_term_link($term).'">'.$term->name.'</li>';
	}
	echo "</ul>";
}
?>

3. С помощью функции get_categories():

<?php  
$terms = get_categories(array('taxonomy' => 'rubriki'));
foreach ($terms as $categories) {
	echo '<li><a href="'.get_category_link($category->term_id).'">'.$categories->cat_name.'</a><br><span class="small-text">'.$categories->category_description.'</span></li>';
}
?>

4. Выведем облако произвольных меток с помощью функции wp_tag_cloud:

<?php wp_tag_cloud (array('taxonomy' => 'metki')); ?>

Вставлять в файл sitebar.php или в виджет.

Вывод категорий в зависимости от таксономии и типа записи

Бывает, что тематика сайта подразумевает наличие множества произвольных разделов и не очень удобно, когда в сайдбаре вытягивается длинная «простыня» из рубрик и подрубрик.
Поэтому нередко требуется функционал, который позволял бы выводить категории только в том разделе, к которому они относятся.

Пример: Выведем две произвольные таксономии только на тех страницах, к которым они относятся.

function mayak_sort_category(){
if (
    is_tax('Имя_произвольной_таксономии_1') or 
    is_singular('Имя_произвольного_типа_записи_1') or
	is_post_type_archive('Имя_произвольного_типа_записи_1')
	){
	$args = array(
		'taxonomy'     => 'Имя_произвольной_таксономии_1', 
		'orderby'      => 'name',  
		'show_count'   => 1,      
		'hierarchical' => 1,     
		'title_li'     => '',  
		'use_desc_for_title' => 1,
		);	
echo '<h5>Произвольные категории 1</h5>';
echo '<ul>';
wp_list_categories($args);
echo '</ul>';
} elseif (
    is_tax('Имя_произвольной_таксономии_2') or 
    is_singular('Имя_произвольного_типа_записи_2') or
	is_post_type_archive('Имя_произвольного_типа_записи_2')
	){
	$args = array(
		'taxonomy'     => 'Имя_произвольной_таксономии_2', 
		'orderby'      => 'name',  
		'show_count'   => 1,      
		'hierarchical' => 1,     
		'title_li'     => '',  
		'use_desc_for_title' => 1,
		);	
echo '<h5>Произвольные категории 2</h5>';
echo '<ul>';
wp_list_categories($args);
echo '</ul>';		
} else {
    $args = array(
		'orderby'      => 'name', 
		'show_count'   => 1,      
		'hierarchical' => 1,     
		'title_li'     => '',    
		'use_desc_for_title' => 1, 
		);
echo '<h5>Стандартные категории</h5>';
echo '<ul>';
wp_list_categories($args);
echo '</ul>';
   } 
}

Функция вставляется в файл functions.php. Понятно, что в функцию надо вписать свои имена таксономий и типов записей.

Код вызова:

<?php mayak_sort_category() ?>

Вызвать функцию можно в файле sitebar.php или через виджеты, если, конечно, они у Вас поддерживают выполнение php кода.

До встречи!

С уважением, Виталий Кириллов

Статьи по теме:

Функция register_post_type() — произвольные типы записей WordPress
wp_list_categories() — как выводить рубрики WordPress
Шаблоны для категорий WordPress. Как сделать каталог из рубрики
Картинки для категорий WordPress
Title, description, keywords и h1 для категорий WordPress

Оставить комментарий

Внимание комментатор! Прежде чем вставить: HTML, JavaScript или PHP код в свой комментарий, преобразуй его в html сущность!

Subscribe without commenting

» Подписаться на комментарии по RSS