Добавить настраиваемое поле в категорию

22

Я хотел бы добавить настраиваемые поля для определенной категории. Категория имеет только следующие поля:

Название:

Slug:

родитель:

Описание:

Так как у меня есть сайт сериала, я хочу добавить еще несколько полей, я хочу что-то вроде этого, когда я создаю новую категорию (Category = Series)

Название:

Исполнитель:

Год:

Тип:

Жанр:

Резюме:

Slug:

родитель:

Описание:

И так далее...

Любая помощь, пожалуйста? Заранее спасибо.

Earlee
источник
Вот шпаргалка, которую я использую при этом. Он содержит соответствующие хуки и фильтры действий в одном коротком списке. charlestonsw.com/…
Лэнс Кливленд

Ответы:

24

Я опубликовал How To об этом неделю назад http://en.bainternet.info/2011/wordpress-category-extra-fields

надеюсь это поможет.

Ohad.


Вот детали поста:

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

<?php
//add extra fields to category edit form hook
add_action ( 'edit_category_form_fields', 'extra_category_fields');

//add extra fields to category edit form callback function
function extra_category_fields( $tag ) {    //check for existing featured ID
    $t_id = $tag->term_id;
    $cat_meta = get_option( "category_$t_id");
?>
<tr class="form-field">
<th scope="row" valign="top"><label for="cat_Image_url"><?php _e('Category Image Url'); ?></label></th>
<td>
<input type="text" name="Cat_meta[img]" id="Cat_meta[img]" size="3" style="width:60%;" value="<?php echo $cat_meta['img'] ? $cat_meta['img'] : ''; ?>"><br />
        <span class="description"><?php _e('Image for category: use full url with '); ?></span>
    </td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="extra1"><?php _e('extra field'); ?></label></th>
<td>
<input type="text" name="Cat_meta[extra1]" id="Cat_meta[extra1]" size="25" style="width:60%;" value="<?php echo $cat_meta['extra1'] ? $cat_meta['extra1'] : ''; ?>"><br />
        <span class="description"><?php _e('extra field'); ?></span>
    </td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="extra2"><?php _e('extra field'); ?></label></th>
<td>
<input type="text" name="Cat_meta[extra2]" id="Cat_meta[extra2]" size="25" style="width:60%;" value="<?php echo $cat_meta['extra2'] ? $cat_meta['extra2'] : ''; ?>"><br />
        <span class="description"><?php _e('extra field'); ?></span>
    </td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="extra3"><?php _e('extra field'); ?></label></th>
<td>
        <textarea name="Cat_meta[extra3]" id="Cat_meta[extra3]" style="width:60%;"><?php echo $cat_meta['extra3'] ? $cat_meta['extra3'] : ''; ?></textarea><br />
        <span class="description"><?php _e('extra field'); ?></span>
    </td>
</tr>
<?php
}

Как вы видите, я добавил 4 новых поля, и все они находятся в массиве Cat_meta [ключ], потому что таким образом мы создаем только строку в таблице параметров, чтобы сохранить все дополнительные поля категории вместо строки для каждого поля.

Затем нам нужно сохранить дополнительные поля в базе данных, как только пользователь отправит форму редактирования категории, и мы сделаем это, используя «edited_category» с функцией, которая будет проходить через каждое из представленных полей и вставлять их в базу данных, используя функцию update_option , так:

<?php
// save extra category extra fields hook
add_action ( 'edited_category', 'save_extra_category_fileds');

// save extra category extra fields callback function
function save_extra_category_fileds( $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 );
    }
}

Из приведенного выше кода вы можете видеть, что все добавленные нами дополнительные поля хранятся в таблице параметров базы данных с именем «category_ID», где ID - это идентификатор определенной категории, которую мы только что отредактировали, и это означает, что мы можем вызвать это данные в наши плагины или файлы тем легко с помощью функции get_option.

скажем, например, мой идентификатор категории 25, то мой код будет выглядеть

<?php $cat_data = get_option('category_25'); ?>

Как я уже говорил в начале, мне нужно отображать разные изображения для каждой категории, поэтому в этом случае я добавил эти несколько строк кода в файл category.php моей темы сразу после кода, отображающего заголовок категории:

<?php
//first get the current category ID
$cat_id = get_query_var('cat');

//then i get the data from the database
$cat_data = get_option("category_$cat_id");

//and then i just display my category image if it exists
if (isset($cat_data['img'])){
    echo '<div class="category_image"><img src="'.$cat_data['img'].'"></div>';
}

Красиво и легко, и мы все сделали. Результат должен выглядеть примерно так:

введите описание изображения здесь

Bainternet
источник
4
Пожалуйста, опубликуйте основное содержание вашего блога в этом ответе. Гниль ссылок может случиться даже на вашем собственном блоге.
Джанго Рейнхардт
1
На этот вопрос ответили в 2011 году, приятель :)
Bainternet
1
Ваша точка зрения?
Джанго Рейнхардт
4
Если вы не думаете, что этот ответ имеет какое-либо значение, его следует удалить ... Однако этот вопрос имеет более 16 000 просмотров. Я думаю, что этот вопрос остается полезным для людей, несмотря на его возраст, и этот ответ будет улучшен путем включения подробностей из рассматриваемой ссылки.
Джанго Рейнхардт
4
... пока вы, ребята, были заняты обсуждением этого (хотя и год назад), мне потребовалось менее 5 минут, чтобы привести все в ответ. Это просто ...
MxmastaMills
18

Начиная с Wordpress 4.4, были добавлены функции add_term_meta () , update_term_meta () и get_term_meta () . Это означает, что код, предоставленный MxmastaMills, может быть обновлен для использования гораздо менее хакерского подхода.

Вот мое обновление этого. Есть только одно поле, поскольку я хотел добавить пользовательский заголовок, но он будет работать одинаково для всех полей, которые вы хотите добавить.

function addTitleFieldToCat(){
    $cat_title = get_term_meta($_POST['tag_ID'], '_pagetitle', true);
    ?> 
    <tr class="form-field">
        <th scope="row" valign="top"><label for="cat_page_title"><?php _e('Category Page Title'); ?></label></th>
        <td>
        <input type="text" name="cat_title" id="cat_title" value="<?php echo $cat_title ?>"><br />
            <span class="description"><?php _e('Title for the Category '); ?></span>
        </td>
    </tr>
    <?php

}
add_action ( 'edit_category_form_fields', 'addTitleFieldToCat');

function saveCategoryFields() {
    if ( isset( $_POST['cat_title'] ) ) {
        update_term_meta($_POST['tag_ID'], '_pagetitle', $_POST['cat_title']);
    }
}
add_action ( 'edited_category', 'saveCategoryFields');
Люк Симмонс
источник
2
Несколько вещей, чтобы отметить: в edited_categoryхуке, tag_IDбудет в $_POSTмассиве, а не в $_GET. Также add_term_metaфактически добавит новую запись вместо того, чтобы переопределить возможную старую. Используйте update_term_metaвместо этого.
Мартин Димитров
@MartinDimitrov Не могли бы вы исправить ответ Люка Симмонса, нажав на кнопку редактирования? Таким образом, каждый может использовать лучший доступный код, даже если он не очень хорошо кодирует (дизайнер здесь!). Спасибо!
Хьюго
1
Он не сохраняет данные в форме
Dev
@Dev сохраняет данные, просто не показывает их, пока вы не измените $ _POST на $ _GET во второй строке.
banesto
3

Этот код работает:

add_action ( 'edit_category_form_fields', function( $tag ){
    $cat_title = get_term_meta( $tag->term_id, '_pagetitle', true ); ?>
    <tr class='form-field'>
        <th scope='row'><label for='cat_page_title'><?php _e('Category Page Title'); ?></label></th>
        <td>
            <input type='text' name='cat_title' id='cat_title' value='<?php echo $cat_title ?>'>
            <p class='description'><?php _e('Title for the Category '); ?></p>
        </td>
    </tr> <?php
});
add_action ( 'edited_category', function() {
    if ( isset( $_POST['cat_title'] ) )
        update_term_meta( $_POST['tag_ID'], '_pagetitle', $_POST['cat_title'] );
});
Mario62RUS
источник
Это менее неуклюже, чем другие, и я только что проверил это с WordPress 5.2.2
Нико Гавенда
1

Пол Менард представил пример того, как создавать и использовать мета-термины в своем блоге ...
Пользовательские мета для новых таксономий в WordPress 3.0 .

Там нет примера создания таблицы БД или проверки установки $_POSTvars, поэтому вам придется делать эти мелочи самостоятельно, но это выглядит как приличная база кода для сборки поверх ... :)

t31os
источник