Статьи

Освоение WP_Query: 10 полезных примеров

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

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

Чтобы сделать эту статью понятной отдельно от серии «Освоение WP_Query», я должен нанести учебник по созданию циклов WordPress с WP_Query класса WP_Query .

На самом деле это не отличается от создания обычного цикла. Типичный цикл WordPress выглядит так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?php
 
if ( have_posts() ) {
 
    while ( have_posts() ) {
 
        the_post();
 
        // Post data goes here.
 
    }
 
}
 
?>

И создание цикла с классом WP_Query имеет только несколько отличий:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
 
$args = array(
    ‘category_name’ => ‘news’,
    ‘posts_per_page’ => 3
);
 
$my_query = new WP_Query( $args );
 
if ( $my_query->have_posts() ) {
 
    while ( $my_query->have_posts() ) {
 
        $my_query->the_post();
 
        // Post data goes here.
 
    }
 
}
 
// Reset the `$post` data to the current post in main query.
wp_reset_postdata();
 
?>

Давайте посмотрим на разницу между ними:

  • Мы устанавливаем некоторые аргументы для нашего экземпляра WP_Query ,
  • Мы WP_Query экземпляр класса WP_Query ,
  • Мы добавили $my_query-> в начало функций have_posts() и the_post() (так что теперь они являются методами класса WP_Query ),
  • И мы сбрасываем данные $post чтобы он мог вернуться к основному запросу.

Теперь мы знаем, как создать цикл с WP_Query и разницу между обычным циклом и циклом, созданным с помощью WP_Query . Мы не собираемся создавать циклы в каждом примере (ради краткости учебника и по теме), поэтому вы можете обратиться к этому разделу, если вам нужно создать цикл с примерами ниже.

Допустим, вы хотите перечислить посты конкретного автора, написанные в текущем году, в специальном разделе «Посты автора в этом году». Достаточно простой комбинации двух параметров WP_Query :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<?php
 
// Get the year we’re in.
$current_year = date( ‘Y’ );
 
// Setup arguments.
$args = array(
    // Get the author with the nicename «john».
    ‘author’ => ‘john’,
    // Get his posts from this year.
    ‘year’ => $current_year
);
 
// Instantiate new query instance.
$my_query = new WP_Query( $args );
 
?>

Передайте этот запрос в цикле, и все готово!

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
<?php
 
// Get the current post id.
$current_post_id = get_the_ID();
 
// Get the current post’s category (first one if there’s more than one).
$current_post_cats = get_the_category();
$current_post_first_cat_id = $current_post_cats[ 0 ]->term_id;
 
// Setup arguments.
$args = array(
    // Get category’s posts.
    ‘cat’ => $current_post_first_cat_id,
    // Exclude current post.
    ‘post__not_in’ => array( $current_post_id )
);
 
// Instantiate new query instance.
$my_query = new WP_Query( $args );
 
?>

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

В WordPress нет встроенной системы «подсчета просмотров», и плагины, предоставляющие эту функцию, известны тем, что замедляют работу сайта (поскольку при каждом просмотре постов плагины снова и снова записывают в базу данных для записи представления. отсчеты). Тем не менее, есть другой вид измерения, чтобы определить, какие сообщения являются наиболее «популярными»: подсчет комментариев. И в отличие от количества просмотров, количество комментариев уже есть в базе данных — класс WP_Query упрощает упорядочение постов по количеству комментариев:

01
02
03
04
05
06
07
08
09
10
11
12
<?php
 
// Setup arguments.
$args = array(
    // Order by comment count.
    ‘orderby’ => ‘comment_count’
);
 
// Instantiate new query instance.
$my_query = new WP_Query( $args );
 
?>

Видишь, как это легко? Теперь представьте, что вы создаете собственный шаблон страницы с циклом, выполняющим этот запрос, — страницей «Самые комментируемые сообщения»

При использовании WordPress для создания корпоративных веб-сайтов, портфолио или веб-журналов слайдеры стали «обязательным» промышленным стандартом. Я на самом деле не фанат слайдеров (я думаю, что это плохой UX), но Интернету это нравится, поэтому я не могу просто сказать «нет» своим клиентам, когда создаю для них сайты. Если им нужны ползунки, я использую простой запрос с использованием класса WP_Query :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<?php
 
// Setup arguments.
$args = array(
    // Get the «slider» post type.
    ‘post_type’ => ‘slider’,
    // Get a specific slider category.
    ‘category_name’ => ‘home-slides’,
    // Get all slides and don’t paginate.
    ‘nopaging’ => true
);
 
// Instantiate new query instance.
$my_query = new WP_Query( $args );
 
?>

Аргумент 'cat' может использоваться для извлечения слайдов из разных категорий, поэтому вы можете разделить группы слайдов и использовать несколько слайдеров на нескольких страницах. Если вы собираетесь использовать только один слайдер на своем веб-сайте, вы можете удалить эту строку, и все готово.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
 
/*
 * Create new post type called «Quotes»
 * (refer to the `register_post_type` function to
 * learn more about creating custom post types).
 */
function quote_post_type() {
     
    $args = array(
        ‘label’ => ‘Quotes’,
        ‘public’ => true
    );
     
    register_post_type( ‘quotes’, $args );
}
 
add_action( ‘init’, ‘quote_post_type’ );
 
// Setup arguments.
$args = array(
    // Get the «quotes» psot type.
    ‘post_type’ => ‘quotes’,
    // Randomize the order.
    ‘orderby’ => ‘rand’,
    // Get only one item.
    ‘posts_per_page’ => 1,
);
 
// Instantiate new query instance.
$my_query = new WP_Query( $args );
 
?>

Простое и элегантное решение.

Я нашел этот пример на Scribu.net и должен сказать, что он может быть лучшим трюком WP_Query в этом уроке. Он немного более технический, чем другие, потому что в этом контексте его можно применить к веб-сайту электронной коммерции на платформе WordPress.

Вот фрагмент кода, который вы будете использовать, если хотите перечислить элементы из пользовательского типа записи «Продукт» и отфильтровать результаты с помощью пользовательских полей «цена»:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
 
// Source: http://scribu.net/wordpress/advanced-metadata-queries.html
 
// Setup arguments.
$args = array(
    // Get the «product» post type.
    ‘post_type’ => ‘product’,
    // Setup the «meta query».
    ‘meta_query’ => array(
        array(
            // Get the «price» custom field.
            ‘key’ => ‘price’,
            // Set the price values.
            ‘value’ => array( 100, 200 ),
            // Set the compare operator.
            ‘compare’ => ‘BETWEEN’,
            // Only look at numeric fields.
            ‘type’ => ‘numeric’,
        )
    )
);
 
// Instantiate new query instance.
$my_query = new WP_Query( $args );
 
?>

Слава Сильвиу-Кристиану Бурке!

Вот забавное упражнение — и мы тоже можем использовать API Shortcode! В этом примере мы собираемся создать шорткод, который может встраивать сообщение в сообщение. (Я едва сдерживал себя в названии [postception] .) В следующем фрагменте кода мы создаем функцию шорткода, которая позволяет нам встраивать посты (или любой другой тип поста) и позволяет нам выбирать, показывать полный пост или просто выдержка:

01
02
03
04
05
06
07
08
09
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?php
 
/*
 * Usage:
 *
 * [embed_post slug=»my-post»]
 * [embed_post slug=»my-post» full=»false»]
 * [embed_post type=»movie» slug=»inception»]
 */
 
function tutsplus_embedded_post_shortcode( $attributes ) {
 
    // Extract shortcode attributes.
    extract(
        shortcode_atts(
            array(
                ‘type’ => ‘post’,
                ‘slug’ => »,
                ‘full’ => true
            ),
            $attributes
        )
    );
 
    // Setup arguments.
    $args = array(
        // Get post type («post» by default).
        ‘post_type’ => $type,
        // Get post by slug.
        ‘name’ => $slug
    );
 
    // Instantiate new query instance.
    $my_query = new WP_Query( $args );
 
    // Check that we have query results.
    if ( $my_query->have_posts() ) {
 
        // Begin generating markup.
        $output = ‘<section class=»embedded-post»>’;
 
        // Start looping over the query results.
        while ( $my_query->have_posts() ) {
 
            $my_query->the_post();
 
            // Add title to output.
            $output .= ‘<h2 class=»embedded-post-title»>’;
                $output .= get_the_title();
            $output .= ‘</h2>’;
 
            // Get full post if `$full` is true, otherwise, show the get excerpt
            if ( ‘true’ === $full ) {
 
                // Add full content to output.
                $output .= ‘<div class=»embedded-post-content»>’;
                    $output .= get_the_content();
                $output .= ‘</div>’;
 
            } else {
 
                // Add excerpt to output.
                $output .= ‘<div class=»embedded-post-excerpt»>’;
                    $output .= get_the_excerpt();
                    $output .= ‘&hellip;
                $output .= ‘</div>’;
 
            }
 
        }
 
        // End generating markup.
        $output .= ‘</section>’;
 
    } else {
 
        // Output message to let user know that no posts were found.
        $output = ‘<section class=»embedded-post-error»>’;
            $output .= ‘<p>’ .
        $output .= ‘</section>’;
 
    }
 
    wp_reset_postdata();
 
    return $output;
 
}
 
add_shortcode( ’embed_post’, ‘tutsplus_embedded_post_shortcode’ );
 
?>

Вот идея: почему бы вам не показать некоторые «подглядывания» ваших предстоящих сообщений для ваших посетителей? Вы можете использовать следующую функцию, чтобы составить список запланированных постов с выдержками или без них после заголовков:

01
02
03
04
05
06
07
08
09
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
61
62
63
64
65
66
67
68
69
70
71
<?php
 
/*
 * Usage with Excerpts:
 *
 * <?php echo tutsplus_show_drafts();
 *
 * Usage without Excerpts:
 *
 * <?php echo tutsplus_show_drafts( false );
 */
 
function tutsplus_show_drafts( $show_excerpts = true ) {
 
    // Setup arguments.
    $args = array(
        ‘post_status’ => ‘future’,
        ‘nopaging’ => true
    );
 
    // Instantiate new query instance.
    $my_query = new WP_Query( $args );
 
    // Check that we have query results.
    if ( $my_query->have_posts() ) {
 
        // Begin generating markup.
        $output = ‘<section class=»pending-posts»>’;
 
        // Start looping over the query results.
        while ( $my_query->have_posts() ) {
 
            $my_query->the_post();
 
            // Output draft post title and excerpt (if enabled).
            $output .= ‘<div class=»pending»>’;
                $output .= ‘<h3 class=»pending-title»>’ .
                    $output .= get_the_title();
                $output .= ‘</h3>’;
 
                if ( $show_excerpts ) {
 
                    $output .= ‘<div class=»pending-excerpt»>’;
                        $output .= get_the_excerpt();
                    $output .= ‘</div>’;
 
                }
 
            $output .= ‘</div>’;
 
        }
 
        // End generating markup.
        $output .= ‘</section>’;
 
    } else {
 
        // Let user know that nothing was found.
        $output = ‘<section class=»drafts-error»>’;
            $output .= ‘<p>’ .
        $output .= ‘</section>’;
 
    }
 
    wp_reset_postdata();
 
    return $output;
 
}
 
?>

Если ваш блог старше года, а ваш контент не зависит от времени (то есть статья 2015 и 2025 годов будет сочтена релевантной), добавление раздела «Опубликовать год назад» может увеличить количество просмотров страниц. Вот как вы это делаете:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<?php
 
// Setup arguments.
$args = array(
    // Day (1 — 31).
    ‘day’ => date( ‘j’ ),
    // Month (1 — 12).
    ‘monthnum’ => date( ‘n’ ),
    // Year (minus 1).
    ‘year’ => date( ‘Y’ ) — 1,
    // Show only one post.
    ‘posts_per_page’ => 1
);
 
// Instantiate new query instance.
$my_query = new WP_Query( $args );
 
?>

Используйте этот запрос, чтобы построить цикл, который отображает один пост за прошлый год.

У вас нет ничего, кроме названий подстраниц, которые можно разместить на странице «Услуги», «Наши работы» или «Мой портфель»? Может быть, вступительный абзац, но вы правы, эти страницы обречены быть «заполнителями». Тем не менее, это хорошая идея, чтобы разместить там подстраницы — может быть, сетку с квадратными миниатюрами и названиями ниже. Давайте посмотрим, какой запрос мы должны использовать при создании такого шаблона страницы:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<?php
 
$current_page_id = get_the_ID();
 
// Setup arguments.
$args = array(
    // Get children of current page.
    ‘parent’ => $current_page_id,
    // Disable pagination.
    ‘nopaging’ => true
);
 
// Instantiate new query instance.
$my_query = new WP_Query( $args );
 
?>

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

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

В следующей части мы поговорим о WP_User_Query , одном из родственных классов WP_Query . Увидимся тогда!