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

Как добавить мета бокс в категорию и другие таксономии?

 
Итак, добавление метабокса в категорию потребует от нас 3-х функций. Начнем с добавления формы для дополнительной информации о категории на страницу добавления новой категории:

<?php
// страница добавления категории
function taxonomy_add_new_meta_field() {
	// это добавит мета-поле на страницу добавления категории
	?>
	<div class="form-field">
		<label for="term_meta[custom_term_meta]"><?php _e( 'Демо-поле', 'htmler' ); ?></label>
		<input type="text" name="term_meta[custom_term_meta]" id="term_meta[custom_term_meta]" value="">
		<p class="description"><?php _e( 'Enter a value for this field','pippin' ); ?></p>
	</div>
<?php
}
add_action( 'category_add_form_fields', 'taxonomy_add_new_meta_field', 10, 2 );

В самой функции нет ничего необычного: просто вывод поля для ввода, внимания заслуживает название экшена, на который мы навязываем эту функцию. Конкретно: category_add_form_fields. Вместо category здесь может быть совершенно любая таксономия, например bookauthor_add_form_fields или photoalbum_add_form_fields. То есть {taxonomy}_add_form_fields, где вместо {taxonomy} нужно подставить имя нужной таксономии.

Такс. Со страницей добавления категории разобрались. Теперь нужно добавить мета бокс в категорию и другие таксономии на страницу редактирования категории (таксономии).

<?php
// старница редактирования категории
function taxonomy_edit_meta_field($term) {
 
 
	// Получаем список текущих значений (возвращает массив)
	$term_meta = get_option( "taxonomy_{$term->term_id}" ); ?>
	<tr class="form-field">
	<th scope="row" valign="top"><label for="term_meta[custom_term_meta]"><?php _e( 'Демо-поле', 'htmler' ); ?></label></th>
		<td>
			<input type="text" name="term_meta[custom_term_meta]" id="term_meta[custom_term_meta]" value="<?php echo esc_attr( $term_meta['custom_term_meta'] ) ? esc_attr( $term_meta['custom_term_meta'] ) : ''; ?>">
			<p class="description"><?php _e( 'Укажите тут значение','htmler' ); ?></p>
		</td>
	</tr>
<?php
}
add_action( 'category_edit_form_fields', 'taxonomy_edit_meta_field', 10, 2 );

Тут всё аналогично, отличие только в том, что эта форма выведется на странице редактирования категории и в том, что в поле уже должно быть подставлено прежнее значение (мы получаем значение из базы), для этого в функцию WordPress передаёт объект таксономии $term.

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

function save_taxonomy_custom_meta( $term_id ) {
	if ( isset( $_POST['term_meta'] ) ) {
		$term_meta = get_option( "taxonomy_$term_id" );
		$cat_keys = array_keys( $_POST['term_meta'] );
		foreach ( $cat_keys as $key ) {
			if ( isset ( $_POST['term_meta'][$key] ) ) {
				$term_meta[$key] = $_POST['term_meta'][$key];
			}
		}
		// Save the option array.
		update_option( "taxonomy_$term_id", $term_meta );
	}
}  
add_action( 'edited_category', 'save_taxonomy_custom_meta', 10, 2 );  
add_action( 'create_category', 'save_taxonomy_custom_meta', 10, 2 );

Как видите, эту функцию мы навязываем сразу на 2 экшена, чтобы сохранять значения как формы редактирования категории, так и формы создания категории. Значения из формы мы записываем в настройки Worpdress в поле taxonomy_{id таксономии}.

Для того, чтобы на фронтенде получить эти данные для конкретной категории нужно использовать всё ту же функцию get_option:

$cat_id = get_query_var('cat');
$term_meta = get_option( "taxonomy_{$cat_id}" ); 
echo $term_meta['custom_term_meta'];

То есть мы получаем из массива переменных запроса query_var текущую категорию (если она существует), и с её помощью получаем нужные данные.
Редакция рекомендует лучшую по версии CMSMagazine платформу для быстрого создания интернет-магазинов – StoreLand. 7 лет успешной работы гарантируют стабильность работы вашего магазина. Создать магазин можно за считанные часы. А цена вас очень порадует (от 149 руб/мес).
Попробуйте сами: перейти на сайт