Ich habe folgende Abfrage, die ich in meiner taxonomy.php-Vorlage über aufrufe query_brands_geo('dealers', 'publish', '1', $taxtype, $geo, $brands);
Diese Funktion funktioniert einwandfrei. Nach dem Lesen des Codex für Abfrageposts wurden jedoch pre_get_posts als bevorzugte Methode zum Ändern der Standardabfrage angegeben. Wären die pre_get_posts effizienter als meine unten stehende wp_query-Funktion?
Wenn ja, wie würde ich die pre_get_posts konstruieren und meine Variable und Abfrage unten übergeben?
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);
}
quelle
$wp_query
und die Dinge werden vollständig fehlschlagen. Abgesehen davon ist es einfach nicht wahr, dasspre_get_posts
eine zusätzliche Abfrage ausgeführt wird ...Eine verspätete Antwort als die am häufigsten gewählte Antwort wird Ihre Anfrage unterbrechen und ist in einigen wichtigen Punkten einfach nicht wahr.
Die Haupt- WP_Query und ihre Filter
Erstens verwendet WordPress intern
query_posts()
(ein dünner WrapperWP_Query
, der nicht in Themes oder Plugins verwendet werden sollte), um Folgendes zu tun:WP_Query
: DiesWP_Query
ist die Hauptschleife / Abfrage. Diese Abfrage durchläuft eine Vielzahl von Filtern und Aktionen, bis die eigentliche SQL-Abfragezeichenfolge erstellt wurde. Eine davon istpre_get_posts
. Andere sindposts_clauses
,posts_where
usw. , die auch Ihnen erlauben , die Query - String - Bauprozess abzufangen.Ein genauer Blick auf das, was im Inneren des Kerns passiert
Fazit
Wenn Sie die Hauptabfrage wirklich ändern möchten, können Sie eine Vielzahl von Filtern verwenden. Verwenden Sie einfach
$query->set( 'some_key', 'some_value' );
, um Daten dort zu ändern , oder$query->get( 'some_key' );
, um Daten abzurufen , um bedingte Prüfungen durchzuführen. Dies erspart Ihnen das Ausführen einer zweiten Abfrage, da Sie nur die SQL-Abfrage ändern .Wenn Sie eine zusätzliche Abfrage durchführen müssen, gehen Sie mit einem
WP_Query
Objekt. Dadurch wird der Datenbank eine weitere Abfrage hinzugefügt.Beispiel
Da Antworten mit einem Beispiel immer besser funktionieren, haben Sie hier ein wirklich nettes (Requisiten an Brad Touesnard), das das Kernobjekt einfach erweitert und daher ziemlich wiederverwendbar ist (machen Sie ein Plugin daraus):
Sie können dann Ihre zweite / zusätzliche Abfrage ausführen, wie Sie im folgenden Beispiel sehen können. Vergessen Sie nicht, Ihre Anfrage danach zurückzusetzen.
quelle
Lesen Sie die Antworten unter Verwendungszeitpunkt von WP_query (), query_posts () und pre_get_posts .
Es ist eine großartige Ressource, wenn Sie irgendwelche Zweifel haben.
quelle