Додайте спеціальне поле до категорії


22

Я хотів би додати спеціальні поля до певної категорії. Категорія містить лише такі поля:

Ім'я:

Кулі:

Батько:

Опис:

Оскільки у мене є сайт серіалу, я хочу додати ще кілька полів, я хочу щось подібне, коли створюю нову категорію (категорія = серія)

Ім'я:

Виконавець:

Рік:

Тип:

Жанр:

Підсумок:

Кулі:

Батько:

Опис:

І так далі...

Будь-яка допомога, будь ласка? Заздалегідь спасибі.



Ось шпаргалка, яку я використовую, роблячи це. У одному короткому списку є відповідні гачки та фільтри для дій. charlestonsw.com/…
Ленс Клівленд

Відповіді:


24

Я опублікував тему Як про це тиждень тому http://en.bainternet.info/2011/wordpress-category-extra-fields

сподіваюся, що це допомагає.

Охад.


Ось деталі публікації:

Перше, що нам потрібно зробити, - це додати додаткові поля до форми редагування категорій за допомогою гака 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 [key], тому що ми створюємо лише рядок у таблиці параметрів, щоб зберегти всі додаткові поля категорії замість рядка для кожного поля.

Далі нам потрібно зберегти зайві поля в базі даних, як тільки користувач подає форму редагування категорії, і ми це зробимо, використовуючи "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'); ?>

Як я вже говорив на початку, мені потрібно відобразити інше зображення для кожної категорії, тож у такому випадку я додав ці кілька рядків коду до категорії.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>';
}

Приємно і легко, і ми все зробили. Результат повинен виглядати приблизно таким:

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


4
Будь ласка, опублікуйте основний вміст свого блогу в цій відповіді. Гниття посилань може статися навіть у вашому власному блозі.
Джанго Райнхардт

1
На це відповів приятель 2011 року :)
Bainternet

1
Ваша думка бути?
Джанго Рейнхардт

4
Якщо ви не вважаєте, що ця відповідь не має жодного значення, її слід видалити ... Однак це питання має понад 16 000 переглядів. Я думаю, що це питання залишається корисним для людей, незважаючи на його вік, і цю відповідь можна було б покращити, включивши деталі з посилання, про яке йде мова.
Джанго Рейнхардт

4
... поки ви, хлопці, були зайняті обговоренням цього питання (хоча рік тому хоч), мені знадобилося менше 5 хвилин, щоб все зрозуміти у відповідь. Це легко ...
MxmastaMills

19

Станом на 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 Чи можете ви виправити відповідь Luke-Simmons, натиснувши кнопку редагування? Таким чином кожен може використовувати найкращий доступний код, навіть той, хто не кодує дуже добре (дизайнер тут!). Дякую!
Гюго

1
Це не зберігає дані у формі
Dev

@Dev він зберігає дані, просто не показує їх, якщо ви не зміните $ _POST на $ _GET у другому рядку.
Банесто

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'] );
});

Це менш незграбно, ніж інший, і я щойно перевірив це WordPress 5.2.2
nico gawenda,

1

Пол Менард наводив приклад того, як створювати та використовувати термін мета у своєму блозі ...
Спеціальна мета для нових таксономій у WordPress 3.0 .

Немає приклад створення таблиці БД або перевірки встановлених $_POSTваріантів, тому вам потрібно буде робити ці дрібниці самостійно, але це схоже на гідну базу коду, яку потрібно будувати поверх ... :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.