§ WordPress — Плагин CMB2, основы работы, базовые примеры

Как мы узнали ранее, замечательный плагин CMB2 позволяет создавать произвольные поля различных типов.

Скачать плагин CMB2

Основные понятия статьи:

  • Типы контента — WordPress использует несколько типов контента: post — записи, page — страницы, custom post types — пользовательские типы записей. И несколько других, в рамках этой статьи невостребованных.
  • Произвольные поля — дополнительные данные записей или станиц, можно указывать любые типы, от чисел и текста, до файлов и галерей изображений. В статье будем их называть метаполями. Просто потому что мне так захотелось.
  • CMB2 — плагин, для создания любых метаполей.
  • Темплейт single.php — шаблон вывода записей (post).

Давайте подробнее разберем его работу на базовых примерах, создадим дополнительные поля для записей (post).

Инициализируем наши поля в файле functions.php активной темы:

1
2
3
4
5
6
7
8
9
10
11
12
add_action( 'cmb2_admin_init', 'cmb2_metaboxes' );
function cmb2_metaboxes() {
    $post_prefix = 'postmeta_'; //Префикс, на случай если мы будет использовать разные метаполя для разных типов постов.
    $cmb_post = new_cmb2_box( array(
        'id'            => 'metaboxes',
        'title'         => __( 'Дополнительные поля' ),
        'object_types'  => array( 'post', ), //Выводим метаполя для записей (post). Или page для страниц.
        'context'       => 'normal',
        'priority'      => 'high',
        'show_names'    => true, // Показывать название полей слева.
    ) );
}

Теперь прикрутим новое метаполе типа текст.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
add_action( 'cmb2_admin_init', 'cmb2_metaboxes' );
function cmb2_metaboxes() {
    $post_prefix = 'postmeta_'; //Префикс, на случай если мы будет использовать разные метаполя для разных типов постов.
    $cmb_post = new_cmb2_box( array(
        'id'            => 'metaboxes',
        'title'         => __( 'Дополнительные поля' ),
        'object_types'  => array( 'post', ), //Выводим метаполя для записей (post). Или page для страниц.
        'context'       => 'normal',
        'priority'      => 'high',
        'show_names'    => true, // Показывать название полей слева.
    ) );
    //Поле типа текст.
    $cmb_post->add_field( array(
        'name' => esc_html__( 'Год выхода:' ), //Название поля в админке.
        'desc' => esc_html__( 'Например: 1995.' ), //Описание поля в админке.
        'id'   => $post_prefix . 'year', //Используем наш префикс и добавляем уникальное название year.
        'type' => 'text_small', //Поле типа текст.
    ) );
}

Результат в админке:

CMB2 - Поле типа текст.

Получение этого поля возможно в теплейте single.php, или в прямо в цикле довольно простым кодом:

1
2
$year = get_post_meta($post->ID, 'postmeta_year', true);
echo $year;

Усложним задачу, добавим еще одно поле типа переключатели (radio button).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
add_action( 'cmb2_admin_init', 'cmb2_metaboxes' );
function cmb2_metaboxes() {
    $post_prefix = 'postmeta_'; //Префикс, на случай если мы будет использовать разные метаполя для разных типов постов.
    $cmb_post = new_cmb2_box( array(
        'id'            => 'metaboxes',
        'title'         => __( 'Дополнительные поля' ),
        'object_types'  => array( 'post', ), //Выводим метаполя для записей (post). Или page для страниц.
        'context'       => 'normal',
        'priority'      => 'high',
        'show_names'    => true, // Показывать название полей слева.
    ) );
    //Поле типа текст.
    $cmb_post->add_field( array(
        'name' => esc_html__( 'Год выхода:' ), //Название поля в админке.
        'desc' => esc_html__( 'Например: 1995.' ), //Описание поля в админке.
        'id'   => $post_prefix . 'year', //Используем наш префикс и добавляем уникальное название year.
        'type' => 'text_small', //Поле типа текст.
    ) );
    //Поле типа переключатели.
    $cmb_post->add_field( array(
        'name'             => esc_html__( 'Выберите жанр:' ), //Название поля в админке.
        'desc'             => esc_html__( 'Можно выбрать только один жанр.' ), //Описание поля в админке.
        'id'               => $post_prefix . 'genre',
        'type'             => 'radio_inline', //Поле типа переключатели. Может быть двух типов: radio и radio_inline.
        'show_option_none' => 'Не указано', //Показывать пустое значение. 
        'options'          => array(
            'Драма' => esc_html__( 'Драма' ),
            'Триллер' => esc_html__( 'Триллер' ),
            'Ужасы' => esc_html__( 'Ужасы' ),
        ),
    ) );
}

Может быть двух типов: radio (вертикальный вывод) и radio_inline (вывод в строку). Получаем их так же как и в случае с полем типа текст:

1
2
$genre = get_post_meta($post->ID, 'postmeta_genre', true);
echo $genre;

Результат в админке:

CMB2 - Поле типа переключатели.

Сделаем еще одно поле, добавим возможность прикреплять файл (file).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
add_action( 'cmb2_admin_init', 'cmb2_metaboxes' );
function cmb2_metaboxes() {
    $post_prefix = 'postmeta_'; //Префикс, на случай если мы будет использовать разные метаполя для разных типов постов.
    $cmb_post = new_cmb2_box( array(
        'id'            => 'metaboxes',
        'title'         => __( 'Дополнительные поля' ),
        'object_types'  => array( 'post', ), //Выводим метаполя для записей (post). Или page для страниц.
        'context'       => 'normal',
        'priority'      => 'high',
        'show_names'    => true, // Показывать название полей слева.
    ) );
    //Поле типа текст.
    $cmb_post->add_field( array(
        'name' => esc_html__( 'Год выхода:' ), //Название поля в админке.
        'desc' => esc_html__( 'Например: 1995.' ), //Описание поля в админке.
        'id'   => $post_prefix . 'year', //Используем наш префикс и добавляем уникальное название year.
        'type' => 'text_small', //Поле типа текст.
    ) );
    //Поле типа переключатели.
    $cmb_post->add_field( array(
        'name'             => esc_html__( 'Выберите жанр:' ), //Название поля в админке.
        'desc'             => esc_html__( 'Можно выбрать только один жанр.' ), //Описание поля в админке.
        'id'               => $post_prefix . 'genre',
        'type'             => 'radio_inline', //Поле типа переключатели. Может быть двух типов: radio и radio_inline.
        'show_option_none' => 'Не указано', //Показывать пустое значение. 
        'options'          => array(
            'Драма' => esc_html__( 'Драма' ),
            'Триллер' => esc_html__( 'Триллер' ),
            'Ужасы' => esc_html__( 'Ужасы' ),
        ),
    ) );
    //Поле типа файл.
    $cmb_post->add_field( array(
        'name'    => 'Файл:', //Название поля в админке.
        'desc'    => 'Загрузите новый Файл.', //Описание поля в админке.
        'id'      => $post_prefix . 'file',
        'type'    => 'file', //Поле типа файл.
        'options' => array(
            'url' => true, //Показывает url файла, можеть быть true - показывать и false - скрыть.
        ),
        'text'    => array(
            'add_upload_file_text' => 'Добавить файл' //Текст кнопки.
        ),
	'query_args' => array( //Мы можем сами выбирать форматы файла, наример: 'type' => 'application/pdf', разрешит добавлять только файлы в формате pdf.
            'type' => array(
                'image/gif',
                'image/jpeg',
                'image/png',
            ),
	),
        'preview_size' => 'large', //Размер превью. Возможно несколько значений: small, medium, large. Либо свой размер: array( 100, 100 ).
    ) );
}

Результат в админке:

CMB2 - Поле типа файл.

Сделаем возможность скачать этот файл в темплейте single.php:

1
2
$file = get_post_meta($post->ID, 'postmeta_file', true);
echo '<a href="'. $file .'">Скачать файл</a>';

Сделаем дополнительное поле типа чекбокс. Например, можно использовать его в цикле вордпресса для вывода featured постов на главной странице.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
add_action( 'cmb2_admin_init', 'cmb2_metaboxes' );
function cmb2_metaboxes() {
    $post_prefix = 'postmeta_'; //Префикс, на случай если мы будет использовать разные метаполя для разных типов постов.
    $cmb_post = new_cmb2_box( array(
        'id'            => 'metaboxes',
        'title'         => __( 'Дополнительные поля' ),
        'object_types'  => array( 'post', ), //Выводим метаполя для записей (post). Или page для страниц.
        'context'       => 'normal',
        'priority'      => 'high',
        'show_names'    => true, // Показывать название полей слева.
    ) );
    //Поле типа чекбокс.
    $cmb_post->add_field( array(
        'name' => esc_html__( 'Показывать на главной' ), //Название поля в админке.
        'desc' => esc_html__( '' ), //Описание поля в админке.
        'id'   => $post_prefix . 'featured', //Используем наш префикс и добавляем уникальное название featured.
        'type' => 'checkbox', //Поле типа чекбокс.
    ) );
    //Поле типа текст.
    $cmb_post->add_field( array(
        'name' => esc_html__( 'Год выхода:' ), //Название поля в админке.
        'desc' => esc_html__( 'Например: 1995.' ), //Описание поля в админке.
        'id'   => $post_prefix . 'year', //Используем наш префикс и добавляем уникальное название year.
        'type' => 'text_small', //Поле типа текст.
    ) );
    //Поле типа переключатели.
    $cmb_post->add_field( array(
        'name'             => esc_html__( 'Выберите жанр:' ), //Название поля в админке.
        'desc'             => esc_html__( 'Можно выбрать только один жанр.' ), //Описание поля в админке.
        'id'               => $post_prefix . 'genre',
        'type'             => 'radio_inline', //Поле типа переключатели. Может быть двух типов: radio и radio_inline.
        'show_option_none' => 'Не указано', //Показывать пустое значение. 
        'options'          => array(
            'Драма' => esc_html__( 'Драма' ),
            'Триллер' => esc_html__( 'Триллер' ),
            'Ужасы' => esc_html__( 'Ужасы' ),
        ),
    ) );
    //Поле типа файл.
    $cmb_post->add_field( array(
        'name'    => 'Файл:', //Название поля в админке.
        'desc'    => 'Загрузите новый Файл.', //Описание поля в админке.
        'id'      => $post_prefix . 'file',
        'type'    => 'file', //Поле типа файл.
        'options' => array(
            'url' => true, //Показывает url файла, можеть быть true - показывать и false - скрыть.
        ),
        'text'    => array(
            'add_upload_file_text' => 'Добавить файл' //Текст кнопки.
        ),
	'query_args' => array(//Мы можем сами выбирать форматы файла, наример: 'type' => 'application/pdf', разрешит добавлять только файлы в формате pdf.
            'type' => array(
                'image/gif',
                'image/jpeg',
                'image/png',
            ),
	),
        'preview_size' => 'large', //Размер превью. Возможно несколько значений: small, medium, large. Либо свой размер: array( 100, 100 ).
    ) );
}

Результат в админке:

CMB2 - Поле типа чекбокс.

Итоги

Скорость, с которой CMB2 позволяет кастомизировать админку, расширяя базовый функционал WordPress’а и его простота, делает плагин CMB2 отличным подспорьем в любом проекте.

03 апреля