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

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

HIT

05.02.2017

3518

Учимся создавать метаполя для терминов таксономии, оформлять их в виде 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; ?>
[site-socialshare]
  • Похожие записи
  • Комментарии
  • Вложения
Metabox woocommerce

Metabox woocommerce

У плагина woocommerce есть набор дополнительных полей при редактировании товара. При необходимости можно в группы полей WC добавить свои произвольные metabox. Должно получится так: Создание и отображение metabox Первый экшн Читать далее »

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

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

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

Создание metabox

Создание metabox

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

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

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

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