Статьи

Многоразовые пользовательские мета-боксы. Часть 2. Расширенные поля

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


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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
array (
    ‘label’ => ‘Radio Group’,
    ‘desc’ => ‘A description for the field.’,
    ‘id’ => $prefix.’radio’,
    ‘type’ => ‘radio’,
    ‘options’ => array (
        ‘one’ => array (
            ‘label’ => ‘Option One’,
            ‘value’ => ‘one’
        ),
        ‘two’ => array (
            ‘label’ => ‘Option Two’,
            ‘value’ => ‘two’
        ),
        ‘three’ => array (
            ‘label’ => ‘Option Three’,
            ‘value’ => ‘three’
        )
    )
)

Обязательно добавьте это среди других элементов массива в исходный массив $custom_meta_fields мы начали в первой части.

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

1
2
3
4
5
6
7
// radio
case ‘radio’:
    foreach ( $field[‘options’] as $option ) {
        echo ‘<input type=»radio» name=»‘.$field[‘id’].'» id=»‘.$option[‘value’].'» value=»‘.$option[‘value’].'» ‘,$meta == $option[‘value’] ?
                <label for=»‘.$option[‘value’].'»>’.$option[‘label’].'</label><br />’;
    }
break;

Этот код будет добавлен после последнего «перерыва» в нашем переключателе мета-блока.

  • Перебирайте каждую опцию во вложенном массиве «options» поля
  • Используйте встроенное условное выражение, чтобы определить, соответствует ли сохраненное значение значению текущего открытия и вывести атрибут «флажок», если оно истинно
  • Используйте значение опции в качестве уникального идентификатора для метки
  • Добавьте разрыв в конце, чтобы следующая опция была на новой строке
  • закончите это с полем описания. Нет необходимости в предшествующем «<br />», так как у нас остался один от циклического перебора вариантов

Мы рассмотрели возможность использования флажка в качестве переключателя вкл. / Выкл. И как выбрать один вариант из многих, но что мы хотим, чтобы можно было сохранить более одного значения для одного и того же поля? Вот тут-то и пригодится группа флажков.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
array (
    ‘label’ => ‘Checkbox Group’,
    ‘desc’ => ‘A description for the field.’,
    ‘id’ => $prefix.’checkbox_group’,
    ‘type’ => ‘checkbox_group’,
    ‘options’ => array (
        ‘one’ => array (
            ‘label’ => ‘Option One’,
            ‘value’ => ‘one’
        ),
        ‘two’ => array (
            ‘label’ => ‘Option Two’,
            ‘value’ => ‘two’
        ),
        ‘three’ => array (
            ‘label’ => ‘Option Three’,
            ‘value’ => ‘three’
        )
    )
)

Опять же, мы добавляем это в наш массив $custom_meta_fields и настройки практически идентичны аналогичным полям с уникальным идентификатором и определенным типом.

1
2
3
4
5
6
7
8
// checkbox_group
case ‘checkbox_group’:
    foreach ($field[‘options’] as $option) {
        echo ‘<input type=»checkbox» value=»‘.$option[‘value’].'» name=»‘.$field[‘id’].'[]» id=»‘.$option[‘value’].'»‘,$meta && in_array($option[‘value’], $meta) ?
                <label for=»‘.$option[‘value’].'»>’.$option[‘label’].'</label><br />’;
    }
    echo ‘<span class=»description»>’.$field[‘desc’].’
break;

Самое большое различие заключается в том, что мы сохраняем эти данные в виде массива.

  • Перебрать каждую опцию, определенную в массиве
  • Сохраните данные в массиве, добавив квадратные скобки в конец имени: []
  • В нашем встроенном условном выражении для вывода атрибута «checked» проверьте, находится ли значение внутри массива, с помощью «in_array ()»
  • Как и раньше, добавьте значение для каждого входа, закройте цикл и выведите описание

Возможность иметь пользовательские таксономии для различных целей — это прекрасно, но иногда вы хотите ограничить пользователя, чтобы он мог выбирать только один термин на пост. Простое решение состоит в том, чтобы удалить поле выбора по умолчанию, добавляемое WordPress на страницу «Написать сообщение», и добавить его в качестве поля выбора в свой пользовательский мета-блок.

1
2
3
4
5
array(
    ‘label’ => ‘Category’,
    ‘id’ => ‘category’,
    ‘type’ => ‘tax_select’
)

Для этого примера я просто собираюсь использовать встроенную таксономию «категория». Добавьте это в ваш массив $custom_meta_fields . Убедитесь, что идентификатор идентичен названию таксономии.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
// tax_select
case ‘tax_select’:
    echo ‘<select name=»‘.$field[‘id’].'» id=»‘.$field[‘id’].'»>
            <option value=»»>Select One</option>’;
    $terms = get_terms($field[‘id’], ‘get=all’);
    $selected = wp_get_object_terms($post->ID, $field[‘id’]);
    foreach ($terms as $term) {
        if (!empty($selected) && !strcmp($term->slug, $selected[0]->slug))
            echo ‘<option value=»‘.$term->slug.'» selected=»selected»>’.$term->name.'</option>’;
        else
            echo ‘<option value=»‘.$term->slug.'»>’.$term->name.'</option>’;
    }
    $taxonomy = get_taxonomy($field[‘id’]);
    echo ‘</select><br /><span class=»description»><a href=»‘.get_bloginfo(‘home’).’/wp-admin/edit-tags.php?taxonomy=’.$field[‘id’].'»>Manage ‘.$taxonomy->label.'</a>
break;

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

  • Откройте поле выбора и добавьте пустое значение как «Выбрать один»
  • Получить все условия набора таксономии
  • Получить условия, которые были сохранены для текущей таксономии
  • Начните цикл через каждый термин.
  • Для простоты и удобства чтения мы используем полноразмерную условную опцию вывода, которая выбирается, если она соответствует сохраненному термину, и обычную опцию для остальных.
  • Когда вы закроете цикл и поле выбора, мы хотим получить немного информации о таксономии и сохранить ее в переменной.
  • Используйте область описания как простой способ связать пользователя с областью, где он может управлять терминами таксономии. Используйте метку из информации о таксономии $, которую мы собрали, чтобы множественное число было правильным (нет такого понятия, как категории).

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

1
2
3
4
function remove_taxonomy_boxes() {
    remove_meta_box(‘categorydiv’, ‘post’, ‘side’);
}
add_action( ‘admin_menu’ , ‘remove_taxonomy_boxes’ );

Вы можете получить здесь фантазию и снова использовать массив $custom_meta_fields чтобы циклически проходить через каждое поле «tax_select» и добавлять его в эту функцию удаления, но, вероятно, намного проще назвать их по отдельности. Вам нужно знать идентификатор, если div для поля таксономии, чтобы правильно удалить его. Узнайте больше о remove_meta_box() в Кодексе WordPress.

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

Сначала пропустите его в цикле поля. Найдите эту строку:

1
foreach ($custom_meta_fields as $field) {

и после этого добавьте эту строку:

1
if($field[‘type’] == ‘tax_select’) continue;

Затем после цикла foreach добавьте следующее:

1
2
3
4
// save taxonomies
$post = get_post($post_id);
$category = $_POST[‘category’];
wp_set_object_terms( $post_id, $category, ‘category’ );

Это просто захватывает значение из нашего поля выбора категории, а затем устанавливает его как условия таксономии для публикации.


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

1
2
3
4
5
6
7
array(
    ‘label’ => ‘Post List’,
    ‘desc’ => ‘A description for the field.’,
    ‘id’ => $prefix.’post_id’,
    ‘type’ => ‘post_list’,
    ‘post_type’ => array(‘post’,’page’)
)

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

01
02
03
04
05
06
07
08
09
10
11
12
13
// post_list
case ‘post_list’:
$items = get_posts( array (
    ‘post_type’ => $field[‘post_type’],
    ‘posts_per_page’ => -1
));
    echo ‘<select name=»‘.$field[‘id’].'» id=»‘.$field[‘id’].'»>
            <option value=»»>Select One</option>’;
        foreach($items as $item) {
            echo ‘<option value=»‘.$item->ID.'»‘,$meta == $item->ID ?
        } // end foreach
    echo ‘</select><br /><span class=»description»>’.$field[‘desc’].’
break;

Существует множество опций, которые вы можете добавить, чтобы отфильтровать этот запрос, но мы используем базовый набор всех постов с заданными типами постов.

  • Запросить все сообщения
  • Откройте поле выбора и добавьте пустое значение
  • Прокрутите каждое сообщение и установите идентификатор в качестве значения параметра, а заголовок, помеченный типом сообщения в качестве отображаемого текста, выберите из
  • Закройте цикл и поле выбора и добавьте описание

Если вы следили за обеими частями этой серии до сих пор, ваш окончательный вариант должен выглядеть так, как показано здесь:

Custom Meta Box

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