Совершенствование запросов в современных версиях WordPress

За прошедший год много статей было посвящено улучшениям и нововведениям в WordPress. Сегодня я хочу рассказать вам об одном из самых интересных изменений для разработчиков: совершенствовании конкретных типов запросов.

Главные изменения:

  • Внедрение поддержки вложенных запросов для запросов к метаданным записи, датам и терминам таксономии;
  • Дополнительные параметры для запросов к комментариям;
  • Несколько исправленных багов.

Вложенные запросы

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

<?php

$args = array(
    'post_type' => 'post',
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'speed',
            'field' => 'slug',
            'terms' => array( 'quick' )
        ),
        array(
            'taxonomy' => 'meal',
            'field' => 'slug',
            'terms' => array( 'breakfast' )
        )
    )
);

$query = new WP_Query( $args );

?>

Такой запрос осуществляет поиск по таксономиям ‘speed‘ и ‘meal‘, и выдает записи с соответствующими терминами ‘quick‘ и ‘breakfast‘. Но что если нам нужно создать более комплексный запрос? Предположим, вам нужен рецепт быстрого завтрака, а также рецепты традиционных полдников.

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

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

<?php

$query = new WP_Query(
    array(
        'tax_query' => array(
            'relation' => 'OR',
            array(
                'relation' => 'AND',
                array(
                    'taxonomy' => 'meal',
                    'field' => 'slug',
                    'terms' => array( 'breakfast' )
                ),
                array(
                    'taxonomy' => 'speed',
                    'field' => 'slug',
                    'terms' => array( 'quick' )
                )
            ),
            array(
                'relation' => 'AND',
                array(
                    'taxonomy' => 'meal',
                    'field' => 'slug',
                    'terms' => array( 'lunch' )
                ),
                array(
                    'taxonomy' => 'speed',
                    'field' => 'slug',
                    'terms' => array( 'slow' )

                )
            )
        )
    )
);

$query = new WP_Query( $args );

?>

Здесь мы использовали два вложенных массива:

  • Внешний массив использует выражение OR, так как здесь мы ищем рецепты быстрых завтраков или традиционных полдников;
  • Первый вложенный массив ищет рецепты быстрых завтраков при помощи выражения AND, так как нам нужно, чтобы в записях присутствовали оба термина;
  • Второй вложенный массив ищет рецепты традиционных полдников при помощи AND.

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

Применяем вложенные запросы: термины таксономий, метаданные и даты

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

Синтаксис работает одинаково в запросах и к датам, и к метаданным. В мета-запросах вы заменяете tax_query на meta_query и используете ‘key’ и ‘value’ в качестве значений. В запросах к датам вы заменяете tax_query на date_query и используете параметры дат, представленные в кодексе WordPress.

Параметры для комментариев

Чтобы выполнять запросы к комментариям, вместо класса WP_Query следует использовать WP_Comment_Query. Этот класс приобрел 8 новых параметров:

  • ‘author__in’: идентифицирует автора комментария (или массив авторов);
  • ‘author__not_in’: исключить комментарий автора по ID (или массива авторов);
  • ‘post_author__in’: идентифицирует автора (или массив авторов) записи, к которой был оставлен комментарий;
  • ‘post_author__not_in’: исключает комментарии, оставленные к записям конкретного автора или массива авторов;
  • ‘comment__in’: комментарии с конкретным ID или массивом ID;
  • ‘comment__not_in’: исключает комментарии с конкретным ID или массивом ID;
  • ‘post__in’: дочерние комментарии, оставленные к записи или массиву записей (используется ID записи);
  • ‘post__not_in’: исключить дочерние комментарии, оставленные к записи или массиву записей (используется ID записи).

Здесь в качестве значений используются ID автора, комментария или записи.

Учтите, что класс WP_Comment_Query теперь также поддерживает вложенные запросы.

Исправления

  • Исправлен баг, который вызывал ошибку запроса, если в нем с date_query использовались tax_query или meta_query;
  • Исправлена ошибка запроса ‘orderby’ => ‘meta_value’ при передаче в WP_Query ‘meta_query’ с выражением OR.

Более подробно обо всех изменениях можно узнать на сайте WordPress.

В завершение

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

Валентин Сейидовавтор-переводчик статьи «Query Improvements in the Latest Versions of WordPress»