Статьи

Аргументы WP_Query: сообщения, страницы и типы сообщений

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

Прежде чем мы начнем, давайте WP_Query как работают аргументы в WP_Query . Когда вы WP_Query в своих темах или плагинах, вам нужно включить четыре основных элемента:

  • аргументы для запроса, используя параметры, которые будут рассмотрены в этом руководстве
  • сам запрос
  • петля
  • завершение: закрытие тегов if и while и сброс данных поста

На практике это будет выглядеть примерно так:

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
 
$args = array(
    // Arguments for your query.
);
 
// 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();
 
?>

Аргументы – это то, что сообщает WordPress, какие данные нужно извлечь из базы данных, и это те, которые я расскажу здесь. Итак, все, на чем мы концентрируемся, это первая часть кода:

1
2
3
$args = array(
    // Arguments for your query.
);

Как видите, аргументы содержатся в массиве. В этом уроке вы узнаете, как их кодировать.

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

1
2
3
4
5
$args = array(
    ‘parameter1’ => ‘value’,
    ‘parameter2’ => ‘value’,
    ‘parameter3’ => ‘value’
);

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

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

Чтобы найти конкретное сообщение (или набор сообщений), у вас есть два варианта:

  • p ( int ): использовать идентификатор записи.
  • name ( строка ): использовать пост-слаг.

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

Итак, чтобы вернуть конкретный пост, вы должны использовать один из них:

1
2
3
$args = array(
    ‘p’ => ’32’
);

или:

1
2
3
$args = array(
    ‘name’ => ‘post_slug’
);

Обратите внимание, что параметр name принимает пост-слаг в качестве аргумента, а не его заголовок.

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

Чтобы запросить определенную страницу, у вас снова есть два варианта:

  • page_id ( int ): использовать идентификатор страницы.
  • pagename ( строка ): использовать слаг страницы.

Итак, чтобы запустить запрос, извлекающий только одну конкретную страницу из базы данных, вы должны использовать одну из них:

1
2
3
$args = array(
    ‘page_id’ => ’20’
);

или:

1
2
3
$args = array(
    ‘pagename’ => ‘page_slug’
);

Чтобы выполнить запрос для сообщения другого типа, включая пользовательский тип сообщения, вы также должны использовать параметр post_type . Я расскажу об этом чуть подробнее позже в этом уроке, но вкратце, чтобы запросить одну публикацию в пользовательском типе записи product , вы должны использовать это:

1
2
3
4
$args = array(
    ‘p’ => ’46’,
    ‘post_type’ => ‘product’
);

Или для запроса вложения, вы должны использовать:

1
2
3
4
$args = array(
    ‘p’ => ’46’,
    ‘post_type’ => ‘attachment’
);

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

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

У вас есть три аргумента, которые вы можете использовать для этого:

  • post_parent ( int ): использовать идентификатор страницы для возврата только дочерних страниц. Установите 0, чтобы возвращать только записи верхнего уровня.
  • post_parent__in ( array ): использовать массив идентификаторов post_parent__in .
  • post_parent__not_in ( array ): использовать массив идентификаторов post_parent__not_in .

Давайте посмотрим на каждого из них.

Первый, post_parent , позволяет запрашивать страницы, которые являются post_parent для одной конкретной страницы.

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

1
2
3
4
$args = array(
    ‘post_type’ => ‘page’,
    ‘post_parent’ => ‘2’
);

Обратите внимание, что вы должны включить аргумент post_type в качестве типа поста по умолчанию, который WP_Query ищет – post .

Кроме того, вы можете использовать его для поиска дочерних элементов текущей страницы:

1
2
3
4
5
6
$current_page_id = get_the_ID();
 
$args = array(
    ‘post_type’ => ‘page’,
    ‘post_parent’ => $current_page_id
);

Вы также можете использовать этот параметр для идентификации страниц верхнего уровня, то есть тех, у которых нет родителя:

1
2
3
4
$args = array(
    ‘post_type’ => ‘page’,
    ‘post_parent’ => ‘0’
);

Но что, если вы хотите идентифицировать детей на нескольких страницах? Вы также можете сделать это с post_parent__in параметра post_parent__in . Это займет массив почтовых идентификаторов.

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

1
2
3
4
5
6
7
$args = array(
    ‘post_type’ => ‘page’,
    ‘post_parent__in’ => array(
        ‘2’,
        ‘4’
    )
);

Вы также можете исключить дочерние страницы из вашего запроса, используя параметр post_parent__not_in :

1
2
3
4
5
6
7
$args = array(
    ‘post_type’ => ‘page’,
    ‘post_parent__not_in’ => array(
        ‘2’,
        ‘4’
    )
);

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

  • post__in ( массив ): использовать идентификаторы постов.
  • post__not_in ( массив ): использовать идентификаторы постов.

Аргумент post__in может использоваться для всех типов post__in и принимает массив идентификаторов. Таким образом, чтобы вывести список конкретных сообщений, вы должны использовать это:

1
2
3
4
5
6
7
8
$args = array(
    ‘post__in’ => array(
        ’36’,
        ’52’,
        ‘246’,
        ‘354’
    )
);

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

1
2
3
4
5
6
7
8
9
$args = array(
    ‘post__in’ => array(
        ’36’,
        ’52’,
        ‘246’,
        ‘354’
    ),
    ‘ignore_sticky_posts’ => ‘true’
);

Аргумент post__not_in работает аналогичным образом, снова принимая массив идентификаторов постов, но он выводит все остальное, кроме перечисленных постов. Обычно вы комбинируете это с другими аргументами, чтобы избежать вывода огромного списка сообщений.

Таким образом, для запроса всех сообщений типа сообщения product но исключить несколько:

1
2
3
4
5
6
7
8
9
$args = array(
    ‘post_type’ => ‘product’,
    ‘post__not_in’ => array(
        ’36’,
        ’52’,
        ‘246’,
        ‘354’
    )
);

Итак, чтобы объединить это с одним из наших предыдущих примеров, вот как вы будете запрашивать все страницы верхнего уровня, кроме текущей:

1
2
3
4
5
6
$current_page_ids = array( get_the_ID() );
 
$args = array(
    ‘post_parent’ => ‘0’,
    ‘post__not_in’ => $current_page_ids
);

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

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

  • post : пост.
  • page : страница.
  • revision : пересмотр.
  • attachment : вложение.
  • nav_menu_item : пункт меню навигации.
  • any : извлекает любой тип, кроме ревизий и типов, для которого 'exclude_from_search' установлено значение true когда они были зарегистрированы.
  • Пользовательские типы сообщений (например, product ).

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

Итак, чтобы привести простой пример, вот как вы бы запрашивали все страницы вашего сайта:

1
2
3
$args = array(
    ‘post_type’ => ‘page’
);

Запросить пользовательский тип сообщения очень просто: используйте имя, которое вы дали типу сообщения, при регистрации, а не название, которое используется в меню администратора. Допустим, вы зарегистрировали типы сообщений о вашем продукте с помощью register_post_type() следующим образом:

1
2
3
4
5
6
7
8
9
function register_product() {
 
    $args = array(
        ‘name’ => __( ‘Products’, ‘tutsplus’ ),
        ‘singular_name’ => __( ‘Product’, ‘tutsplus’ )
    );
 
    register_post_type( ‘product’, $args );
}

Значение, которое вы используете для аргумента post_type при запросе продуктов, – это не 'Product' или 'Products' а 'product' :

1
2
3
$args = array(
    ‘post_type’ => ‘product’
);

По умолчанию, если вы попытаетесь выполнить запрос для вложений, он не будет работать, так как WordPress устанавливает post_status вложений для inherit а WP_Query умолчанию имеет значение 'post_status' => 'publish' если не указано иное. Поэтому, если вы хотите запросить вложения, вы должны включить аргумент post_status :

1
2
3
4
$args = array(
    ‘post_type’ => ‘attachment’,
    ‘post_status’ => ‘inherit’
);

Обратите внимание, что вы также можете использовать any вместо inherit .

WP_Query использую WP_Query для создания пользовательских запросов к сообщениям и типам сообщений. Как вы видели из приведенных здесь примеров, существует множество возможностей:

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

Есть много других возможностей с использованием аргументов, описанных здесь, но это должно дать вам дегустатор.