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

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

16.04.2017

773

Некоторое время назад мною был размещен пост на тему 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>';

// select
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);

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

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

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

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

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