Статьи

Объединение WP_Query с основным запросом

До сих пор в этой серии вы узнали, как использовать WP_Query для создания пользовательских запросов для использования в вашей теме или плагинах.

В большинстве случаев вы будете использовать WP_Query с совершенно новым набором аргументов, которые отделены от основного запроса, но что, если вы хотите включить основной запрос в свои аргументы?

Примеры того, когда вы можете сделать это, включают:

  • на странице категории или таксономии, отображая только сообщения одного типа
  • на странице категории, отображая сообщения с текущей категорией и другой категорией или тегом или термином таксономии
  • на странице для типа сообщения, просто отображая сообщения с определенными метаданными

Я мог бы продолжить — существует множество возможностей для объединения основного запроса с вашим собственным пользовательским запросом.

Я собираюсь продемонстрировать это на трех примерах: первый будет простым примером с одним циклом; второй будет использовать foreach для вывода нескольких циклов, по одному для каждого типа записи; а третий выводит два типа записей в архиве категорий, используя два отдельных запроса.

Однако, если вы собираетесь объединить свой основной запрос с WP_Query , вам нужно сохранить текущий объект запроса таким образом, чтобы его было легко использовать в аргументах WP_Query . Самый простой способ сделать это — присвоить его переменной.

Вы делаете это перед определением аргументов WP_Query , например так:

1
$mainquery = get_queried_object();

Функция get_queried_object() возвращает get_queried_object() запрашиваемый объект, каким бы он ни был. В одном сообщении он просто возвращает объект сообщения, а в архиве он возвращает категорию, тег, объект термина или любой другой объект, относящийся к архиву. Возвращает идентификатор запрашиваемого объекта.

Затем вы можете использовать эту переменную $mainquery в своих аргументах WP_Query . Теперь давайте посмотрим на некоторые примеры.

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

Ваш запрос может выглядеть примерно так:

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
<?php
 
$mainquery = get_queried_object();
 
$args = array (
    ‘category_name’ => $mainquery->slug,
    ‘post_type’ => ‘product’
);
 
// Custom query.
$query = new WP_Query( $args );
 
// Check that we have query results.
if ( $query->have_posts() ) {
 
    // Start looping over the query results.
    while ( $query->have_posts() ) {
 
        $query->the_post();
 
        // Contents of the queried post results go here.
 
    }
 
}
 
// Restore original post data.
wp_reset_postdata();
 
?>

Поскольку параметр category_name который я использовал выше, принимает в качестве аргумента категорию slug, вам нужно добавить ->slug после переменной, чтобы вывести slug категории.

Это дает вам запрос, который выбирает сообщения типа product из базы данных с текущей запрашиваемой категорией. Вы бы использовали его в шаблоне страницы category.php .

Примечание. pre_get_posts результата также можно достичь, используя хук pre_get_posts для изменения основного запроса в сочетании с условной функцией для проверки архивов категорий.

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

Это означает, что вы можете сортировать типы сообщений по блокам или столбцам на странице с помощью CSS или просто разделять их по разным спискам.

Для этого вы должны использовать следующий код:

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
<?php
 
$mainquery = get_queried_object();
 
$post_types = get_post_types();
 
foreach ( $post_types as $post_type ) {
 
    $args = array(
        ‘category_name’ => $mainquery->slug,
        ‘post_type’ => $post_type
    );
 
    // Custom query.
    $query = new WP_Query( $args );
 
    // Check that we have query results.
    if ( $query->have_posts() ) {
 
        // Start looping over the query results.
        while ( $query->have_posts() ) {
 
            $query->the_post();
 
            // Contents of the queried post results go here.
 
        }
 
    }
 
    // Restore original post data.
    wp_reset_postdata();
 
}
 
?>

Здесь используется переменная $mainquery мы использовали ранее, но также добавляется переменная $post_types для хранения всех типов $post_type зарегистрированных на сайте, и переменная $post_type для хранения каждого отдельного типа $post_type по очереди.

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

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

Чтобы сделать это, вы должны использовать что-то вроде этого кода:

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
<?php
 
$mainquery = get_queried_object();
 
// First query arguments for posts.
$args = array (
    ‘category_name’ => $mainquery->slug,
    ‘post_type’ => ‘post’,
    ‘posts_per_page’ => ’10’
);
 
// Custom query.
$query = new WP_Query( $args );
 
// Check that we have query results.
if ( $query->have_posts() ) {
 
    // Start looping over the query results.
    while ( $query->have_posts() ) {
 
        $query->the_post();
 
        // Contents of the queried post results go here.
 
    }
 
}
 
// Restore original post data.
wp_reset_postdata();
 
// Second query arguments for products.
$args = array (
    ‘category_name’ => $mainquery->slug,
    ‘post_type’ => ‘product’,
    ‘posts_per_page’ => ‘-1’
);
 
// Custom query.
$query = new WP_Query( $args );
 
// Check that we have query results.
if ( $query->have_posts() ) {
 
    // Start looping over the query results.
    while ( $query->have_posts() ) {
 
        $query->the_post();
 
        // Contents of the queried post results go here.
 
    }
 
}
 
// Restore original post data.
wp_reset_postdata();
 
?>

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

Как видно из приведенных выше примеров, WP_Query можно использовать не только для создания полностью настраиваемых запросов отдельно от основного запроса, но также для включения запрашиваемого в настоящее время объекта и создания более мощных запросов на страницах архива.

Приведенные выше примеры также можно выполнить с другими типами архивов: для таксономий , авторов, дат и т. Д. Посмотрите, сможете ли вы придумать больше возможностей!