Reduzieren Sie die Anzahl der SQL-Abfragen in der WP_Query-Schleife, um Autorendaten abzurufen

Diese Frage gilt für die Skalierung und betrifft keine typischen Blog-Implementierungen. Ich arbeite an einer Web-App, wo ich Standard-WP_Query ausführen, um einige benutzerdefinierte Post-Typen zu holen. Dies führt normalerweise dazu, dass ungefähr 10 SQL-Abfragen ausgeführt werden. Innerhalb der Schleife muss ich sowohl auf post meta für den Post und user meta für den Autor des Posts zugreifen. Zugriff auf Post-Meta ist trivial mit Verwendung von get_post_meta innerhalb der Schleife. WordPress speichert die Ergebnisse von WP_Query zwischen und führt daher bei jedem get_post_meta von get_post_meta innerhalb der Schleife keine zusätzlichen Abfragen durch.

Beim Abrufen von Benutzerdaten für den Postautor werden die Dinge jedoch hässlich. Normalerweise müsste ich get_user_by innerhalb der Schleife aufrufen, um Benutzerdaten abzurufen. Hier kommt das Problem. Wenn ich WP_Query , um jeweils 50 Beiträge each by a different author get_user_by , führt das Aufrufen von get_user_by innerhalb der Schleife zu 100 SQL-Abfragen (zwei Abfragen für jeden Benutzer zum Abrufen von Daten aus der Tabelle users und der Tabelle usermeta ). Dies ist zusätzlich zu den 10 SQL-Abfragen, die ich bereits erwähnt habe. 110 SQL-Abfragen! – das ist verrückt.

Als Nächstes dachte ich daran, WP_User_Query zu verwenden, um Benutzerdaten WP_User_Query , bevor die Schleife ausgeführt wird.

  $custom_query = new WP_Query($args); foreach($custom_query->posts as $post) { $post_authors[] = (int)$post->post_author; } $user_query = new WP_User_Query( array('include' => $post_authors) ); 

Ich habe erwartet, dass WP_User_Query so intelligent wie WP_Query und die Anzahl der Abfragen reduziert. Dadurch wurden Abfragen auf 51 statt auf 100 reduziert. Eine Abfrage trifft die users for all users und 50 Abfragen treffen die usermeta one for each user . Besser, aber nicht das, was ich erwartet habe.

Wie reduziere ich die Abfragen für mein Szenario?

Solutions Collecting From Web of "Reduzieren Sie die Anzahl der SQL-Abfragen in der WP_Query-Schleife, um Autorendaten abzurufen"

Nach viel Versuch und Irrtum habe ich gelernt, dass WP_User_Query ein Argument fields nimmt, die auf 'all_with_meta' . Dies reduziert die Anzahl der Abfragen auf zwei für eine beliebige Anzahl von Benutzern, die in einem einzigen Schritt abgerufen werden, und bietet auch Vorteile des Caching. Die Verwendung würde wie folgt aussehen:

 $user_query = new WP_User_Query( array('include' => $post_authors, 'fields' => 'all_with_meta') );