/ Wordpress / Metabox для таксономии

Metabox для таксономии

HIT

05.02.2017

3340

Учимся создавать метаполя для терминов таксономии, оформлять их в виде metabox’а, а также выводить их во frontend.

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

Превратить текстовое поле в стандартный визуальный редактор WP помогут плагины CategoryTinymce (для категорий), Rich Text Tags, Categories, and Taxonomies (для любых таксономий).

При использовании плагина Rich Text Tags, Categories, and Taxonomies обнаружилась проблема в том, что разрывы между абзацами не выводятся в виде тэгов p. Необходимо дополнительно подключать плагин TinyMCE Advanced и включать в нем опцию «Сохранять тэги параграфов», тогда тэги p появятся уже в админке и будут выведены на сайт. Но сами страницы необходимо обновлять.

Metabox для категории


// SEO-описание для категории

function wpm_sanitize_details( $cat_details ) {	return wp_kses_post( $cat_details ); }

add_action( 'category_edit_form_fields', 'taxonomy_edit_meta_field', 10, 2 );
function taxonomy_edit_meta_field($term) {
	
	$cat_details = get_term_meta( $term->term_id, 'details', true );

	if ( ! $cat_details ) { $cat_details = ''; }	

	$settings = array( 'textarea_name' => 'cat-details' );
	?>

	<tr class="form-field">
		<th scope="row" valign="top"><label for="cat-details">SEO-описание</label></th>
		<td>
			<?php wp_nonce_field( basename( __FILE__ ), 'cat_details_nonce' ); ?>
			<?php wp_editor( wpm_sanitize_details( $cat_details ), 'cat_details', $settings ); ?>
			<p class="description">SEO-описание должно отображаться ниже записей></p>
		</td>
	</tr>
<?php
}

add_action( 'edited_category', 'cat_details_meta_save' );
function cat_details_meta_save( $term_id ) {

	if ( ! isset( $_POST['cat_details_nonce'] ) || ! wp_verify_nonce( $_POST['cat_details_nonce'], basename( __FILE__ ) ) ) {
		return;
	}

	$old_details = get_term_meta( $term_id, 'details', true );
	$new_details = isset( $_POST['cat-details'] ) ? $_POST['cat-details'] : '';

	if ( $old_details && '' === $new_details ) {
		delete_term_meta( $term_id, 'details' );
	} else if ( $old_details !== $new_details ) {
		update_term_meta(
			$term_id,
			'details',
			wpm_sanitize_details( $new_details )
		);
	}
} 

Вывести данные метаполя

<?php $t_id = get_queried_object()->term_id;
$details = get_term_meta( $t_id, 'details', true ); ?>

<div class="product-cat-details"><?php echo apply_filters( 'the_content', wp_kses_post( $details ) ); ?></div>

Метаполе текст (строка) для категории

Несколько странный способ добавления метаполя через option, но работает! Решил оставить на будущее, возможно пригодится.

// Верстка метаполя при создании категории
function pippin_taxonomy_add_new_meta_field() {
	?>
	<div class="form-field">
		<label for="term_meta[custom_term_meta]"><?php _e( 'Example meta field', 'pippin' ); ?></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', 'pippin_taxonomy_add_new_meta_field', 10, 2 );


// Верстка метаполя при редактировании категории
function pippin_taxonomy_edit_meta_field($term) {

	$t_id = $term->term_id;

	$term_meta = get_option( "taxonomy_$t_id" ); ?>
	<tr class="form-field">
		<th scope="row" valign="top"><label for="term_meta[custom_term_meta]"><?php _e( 'Example meta field', 'pippin' ); ?></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( 'Enter a value for this field','pippin' ); ?></p>
		</td>
	</tr>
	<?php
}
add_action( 'category_edit_form_fields', 'pippin_taxonomy_edit_meta_field', 10, 2 );

// Сохранение метаполя
function save_taxonomy_custom_meta( $term_id ) {
	if ( isset( $_POST['term_meta'] ) ) {
		$t_id = $term_id;
		$term_meta = get_option( "taxonomy_$t_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_$t_id", $term_meta );
	}
}
add_action( 'edited_category', 'save_taxonomy_custom_meta', 10, 2 );
add_action( 'create_category', 'save_taxonomy_custom_meta', 10, 2 );

Вывести данные метаполя текст (строка) в шаблоне категории

<?php $t_id = get_queried_object()->term_id;
$term_meta = get_option( "taxonomy_$t_id" ); ?>

<?php echo esc_attr( $term_meta['custom_term_meta'] ) ? esc_attr( $term_meta['custom_term_meta'] ) : ''; ?>

Вывести данные метаполя текст (строка) в шаблоне записи данной категории

<?php $cat = get_the_category($post->ID);
$t_id = $cat[0]->term_id;
$term_meta = get_option( "taxonomy_$t_id" ); ?>

<?php echo esc_attr( $term_meta['custom_term_meta'] ) ? esc_attr( $term_meta['custom_term_meta'] ) : ''; ?>

Metabox для категории товаров WC

// Добавим поле SEO-описание для категорий

add_action( 'init', 'wpm_product_cat_register_meta' );
function wpm_product_cat_register_meta() { register_meta( 'term', 'details', 'wpm_sanitize_details' );}
function wpm_sanitize_details( $details ) {	return wp_kses_post( $details ); }


// Верстка поля

add_action( 'product_cat_edit_form_fields', 'wpm_product_cat_edit_details_meta' );
function wpm_product_cat_edit_details_meta( $term ) {
	$product_cat_details = get_term_meta( $term->term_id, 'details', true );

	if ( ! $product_cat_details ) {
		$product_cat_details = '';
	}

	$settings = array( 'textarea_name' => 'wpm-product-cat-details' );
	?>
	<tr class="form-field">
		<th scope="row" valign="top"><label for="wpm-product-cat-details"><?php esc_html_e( 'SEO-описание', 'wpm' ); ?></label></th>
		<td>
			<?php wp_nonce_field( basename( __FILE__ ), 'wpm_product_cat_details_nonce' ); ?>
			<?php wp_editor( wpm_sanitize_details( $product_cat_details ), 'product_cat_details', $settings ); ?>
			<p class="description"><?php esc_html_e( 'SEO-описание должно отображаться под каталогом товаров','wpm' ); ?></p>
		</td>
	</tr>
	<?php
}


// Сохранение поля

add_action( 'edit_product_cat', 'wpm_product_cat_details_meta_save' );
function wpm_product_cat_details_meta_save( $term_id ) {

	if ( ! isset( $_POST['wpm_product_cat_details_nonce'] ) || ! wp_verify_nonce( $_POST['wpm_product_cat_details_nonce'], basename( __FILE__ ) ) ) {
		return;
	}

	$old_details = get_term_meta( $term_id, 'details', true );
	$new_details = isset( $_POST['wpm-product-cat-details'] ) ? $_POST['wpm-product-cat-details'] : '';

	if ( $old_details && '' === $new_details ) {
		delete_term_meta( $term_id, 'details' );
	} else if ( $old_details !== $new_details ) {
		update_term_meta(
			$term_id,
			'details',
			wpm_sanitize_details( $new_details )
		);
	}
}



// Вывод поля в шаблоне категории

add_action( 'woocommerce_after_shop_loop', 'wpm_product_cat_display_details_meta' );
function wpm_product_cat_display_details_meta() {

	if ( ! is_tax( 'product_cat' ) ) {
		return;
	}

	$t_id = get_queried_object()->term_id;
	$details = get_term_meta( $t_id, 'details', true );

	if ( '' !== $details ) {
		?>
		<div class="product-cat-details area">
			<?php echo apply_filters( 'the_content', wp_kses_post( $details ) ); ?>
		</div>
		<?php
	}

}

Смотрите также: Метабокс-загрузчик для таксономии (add_term_meta())

Группа чекбоксов (multiple checkbox) для категории товаров

// Верстка метаполя при редактировании категории
function pippin_taxonomy_edit_meta_field($term) {

	$term_level = get_term_meta( $term->term_id, 'term_level', true );
	
    $elements = array(
		'lvl-newbie' => 'Для новичков',
        'lvl-master' => 'Для мастеров',
		'lvl-parter' => 'Для партнеров',
        'lvl-technolog' => 'Для технологов',
    ); ?>
	
	<tr class="form-field">
		<th scope="row" valign="top"><label><?php _e( 'Аудитория курса', 'pippin' ); ?></label></th>
		<td>
		
    <?php foreach ( $elements as $elementKey => $elementValue) {

		if (!empty($term_level)) {
			if ( in_array( $elementKey, $term_level ) ) { $checked = 'checked="checked"'; } 
			else { $checked = null; }
		} ?>

        <label>
		<input  type="checkbox" name="term_level[]" value="<?php echo $elementKey; ?>" <?php echo $checked; ?> /><?php echo $elementValue; ?>
		</label>

    <?php } ?>		
		
			<p class="description"><?php _e( 'Выберите аудиторию курсов','pippin' ); ?></p>
		</td>
	</tr>
	<?php
}
add_action( 'product_cat_edit_form_fields', 'pippin_taxonomy_edit_meta_field', 10, 2 );

// Сохранение метаполя
function save_taxonomy_custom_meta( $term_id ) {
	
	if ( isset( $_POST['term_level'] ) ) {
		update_term_meta($term_id, 'term_level', $_POST['term_level']);
	} else {
		delete_term_meta($term_id, 'term_level');
	}

}
add_action( 'edit_product_cat', 'save_taxonomy_custom_meta', 10, 2 );

Вывод данного поля

<?php $levels = get_term_meta( $term->term_id, 'term_level', 1 );
if (!empty($levels)) { $levels_str = implode(" ", $levels); } else { $levels_str = ""; } 
echo $levels_str; ?>

Поделиться в соц. сетях:

  • Похожие записи
  • Комментарии
  • Вложения
Создание metabox’а

Создание metabox’а

Metabox — это произвольное поле реализованное в виде специальной формы (оболочка для PostMeta). Создание metabox’а самостоятельно — лучшая альтернатива плагину Advanced custom fields, особенно для релизации доп.полей в плагинах. Создание Читать далее »

Продвинутые metabox

Продвинутые metabox

Существую станданртные metabox: text, textarea (область текста), checkbox, radiobutton, selectbox (выпадающий список). Но помимо этих существуют более сложные metabox’ы, рассмотрим их. Metabox редактор WYSIWYG (старый способ) Metabox редактор WYSIWYG (новый Читать далее »

Загрузчик изображений для таксономии

Загрузчик изображений для таксономии

Создаем загрузчик изображений для термина таксономии. Данный пост содержит чистый метод создания metabox для термина таксономии. Есть более универсальный метод добавления изображений терминам, но нижеописанный способ может стать дополнительным, когда Читать далее »

/

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

Пока нет комментариев. Будь первым!

Metabox для таксономии
Динамическая цена
Рекомендации для васДинамическая ценаOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.