Was ist eine effiziente Möglichkeit zur Abfrage basierend auf Post_Meta?

Das Problem, das ich habe, ist, wenn ich Benutzern erlaube, Posts zu filtern, es überwältigt die database und Sachen laufen extrem langsam. Ich bin mir nicht sicher, was der beste Weg ist, Beiträge mit Hilfe von Metawerten abzufragen. Meine Website enthält ein Formular, das Benutzer zum Filtern von Beiträgen anhand von Kontrollkästchen mit Metawerten senden können. Ich habe derzeit die Site, die ein Array aus den Kontrollkästchen erstellt, die für einzelne post_meta-Schlüssel wie folgt ausgewählt sind:

for ($i=0; $i 'amenities', 'value' => $amenities[$i], 'compare' => 'LIKE' ); } 

Dann frage ich die database mit einem Array von Arrays ab, die die für jeden Meta-Schlüssel ausgewählten Werte enthalten. So was:

 $the_query = new WP_Query(array( 'post_type' => 'listing', 'post_status' => 'publish', 'category_name' => 'private_rental', 'orderby' => 'rand', 'meta_query' => $arrays )); 

Wenn ich das mache, bekomme ich die gewünschten Ergebnisse, aber es kann über eine Minute dauern, bis die Ergebnisse auf dem Bildschirm erscheinen. Gibt es einen effizienteren Weg, dies zu tun?

Jede Hilfe wäre willkommen!

Solutions Collecting From Web of "Was ist eine effiziente Möglichkeit zur Abfrage basierend auf Post_Meta?"

Ich würde gerne sehen, was das tatsächlich generierte SQL ist, das WP_Query verwendet, aber jetzt.

(Sie können http://wordpress.org/extend/plugins/debug-bar/ zum einfachen Anzeigen der SQL-Abfrage verwenden)

Abfragen nach “zufällig” sind ineffizient. Wenn Sie das nicht brauchen, entfernen Sie es. Wenn Sie eine zufällige Reihenfolge benötigen, ziehen Sie in Betracht, sie trotzdem zu entfernen, und verwenden Sie die Zufallsreihenfolge von PHP.

LIKE Abfragen sind auch ziemlich ineffizient. Verwenden Sie = wenn Sie können.

Sie könnten schneller eine eigene Abfrage schreiben, die die Post-IDs aus der postmeta-Tabelle entfernt und dann WP_Query mit einem einfachen post__in Parameter verwendet, um den Post-Inhalt post__in . Dies kann oder kann nicht helfen, ist aber das Experiment wert.

Möglicherweise können Sie den Server mithilfe einer Meta-Abfrage mit IN :

 $the_query = new WP_Query(array( 'post_type' => 'listing', 'post_status' => 'publish', 'category_name' => 'private_rental', 'orderby' => 'rand', 'meta_query' => array( 'key' => 'amenities', 'value' => $amenities, 'compare' => 'IN' ); )); 

Die Abfrage, die Sie versucht haben, scheint kompliziert zu sein, was eine übermäßige Serverlast verursacht haben könnte. IN wird grundsätzlich nach allen Beiträgen suchen, die Metadaten der wichtigsten amenities , die einen Wert innerhalb der Felder haben, nach denen der Benutzer sucht. Definitiv eine effizientere Abfrage, imho