Как добавить произвольные поля к категории в вордпресс?

Решено

Мне нужно добавить дополнительный текст и изображение в категорию вордпресс. Что бы при создании новой категории была возможность загрузить свое изображение и прописать еще один текст кроме описания категории. Скаите можно ли вообще добавлять произвольные поля к категориям? Как добавить свои произвольные поля в стандартный раздел категорий category?

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

    Для того что бы добавить свои произвольные поля в категории вордпресс(таксономия category) нужно приписать следующий код в файле functions.php который расположен в папке с вашим шаблоном.

     // добавляет вызов функции при инициализации административного раздела
     add_action('admin_init', 'category_custom_fields', 1);
    // функция расширения функционала административного раздела
     function category_custom_fields() {
     // добавления действия после отображения формы ввода параметров категории
     add_action('lift_edit_form_fields', 'category_custom_fields_form');
     // add_action('cat_add_form_fields', 'category_custom_fields_form');   - можно добавить поля при создании категории, но могут быть проблемы, так как категории сохраняются через ajax
     // добавления действия при сохранении формы ввода параметров категории
     add_action('edited_lift', 'category_custom_fields_save');
     }
     

    С помощью данного кода мы добавим произвольные поля к таксономии lift. Если вам нужно добавить для категорий замените lift на caregory. Пример:

     function category_custom_fields() {
     add_action('category_edit_form_fields', 'category_custom_fields_form');
     add_action('edited_category', 'category_custom_fields_save');
     }
     

    Далее добавим 2 поля для изображения и для текста в раздел редактирования таксономии(категории)

     function category_custom_fields_form($tag) {
     $t_id = $tag->term_id;
     $cat_meta = get_option("category_$t_id");
     ?>
     <!-- изображение 1 -->
     <tr class="form-field">
     <th scope="row" valign="top"><label for="extra1">Изображение:</label></th>
     <td>
     <a href="#" class="upload_cat_img">Загрузить</a>
     <input class="cat_img" type="text" name="Cat_meta[cat_title]" id="Cat_meta[cat_title]" size="25" style="width:60%;" value="<?php
     echo
     $cat_meta['cat_title'] ? $cat_meta['cat_title'] : '';
     ?>"><br />
     </td>
     </tr>
     <!-- текст -->
     <tr class="form-field">
     <th scope="row" valign="top"><label for="extra1">Текст 1:</label></th>
     <td>
     <textarea name="Cat_meta[cat_text1]" id="Cat_meta[cat_text1]"><?php echo $cat_meta['cat_text1'] ? $cat_meta['cat_text1'] : ''; ?></textarea>
     <!--<input class="cat_img" type="text" name="Cat_meta[cat_title]" id="Cat_meta[cat_title]" size="25" style="width:60%;" value="<?php
     echo
     $cat_meta['cat_title'] ? $cat_meta['cat_title'] : '';
     ?>"> -->
     <br />
     </td>
     </tr>
     <?php
     }
     

    Теперь нам нужно написать обработчик который будет сохранять наши поля:

     function category_custom_fields_save($term_id) {
     if (isset($_POST['Cat_meta'])) {
     $t_id = $term_id;
     $cat_meta = get_option("category_$t_id");
     $cat_keys = array_keys($_POST['Cat_meta']);
     foreach ($cat_keys as $key) {
     if (isset($_POST['Cat_meta'][$key])) {
     $cat_meta[$key] = $_POST['Cat_meta'][$key];
     }
     }
     //save the option array
     update_option("category_$t_id", $cat_meta);
     }
     }
     

    Теперь для того что бы загружать изображения с помощью стандартного загрузчика вордпресс нам нужно подключить js файл в котором мы будет вызывать загрузчик и сохранять адрес изображения в наше поле.
    Подключим файл:

     // add js scripts
     wp_enqueue_script('te_portfolio_admin_js', get_bloginfo('template_url') . '/settings.js', array('jquery'), false, true);
     

    Сам js файл дожен содержать следующий код:

     jQuery(function() {
     /* add category img */
     jQuery('.upload_cat_img').click(function() {
     var send_attachment_bkp = wp.media.editor.send.attachment;
     wp.media.editor.send.attachment = function(props, attachment) {
     jQuery('.cat_img').val(attachment.url);
     wp.media.editor.send.attachment = send_attachment_bkp;
     };
     wp.media.editor.open();
     return false;
     });
     

    Файл js должен называться settings.js и лежать в одном каталоге с functions.php

    Теперь осталось вывести в нужном месте наши данные которые уже сохраняются при редактировании таксономии(категории)

    $term = get_queried_object();
     $cat_id = $term->term_id; // $term->term_id - это id таксономии или категории
     // извлекаем данные наших произвольных полей для категории
     $cat_data = get_option("category_$cat_id");
     // Пример вывода текстового поля
     echo $cat_data['cat_title'];
     

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

    Добрый день, спасибо за этот ответ. Поля вывелись но вот загрузчик изображения не работает, в консоли при нажатии а кнопку «Загрузить» появляется ошибка: Uncaught TypeError: Cannot read property ‘editor’ of undefined

    Подскажите, как исправить эту проблему?

    Посмотрите другие вопросы:
    Загрузчик вордпресс

    В частности:
    http://onwp.ru/question/funkciya-vyzova-zagruzchika-vordpress— тут используется немного другой код ля подключения загрузчика.

    в 01.02.2016.

    Здравствуйте. Помогите, пожалуйста, что нужно сделать для добавления картинки, как произвольного поля?

     

    в 05.05.2019.
    Добавить Комментарий

    trubine, большое спасибо, все заработало, теперь другая проблема: на странице таксономии я не могу получить данные произвольных полей, все упирается в id таксономии и я не знаю откуда его взять. Помогите пожалуйста решить этот вопрос.

    Задайте отдельный вопрос и распишите его более подробно.

    в 01.02.2016.
    Добавить Комментарий

    Все сделал по инструкции, вывод на фронте в категории не работает 🙁

     $term = get_queried_object();
     $cat_id = $term->term_id; // $term->term_id - это id таксономии или категории
     // извлекаем данные наших произвольных полей для категории
     $cat_data = get_option("category_$cat_id");
     // Пример вывода текстового поля
     echo $cat_data['cat_title'];
     

    или

    $categories = get_the_category();
     $cat_id = $categories[0]->cat_ID; // $term->term_id - это id таксономии или категории
     // извлекаем данные наших произвольных полей для категории
     $cat_data = get_option("category_$cat_id");
     // Пример вывода текстового поля
     echo $cat_data['cat_title'];
    
    в 08.04.2016.

    Доброго вам времени суток! Может я что-то не так делаю, или не так понял, но очень нужно решить проблему.
    добавляю в functions.php этот код

    add_action('admin_init', 'category_custom_fields', 1);
    function category_custom_fields() {
        add_action('category_edit_form_fields', 'category_custom_fields_form');
        add_action('edited_category', 'category_custom_fields_save');
    }
    function category_custom_fields_form($tag) {
        $t_id = $tag->term_id;
        $cat_meta = get_option("category_$t_id");
        ?>
        <!-- текст -->
        <tr class="form-field">
            <th scope="row"valign="top"><label for="extra1">Текст 1:</label></th>
            <td>
                <textarea name="Cat_meta[cat_text1]"id="Cat_meta[cat_text1]"><?php echo$cat_meta['cat_text1'] ? $cat_meta['cat_text1'] : ''; ?></textarea>
                <!--<input class="cat_img"type="text"name="Cat_meta[cat_title]"id="Cat_meta[cat_title]"size="25"style="width:60%;"value="<?php
                echo
                $cat_meta['cat_title'] ? $cat_meta['cat_title'] : '';
                ?>"> -->
                <br />
            </td>
        </tr>
        <?php
    }
    function category_custom_fields_save($term_id) {
        if (isset($_POST['Cat_meta'])) {
            $t_id = $term_id;
            $cat_meta = get_option("category_$t_id");
            $cat_keys = array_keys($_POST['Cat_meta']);
            foreach ($cat_keys as $key) {
                if (isset($_POST['Cat_meta'][$key])) {
                    $cat_meta[$key] = $_POST['Cat_meta'][$key];
                }
            }
    //save the option array
            update_option("category_$t_id", $cat_meta);
        }
    }
    

    Данные в произвольных полях категорий сохраняются. В шаблоне вывода категории пишу

    <?php $term = get_queried_object();
    $cat_id = $term->term_id; // $term->term_id - это id таксономии или категории
    // извлекаем данные наших произвольных полей для категории
    $cat_data = get_option("category_$cat_id");
    // Пример вывода текстового поля
    echo $cat_data['cat_title'];?>
    

    или

    <?php $categories = get_the_category();
     $cat_id = $categories[0]->cat_ID; // $term->term_id - это id таксономии или категории
     // извлекаем данные наших произвольных полей для категории
     $cat_data = get_option("category_$cat_id ");
     // Пример вывода текстового поля
     echo $cat_data['cat_title'];?>
    

    Но ничего на фронтенде не выводит 🙁 Плиз ХЕЛП!!!

     

    в 13.04.2016.

    Вы в функции category_custom_fields_form($tag) назвали переменную(элемент массива) cat_text1 а выводите cat_text

    Выводите:

     <?php $term = get_queried_object();
     $cat_id = $term->term_id; // $term->term_id - это id таксономии или категории
     // извлекаем данные наших произвольных полей для категории
     $cat_data = get_option("category_$cat_id");
     // Пример вывода текстового поля
     echo $cat_data['cat_text1'];
     ?>
     
    в 14.04.2016.
    Добавить Комментарий

    добавил в functions.php и при редактировании рубрики доп полей нету

    function category_custom_fields() {
    add_action('category_edit_form_fields', 'category_custom_fields_form');
    add_action('edited_category', 'category_custom_fields_save');
    }
    function category_custom_fields_form($tag) {
    $t_id= $tag->term_id;
    $cat_meta= get_option("category_$t_id");
    ?>
    <!-- текст -->
    <tr class="form-field">
    <th scope="row"valign="top"><label for="extra1">Текст 1:</label></th>
    <td>
    <textarea name="Cat_meta[cat_text1]"id="Cat_meta[cat_text1]"><?php echo$cat_meta['cat_text1'] ? $cat_meta['cat_text1'] : ''; ?></textarea>
    <!--<input class="cat_img"type="text"name="Cat_meta[cat_title]"id="Cat_meta[cat_title]"size="25"style="width:60%;"value="<?php
    echo
    $cat_meta['cat_title'] ? $cat_meta['cat_title'] : '';
    ?>"> -->
    <br />
    </td>
    </tr>
    <?php
    }
    function category_custom_fields_save($term_id) {
    if (isset($_POST['Cat_meta'])) {
    $t_id = $term_id;
    $cat_meta = get_option("category_$t_id");
    $cat_keys = array_keys($_POST['Cat_meta']);
    foreach ($cat_keys as $key) {
    if (isset($_POST['Cat_meta'][$key])) {
    $cat_meta[$key] = $_POST['Cat_meta'][$key];
    }
    }
    //save the option array
    update_option("category_$t_id", $cat_meta);
    }
    }
    

    Вы не повесили событие на хук admin_init для инициализации всего кода. Допишите вверху:

    
    add_action('admin_init', 'category_custom_fields', 1);
    
    

    В примере это есть.

    в 10.04.2016.
    Добавить Комментарий

    Делаю всё, как написано. Получаю ошибку 500.

    Где вообше нейти нормальную инструкцию, как добавить произвольные  поля для категорий? Везде какие то заумные решения, которые еще и не работают  или плагины.

    Здравствуйте. Код рабочий.

    Проверьте что действительно добавили все куда нужно.

    Проверьте что добавлены все функции.

    Попробуйте поменять названия функциям, может у вас уже есть с таким же названием, например:

    // Было
    
    add_action('admin_init', 'category_custom_fields', 1);
    
    function category_custom_fields() {
    
    add_action('lift_edit_form_fields', 'category_custom_fields_form');
    
    add_action('edited_lift', 'category_custom_fields_save');
    
    }
    /* ....... и так далее */
    // Нужно
    add_action('admin_init', 'onwp_category_custom_fields', 1);
    
    function onwp_category_custom_fields() {
    
    add_action('lift_edit_form_fields', 'onwp_category_custom_fields_form');
    
    add_action('edited_lift', 'onwp_category_custom_fields_save');
    
    }
    /* ....... и так далее */
    
    

    к названием функций добавили префикс «onwp_»

    в 06.02.2017.
    Добавить Комментарий

    Доброго времени суток, скажите а подойдёт этот код не для какой то отдельной категории, а для всех категорий?

    Данный код для всех категорий.

    в 21.03.2017.

    скажите а в какое место добавляем данный код? И весь этот код вставляем в functions.php который находится в папке шаблона?

    в 22.03.2017.

    Добавил код в админке поле появилось, а на сайт не выводит

    Использовал  код ardeil который предложил, а что дописать к нему не соображу, помогите пжл.

     

     
    в 22.03.2017.

    Значение в поле сохраняется? Как выводите значение, так:

    
    $term = get_queried_object();
    
    $cat_id = $term->term_id; // $term->term_id - это id таксономии или категории
    
    // извлекаем данные наших произвольных полей для категории
    
    $cat_data = get_option("category_$cat_id");
    
    // Пример вывода текстового поля
    
    echo $cat_data['cat_title'];
    
    
    в 22.03.2017.

    Да значение в поле сохраняется. Я в php не силён, я взял код из комментария Ardeil, он текст сохраняет, а на сайт не выводит

    add_action('admin_init', 'category_custom_fields', 1);
    function category_custom_fields() {
     add_action('category_edit_form_fields', 'category_custom_fields_form');
     add_action('edited_category', 'category_custom_fields_save');
    }
    function category_custom_fields_form($tag) {
     $t_id = $tag->term_id;
     $cat_meta = get_option("category_$t_id");
     ?>
     <!-- текст -->
     <tr class="form-field">
     <th scope="row"valign="top"><label for="extra1">Текст 1:</label></th>
     <td>
     <textarea name="Cat_meta[cat_text1]"id="Cat_meta[cat_text1]"><?php echo$cat_meta['cat_text1'] ? $cat_meta['cat_text1'] : ''; ?></textarea>
     <!--<input class="cat_img"type="text"name="Cat_meta[cat_title]"id="Cat_meta[cat_title]"size="25"style="width:60%;"value="
     <?php
     echo
     $cat_meta['cat_title'] ? $cat_meta['cat_title'] : '';
     ?>"> -->
     <br />
     </td>
     </tr>
     <?php
    }
    function category_custom_fields_save($term_id) {
     if (isset($_POST['Cat_meta'])) {
     $t_id = $term_id;
     $cat_meta = get_option("category_$t_id");
     $cat_keys = array_keys($_POST['Cat_meta']);
     foreach ($cat_keys as $key) {
     if (isset($_POST['Cat_meta'][$key])) {
     $cat_meta[$key] = $_POST['Cat_meta'][$key];
     }
     }
    //save the option array
     update_option("category_$t_id", $cat_meta);
     }
    }
    

    P.S. И для категорий товара используем этот же код?

    в 22.03.2017.

    вам в шаблоне нужно найти место куда вы хотите вывести эту информации и прописать:

    
    $term = get_queried_object();
    
    $cat_id = $term->term_id; // $term->term_id - это id таксономии или категории
    
    // извлекаем данные наших произвольных полей для категории
    
    $cat_data = get_option("category_$cat_id");
    
    // Пример вывода текстового поля
    
    echo $cat_data['cat_title'];
    
    

    Все работает, просто вы сохранили, и нигде не вывели.

    Данный код для таксономии «category», в примере(который ответ) там для таксономии lift

    в 22.03.2017.
    Добавить Комментарий
    
    add_action('admin_init', 'category_custom_fields', 1);
    
    function category_custom_fields() {
    
    add_action('category_edit_form_fields', 'category_custom_fields_form');
    
    add_action('edited_category', 'category_custom_fields_save');
    
    }
    function category_custom_fields_form($tag) {
    
    $t_id = $tag->term_id;
    
    $cat_meta = get_option("category_$t_id");
    
    ?>
    
    <!-- текст -->
    
    <tr class="form-field">
    
    <th scope="row"valign="top"><label for="extra1">Краткое описание:</label></th>
    
    <td>
    
    <textarea name="Cat_meta[cat_text1]"id="Cat_meta[cat_text1]"><?php echo$cat_meta['cat_text1'] ? $cat_meta['cat_text1'] : ''; ?></textarea>
    
    <?php
    
    echo
    
    $cat_meta['cat_title'] ? $cat_meta['cat_title'] : '';
    
    ?>
    
    <br />
    
    </td>
    
    </tr>
    
    <?php
    
    }
    function category_custom_fields_save($term_id) {
    
    if (isset($_POST['Cat_meta'])) {
    
    $t_id = $term_id;
    
    $cat_meta = get_option("category_$t_id");
    
    $cat_keys = array_keys($_POST['Cat_meta']);
    
    foreach ($cat_keys as $key) {
    
    if (isset($_POST['Cat_meta'][$key])) {
    
    $cat_meta[$key] = $_POST['Cat_meta'][$key];
    
    }
    
    }
    
    //save the option array
    
    update_option("category_$t_id", $cat_meta);
    
    }
    
    }
    
    
    Добавить Комментарий

    У меня в категории товара не добавляются поля, но в рубриках постов все норм работает, юзаю плагин Вукомерс.

    ХЕЛП!!

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

    А как обработать checkbox
    Например: в свойствах рубрики задать checkBox, а на странице рубрики проверить состояние этого свойства и вывести какой-то контент…

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

    Ваш ответ

    Размещая свой ответ, вы соглашаетесь с правилами сайта.