Добавление полей на экран редактирования категорий, меток и пользовательских таксономий в админке WordPress

22 авг. 2010 г., 07:46:18
Просмотры: 43K
Голосов: 37

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

8
Комментарии

Привет, Майк, я думаю, будет лучше, если ты опубликуешь код в поле ответа. Так у нас будет резервная копия здесь, на случай если github упадёт.

ariefbayu ariefbayu
22 авг. 2010 г. 11:13:08

@silent: Эй, я работаю над этим. :) Я уже на половине пути, но упёрся в стену и мне нужно поспать. Вот как это будет выглядеть (примерно), когда я закончу: http://wordpress.stackexchange.com/questions/578/#582

MikeSchinkel MikeSchinkel
22 авг. 2010 г. 11:28:31

Есть какие-то новые подвижки по этому вопросу? Я, честно говоря, довольно заинтересован... :D

John P Bloch John P Bloch
28 сент. 2010 г. 00:19:19

Эй @John P Bloch: Мои клиенты прижали меня, и у меня просто не было времени. Надеюсь, скоро...

MikeSchinkel MikeSchinkel
28 сент. 2010 г. 10:14:04

@John P Bloch Я действительно попробовал, и это работает отлично, мне нужно было "сгруппировать" определённые категории без родительской категории.

Amit Amit
29 сент. 2010 г. 00:21:57

@Mike: Можем ли мы придать этому импульс? Я не до конца понимаю вопрос, так что, возможно, ты можешь привести пример?

hakre hakre
25 дек. 2010 г. 15:23:45

@hakre - И тебе счастливых праздников! ;) (Мне очень легко терять из виду вещи, которые я собирался сделать здесь на WA, потому что их система не предоставляет удобного способа отслеживать их. Я бы сделал сейчас, но у меня рождественский ужин, на который нужно идти, так что придется отложить на потом.)

MikeSchinkel MikeSchinkel
25 дек. 2010 г. 22:32:20

Смотри мой ответ здесь: http://wordpress.stackexchange.com/questions/29322/add-custom-taxonomy-fields-when-creating-a-new-taxonomy/41483#41483

Aram Kocharyan Aram Kocharyan
7 февр. 2012 г. 12:36:26
Показать остальные 3 комментариев
Все ответы на вопрос 7
2
25

Я добавил новое поле '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 на название вашей таксономии

19 янв. 2011 г. 13:26:53
Комментарии

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

NetConstructor.com NetConstructor.com
19 янв. 2011 г. 13:48:40

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

NetConstructor.com NetConstructor.com
19 янв. 2011 г. 13:56:47
0
11

Также, если вы хотите добавить это поле в форму пользовательской таксономии, просто замените 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');
26 окт. 2011 г. 04:53:39
0

Я добавил дополнительные поля для добавления и удаления изображения в пользовательскую таксономию под названием "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.

14 мар. 2018 г. 14:33:13
0

Для тех, кто хочет подключиться к полю формы тега, хук немного отличается.

add_tag_form_fields

вместо ожидаемого tag_add_form_fields, как можно было бы предположить

28 сент. 2013 г. 01:03:17
0

Я понимаю, что этот вопрос задавался давно, но 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 );
22 мар. 2017 г. 17:41:31
0

Вам нужно добавить свой код в файл 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');
4 мар. 2011 г. 08:02:55
0

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

5 февр. 2012 г. 16:25:27