Все записи с тегом: плагины wp

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

Плагин электронной коммерции Woocommerce, версии 3 и выше, изменил работу и вывод рекомендуемых товаров. Теперь рекомендованные товары можно получить так:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
    $args = array(
        'post_type' => 'product',
        'posts_per_page' => 3,
        'tax_query' => array(
                array(
                    'taxonomy' => 'product_visibility',
                    'field'    => 'name',
                    'terms'    => 'featured',
                ),
            ),
        );
    $featured_products = new WP_Query( $args );
    if ( $featured_products->have_posts() ) {
        while ( $featured_products->have_posts() ) : $featured_products->the_post();
            wc_get_template_part( 'content', 'product' ); // Можно заменить на свой шаблон вывода, например: get_template_part( 'template-parts/featured-products', get_post_format() ); 
        endwhile;
    } else {
        echo 'Рекомендуемых товаров нет.';
    }
    wp_reset_postdata();
?>
28 декабря

Замечательный плагин 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 сентября