Как создать эксклюзивные пользовательские таксономии

WordPress, одна из самых мощных систем ведения блога с открытым исходным кодом и управления контентом.

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

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

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

Что такое таксономия?

Согласно кодексу WordPress:

Таксономия — способ группировки.

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

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

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

По умолчанию WordPress поставляется с четырьмя таксономиями: категориями, тегами, категориями ссылок и форматированием постов.

Среди этих встроенных таксономий категории и теги очень похожи, но имеют одно важное различие: Категории — это исключительные таксономии (т. е. для каждого поста можно выбрать не более одной категории), тогда как каждому посту может быть присвоено несколько тегов.

Более того, категории обычно предопределены, в то время как теги могут определяться по ходу.

Определение пользовательских таксономий

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

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

function view_init() {
	register_taxonomy(
		'view',
		'post',
		array(
			'label' => __( 'View' ),
			'capabilities' => array(
				'assign_terms' => 'edit_guides',
				'edit_terms' => 'publish_guides'
			)
		)
	);
}
add_action( 'init', 'view_init' );

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

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

Как всегда, посты, относящиеся к определенным условиям этой категории, будут отображаться в / view / {view_name}.

Список разрешений в приведенном выше фрагменте необязателен. Без него WordPress будет использовать разрешения по умолчанию тем же пользователям. Как показано выше, это позволит любому пользователю с настраиваемой возможностью «edit_guides» назначать таксономию должности и любому пользователю с пользовательской возможностью «publish_guides» для создания новых элементов таксономии.

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

Возможности таксономии включают assign_terms, edit_terms, manage_terms (отображает таксономию в навигации администратора) и delete_terms.

Как использовать таксономии?

Внутри вашего кода вы можете использовать функцию wp_set_object_terms () для добавления терминов к объектам с использованием таксономии. Вы можете перечислить существующие термины, используя функцию the_terms (). Кроме того, вы можете использовать функцию wp_tag_cloud () для создания облака терминов для вашей пользовательской таксономии.

На стороне пользовательского интерфейса WordPress создает новый мета-столбец для сообщений для каждой таксономии. Мета-поле похоже на метатекст «Теги», который позволяет связать одно или несколько условий с вашим сообщением. Это то, что делает WordPress по умолчанию, и это то, что мы можем изменить, сделав таксономию кастомной.

Когда мы создаем пользовательскую таксономию с помощью метода register_taxonomy (), WordPress добавляет мета-поле с несколькими пунктами выбора на страницу редактирования сообщений:

Используя этот meta-box, пользователь может выбрать любое количество существующих (уже используемых) терминов, а также может добавлять новые термины с помощью текстового поля.

Чтобы создать таксономию, подобную категории, где каждый пост относится не более чем к одной категории из набора предопределенных категорий, вы можете сделать это, немного изменив WordPress:

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

 

Давайте посмотрим на каждый из шагов.

Скрыть мета-поле по умолчанию, созданное WordPress.

Для этого нам нужно установить для show_in_quick_edit и meta_box_cb опции значение false при вызове register_taxonomy.

Первый вариант скрывает таксономию на панели редактирования «быстрый / группировка», а второй вариант скрывает его на странице редактирования после публикации:

register_taxonomy( 'custom_taxonomy', 'post', array(
	'labels' => array(
		'name' => 'Custom Exclusive Taxonomy'
	),
	'show_in_quick_edit' => false,
	'meta_box_cb' => false
));

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

Создание настраиваемого мета-окна на странице редакции поста

Для создания meta box, мы можем использовать хук WordPress add_meta_boxes.

add_action('add_meta_boxes', 'add_custom_meta_box');
function add_custom_meta_box(){
	add_meta_box( 'taxonomy_box', __('Custom Exclusive Taxonomy'), 'fill_custom_meta_box_content', 'post' ,'side');
}

Мы вызываем add_meta_box со следующими аргументами:

  • taxonomy_box – ID meta box
  • __('Custom Exclusive Taxonomy') – Заголовок мета бокс
  • fill_custom_meta_box_content – функция, которая наполнит мета бокс контентом
  • post – на какой странице показывать мета бокс. В данном случае на странице редактирования поста. Аргумент является массивом.
  • side – Отображение мета бокса на странице.

Обратите внимание, мы указали taxonomy_box как ID.

Теперь мы реализуем функцию fill_custom_meta_box_content:

<?php
function fill_custom_meta_box_content( $post ) {
	$terms = get_terms( array(
		'taxonomy' => 'custom_taxonomy',
		'hide_empty' => false // Получим все
));

	// Мы предполагаем, что существует одна категория
	$currentTaxonomyValue = get_the_terms($post->ID, 'custom_taxonomy')[0];
?>
	<p>Choose taxonomy value</p>
	<p>
		<?php foreach($terms as $term): ?>
			<input type="radio" name="custom_taxonomy" id="taxonomy_term_<?php echo $term->term_id;?>" value="<?php echo $term->term_id;?>"<?php if($term->term_id==$currentTaxonomyValue->term_id) echo "checked"; ?>>
			<label for="taxonomy_term_<?php echo $term->term_id;?>"><?php echo $term->name; ?></label>
			</input><br/>
		<?php endforeach; ?>
	</p>
<?php
}

Здесь мы сначала извлекаем все термины (т. е. существующие значения) таксономии. Мы будем использовать их, чтобы отобразить список элементов управления переключателями (радиокнопками).

Затем мы извлекаем текущий выбранный термин таксономии с использованием функции get_the_terms () — это нужно, чтобы сделать соответствующую радиокнопку выбранной.

Обратите внимание, что эта функция возвращает массив. Это связано с тем, что по умолчанию пост может иметь любое количество связанных с ним терминов. Предположим, пост имеет  не более одного термина, поэтому мы обращаемся к первому элементу массива. (Это нормально, если массив пуст, мы получим значение null в качестве текущего значения, и никакой переключатель не будет выбран.)

HTML-код, использующий HTML, использует custom_taxonomy как имя переключателей и соответствующих идентификаторов термина в качестве их значений; Атрибуты идентификатора радиокнопки используются только для подключения к ярлыкам меток. В результате мы получаем следующий мета бокс:

Наконец, нам нужно сохранить значение таксономии, когда когда пост будет сохранен. для этого используем хук save_post:

add_action('save_post', 'save_custom_taxonomy');

function save_custom_taxonomy($post_id){
	if ( isset( $_REQUEST['custom_taxonomy'] ) ) 
		wp_set_object_terms($post_id, (int)sanitize_text_field( $_POST['custom_taxonomy'] ), 'custom_taxonomy');
}

Вот и все! Мы сделали.

Теперь вы знаете, как создать пользовательскую таксономию, которая будет вести себя как встроенная таксономия категории.
Таксономии — очень мощная и полезная функция в WordPress. Из коробки они не имеют возможности строго категоризировать сообщения, но, как и в любом случае в WordPress, таксономии и связанные с ними функциональные возможности чрезвычайно настраиваются. Это позволяет нам добавить эту часто необходимую способность в несколько этапов.

Приведенный здесь подход также может быть использован для создания еще более настраиваемого пользовательского интерфейса на страницах редактирования после выбора таксономии.

Оригинал статьи How to Create Exclusive Custom Taxonomies in WordPress

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *