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