Метадані WordPress: знайомство і способи застосування

17

Від автора: з виходом WordPress 4.4 в даній CMS з’явився новий тип метаданих – метадані термінів. Тепер ви можете зберігати метадані для термінів так само, як і для постів. Довгоочікуване нововведення і логічне доповнення WordPress.

До цього часу у нас була можливість додавати довільні метадані до постів та коментарів. Все це можна було використовувати для додавання рейтингу до коментарів, вираження свого настрою під час написання коментаря, прикріплення ціни товарів для додавання будь-якої іншої відповідної інформації до контенту. В останній версії WordPress з’явилася можливість додавати метадані до термінів, дозволяючи створювати такі функції, як додавання до категорій за замовчуванням превьюшек. У цьому уроці ви навчитеся змінювати, оновлювати і витягувати метадані для термінів.

Що під капотом у метаданих для термінів

Логіка далеко не нова і вже застосовувалася в постах, коментарях і для таблиці користувачів. У метаданих термінів з’явилася своя таблиця termmeta з полями term_id, meta_key, meta_value і автоинкрементом meta_id.

Функції метаданих

Для роботи з новим типом метаданих, зокрема для створення, читання, оновлення та видалення метаданих термінів, були представлені чотири нові функції:

add_term_meta(): додає метадані

update_term_meta(): оновлює існуючі метадані

delete_term_meta(): видаляє метадані

get_term_meta(): витягує метадані

Під капотом у цих функцій код майже такий же, як для функцій метаданих постів.

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

В останньому проекті мені довелося додати додаткові атрибути не ієрархічним термінам. Відмінний шанс протестувати нові метадані.

У проекті використовувалася кастомний категорія постів, пости були про будинки. В якості термінів кастомних таксономії були задані властивості будинку (тобто диван, TV і т. д.). Редактору інформації про будинках необхідно було отримати список властивостей будинків на основі груп. А групи в свою чергу не повинні бути властивостями будинку. І я вирішив додати цю групу через метадані термінів.

Я використовував свою таксономію house_feature, але якщо ви хочете додати метадані для категорій посад або тегів, можете скористатися стандартними category або post_tag. Спершу я створив свою таксономію:

add_action(‘init’, ‘register_feature_taxonomy’);
function register_feature_taxonomy() {
$labels = array(
‘name’ => _x( ‘Features’, ‘taxonomy general name’, ‘my_plugin’ ),
‘singular_name’ => _x(‘Features’, ‘taxonomy singular name’, ‘my_plugin’),
‘search_items’ => __(‘Search Feature’, ‘my_plugin’),
‘popular_items’ => __(‘Common Features’, ‘my_plugin’),
‘all_items’ => __(‘All Features’, ‘my_plugin’),
‘edit_item’ => __(‘Edit Feature’, ‘my_plugin’),
‘update_item’ => __(‘Update Feature’, ‘my_plugin’),
‘add_new_item’ => __(‘Add new Feature’, ‘my_plugin’),
‘new_item_name’ => __(‘New Feature:’, ‘my_plugin’),
‘add_or_remove_items’ => __(‘Remove Feature’, ‘my_plugin’),
‘choose_from_most_used’ => __(‘Choose from common Feature’, ‘my_plugin’),
‘not_found’ => __(‘No Feature found.’, ‘my_plugin’),
‘menu_name’ => __(‘Features’, ‘my_plugin’),
);
$args = array(
‘hierarchical’ => false,
‘labels’ => $labels,
‘show_ui’ => true,
);
register_taxonomy(‘house_feature’, array(‘houses’), $args);
}

В останньому рядку вам необхідно замінити тип поста houses на свій. Якщо ви хочете використовувати нову таксономію на посадах за замовчуванням, то поставте значення post.

У випадку якщо ви використовуєте код з даної статті у файлі теми functions.php або всередині плагіна, перевірте, щоб текст домену my_plugin збігався з текстом домену теми або плагіна. Текст домену my_plugin буде працювати в плагіні з текстом посилання my_plugin.

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

$feature_groups = array(
‘bedroom’ => __(‘Bedroom’, ‘my_plugin’),
‘living’ => __(‘Living room’, ‘my_plugin’),
‘kitchen’ => __(‘Kitchen’, ‘my_plugin’)
);

Для того, щоб прикріпити до термінів метадані, необхідно розширити форму редагування термінів. Складність в тому, що всі необхідні нам хуки створюються динамічно.

Додавання метаданих до нового терміну

Для того, щоб розширити форму й додати термін, необхідно скористатися хуком {$taxonomy}_add_form_fields. Для нашої таксономії house_feature це house_feature_add_form_fields.

add_action( ‘house_feature_add_form_fields’, ‘add_feature_group_field’, 10, 2 );
function add_feature_group_field($taxonomy) {
global $feature_groups;
?>

$_group) : ?>

Код вище додає випадаючий список між оригінальними полями форми і кнопкою відправлення.

Метадані WordPress: знайомство і способи застосування

Форма створення нового терміна в кастомних таксономії тепер виглядає так. Для збереження метаданих терміна необхідно запускати спеціальний хук, created_{$taxonomy}.

add_action( ‘created_house_feature’, ‘save_feature_meta’, 10, 2 );
function save_feature_meta( $term_id, $tt_id ){
if( isset( $_POST[‘feature-group’] ) && » !== $_POST[‘feature-group’] ){
$group = sanitize_title( $_POST[‘feature-group’] );
add_term_meta( $term_id, ‘feature-group’, $group, true );
}
}

Дані про термін, отримані з глобального масиву $_POST, зберігаються за допомогою нової функції add_term_meta(). Як і add_post_meta() функція приймає 4 аргументу:

$term_id: ID терміна

$meta_key: мета ключ

$meta_value: значення

$unique: може чи ключ використовуватися лише раз чи ні. За замовчуванням стоїть false.

Аргумент $unique я задав в true, так як я хочу, щоб кожна властивість будинку знаходилося тільки в одній групі.

Оновлення терміна за допомогою метаданих

Навіть якщо процесів є щось спільне, все ж додавання нового терміна і оновлення існуючого технічно відрізняється в WordPress. Тому необхідно додати і функцію оновлення. Для отримання поля для групи в формі редагування, ми використовували хук {$taxonomy}_edit_form_fields.

add_action( ‘house_feature_edit_form_fields’, ‘edit_feature_group_field’, 10, 2 );
function edit_feature_group_field( $term $taxonomy ){
global $feature_groups;
// отримуємо поточну групу
$feature_group = get_term_meta( $term->term_id, ‘feature-group’, true );
?>

$_group ) : ?>