Поздний ответ, так как ответ с наибольшим количеством голосов сломает ваш запрос и просто не соответствует действительности в некоторых важных моментах.
Основной WP_Query и это фильтры
Во-первых, WordPress внутренне использует query_posts()
(тонкая обертка вокруг, WP_Query
которая не должна использоваться в темах или плагинах), чтобы сделать WP_Query
. Это WP_Query
действует как основной цикл / запрос. Этот запрос будет проходить через множество фильтров и действий, пока не будет построена фактическая строка запроса SQL. Одним из них является pre_get_posts
. Другие posts_clauses
, posts_where
и т.д. , которые также позволяют перехватывать процесс создания строки запроса.
Подробно рассмотрим, что происходит внутри ядра
WordPress запускает wp()
функцию (in wp-includes/functions.php
), которая вызывает $wp->main()
( $wp
является объектом класса WP, который определен в wp-includes/class-wp.php
). Это говорит WordPress:
- Разобрать URL в спецификации запроса, используя
WP->parse_request()
- подробнее об этом ниже.
- Установите все переменные is_, которые используются условными тегами, используя
$wp_query->parse_query()
( $wp_query
является объектом class WP_Query
, который определен в wp-includes/query.php
). Обратите внимание, что, несмотря на название этой функции, в этом случае мы WP_Query->parse_query
фактически не выполняем синтаксический анализ для нас, поскольку это делается заранее WP->parse_request()
.
- Преобразуйте спецификацию запроса в запрос базы данных MySQL и выполните запрос базы данных, чтобы получить список сообщений, в функции WP_Query-> get_posts (). Сохраните записи в объекте $ wp_query для использования в цикле WordPress.
Исходный кодекс
Вывод
Если вы действительно хотите изменить основной запрос, то вы можете использовать широкий спектр фильтров. Просто используйте $query->set( 'some_key', 'some_value' );
для изменения данных или используйте $query->get( 'some_key' );
для извлечения данных для выполнения условных проверок. Это избавит вас от выполнения второго запроса, так как вы изменяете только SQL-запрос.
Если вам нужно сделать дополнительный запрос, тогда идите с WP_Query
объектом. Это добавит еще один запрос к БД.
пример
Поскольку ответы всегда лучше работают с примером, у вас здесь есть один действительно хороший (подпорки для Брэда Туеснарда), который просто расширяет основной объект и, следовательно, довольно многократно используется (сделайте из него плагин):
class My_Book_Query extends WP_Query
{
function __construct( $args = array() )
{
// Forced/default args
$args = array_merge( $args, array(
'posts_per_page' => -1
) );
add_filter( 'posts_fields', array( $this, 'posts_fields' ) );
parent::__construct( $args );
}
public function posts_fields( $sql )
{
return "{$sql}, {$GLOBALS['wpdb']->terms}.name AS 'book_category'";
}
}
Затем вы можете запустить второй / дополнительный запрос, как показано в следующем примере. Не забудьте сбросить ваш запрос впоследствии.
$book_query = new My_Book_Query();
if ( $book_query->have_posts() )
{
while ( $book_query->have_posts() )
{
$book_query->the_post();
# ...do stuff...
} // endwhile;
wp_reset_postdata();
} // endif;