/ Сайтостроение / Wordpress / Metabox для таксономии

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

05.02.2017

907

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

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

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

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

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

// Создание метаполя

add_action( 'init', 'wpm_category_register_meta' );

function wpm_category_register_meta() {
register_meta( 'term', 'details', 'wpm_sanitize_details' );
}

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

// Создание метабокса в категории товара

add_action( 'category_edit_form_fields', 'wpm_category_edit_details_meta' );

function wpm_category_edit_details_meta( $term ) {
$category_details = get_term_meta( $term->term_id, 'details', true );
if ( ! $category_details ) {
$category_details = '';
}
$settings = array( 'textarea_name' => 'wpm-category-details' );
?>
<tr class="form-field">
<th scope="row" valign="top"><label for="wpm-category-details"><?php esc_html_e( 'Наименование (им.п.)', 'wpm' ); ?></label></th>
<td>
<?php wp_nonce_field( basename( __FILE__ ), 'wpm_category_details_nonce' ); ?>
<?php wp_editor( wpm_sanitize_details( $category_details ), 'category_details', $settings ); ?>
<p class="description"><?php esc_html_e( 'Вписать название категории в родительном падеже','wpm' ); ?></p>
</td>
</tr>
<?php
}

// Сохранение данных метаполя

add_action( 'create_category', 'wpm_category_details_meta_save' );
add_action( 'edit_category', 'wpm_category_details_meta_save' );

function wpm_category_details_meta_save( $term_id ) {
if ( ! isset( $_POST['wpm_category_details_nonce'] ) || ! wp_verify_nonce( $_POST['wpm_category_details_nonce'], basename( __FILE__ ) ) ) {
return;
}
$old_details = get_term_meta( $term_id, 'details', true );
$new_details = isset( $_POST['wpm-category-details'] ) ? $_POST['wpm-category-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() {
// this will add the custom meta field to the add new term page
?>
<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) {

// put the term ID into a variable
$t_id = $term->term_id;

// retrieve the existing value(s) for this meta field. This returns an array
$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

//Создание метаполя

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( 'Details', '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( 'Detailed category info to appear below the product list','wpm' ); ?></p>
		</td>
	</tr>
	<?php
}


// Создание метабокса при создании новой категорий товара

add_action( 'product_cat_add_form_fields', 'wpm_product_cat_add_details_meta' );

function wpm_product_cat_add_details_meta() {
	wp_nonce_field( basename( __FILE__ ), 'wpm_product_cat_details_nonce' );
	?>
	<div class="form-field">
		<label for="wpm-product-cat-details"><?php esc_html_e( 'Details', 'wpm' ); ?></label>
		<textarea name="wpm-product-cat-details" id="wpm-product-cat-details" rows="5" cols="40"></textarea>
		<p class="description"><?php esc_html_e( 'Detailed category info to appear below the product list', 'wpm' ); ?></p>
	</div>
	<?php
}


// Сохранение данных метаполя

add_action( 'create_product_cat', 'wpm_product_cat_details_meta_save' );
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">
			<?php echo apply_filters( 'the_content', wp_kses_post( $details ) ); ?>
		</div>
		<?php
	}
}

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

Тэги:

Поделится информацией с друзьями

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

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

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

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

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

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

/
Создание metabox’а

Создание metabox’а

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

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

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

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