Ich möchte eine wp_query erstellen, die Posts-Meta innerhalb des posts
Arrays zurückgibt .
$args = array (
'post_type' => 'page',
'meta_key' => 'someMetaKeyName',
);
// The Query
$query = new WP_Query( $args );
Das ergibt so etwas wie:
Wie Sie sehen, haben die Posts keine Metadaten. Ist es möglich, die Metadaten auch in das zurückgegebene Array aufzunehmen?
PS Ich möchte aus Performancegründen keine zusätzlichen wp_queries.
wp-query
custom-field
post-meta
YemSalat
quelle
quelle
get_post_meta
mit einzelnen Schlüsseln, 2) Ausführenget_post_custom
, um alle benutzerdefinierten Felder eines Posts auf einmal abzurufen, oder 3) Erstellen einer eigenen Abfrage mit der Klasse $ wpdb (get_results()
), um Ihr eigenes Rückgabeobjekt zu erstellen . ($ wpdb class documentation: codex.wordpress.org/Class_Reference/wpdb )Antworten:
Standardmäßig werden
WP_Query
die StandardobjekteWP_Post
für die abgefragten Posts zurückgegeben. Ich glaube, mit einigem geschickten Umschreiben und der Verwendung der Filter inWP_Query
können Sie demWP_Post
Array der zurückgegebenen Objekte Objekte hinzufügen .Wird das performant sein? Meiner Meinung nach beeinträchtigt dies die Leistung, da Sie die Ergebnisse in Ihrer Abfrage zusammenführen müssen, da benutzerdefinierte Felder nicht in der
wp_posts
Tabelle, sondern in derwp_postmeta
Tabelle gespeichert werdenDas Abrufen von Post-Meta ist sehr schnell und erfordert keine zusätzliche Instanz von
WP_Query
. Sie können das benutzerdefinierte Feld einfach mit aufrufenget_post_meta()
. WordPress war sehr nachdenklich, als die benutzerdefinierten Felder eingeführt wurden. Sie haben einen Cache hinzugefügt, um sie zwischenzuspeichern. Unabhängig davon, ob Sie 1 oder 100 benutzerdefinierte Felder abfragen, treffen Sie die Datenbank einmal, superschnell. Einen vollständigen Test und eine Erklärung finden Sie in diesem Beitrag, den ich kürzlich zu diesem Thema verfasst habe.Meiner Meinung nach lohnt sich der zusätzliche Datenbankaufruf und die tatsächlich aufgewendete Zeit und sind schneller als das Umschreiben
WP_Query
, um benutzerdefinierte Felder in das von zurückgegebene Standard-Post-Objekt aufzunehmen$posts
quelle
get_post_meta()
für jeden einzelnen Post .. Ich würde eher war es eine Möglichkeit , zusätzliche Daten zu speichern , entweder direkt in derwp_posts
Tabelle oder in ein verwandte Tabelle, die nicht so ein Geist ist, wie eswp_postsmeta
ist.get_post_meta()
, müssen Sie es bei jedem Post aufrufen, egal ob es sich um einen Call handelt oder um ein Post-Objekt. Das gleiche gilt für Template-Tagsthe_content()
, die Sie bei jedem Beitrag aufrufen müssen.Diese Frage ist mehr als 1 Jahr alt, aber ich habe das gleiche Problem, und hier ist eine Funktion, die jeden meta_value und meta_key zum $ wp_query-Objekt hinzufügt.
Anstatt jede Post-Meta-In-While-Schleife abzufragen, führt diese Funktion ein zusätzliches Abfragebeispiel aus:
"SELECT meta_key, meta_value, post_id FROM $ wpdb-> postmeta WHERE post_id IN (1,2,3,4,5 ...)"
Dabei ist (1,2,3,4,5 ...) die aktuelle Post-ID von $ wp_query
Zusätzliche "Postmeta" werden in jeden $ wp_query-> Post geschrieben [$ i]
$wp_query->posts[0]->postmeta
Beispiel mit 'someMetaKeyName' vergessen Sie nicht zu setzen
add_query_meta()
zu deinem Theme functin.phpquelle
Vor kurzem hatte ich ein ähnliches Problem. Ich musste 7 Metadaten eines benutzerdefinierten Beitragstyps abrufen, aber ich musste auch den Beitrag auf der Grundlage von Metadaten abrufen.
Daher habe ich die folgende SQL-Anweisung erstellt, die ich häufig verwende. Hoffentlich hilft es jemand anderem. Ich werde versuchen, es so gut wie möglich zu erklären.
Zuerst bekomme ich die WordPress-Datenbankfunktionen mit globalem $ wpdb. Dann setze ich den Posttyp mit $ pt. Um den korrekten Beitrag zu erhalten, der einem bestimmten Wert in post_meta entspricht, setze ich $ mk (meta_key)
Dann setze ich die Variable $ mv (meta_value). (In diesem Fall stimmt der Meta-Wert mit einer Post-ID überein.)
$ mk1- $ mk7 sind die Metaschlüssel, die ich von jedem Beitrag haben möchte. (Ich werde die Werte in der Select-Anweisung greifen)
Ich mache auch das 'order by' ein var, indem ich $ ord setze
Die select-Anweisung lautet wie folgt: Ich wähle die Post-ID und den post_title aus dem POST oder 'p.'
Dann wähle ich alle Metadaten aus, die ich mit pm1 auswählen muss. -> pm.7 und nimm den meta_value und benenne ihn um (AS), damit er besser lesbar ist, wenn du die Daten von meinem Objekt abrufst.
Ich erstelle einen LEFT JOIN für die Metadaten, die ich für den Beitrag benötige. (pm)
Ich erstelle 7 linke Verknüpfungen für jede der Metadaten, die ich abrufen muss. (pm1-pm7)
Die WHERE-Anweisung basiert auf dem ersten LEFT JOIN (pm), sodass ich nur die Posts benötige, bei denen die Metadaten übereinstimmen.
Ich füge auch ein "UND" für den Beitragstyp und für die post_statuses hinzu, die keine Entwürfe sind. (also nur veröffentlichte Beiträge)
Schließlich füge ich die 'order by'-Klausel hinzu.
Dies funktioniert schnell und mit den in Wordpress integrierten Indizes. Es scheint also effizient zu sein.
Ich weiß nicht, ob etwas besser ist als dieses, aber wenn ja, würde ich es gerne verwenden.
Hoffe das hilft.
Marcus
quelle
Hey, bitte versuchen Sie es hier, ich denke, es funktioniert gut.
quelle
meta_key
undmeta_query[]['key']
auch?meta_key
und / odermeta_query
ändern Sie nicht die Art der zurückgegebenen Ergebnisse, sondern nur die Abfrage selbst.