WordPress 4.4 представил термин мета данных, который позволяет сохранить мета-значения для терминов аналогичным образом, чтобы получить возможность отправлять мета данных. Это долгожданное и логичное дополнение к системе WordPress.
До сих пор метасистемы постов и комментариев позволяли нам добавлять произвольные данные в сообщения и комментарии. Это может быть использовано для добавления оценок в комментарии, указать ваше настроение, когда вы писали сообщение, прикрепить цены на продукт сообщения, и различные другие сведения, которые вы думаете, имеет отношение к вашему содержанию. По состоянию на новейшую версию WordPress, мета данные теперь могут быть добавлены к терминам, что позволяет нам создавать такие функции, как эскизы категории по умолчанию стандартизированным способом. Этот учебник покажет вам, как вы можете отсеивать, обновлять и извлекать эти метаданные для терминов.
Дальнейшее чтение на SmashingMag:
- Расширение WordPress с пользовательскими типами контента
- Как добавить пользовательские поля в форме комментарий WordPress
- RICG Отзывчивые изображения для WordPress
- Все, что вам нужно знать об ускоренных мобильных страницах
Под капотом термина Мета данных
Логика термина мета-данных не нова, уже используется для публикаций, комментариев и пользователей.
Для обеспечения условий метаданных была введена новая termmeta
таблица. Это экономит сочетание term_id
, meta_key
и , а также meta_value
приращения meta_id
.
Функции мета данных
Были введены четыре новые функции для обработки для обработки для создания, чтения, обновления и удаления (CRUD) операций для термина мета-данных:
-
add_term_meta()
: добавляет метаданные -
update_term_meta()
: обновление существующих метаданных -
delete_term_meta()
: удаляет метаданные -
get_term_meta()
: извлекает метаданные
Под капотом эти функции используют тот же код, что и соответствующие функции для использования данных после мета.
Как использовать данные мета-терминов
В недавнем проекте мне пришлось присвоить дополнительные атрибуты неиерархическим терминам, что стало отличным шансом протестировать новую функцию метаданных.
Проект использовал пользовательский тип поста для представления домов. Особенности дома (например, телевизор, диван и т.д.) были термины в пользовательских таксономии. Редактор информации о доме хотел перечислить функции, основанные на группе, которая не должна быть функцией сама по себе. Поэтому я решил добавить эту группу, используя термин мета-данные.
Таксономия я использовал 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
если вы хотите принять новую таксономию вне для испытания поставить на столбах значения по умолчанию.
Если вы используете код из этой статьи в файле функций вашей темы или в плагине, убедитесь, что текстовый домен 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;
?><div class="form-field term-group">
<label for="featuret-group"><?php _e('Feature Group', 'my_plugin'); ?></label>
<select class="postform" id="equipment-group" name="feature-group">
<option value="-1"><?php _e('none', 'my_plugin'); ?></option><?php foreach ($feature_groups as $_group_key => $_group) : ?>
<option value="<?php echo $_group_key; ?>" class=""><?php echo $_group; ?></option>
<?php endforeach; ?>
</select>
</div><?php
}
Это добавляет выбрать форму прямо между исходными полями формы и кнопкой отправки.
Чтобы сохранить термин мета, нам нужно подключиться к действию, которое выполняется при сохранении нового термина. На этот раз мы используем 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()
, он принимает четыре аргумента:
-
$term_id
: идентификатор термина, -
$meta_key
: мета-ключ, -
$meta_value
: значение, -
$unique
: можно ли использовать ключ только один раз; по умолчаниюfalse
.
Я $unique
устанавливаю к истине, потому что я хочу каждую характеристику дома быть перечисленным в только одной группе.
Обновление срока с мета-данными
Даже если они разделяют аналогичные функции, добавив новый термин и обновление существующего технически отличается в 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;
// get current group
$feature_group = get_term_meta( $term->term_id, 'feature-group', true );
?><tr class="form-field term-group-wrap">
<th scope="row"><label for="feature-group"><?php _e( 'Feature Group', 'my_plugin' ); ?></label></th>
<td><select class="postform" id="feature-group" name="feature-group">
<option value="-1"><?php _e( 'none', 'my_plugin' ); ?></option>
<?php foreach( $feature_groups as $_group_key => $_group ) : ?>
<option value="<?php echo $_group_key; ?>" <?php selected( $feature_group, $_group_key ); ?>><?php echo $_group; ?></option>
<?php endforeach; ?>
</select></td>
</tr><?php
}
В дополнение к форме добавления, мы должны получить существующие данные термина, используя get_term_meta()
и предварительно выбрать его. Эта функция имеет три аргумента:
-
$term_id
: идентификатор термина, -
$key
: ключ метаданных, -
$single
: вернуть ли один результат; поfalse
умолчанию, к которым будет возвращен массив.
Так как я ожидал только одно значение, чтобы быть возвращены, я установил $single
true
на .
Теперь нам нужно edited_{$taxonomy}
подключиться, чтобы сохранить данные.
add_action( 'edited_house_feature', 'update_feature_meta', 10, 2 );
function update_feature_meta( $term_id, $tt_id ){
if( isset( $_POST['feature-group'] ) && ’ !== $_POST['feature-group'] ){
$group = sanitize_title( $_POST['feature-group'] );
update_term_meta( $term_id, 'feature-group', $group );
}
}
Мы используем update_term_meta()
для перезаписи существующего значения вместо добавления нового набора метаданных.
Отображение срок мета данных в срок список
Мета данные сохраняются сейчас. Давайте отобразим его в новой колонке в таблице списка терминов. Во-первых, давайте добавим столбец и заголовок к столу. Поиск правильного крючка, чтобы расширить таблицу в WordPress приборной панели снова немного сложнее из-за так много гибких имен крючок.
Шаблон, который можно использовать manage_edit-{$taxonomy}_columns
здесь, даже если это не совсем так, как крючок определяется.
add_filter('manage_edit-house_feature_columns', 'add_feature_group_column' );
function add_feature_group_column( $columns ){
$columns['feature_group'] = __( 'Group', 'my_plugin' );
return $columns;
}
Чтобы добавить содержимое в поля столбца, можно использовать шаблон manage_{$taxonomy}_custom_column
крючка.
add_filter('manage_house_feature_custom_column', 'add_feature_group_column_content', 10, 3 );
function add_feature_group_column_content( $content, $column_name, $term_id ){
global $feature_groups;
if( $column_name !== 'feature_group' ){
return $content;
}
$term_id = absint( $term_id );
$feature_group = get_term_meta( $term_id, 'feature-group', true );
if( !empty( $feature_group ) ){
$content .= esc_attr( $feature_groups[ $feature_group ] );
}
return $content;
}
Опять же, мы используем get_term_meta()
для получения значения, а затем просто прикрепить его к существующему содержимому. Это позволит другим разработчикам прикрепить что-то еще здесь.
Это было в природе моего проекта, что многие термины разделяют то же значение, так что давайте сделаем группу колонки сортируются. Нам нужно только добавить его в сортируемые столбцы.
add_filter( 'manage_edit-house_feature_sortable_columns', 'add_feature_group_column_sortable' );
function add_feature_group_column_sortable( $sortable ){
$sortable[ 'feature_group' ] = 'feature_group';
return $sortable;
}
Вот как может выглядеть список терминов с дополнительным столбцом для терминных данных:
Удалять данные мета-терминов
Если вы удалите термин, соответствующие мета данные также будут удалены, так что вам не нужно убирать за собой.
Однако, если вы обнаружите, что вам нужно удалить данные мета термина, вы можете использовать delete_term_meta()
эту функцию. Она занимает до трех аргументов:
-
$term_id
: идентификатор термина -
$meta_key
: мета-ключ -
$meta_value
: предыдущее значение
Вам нужно только предоставить, $meta_value
если вы хотите удалить мета данные с определенным значением.
Получение условия по мета-значение
Как и в публикациях, можно также получить термины, используя мета-значения. Установите meta_query
параметр при использовании get_terms()
или wp_get_object_terms()
.
Со следующим запросом я хотел бы получить все функции в kitchen
группе.
$args = array(
'hide_empty' => false, // also retrieve terms which are not used yet
'meta_query' => array(
array(
'key' => 'feature-group',
'value' => 'kitchen',
'compare' => 'LIKE'
)
)
);
$terms = get_terms( 'house_feature', $args );
Синтаксис meta_query
такой же, WP_Query
как в , что позволяет использовать различные операторы compare
для, как NOT LIKE
, или EXISTS
BETWEEN
.
Так как я использую мета данные для группы моих терминов, получить результат обратно приказал мета значение было бы очень полезно. Однако, в отличие WP_Query
от, вы не можете использовать orderby => meta_value
еще и должны сортировать результаты после их получения.
Для отображения наших терминов и мета-данных, мы итерации через результаты и использовать get_term_meta()
снова.
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
echo '<ul>';
foreach ( $terms as $term ) {
echo '<li>' . $term->name . ' (' . get_term_meta( $term->term_id, 'feature-group', true ) . ')' . '</li>';
}
echo '</ul>';
}
Заключение
Я знаю много проектов, которые уже сохранить мета информацию для пользовательских таксономий. Многие из них, вероятно, будет обновлять и использовать новую логику мета данных раз WordPress 4.4 широко используется.
Последнее, что я упускаю сейчас в таксономии дорожной карты, чтобы иметь возможность установить мета данные для конкретного термина-объект отношения. Позвольте мне знать, если вы можете относиться к этому в комментариях.
Ресурсы
get_terms
в Кодексе WordPress- Таксономия облавы на make.wordpress.org
Выдержка из изображения: Николай Бачийский
Источник: smashingmagazine.com