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.
global $wpdb;
$pt = 'clients';
$mk = 'trainerid';
$mv = $pid;
$mk1 = 'email';
$mk2 = 'phone';
$mk3 = 'gender';
$mk4 = 'dob';
$mk5 = 'photo';
$mk6 = 'registrationts';
$mk7 = 'activationts';
$ord = 'p.post_name ASC';
$sql = "
SELECT p.ID, p.post_title AS fullname, pm1.meta_value AS email, pm2.meta_value AS phone, pm3.meta_value AS gender, pm4.meta_value AS dob, pm5.meta_value AS photo, pm6.meta_value AS regts, pm7.meta_value AS actemailts
FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID
AND pm.meta_key = '{$mk}'
LEFT JOIN {$wpdb->postmeta} pm1 ON pm1.post_id = p.ID
AND pm1.meta_key = '{$mk1}'
LEFT JOIN {$wpdb->postmeta} pm2 ON pm2.post_id = p.ID
AND pm2.meta_key = '{$mk2}'
LEFT JOIN {$wpdb->postmeta} pm3 ON pm3.post_id = p.ID
AND pm3.meta_key = '{$mk3}'
LEFT JOIN {$wpdb->postmeta} pm4 ON pm4.post_id = p.ID
AND pm4.meta_key = '{$mk4}'
LEFT JOIN {$wpdb->postmeta} pm5 ON pm5.post_id = p.ID
AND pm5.meta_key = '{$mk5}'
LEFT JOIN {$wpdb->postmeta} pm6 ON pm6.post_id = p.ID
AND pm6.meta_key = '{$mk6}'
LEFT JOIN {$wpdb->postmeta} pm7 ON pm7.post_id = p.ID
AND pm7.meta_key = '{$mk7}'
WHERE pm.meta_value = '{$mv}'
AND p.post_type = '{$pt}'
AND p.post_status NOT IN ('draft','auto-draft')
ORDER BY {$ord}
";
$clients = $wpdb->get_results( $wpdb->prepare( $sql ), OBJECT );
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
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 )