Мета-поля в таксономиях без использования плагинов

Владислав Белецкий
Владислав Белецкий .
Категория:
Комментариев: 0

Я уже писал про добавление метабоксов к постам (записям, страницам, произвольным типам постов), теперь давайте разберемся, как добавлять произвольные поля (дополнительные настройки) на страницы редактирования рубрик, меток и прочих таксономий, которые вы можете насоздавать.

Опять-таки сразу вас предупрежу, что у вас нет необходимости писать с нуля весь код самим. Можете воспользоваться плагином Carbon Fields например, но тут же я обещал всё делать без плагинов.

Итак, вот что мы будем создавать в этом уроке:

В общем я решил не придумывать каких-то бесполезных примеров и сделать всё так же, как в примере с обычными метабоксами – добавить SEO-поля для рубрик.

1. Добавляем поля на страницу со всеми рубриками, в форму добавления рубрики

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

add_action( 'category_add_form_fields', 'true_add_cat_fields' );
 
function true_add_cat_fields( $taxonomy ) {
 
	echo '<div class="form-field">
		<label for="seo-title">SEO-заголовок</label>
		<input type="text" name="seo_title" id="seo_title" />
	</div>
	<div class="form-field">
		<label><input type="checkbox" name="seo_robots" /> Скрыть от поисковиков</label>
	</div>';
 
}

Плюс-минус ничего сложного, вам даже не нужно беспокоиться о заполнении значений этих полей. Это финиш с этим шагом.

И да, надеюсь, что вы знаете, куда вставлять код.

2. Добавляем поля на страницу редактирования рубрики

Принцип очень похож, по сути отличается лишь хук, он будет называться {название таксономии}_edit_form_field ну и да, тут уже нужно будет постараться заполнить значения полей из базы данных!

add_action( 'category_edit_form_fields', 'true_edit_term_fields', 10, 2 );
 
function true_edit_term_fields( $term, $taxonomy ) {
 
	// сначала получаем значения этих полей
	// заголовок
	$seo_title = get_term_meta( $term->term_id, 'seo_title', true );
	// скрытие от поисковиков
	$seo_robots = get_term_meta( $term->term_id, 'seo_robots', true );
 
	echo '<tr class="form-field">
	<th>
		<label for="seo_title">SEO-заголовок</label>
	</th>
	<td>
		<input name="seo_title" id="seo_title" type="text" value="' . esc_attr( $seo_title ) .'" />
	</td>
	</tr>
	<tr>
		<th>Скрыть из поисковиков</th>
		<td>
			<label><input type="checkbox" name="seo_robots" ' . checked( 'yes', $seo_robots, false ) . ' /> Да</label>
		</td>
	</tr>';
 
}

И результат:

3. Сохранение значений полей

Тут всё легко – вешаем единственную функцию для сохранения полей на сразу два хука – created_{название таксономии} и edited_{название таксономии}.

В нашей ситуации функция будет выглядеть вот так:

add_action( 'created_category', 'true_save_term_fields' );
add_action( 'edited_category', 'true_save_term_fields' );
 
function true_save_term_fields( $term_id ) {
 
	if( isset( $_POST[ 'seo_title' ] ) ) {
		update_term_meta( $term_id, 'seo_title', sanitize_text_field( $_POST[ 'seo_title' ] ) );
	} else {
		delete_term_meta( $term_id, 'seo_title' );
	}
 
	if( isset( $_POST[ 'seo_robots' ] ) && 'on' == $_POST[ 'seo_robots' ] ) {
		update_term_meta( $term_id, 'seo_robots', 'yes' );
	} else {
		delete_term_meta( $term_id, 'seo_robots' );
	}
 
}

4. Очищаем поля формы при добавлении таксономии через AJAX

И этот шаг – небольшой бонус для вас. Дело в том, что добавляются таксономии через AJAX и по умолчанию очищаются только текстовые поля. А у нас там например чекбокс. Что, если я хочу его переводиться в нечекнутое состояние каждый раз после добавления рубрики?

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

Пробуем:

jQuery( function( $ ) {
	$(document).ajaxSuccess(function(evt, xhr, opts){
		if (
		  xhr.status >= 200
		  && xhr.status < 300
		  && opts.data
		  && /(^|&)action=add-tag($|&)/.test(opts.data)
		  && /(^|&)taxonomy=category($|&)/.test(opts.data) // тут укажите свою таксономию
		  && xhr.responseXML
		  && $('wp_error', xhr.responseXML).length == 0
		) {
			$( "#seo_robots" ).prop( "checked", false );
		}
	});
});

5. Вывод значений произвольных полей элементов таксономий на сайте

Ну во-первых, нам понадобится одна-единственная функция get_term_meta() для получения значений этих полей.

Затем я воспользуюсь хуком pre_get_document_title изменения тайтла страницы и хуком wp_head для вывода мета-тега robots.

add_filter( 'pre_get_document_title', 'true_seo_title_for_cats', 25 );
 
function true_seo_title_for_cats(){
 
	if( is_category() && ( $title = get_term_meta( get_queried_object_id(), 'seo_title', true ) ) ) {
		return $title;
	}
 
	return '';
 
}
 
add_action( 'wp_head', 'true_seo_robots_for_cats', 25 );
 
function true_seo_robots_for_cats() {
 
	if( is_category() && 'yes' === get_term_meta( get_queried_object_id(), 'seo_robots', true ) ) {
		echo '<meta name="robots" content="noindex,nofollow" />';
	}
}
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии