Представляя Срок Мета данных в WordPress и как их использовать

WordPress 4.4 представил термин мета данных, который позволяет сохранить мета-значения для терминов аналогичным образом, чтобы получить возможность отправлять мета данных. Это долгожданное и логичное дополнение к системе WordPress.

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

Дальнейшее чтение на SmashingMag:

Под капотом термина Мета данных

Логика термина мета-данных не нова, уже используется для публикаций, комментариев и пользователей.

Для обеспечения условий метаданных была введена новая 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
}

Это добавляет выбрать форму прямо между исходными полями формы и кнопкой отправки.

create term form with meta data field
Форма для создания нового термина в пользовательской таксономии теперь должна выглядеть следующим образом. (Посмотреть большую версию)

Чтобы сохранить термин мета, нам нужно подключиться к действию, которое выполняется при сохранении нового термина. На этот раз мы используем 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;
}

Вот как может выглядеть список терминов с дополнительным столбцом для терминных данных:

term list with meta data
Список терминов с таблицей мета данных. (Посмотреть большую версию)

Удалять данные мета-терминов

Если вы удалите термин, соответствующие мета данные также будут удалены, так что вам не нужно убирать за собой.

Однако, если вы обнаружите, что вам нужно удалить данные мета термина, вы можете использовать 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 широко используется.

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

Ресурсы

Выдержка из изображения: Николай Бачийский

Источник: smashingmagazine.com

Великолепный Журнал

Великолепный, сокрушительный, разящий (см. перевод smashing) независимый журнал о веб-разработке. Основан в 2006 году в Германии. Имеет няшный дизайн и кучу крутых авторов, которых читают 2 млн человек в месяц.

Добавить комментарий

%d такие блоггеры, как: