Некоторое время назад мною был размещен пост на тему Metabox для таксономии. В основном он содержит некоторые готовые решения, без подробностей. В данной статье мы более детально рассмотрим процесс создания метаполя для таксономии. Также научимся внедрять метаполя в другие функции wordpress по работе с терминами таксономий.
Функционал метаполей терминов таксономии
Для удобной работы с метаполями терминов будем использовать Класс созданный Мишей Рудастых и доработанный Kama (спасибо им за это). Можно вставить его в functions.php, либо сделать на его основе плагин (второе предпочтительнее):
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);