У меня есть следующий запрос, который я вызываю в моем шаблоне taxonomy.php через query_brands_geo('dealers', 'publish', '1', $taxtype, $geo, $brands);
Эта функция работает отлично. Однако после прочтения кодекса для постов запросов он упомянул pre_get_posts как предпочтительный способ изменить запрос по умолчанию. Будут ли pre_get_posts более эффективными, чем моя функция wp_query ниже?
Если так, то как мне построить pre_get_posts и передать свою переменную и запрос ниже?
function my_custom_query($posttype, $poststatus, $paidvalue, $taxtype, $geo, $brands) {
global $wp_query;
$wp_query = new WP_Query();
$args = array(
'post_type' => $posttype,
'post_status' => array($poststatus),
'orderby' => 'rand',
'posts_per_page' => 30,
'meta_query' => array(
array(
'key' => 'wpcf-paid',
'value' => array($paidvalue),
'compare' => 'IN',
)
),
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => $taxtype,
'field' => 'slug',
'terms' => $geo
),
array(
'taxonomy' => 'brands',
'field' => 'slug',
'terms' => $brands
)
)
);
return $wp_query->query($args);
}
источник
$wp_query
объекта, и все закончится неудачей. Кроме того, это просто неправда, чтоpre_get_posts
будет запущен дополнительный запрос ...Поздний ответ, так как ответ с наибольшим количеством голосов сломает ваш запрос и просто не соответствует действительности в некоторых важных моментах.
Основной WP_Query и это фильтры
Во-первых, WordPress внутренне использует
query_posts()
(тонкая обертка вокруг,WP_Query
которая не должна использоваться в темах или плагинах), чтобы сделатьWP_Query
. ЭтоWP_Query
действует как основной цикл / запрос. Этот запрос будет проходить через множество фильтров и действий, пока не будет построена фактическая строка запроса SQL. Одним из них являетсяpre_get_posts
. Другиеposts_clauses
,posts_where
и т.д. , которые также позволяют перехватывать процесс создания строки запроса.Подробно рассмотрим, что происходит внутри ядра
Вывод
Если вы действительно хотите изменить основной запрос, то вы можете использовать широкий спектр фильтров. Просто используйте
$query->set( 'some_key', 'some_value' );
для изменения данных или используйте$query->get( 'some_key' );
для извлечения данных для выполнения условных проверок. Это избавит вас от выполнения второго запроса, так как вы изменяете только SQL-запрос.Если вам нужно сделать дополнительный запрос, тогда идите с
WP_Query
объектом. Это добавит еще один запрос к БД.пример
Поскольку ответы всегда лучше работают с примером, у вас здесь есть один действительно хороший (подпорки для Брэда Туеснарда), который просто расширяет основной объект и, следовательно, довольно многократно используется (сделайте из него плагин):
Затем вы можете запустить второй / дополнительный запрос, как показано в следующем примере. Не забудьте сбросить ваш запрос впоследствии.
источник
Пожалуйста, ознакомьтесь с ответами в разделе Когда использовать WP_query (), query_posts () и pre_get_posts .
Это отличный ресурс, если у вас есть какие-либо сомнения.
источник