Mam następujące zapytanie, które wywołuję w moim szablonie taxonomy.php za pośrednictwem query_brands_geo('dealers', 'publish', '1', $taxtype, $geo, $brands);
Ta funkcja działa idealnie. Jednak po przeczytaniu kodeksu dla postów zapytania wspomniał o pre_get_posts jako preferowanym sposobie zmiany domyślnego zapytania. Czy pre_get_posts byłyby bardziej wydajne niż moja funkcja wp_query poniżej?
Jeśli tak, to jak mam zbudować pre_get_posts i przekazać moją zmienną i zapytanie poniżej?
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);
}
źródło
$wp_query
obiektu, a wszystko całkowicie zawiedzie. Poza tym po prostu nie jest prawdą, żepre_get_posts
uruchomi dodatkowe zapytanie ...Późna odpowiedź, ponieważ najbardziej uprzywilejowana odpowiedź złamie twoje zapytanie i po prostu nie jest prawdziwa w niektórych głównych punktach.
Główny WP_Query i to filtry
Po pierwsze, WordPress używa wewnętrznie
query_posts()
(cienkie opakowanie,WP_Query
które nie powinno być używane w kompozycjach lub wtyczkach) do zrobieniaWP_Query
. DziałaWP_Query
to jako główna pętla / zapytanie. To zapytanie będzie działać przez wiele filtrów i działań, dopóki nie zostanie utworzony rzeczywisty ciąg zapytania SQL. Jednym z nich jestpre_get_posts
. Inne sąposts_clauses
,posts_where
itd, które również pozwalają na przechwycenie procesu budowania ciąg kwerendy.Dogłębne spojrzenie na to, co dzieje się w rdzeniu
Wniosek
Jeśli naprawdę chcesz zmodyfikować główne zapytanie, możesz użyć szerokiej gamy filtrów. Po prostu użyj,
$query->set( 'some_key', 'some_value' );
aby zmienić tam dane lub użyj,$query->get( 'some_key' );
aby pobrać dane w celu sprawdzenia warunkowego. Pozwoli to zaoszczędzić od robienia drugie zapytanie, jak jesteś zmieniając tylko zapytania SQL.Jeśli musisz wykonać dodatkowe zapytanie, przejdź do
WP_Query
obiektu. Spowoduje to dodanie kolejnego zapytania do bazy danych.Przykład
Ponieważ odpowiedzi zawsze działają lepiej na przykładzie, masz tutaj naprawdę fajny (rekwizyty dla Brada Touesnarda), który po prostu rozszerza główny obiekt i dlatego jest dość wielokrotnego użytku (stwórz z niego wtyczkę):
Następnie możesz uruchomić drugie / dodatkowe zapytanie, jak pokazano w poniższym przykładzie. Nie zapomnij później zresetować zapytania.
źródło
Sprawdź odpowiedzi na Kiedy używać WP_query (), query_posts () i pre_get_posts .
Jest to świetny zasób, jeśli masz jakieś wątpliwości.
źródło