До сих пор в этой серии вы узнали, как получить доступ к метаданным WordPress и работать с массивами, в которые они возвращаются. Мы не просто добавляем настраиваемые поля в посты WordPress, чтобы отображать эту информацию, но и сортируем по ней.
Теперь, когда вы знаете, как извлекать и отображать метаданные, пришло время узнать, как настроить цикл WordPress, чтобы он возвращал только сообщения с определенными мета-значениями.
Использование WP_Query для запроса по значению метаполя
Чтобы настроить сообщения, которые возвращает WordPress на основе мета-полей, нам нужно использовать WP_Query
и указать meta_query
. Если, например, у нас был пользовательский тип поста под названием «фильмы», в котором было специальное поле под названием «режиссер», мы могли бы запросить фильмы, режиссер которых был режиссером одного из трех фильмов « Звездных войн» .
Посмотрите на приведенный ниже код и посмотрите, сможете ли вы использовать свое мастерство массивов, которое вы приобрели в предыдущей части, чтобы понять, что происходит с meta_query
, и я расскажу о том, что происходит в коде.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
$sw_args = array(
‘post_type’ => ‘films’,
‘meta_query’ => array(
array(
‘key’ => ‘director’,
‘value’ => array( ‘George Lucas’, ‘Richard Marquand’, ‘Irvin Kershner’ ),
‘compare’ => ‘IN’,
)
)
);
$query = new WP_Query( $sw_args );
if ( $the_query->have_posts() ) {
echo ‘<h2>Films By Star Wards Directors</h2>’;
echo ‘<ul>’;
while ( $the_query->have_posts() ) {
$the_query->the_post();
echo ‘<li>’ .
}
echo ‘</ul>’;
}
/* Restore original Post Data */
wp_reset_postdata();
|
Как вы можете видеть, у нас есть массив имен директоров, расположенных внутри трех других массивов. Давайте разберем его по частям.
Сначала мы запускаем массив для наших аргументов WP_Query
. После нашего первого аргумента ‘post_type’ мы начинаем массив для размещения наших аргументов meta_query
.
Внутри этого мы указываем, какой ключ искать — в случае «директор». Мы также предоставляем массив значений для поиска в этом ключе.
Последний аргумент — как сравнивать эти значения, в этом случае мы указываем «IN» для извлечения любых сообщений с этими значениями в директоре ключей.
Другие сравнения
Что если мы хотим фильмы, снятые режиссером фильма «Звездные войны», но не хотим исключать приквелы «Звездных войн»? Мы можем просто добавить еще один массив аргументов в наш meta_query
, но на этот раз для значения используйте массив названий этих фильмов для ключа film_title
и для сравнения используйте NOT LIKE, чтобы исключить публикацию с такими значениями в поле film_title
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
$sw_args = array(
‘post_type’ => ‘films’,
‘meta_query’ => array(
array(
‘key’ => ‘director’,
‘value’ => array( ‘George Lucas’, ‘Richard Marquand’, ‘Irvin Kershner’ ),
‘compare’ => ‘IN’,
),
array(
‘key’ => ‘film_title’,
‘value’ => ‘Phantom Menace’, ‘Attack of the Clones’, ‘Revenge of the Sith’ ),
‘compare’ => ‘NOT LIKE’
),
)
);
$query = new WP_Query( $sw_args );
|
Теперь WordPress будет искать фильмы этих трех режиссеров, название которых не входит в число трех приквелов.
Отображение метаполей в WP_Query
До сих пор я показал вам, как использовать WP_Query
для поиска сообщений, которые имеют определенные значения для настраиваемого поля, но не как отображать эти поля.
Отображение этих полей во многом аналогично get_the_ID()
, но вместо использования get_the_ID()
для указания идентификатора для get_post_meta()
мы указываем его в контексте объекта. Итак, в нашем цикле, который вы можете увидеть ниже, идентификатор получается немного иначе, используя $query->post->ID
.
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
|
$sw_args = array(
‘post_type’ => ‘films’,
‘meta_query’ => array(
array(
‘key’ => ‘director’,
‘value’ => array( ‘George Lucas’, ‘Richard Marquand’, ‘Irvin Kershner’ ),
‘compare’ => ‘IN’,
),
array(
‘key’ => ‘film_title’,
‘value’ => ‘Phantom Menace’, ‘Attack of the Clones’, ‘Revenge of the Sith’ ),
‘compare’ => ‘NOT LIKE’
),
)
);
$query = new WP_Query( $sw_args );
if ( $the_query->have_posts() ) {
echo ‘<h2>Films By Star Wards Directors</h2>’;
echo ‘<ul>’;
while ( $the_query->have_posts() ) {
$the_query->the_post();
echo ‘<li><ul>’;
echo ‘<li>’ .
echo ‘<li>’ .
echo ‘</ul></li>»
}
echo ‘</ul>’;
}
/* Restore original Post Data */
wp_reset_postdata();
|
Использование WP_User_Query
Как и в предыдущей части, когда мы использовали WP_Query
для поиска сообщений с определенными значениями для различных настраиваемых полей, мы можем использовать таблицу WP_User_Query
эквивалентную пользовательской таблице WP_User_Query
.
Например, если бы у нас было настраиваемое поле subscriber_level
и мы хотели найти только тех пользователей, у которых был уровень подписчика extra_special
или super_special
мы могли бы так же, как мы искали фильмы, снятые тремя режиссерами фильмов Star Wars:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
$args = array(
‘meta_query’ => array(
array(
‘key’ => ‘subscriber_level’,
‘value’ => array(‘extra_special’, ‘super_special’ );
‘compare’ => ‘=’
)
)
);
$user_query = new WP_User_Query( $args );
if ( ! empty( $user_query->results ) ) {
echo ‘<h3>Extra and Super Special Users</h3>’;
echo ‘<ul>’;
foreach ( $user_query->results as $user ) {
echo ‘<li>’ .
}
echo ‘</ul>’;
}
|
Как и в случае с WP_Query
, мы можем комбинировать различные сравнения, чтобы дополнительно контролировать, каких пользователей возвращает наш запрос. Этот следующий пример объединяет последний запрос с запросом, на этот раз самой таблицы wp_users
для любых пользователей, чьи имена — Люк, Хан или Лея.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
$args = array(
‘meta_query’ => array(
array(
‘key’ => ‘subscriber_level’,
‘value’ => array(‘extra_special’, ‘super_special’ );
‘compare’ => ‘=’
)
),
‘search’ => array( ‘Luke’, ‘Han’, ‘Leia’ ),
‘search_columns’ => array( ‘user_nicename’, ‘display_name’ ),
);
$user_query = new WP_User_Query( $args );
if ( ! empty( $user_query->results ) ) {
echo ‘<h3>Extra and Super Special Users Named Luke, Han or Leia</h3>’;
echo ‘<ul>’;
foreach ( $user_query->results as $user ) {
echo ‘<li>’ .
}
echo ‘</ul>’;
}
|
Завершение
В этой серии вы познакомились с метаданными WordPress и узнали несколько уроков об основных концепциях PHP.
Вы узнали, как получать значения из полей, в которых хранятся метаданные сообщений и пользователей, и как создавать запросы для сообщений и пользователей на основе мета значений. Обладая этими знаниями, вы можете работать с несколькими настраиваемыми полями и использовать WordPress в качестве сложной системы управления контентом.