Добавление полей на экран редактирования категорий, меток и пользовательских таксономий в админке WordPress
Вопрос заключается в следующем: "Как добавить одно или несколько полей на экран редактирования категорий, меток и пользовательских таксономий в админке WordPress?" Этот вопрос был задан в списке wp-hackers 1 августа 2010 года, и я предложил решение в тот же день. Автор вопроса снова поднял эту тему сегодня (21 августа), что напомнило мне о решении. Поскольку это может быть распространенной потребностью, я решил опубликовать здесь решение, включая код, чтобы другие могли найти его в будущем.

Я добавил новое поле 'picture' (тип input file) к категории с помощью следующего кода:
add_action('category_edit_form_fields','category_edit_form_fields');
add_action('category_edit_form', 'category_edit_form');
add_action('category_add_form_fields','category_edit_form_fields');
add_action('category_add_form','category_edit_form');
function category_edit_form() {
?>
<script type="text/javascript">
jQuery(document).ready(function(){
jQuery('#edittag').attr( "enctype", "multipart/form-data" ).attr( "encoding", "multipart/form-data" );
});
</script>
<?php
}
function category_edit_form_fields () {
?>
<tr class="form-field">
<th valign="top" scope="row">
<label for="catpic"><?php _e('Изображение категории', ''); ?></label>
</th>
<td>
<input type="file" id="catpic" name="catpic"/>
</td>
</tr>
<?php
}
Вы можете использовать любую таксономию, просто замените category
на название вашей таксономии

это отлично, но не могли бы вы объяснить (или, возможно, привести пример), как правильно интегрировать эту настройку, если вы хотите добавить ее к пользовательской таксономии — например, "люди"

Обновление — хотя я скопировал ваш точный код выше, чтобы протестировать это, файл, кажется, не сохраняется или, по крайней мере, не отображается. Не могли бы вы объяснить, где он сохраняет файл, возможно, нужно изменить разрешения этой папки (или, еще лучше, не могли бы вы описать, как изменить расположение папки, в которую он сохраняется?). Когда я выбираю файл и пытаюсь сохранить термин, все сохраняется, кроме файла, и, следовательно, изображение, которое я загружал, не отображается.

Также, если вы хотите добавить это поле в форму пользовательской таксономии, просто замените category на имя вашей таксономии в функции add_action
.
Пример:
add_action('{custom_taxonomy}_edit_form_fields','category_edit_form_fields');
add_action('{custom_taxonomy}_edit_form', 'category_edit_form');
add_action('{custom_taxonomy}_add_form_fields','category_edit_form_fields');
add_action('{custom_taxonomy}_add_form','category_edit_form');

Я добавил дополнительные поля для добавления и удаления изображения в пользовательскую таксономию под названием "insurance".
/**
* Класс плагина
**/
if ( ! class_exists( 'CT_TAX_META' ) ) {
class CT_TAX_META {
public function __construct() {
//
}
/*
* Инициализация класса и подключение хуков и фильтров
* @since 1.0.0
*/
public function init() {
add_action( 'insurance_add_form_fields', array ( $this, 'add_category_image' ), 10, 2 );
add_action( 'created_insurance', array ( $this, 'save_category_image' ), 10, 2 );
add_action( 'insurance_edit_form_fields', array ( $this, 'update_category_image' ), 10, 2 );
add_action( 'edited_insurance', array ( $this, 'updated_category_image' ), 10, 2 );
add_action( 'admin_enqueue_scripts', array( $this, 'load_media' ) );
add_action( 'admin_footer', array ( $this, 'add_script' ) );
}
public function load_media() {
wp_enqueue_media();
}
/*
* Добавление поля формы на странице создания новой категории
* @since 1.0.0
*/
public function add_category_image ( $taxonomy ) { ?>
<div class="form-field term-group">
<label for="category-image-id"><?php _e('Изображение', 'hero-theme'); ?></label>
<input type="hidden" id="category-image-id" name="category-image-id" class="custom_media_url" value="">
<div id="category-image-wrapper"></div>
<p>
<input type="button" class="button button-secondary ct_tax_media_button" id="ct_tax_media_button" name="ct_tax_media_button" value="<?php _e( 'Добавить изображение', 'hero-theme' ); ?>" />
<input type="button" class="button button-secondary ct_tax_media_remove" id="ct_tax_media_remove" name="ct_tax_media_remove" value="<?php _e( 'Удалить изображение', 'hero-theme' ); ?>" />
</p>
</div>
<?php
}
/*
* Сохранение поля формы
* @since 1.0.0
*/
public function save_category_image ( $term_id, $tt_id ) {
if( isset( $_POST['category-image-id'] ) && '' !== $_POST['category-image-id'] ){
$image = $_POST['category-image-id'];
add_term_meta( $term_id, 'category-image-id', $image, true );
}
}
/*
* Редактирование поля формы
* @since 1.0.0
*/
public function update_category_image ( $term, $taxonomy ) { ?>
<tr class="form-field term-group-wrap">
<th scope="row">
<label for="category-image-id"><?php _e( 'Изображение', 'hero-theme' ); ?></label>
</th>
<td>
<?php $image_id = get_term_meta ( $term -> term_id, 'category-image-id', true ); ?>
<input type="hidden" id="category-image-id" name="category-image-id" value="<?php echo $image_id; ?>">
<div id="category-image-wrapper">
<?php if ( $image_id ) { ?>
<?php echo wp_get_attachment_image ( $image_id, 'thumbnail' ); ?>
<?php } ?>
</div>
<p>
<input type="button" class="button button-secondary ct_tax_media_button" id="ct_tax_media_button" name="ct_tax_media_button" value="<?php _e( 'Добавить изображение', 'hero-theme' ); ?>" />
<input type="button" class="button button-secondary ct_tax_media_remove" id="ct_tax_media_remove" name="ct_tax_media_remove" value="<?php _e( 'Удалить изображение', 'hero-theme' ); ?>" />
</p>
</td>
</tr>
<?php
}
/*
* Обновление значения поля формы
* @since 1.0.0
*/
public function updated_category_image ( $term_id, $tt_id ) {
if( isset( $_POST['category-image-id'] ) && '' !== $_POST['category-image-id'] ){
$image = $_POST['category-image-id'];
update_term_meta ( $term_id, 'category-image-id', $image );
} else {
update_term_meta ( $term_id, 'category-image-id', '' );
}
}
/*
* Добавление скрипта
* @since 1.0.0
*/
public function add_script() { ?>
<script>
jQuery(document).ready( function($) {
function ct_media_upload(button_class) {
var _custom_media = true,
_orig_send_attachment = wp.media.editor.send.attachment;
$('body').on('click', button_class, function(e) {
var button_id = '#'+$(this).attr('id');
var send_attachment_bkp = wp.media.editor.send.attachment;
var button = $(button_id);
_custom_media = true;
wp.media.editor.send.attachment = function(props, attachment){
if ( _custom_media ) {
$('#category-image-id').val(attachment.id);
$('#category-image-wrapper').html('<img class="custom_media_image" src="" style="margin:0;padding:0;max-height:100px;float:none;" />');
$('#category-image-wrapper .custom_media_image').attr('src',attachment.url).css('display','block');
} else {
return _orig_send_attachment.apply( button_id, [props, attachment] );
}
}
wp.media.editor.open(button);
return false;
});
}
ct_media_upload('.ct_tax_media_button.button');
$('body').on('click','.ct_tax_media_remove',function(){
$('#category-image-id').val('');
$('#category-image-wrapper').html('<img class="custom_media_image" src="" style="margin:0;padding:0;max-height:100px;float:none;" />');
});
// Благодарность: http://stackoverflow.com/questions/15281995/wordpress-create-category-ajax-response
$(document).ajaxComplete(function(event, xhr, settings) {
var queryStringArr = settings.data.split('&');
if( $.inArray('action=add-tag', queryStringArr) !== -1 ){
var xml = xhr.responseXML;
$response = $(xml).find('term_id').text();
if($response!=""){
// Очищаем миниатюру
$('#category-image-wrapper').html('');
}
}
});
});
</script>
<?php }
}
$CT_TAX_META = new CT_TAX_META();
$CT_TAX_META -> init();
}
Примечание: Если вы хотите добавить это поле для другой таксономии, например для пользовательского типа записи, вам нужно заменить ссылку на категорию ссылкой на ваш собственный слаг таксономии. Например, если вы создали таксономию "жанр", вы должны подключить эту функцию через:
add_action( 'taxonomy_add_form_fields', array ( $this, 'add_category_image' ), 10, 2 ).
Мой слаг таксономии называется "insurance".
add_action( 'insurance_add_form_fields', array ( $this, 'add_category_image' ), 10, 2 );
Используйте этот код в вашем файле functions.php
.

Я понимаю, что этот вопрос задавался давно, но WordPress с тех пор немного изменился, поэтому я решил разработать небольшой скрипт, который упрощает процесс добавления пользовательских полей к таксономиям и, опционально, позволяет добавлять столбцы в таблицу терминов для каждого поля. Скрипт называется amarkal-taxonomy и является частью фреймворка Amarkal для WordPress.
Используя amarkal-taxonomy
, добавление пользовательского поля сводится к следующему:
// Добавляем текстовое поле в формы 'add' и 'edit' таксономии 'category':
amarkal_taxonomy_add_field('category', 'cat_icon', array(
'type' => 'text',
'label' => 'Иконка',
'description' => 'Иконка категории',
'table' => array(
'show' => true, // Добавить столбец в таблицу терминов
'sortable' => true // Сделать столбец сортируемым
)
));
// Затем вы можете получить данные с помощью:
$icon = get_term_meta( $term_id, 'cat_icon', true );

Вам нужно добавить свой код в файл functions.php вашей темы. Если вы хотите добавить это поле в форму пользовательской таксономии, просто замените "category" на название вашей пользовательской таксономии в функции add_action.
Пример:
add_action('category_edit_form_fields','category_edit_form_fields');
превратится в
add_action('custom_taxonomy_name_form_fields','function_name_to_hook_on');

Я использую плагин Category Meta. Работает со всеми пользовательскими таксономиями, метками и категориями.
