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

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

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

  • Цикл WordPress — это цикл, который перебирает массив данных содержащих в себе информацию о каждом посте.
  • WP_Query — класс, позволяющий получать посты из базы данных с необходимыми параметрами.
  • Темплейт — шаблон вывода постов.
  • Фильтрация — изменение вывода постов с заданными параметрами. Можно фильтровать посты по наличию или значению произвольных полей, числа даты, и др.
  • Метаполе — произвольное поле записи.

Пример цикла на основе WP_Query:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php 
    $related_posts = new WP_Query( array(
        'post_type' => 'post', //Тип записи
    ) );
    if ( $related_posts->have_posts() ) {
        while ( $related_posts->have_posts() ) {
            $related_posts->the_post();
                get_template_part( 'templates/related-posts', get_post_format() ); //Темплейт вывода постов. Лежит в папке templates активной темы.
            }
    } else {
        echo '<p>Записей не найдено.</p>'; //На случай, если записей нет.
    }
    wp_reset_postdata(); //Сбрасываем цикл.
?>

Таким способом мы можем получить все записи за все время, и, если их будет очень много, скорее всего уроним сайт. Поэтому мы должны ограничить количество постов для вывода, либо отфильтровать их по заданным параметрам. А для вывода постов, будем использовать темплейт related-posts, который будет лежать в папке templates активной темы.

Параметры фильтрации постов:

  • order — направление сортировки по параметру orderby. Бывает: ASC — по порядку, DESC — в обратном порядке.
  • orderby — сортировка по: none — без сортировки, ID — по ID (номеру поста), author — по id автора (номера автора), title — по загловку, name — по названию поста, date — дате публикации, modified — дате изменения, type — по типу контента, rand — случайный порядок, comment_count — количеству комментариев, meta_value — значению произвольного поля, meta_value_num — значению числового произвольного поля.
  • posts_per_page — количество записей на страницу.
  • meta_query — массив параметров метаполей постов.

Теперь изменим наш цикл, и попробуем вывести 8 последних постов, отсортированных по дате.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php 
    $related_posts = new WP_Query( array(
        'post_type'      => 'post', //Тип записи.
        'posts_per_page' => 8, //Выведем первые 8 записей. 
        'orderby'        => date, //Сортировка по дате.
    ) );
    if ( $related_posts->have_posts() ) {
        while ( $related_posts->have_posts() ) {
            $related_posts->the_post();
                get_template_part( 'templates/related-posts', get_post_format() ); //Темплейт вывода постов. Лежит в папке templates активной темы.
            }
    } else {
        echo '<p>Записей не найдено.</p>'; //На случай, если записей нет.
    }
    wp_reset_postdata(); //Сбрасываем цикл.
?>

Усложним задачу: будем фильтровать посты по наличию поля meta_featured, с выводом 8 постов на страницу. Например: с помощью CMB2 можно создать метаполе типа чекбокс, и выводить на главную только заданные посты.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php 
    $related_posts = new WP_Query( array(
        'post_type'      => 'post', //Тип записи.
        'posts_per_page' => 8, //Выведем первые 8 записей. 
        'meta_query' => array( //Выберем посты, в которых есть произвольное поле meta_featured.
            array(
                'key' => 'meta_featured',
                'compare' => 'IN'
            )
        )
    ) );
    if ( $related_posts->have_posts() ) {
        while ( $related_posts->have_posts() ) {
            $related_posts->the_post();
                get_template_part( 'templates/related-posts', get_post_format() ); //Темплейт вывода постов. Лежит в папке templates активной темы.
            }
    } else {
        echo '<p>Записей не найдено.</p>'; //На случай, если записей нет.
    }
    wp_reset_postdata(); //Сбрасываем цикл.
?>

Более сложный пример: будем фильтровать посты по числовому метаполю meta_votes, с выводом 8 постов на страницу.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php 
    $related_posts = new WP_Query( array(
        'post_type'      => 'post', //Тип записи.
        'posts_per_page' => 8, //Выведем первые 8 записей. 
        'order'          => 'DESC', //В сторону уменьшения.
        'orderby'        => 'meta_value_num', //Числовое метаполе.
        'meta_key'       => 'meta_votes' //Имя метаполя.
    ) );
    if ( $related_posts->have_posts() ) {
        while ( $related_posts->have_posts() ) {
            $related_posts->the_post();
                get_template_part( 'templates/related-posts', get_post_format() ); //Темплейт вывода постов. Лежит в папке templates активной темы.
            }
    } else {
        echo '<p>Записей не найдено.</p>'; //На случай, если записей нет.
    }
    wp_reset_postdata(); //Сбрасываем цикл.
?>

Итоги

Понимание и принципы работы фильтрации постов, дает неограниченный простор к кастомизации вордпресса.

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