Пізня відповідь, як найбільш актуальна відповідь, порушить ваш запит і просто не відповідає дійсності деяких основних пунктів.
Основний 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;