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