/ Wordpress / Метаполе для термина таксономии

Метаполе для термина таксономии

HIT

16.04.2017

1697

Некоторое время назад мною был размещен пост на тему Metabox для таксономии. В основном он содержит некоторые готовые решения, без подробностей. В данной статье мы более детально рассмотрим процесс создания метаполя для таксономии. Также научимся внедрять метаполя в другие функции wordpress по работе с терминами таксономий.

Функционал метаполей терминов таксономии

Для удобной работы с метаполями терминов будем использовать Класс созданный Мишей Рудастых и доработанный Kama (спасибо им за это). Можно вставить его в functions.php, либо сделать на его основе плагин (второе предпочтительнее):

Данный функционал нормально работает с версии WordPress 4.4. Для более ранних версий нужно самим создавать таблицы в базе данных.
class trueTaxonomyMetaBox {
	private $opt;
	private $prefix;

	function __construct( $option ) {
		$this->opt = (object) $option;
		$this->prefix = $this->opt->id .'_'; // префикс настроек

		foreach( $this->opt->taxonomy as $taxonomy ){
			add_action( $taxonomy . '_edit_form_fields', array( &$this, 'fill'), 10, 2 ); // хук добавления полей
		}

		// установим таблицу в $wpdb, если её нет
		global $wpdb;
		if( ! isset( $wpdb->termmeta ) ) $wpdb->termmeta = $wpdb->prefix .'termmeta';

		add_action('edit_term', array( &$this, 'save'), 10, 1 ); // хук сохранения значений полей
	}

	function fill( $term, $taxonomy ){

		foreach( $this->opt->args as $param ){
			$def = array('id'=>'', 'title'=>'', 'type'=>'', 'desc'=>'', 'std'=>'', 'args'=>array() );
			$param = (object) array_merge( $def, $param );

			$meta_key = $this->prefix . $param->id;
			$meta_value = get_metadata('term', $term->term_id, $meta_key, true ) ?: $param->std;

			echo '<tr class ="form-field">';
			echo '<th scope="row"><label for="'. $meta_key .'">'. $param->title .'</label></th>';
			echo '<td>';

			// wisiwig
			if( $param->type == 'wp_editor' ){
				wp_editor( $meta_value, $meta_key, array(
					'wpautop' => 1,
					'media_buttons' => false,
					'textarea_name' => $meta_key, //нужно указывать!
					'textarea_rows' => 10,
					//'tabindex' => null,
					//'editor_css' => '',
					//'editor_class' => '',
					'teeny' => 0,
					'dfw' => 0,
					'tinymce' => 1,
					'quicktags' => 1,
					//'drag_drop_upload' => false
				) );
			}

			// select
			elseif( $param->type == 'select' ){
				echo '<select name="'. $meta_key .'" id="'. $meta_key .'"><option value="">...</option>';

				foreach( $param->args as $val => $name ){
					echo '<option value="'. $val .'" '. selected( $meta_value, $val, 0 ) .'>'. $name .'</option>';
				}
				echo '</select>';
				if( $param->desc ) echo '<p class="description">' . $param->desc . '</p>';
			}

			// checkbox
			elseif( $param->type == 'checkbox' ){
				echo '
				<label>
				<input type="hidden" name="'. $meta_key .'" value="">
				<input name="'. $meta_key .'" type="'. $param->type .'" id="'. $meta_key .'" '. checked( $meta_value, 'on', 0) .'>
				'. $param->desc .'
				</label>
				';
			}

			// textarea
			elseif( $param->type == 'textarea' ){
				echo '<textarea name="'. $meta_key .'" type="'. $param->type .'" id="'. $meta_key .'" value="'. $meta_value .'" class="large-text">'. esc_html( $meta_value ) .'</textarea>';
				if( $param->desc ) echo '<p class="description">' . $param->desc . '</p>';
			}

			// text
			else{
				echo '<input name="'. $meta_key .'" type="'. $param->type .'" id="'. $meta_key .'" value="'. $meta_value .'" class="regular-text">';

				if( $param->desc ) echo '<p class="description">' . $param->desc . '</p>';
			}
			echo '</td>';
			echo '</tr>';
		}

	}

	function save( $term_id ){
		foreach( $this->opt->args as $field ){
			$meta_key = $this->prefix . $field['id'];
			if( ! isset($_POST[ $meta_key ]) ) continue;

			if( $meta_value = trim($_POST[ $meta_key ]) ){
				update_metadata('term', $term_id, $meta_key, $meta_value, '');
			}
			else {
				delete_metadata('term', $term_id, $meta_key, '', false );
			}
		}
	}

}

Данный класс фактически создает нам быстрый инструмент для создания метаполей терминов таксономии. В нашем инструменте есть следующие типы полей: text, textarea, select, checkbox.

Создание метаполя термина таксономии

add_action('init', 'register_additional_term_fields');

function register_additional_term_fields(){
	new trueTaxonomyMetaBox( array(
		'id' => 'impadeg', // id играет роль префикса названий полей
		'taxonomy' => array('category'), // названия таксономий, для которых нужно добавить ниже перечисленные поля
		'args' => array(
			array(
				'id' => 'impadeg', // атрибуты name и id без префикса, получится "impadeg_impadeg"
				'title' => 'Им.п.',
				'type' => 'text',
				'desc' => 'Наименование в родительном падеже',
				'std' => '', // по умолчанию
			)
		)
	) );
}

Можно создавать несколько полей одновременно

add_action('init', 'register_additional_term_fields');
function register_additional_term_fields(){ 
	new trueTaxonomyMetaBox( array(
		'id' => 'txseo', // id играет роль префикса названий полей
		'taxonomy' => array('category','post_tag'), // названия таксономий, для которых нужно добавить ниже перечисленные поля
		'args' => array(
			array(
				'id' => 'seo_title', // атрибуты name и id без префикса, получится "txseo_seo_title"
				'title' => 'SEO Заголовок',
				'type' => 'text',
				'desc' => 'Укажите альтернативное название термина для SEO.',
				'std' => '', // по умолчанию
			),
			array(
				'id' => 'seo_description',
				'title' => 'SEO Описание',
				'type' => 'text',
				'desc' => 'meta тег description.',
				'std' => '', // по умолчанию
			)
		)
	) );
}

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

Благодаря тому, что с версии WP 4.4 данный функционал стал поддерживаться системой, вызовы стали проще. Для вызова нам достаточно знать id термина таксономии. Вывод происходит аналогично выводу метаполей записи.

<?php echo get_term_meta( $category_id, 'impadeg_impadeg', 1 ); ?>

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

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

<?php echo get_term_meta( $t_id, 'impadeg_impadeg', 1 ); ?>

Создание колонки с данными метаполя

// Создание колонки метаданных таксономии

function my_column_header($columns) {
    $columns['impadeg'] = __('Им.п.', 'my_plugin');
    return $columns;
}
add_filter('manage_edit-category_columns', 'my_column_header', 10, 1);


// Заполнение колонки метаданных таксономии

function my_column_value( $content, $column_name, $term_id ) {

  if ( 'impadeg' == $column_name ){

		$content = get_term_meta( $term_id, 'impadeg_impadeg', 1 );

		}
		return $content;
	}

add_filter( 'manage_category_custom_column', 'my_column_value', 10, 3 );

Метаполе в панели быстрого редактирования термина

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

function my_quick_edit_custom_box($column_name, $screen, $name) {
	if('impadeg' == $column_name) {
		?>
		<fieldset>
			<div id="my-custom-content" class="inline-edit-col">
				<label>
					<span class="title"><?php if($column_name == 'impadeg') _e('Им.п.', 'my_plugin'); ?></span>
					<span class="input-text-wrap"><input type="text" name="<?php echo $column_name; ?>" class="ptitle" value=""></span>
				</label>
			</div>
		</fieldset>
		<?php
	}
}

add_action('quick_edit_custom_box', 'my_quick_edit_custom_box', 10, 3);

Чтобы в данное поле подставлялось текущее значение поля, нужно создать скрипт quick-metafield-edit.js, закачать его в скрипты (js) темы и подключить его специальной функцией, чтоб он запускался в админке на определенной странице.

Сам скрипт:

jQuery(document).ready(function(){
    jQuery('.editinline').click (function(){
        var tag_id = jQuery(this).parents('tr').attr('id');
        var impadeg = jQuery('.impadeg', '#'+tag_id).text();
        jQuery(':input[name="impadeg"]', '.inline-edit-row').val(impadeg);
    });
});

Функция подключения:

// Заполнение поля в панели быстрого редактора (подключаем скрипт)

function my_add_admin_scripts() {
  global $pagenow;
     
  if($pagenow == 'edit-tags.php' && (isset($_GET['taxonomy']) && $_GET['taxonomy'] == 'category') && !isset($_GET['action']))  
  {
	wp_enqueue_script( 'quick-edit', get_template_directory_uri() . '/js/quick-edit.js' , 'jquery', '1.0' , true );
  }

}
add_action('admin_enqueue_scripts', 'my_add_admin_scripts', 10, 1);
Небольшая неисправность: при повторном включении панели быстрого редактирования значения поля остается первоначальным. Но при обновлении — значение поля сохраняется. Происходит это скорее всего из-за того, что что-то меняется в стилях после обновления поля. Надо доработать!

Осталось добавить функцию сохранения

function my_save_term_meta($term_id) {
    $allowed_html = array(
        'b' => array(),
        'em' => array (), 
        'i' => array (),
        'strike' => array(),
        'strong' => array(),
    );
    if(isset($_POST['impadeg'])) 
        update_term_meta($term_id, 'impadeg_impadeg', wp_kses($_POST['impadeg'], $allowed_html));     
}

add_action('edited_category', 'my_save_term_meta', 10, 1);

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

  • Комментарии
  • Вложения

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

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

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