Знайомство з WordPress Term Meta і WP_Term

21

Від автора: в WordPress ви з легкістю можете зберігати метадані для постів, сторінок та інших типів контенту, проте збереження метаданих для таксономій раніше було занадто складним процесом.

Раніше щоб все запрацювало, необхідно було для кожного елемента даних зберегти метадані терміна як поле таблиці wp_options, і якщо у вас пристойну кількість термінів або просто кілька користувальницьких таксономій це потенційно могло привести до появи сотень, якщо не тисяч записів.

Однак з WordPress 4.4 і вище терміни стали об’єктами, такими ж як пости, сторінки і користувальницькі типи даних. Це зміна сильно спростило процес додавання, видалення і оновлення метаданих.

Передісторія Term Meta

Співтовариство шукало легкий спосіб контролю над термінами ще з WordPress 2.8. Процес був повільним, проте нарешті терміни були перероблені з нуля для використання класової структури. Парочка змін в WordPress 4.4 означає, що тепер терміни в таксономиях (як теги, категорії або інші) можуть мати свої власні мета дані.

Старий спосіб маніпуляції метаданими

До WP 4.4 не було чіткого способу збереження метаданих для термінів, це було невід’ємне обмеження у самому будову термінів. Якщо ви розширювали таксономії або терміни, вам доводилося зберігати дані безпосередньо в якості опції сайту за допомогою update_option. Не самий ідеальний спосіб (він забивав таблицю опцій).

Я вже писав про розширення класифікацій, проте як тільки ви були готові зберегти метадані, ви повинні були викликати функцію зразок цієї:

//збереження нових полів для категорії
function save_extra_taxonomy_fields($term_id){
$term = get_term($term_id);
$term_slug = $term->slug;
//збираємо id категорій зображень із значень
$term_category_image_id = isset($_POST[‘category_image_id’]) ? sanitize_text_field($_POST[‘category_image_id’]) : «;
//оновлюємо значення і зберігаємо як опцію
update_option(‘category_image_id_’ . $term_slug, $term_category_image_id);
}
add_action(‘create_category’,’save_extra_taxonomy_fields’);

У наведеному вище прикладі ми запустили з хука create_category (спрацьовує при створенні нового терміна категорій). Функція шукає наші значення і після обробки зберігає їх як опції. Спосіб робочий, але не найкрасивіший.

Як додати, оновити і видалити Term Meta

Для роботи з метаданими термінів вам знадобляться функції add_term_meta, update_term_meta і delete_term_meta. Ці функції в парі з новими елементами UI дозволять вам зберігати і оновлювати нові метадані для термінів.

Як додати метадані термінів

Для додавання метаданих в термін нам знадобиться функція add_term_meta. Необхідно задати 3 обов’язкових та 1 необов’язковий параметр.

$term_id – ID терміну, до якого хочете зберегти метадані

$meta_key – ключове ім’я метаданих. Як ви будете звертатися до даних

$meta_value – Самі дані

$unique (необов’язковий) – Унікальність ключа метаданих. За промовчанням false, тобто якщо інший ключ, який має таку ж назву, функцію перепише його. Щоб ключі були унікальними, необхідно встановити true.

Приклад: уявіть, що до всіх термінам таксономії category ви хочете прикріпити нові метадані на основі кількості постів, що належать даної категорії. В WP 4.4 ми можемо пройтися циклом по всім термінам та зберегти нові метадані (щоб потім використовувати їх в темі або плагінах).

function add_featured_to_categories(){
//отримуємо всі терміни з category
$taxonomy_name = ‘category’;
$term_args = array(
‘orderby’ => ‘name’,
‘hide_empty’ => false,
‘fields’ => ‘ids’
);
$terms = get_terms($taxonomy_name, $term_args);
if($terms){
$term_key = ‘term_size’;
$term_value = ’empty’;
$term_unique = true;
//проходимся по всім термінам і задаємо нові метадані термінів
foreach($terms as $term_id){
$term = get_term($term_id, $taxonomy_name);
$term_count = $term->count;
//задаємо нове значення метаданих
if($term_count > 10){
$term_value = ‘big’;
}else if($term_count >= 5 && $term_count = 1 && $term_count < 5){
$term_value = ‘small’;
}
//зберігаємо значення
add_term_meta($term_id, $term_key, $term_value, $term_unique);
}
}
}
add_action(‘init’, ‘add_featured_to_categories’);

Як читати метадані термінів

За допомогою функції get_term_meta ми можемо прочитувати збережені метадані термінів. Функція працює схожим чином з get_post_meta, яка потрібна для витягування метаданих з постів. Для роботи з нею необхідно задати один обов’язковий і два опціональних параметра.

$term_id –ID терміну, з якого будуть витягатися метадані

$key (опціональний) – Ключ, який ви хочете повернути. Якщо не задано, повертаються всі метадані.

$single (опціональний) – Якщо значення одне, буде повернуто ключ або пара значень. За замовчуванням значення одне.

Розглянемо ще один сценарій, де може знадобитися дана функція. Розглянемо ситуацію, коли у нас вже збережені метадані до всіх термінів у таксономії category. У цих даних зберігається URL зображення, яке повинне відображатися при перегляді термінів. Ми хочемо показувати це зображення як банер під описом або заголовком терміна, але вище списку постів.

function display_term_meta_image($term_id, $term_taxonomy){
//отримуємо терміни
$term = get_term($term_id, $term_taxonomy);
if($term){
$term_image_id = get_term_meta($term_id, ‘term_image_id’, true);
if($term_image_id){
//отримуємо середнє зображення для відображення
$term_image = wp_get_attachment_image_src($term_image_id, ‘medium’, ‘false’);
echo ‘Знайомство з WordPress Term Meta і WP_Term‘;
}
}
}

Тепер у файлі category.php або іншому файлі шаблону дочірньої теми ми можемо змінити функціонал відображення термінів. В моєму прикладі використовується тема Twenty Fourteen, я редагував файл category.php, а функцію викликаю відразу після опису терміна.

//отримуємо поточний об’єкт (термін)
$term_obj = get_queried_object();
//відображаємо зображення для нього
if(function_exists(‘display_term_meta_image’)){
display_term_meta_image($term_obj->term_id, $term_obj->taxonomy);
}

Фото відкриється відразу після опису:

Як видалити метадані термінів

Видалити метадані термінів можна точно так само, як і для постів. У функції delete_term_meta необхідно задати два обов’язкових і 1 опціональний параметр.

$term_id –ID терміна.

$meta_key – Мета ключ, який потрібно видалити з терміна.

$meta_value (опціональний) – Видаляє метадані, якщо значення збігається змінної. Використовуйте цей параметр, якщо необхідно видалити якісь певні дані.

І знову ж, розглянемо сценарій, коли це можна використовувати. Уявіть, що у вас вже наполовину готовий великий проект, і ви вже зберегли різні метадані у всіх термінах категорій. І раптом якісь дані вам більше не потрібні, тобто ви можете почистити їх, щоб вони не засмічували базу даних.

//віддалені метадані, які нам більше не потрібні в термінах категорій
function delete_old_meta_data_from_category(){
//отримуємо всі терміни категорій
$terms = get_terms(‘category’, array(‘hide_empty’ => false, ‘fields’ => ‘ids’));
if($terms){
//list of allowed term keys
$allowed_term_keys = array(‘term_image_id’, ‘term_size’);
//проходимо циклом по всім термінам
foreach($terms as $term_id){
$term_meta = get_term_meta($term_id);
//проходимо по всіх метаданих в терміні
foreach($term_meta as $meta_key => $meta_value){
//якщо ключа немає серед заданих, видаляємо його
if(!array_key_exists($meta_key, $allowed_term_keys)){
delete_term_meta($term_id, $meta_key);
}
}
}
}
}
add_action(‘init’, ‘delete_old_meta_data_from_category’);

Функція проходиться по всіх метаданих і видаляє ті, які не задані у змінній $allowed_term_keys, тим самим звільняючи місце в базі даних (корисно, коли у нас залишилися десятки непотрібних записів).

Зворотна сумісність з WordPress 4.3 і нижче

Якщо ви хочете використовувати ці функції, але також підтримувати старі версії, можна створити додатковий функціонал, щоб все стабільно працювало.

//додаємо метадані в термін
function add_term_meta_compat($term_id, $term_key, $term_value){
if(function_exists(‘add_term_meta’)){ //WP4.4+
add_term_meta($term_id, $term_key, $term_value, true);
}else{ //Pre WP4.4
//отримуємо об’єкт терміна і дані
$term_object = get_term($term_id);
$term_taxonomy = $term_object->taxonomy;
//створюємо фінальний ключ для збереження (tax + termid + key)
$term_final_key = ($term_taxonomy . ‘_’ . $term_id . ‘_’ . $term_key);
//перевіряємо, щоб ключ не був довший 64 символів (max limit)
$term_final_key = strlen($term_final_key > 64) ? substr($term_final_key, 0, 63) : $term_final_key;
//додаємо нову опцію
add_option($term_final_key, $term_value);
}
}

Почали ми з виклику функції function_exists, щоб перевірити, що нова функція add_term_meta задана. Дана функція працює тільки в WP 4.4 і вище. Якщо потрібно підтримувати старі версії, використовуйте звичайну функцію add_term_meta для прив’язки метаданих до наших термінам.

Якщо підтримки немає, ми витягуємо сам об’єкт терміна (через його ID), а з нього витягаємо $term_taxonomy і використовуємо цю змінну для створення фінального ключового значення. Після збереження даних в таблиці опцій необхідно перевірити ключ на унікальність. Зробити це можна, додавши в одну змінну ім’я таксономії, ID терміна і ключа терміна. Необхідно перевірити, що ключ не перевищує 64 символу. Якщо перевищує, необхідно обрізати. Після всього можна викликати функцію add_option для збереження.

Як бачите, метод трохи довший, але він більш гнучкий, так як з’являється підтримка старих та нових версій WordPress.

Висновок

Ці нові функції повинні розширити можливості і спростити процес управління термінами, а також додати унікальний функціонал. Наприклад, ви захочете додати зображення зверху від терміна або отримати метадані. Тоді ви можете по-різному відображати терміни за умовою (як завантаження файлу шаблону на основі короткого терміну).

Завдяки гнучкості і простоті нових функцій для роботи з метаданими ви можете почати використовувати їх у своїх нових проектах вже сьогодні!