Все записи с тегом: cmb2

Кастомизация админки вордпресса, при разработке сайта под клиента, играет огромную роль. Довольно часто контактную информацию компании клиент может менять на лету, и чтобы не править каждый раз footer и header, нужно дать возможность клиенту менять эту информацию самому. На помощь нам приходит замечательный плагин CMB2. Кстати, в предыдущих статьях, мы научились создавать различные поля, типа: текст, переключатели, файл и чекбокс.

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

Содержание статьи:

  • Создание страницы с контактными данными.
  • Функция получения данных со страницы с контактами.
  • Показ контактных данных.

Создание страницы с контактными данными.

Следующий код создаст в админке страницу «Контакты компании» с двумя контактными телефонами, email и скриптом Яндекс карт. Используем всего два типа полей: text_medium и textarea_code. Код нужно поместить в файл function.php активной темы.

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
//Страница контактов компании
function company_page_options() {
    $company_options = new_cmb2_box( array(
        'id'           => 'company-options',
        'title'        => esc_html__( 'Контакты компании' ),
        'object_types' => array( 'options-page' ),
        'option_key'      => 'company-options', // Ключ опций и слаг.
        'icon_url'        => 'dashicons-image-filter', //Иконка в меню
    ) );
    $company_options->add_field( array(
        'name' => esc_html__( 'Контактный телефон 1:' ), 
        'desc' => esc_html__( 'Например: +79998885522' ), 
        'id'   => 'tell1', 
        'type' => 'text_medium', 
    ) );
    $company_options->add_field( array(
        'name' => esc_html__( 'Контактный телефон 2:' ), 
        'desc' => esc_html__( 'Например: +79998885522' ), 
        'id'   => 'tell2', 
        'type' => 'text_medium', 
    ) );
    $company_options->add_field( array(
        'name' => esc_html__( 'Email:' ), 
        'desc' => esc_html__( 'Например: email@email.ru' ), 
        'id'   => 'email', 
        'type' => 'text_medium', 
    ) );
    $company_options->add_field( array(
        'name' => esc_html__( 'Скрипт Яндекс карты:' ), 
        'desc' => esc_html__( 'Генерируется по ссылке: https://yandex.ru/map-constructor/' ), 
        'id'   => 'ymap', 
        'type' => 'textarea_code', 
    ) );
}
add_action( 'cmb2_admin_init', 'company_page_options' );

Результат:

CMB2 - страницы с контактами компании в админке

Функция получения данных со страницы с контактами.

Следующая функция позволит нам получать сохраненные данные со страницы.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
add_action( 'cmb2_admin_init', 'company_page_options' );
function cp_get_option( $key = '', $default = false ) {
    if ( function_exists( 'cmb2_get_option' ) ) {
        return cmb2_get_option( 'company-options', $key, $default );
    }
    $opts = get_option( 'company-options', $default );
    $val = $default;
    if ( 'all' == $key ) {
        $val = $opts;
    } elseif ( is_array( $opts ) && array_key_exists( $key, $opts ) && false !== $opts[ $key ] ) {
        $val = $opts[ $key ];
    }
    return $val;
}

Показ контактных данных.

Теперь нам осталось получить и вывести данные в нужном месте сайта, например в header.php.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<div class="contacts">
    <?php 
        $tell = cp_get_option( 'tell1' );
        $tell2 = cp_get_option( 'tell2' );
        $email = cp_get_option( 'email' );
        $ymap = cp_get_option( 'ymap' );
    ?>
    <div>
        <b>Телефон 1:</b><br>
        <?php echo $tell; ?>
    </div>
    <div>
        <b>Телефон 2:</b><br>
        <?php echo $tell2; ?>
    </div>
    <div>
        <b>Email:</b><br>
        <?php echo $email; ?>
    </div>
    <div>
        <b>Яндекс карта:</b><br>
        <?php echo $ymap; ?>
    </div>
</div>

Результат:

CMB2 - страницы с контактами компании в админке

Итоги

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

05 апреля
Теги: , ,

Как мы узнали ранее, замечательный плагин 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 апреля

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

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

Сделаем выбор рубрики пользователя в профиле:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function cmb2_get_term_options( $field ) {
    $args = $field->args( 'get_terms_args' );
    $args = is_array( $args ) ? $args : array();
 
    $args = wp_parse_args( $args, array( 'taxonomy' => 'category' ) );
 
    $taxonomy = $args['taxonomy'];
 
    $terms = (array) cmb2_utils()->wp_at_least( '4.5.0' )
        ? get_terms( $args )
        : get_terms( $taxonomy, $args );
    $term_options = array();
    if ( ! empty( $terms ) ) {
        foreach ( $terms as $term ) {
            $term_options[ $term->term_id ] = $term->name;
        }
    }
    return $term_options;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function cmb2_sample_metaboxes() {
        //USERMETA
	$prefix = 'usermeta_';
	$cmb = new_cmb2_box( array(
            'id'            => 'first_box',
            'title'         => __( 'Мета поля' ),
            'object_types'  => array( 'user', ),
            'context'       => 'normal',
            'priority'      => 'high',
            'show_names'    => true,
	) );
        $cmb->add_field( array(
            'name'       => 'Сайт',
            'desc'           => 'Выберите рубрику пользователя.',
            'id'             => $prefix . 'tax',
            'type'           => 'select',
            'options_cb'     => 'cmb2_get_term_options',
            'get_terms_args' => array(
                'taxonomy'   => 'category',
                'hide_empty' => false,
            ),
        ) );
}

Получаем номер рубрики:

1
$user_tax = get_user_meta($user_ID, 'usermeta_tax', true);
15 декабря

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

CMB2

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

Плагин позволяет создавать за считанные секунды такие произвольные поля, как:

  • Поля для ввода — текста, цены, времени, даты;
  • Всевозможные селекты, чекбоксы и радио кнопки;
  • Файлы и изображения.
  • И др.

Установка

Достаточно скачать, положить в папку plugins и активировать плагин. Сам плагин, вплоть до версии 2.2.5.3 своего интерфейса не имеет. Да он и не нужен.

Инициализируем произвольные поля, следующий код нужно вставить в файл functions.php вашей темы.

1
2
3
4
5
6
7
8
9
10
11
12
function cmb2_sample_metaboxes() {
	$prefix = 'my_metaboxes_'; // Уникальный префикс произвольных полей 
	$cmb = new_cmb2_box( array(
		'id'            => 'my_metabox',
		'title'         => __( 'Мои произвольные поля' ),
		'object_types'  => array( 'post', ), // По умолчанию, стоит post, если нужно указать другой тип записи, меняйте на свой.
		'context'       => 'normal',
		'priority'      => 'high',
		'show_names'    => true,
	) );
        // Сюда будем вставлять свои произвольные поля.
}

Важный момент: все примеры можно легко найти в файле example-functions.php, в папке с плагином.

Пример: создадим новое произвольное поле — текст.

Ищем файл example-functions.php, в папке с плагином, открываем и копируем оттуда код (строка 142):

1
2
3
4
5
6
7
8
9
10
11
12
$cmb_demo->add_field( array(
        'name' => esc_html__( 'Test Text Small', 'cmb2' ),
        'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
        'id'   => $prefix . 'textsmall',
        'type' => 'text_small',
        // 'repeatable' => true,
        // 'column' => array(
        // 	'name'     => esc_html__( 'Column Title', 'cmb2' ), // Set the admin column title
        // 	'position' => 2, // Set as the second column.
        // );
        // 'display_cb' => 'yourprefix_display_text_small_column', // Output the display of the column values through a callback.
) );

Вставляем его в functions.php вашей темы.

Теперь, код должен быть таким:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function cmb2_sample_metaboxes() {
	$prefix = 'my_metaboxes_'; // Уникальный префикс произвольных полей
	$cmb = new_cmb2_box( array(
		'id'            => 'my_metabox',
		'title'         => __( 'Мои произвольные поля' ),
		'object_types'  => array( 'post', ), // По умолчанию, стоит post, если нужно указать другой тип записи, меняйте на свой.
		'context'       => 'normal',
		'priority'      => 'high',
		'show_names'    => true,
	) );
        $cmb_demo->add_field( array( //Обязательно изменить переменную на $cmb
		'name' => esc_html__( 'Test Text Small', 'cmb2' ), // Название 
		'desc' => esc_html__( 'field description (optional)', 'cmb2' ), // Подсказка
		'id'   => $prefix . 'textsmall', // Имя произвольного поля
		'type' => 'text_small',
		// 'repeatable' => true,
		// 'column' => array(
		// 	'name'     => esc_html__( 'Column Title', 'cmb2' ), // Set the admin column title
		// 	'position' => 2, // Set as the second column.
		// );
		// 'display_cb' => 'yourprefix_display_text_small_column', // Output the display of the column values through a callback.
	) );
}

Что нужно поправить:

  • Переменную $cmb_demo на $cmb.
  • ‘name’ — Название произвольного поля.
  • ‘desc’ — Подсказка для произвольного поля.
  • ‘id’ — имя произвольного поля в базе.

Результат:

Получим свое произвольное поле.

Получить произвольное поле можно стандартными средствами вордпресса:

1
<?php echo get_post_meta($post->ID, 'my_metaboxes_textsmall', true); ?>

Не запутайтесь: имя произвольного поля формируется из переменной $prefix и id.

26 сентября