Статьи

Освоение метаданных WordPress: запросы к сообщениям и пользователям по метаданным

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

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

Чтобы настроить сообщения, которые возвращает 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 для поиска сообщений, которые имеют определенные значения для настраиваемого поля, но не как отображать эти поля.

Отображение этих полей во многом аналогично 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_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 в качестве сложной системы управления контентом.