Recentemente ho avuto un problema simile, avevo bisogno di ottenere 7 pezzi di metadati da un tipo di post personalizzato, ma avevo anche bisogno di ottenere il post basato su un pezzo di metadati.
Quindi ho creato la seguente istruzione SQL, la uso spesso. Spero che possa aiutare qualcun altro. Proverò a spiegarlo nel miglior modo possibile.
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 );
Per prima cosa ottengo le funzioni del database wordpress con $ wpdb globale. Quindi ho impostato il posttype con $ pt. Per ottenere il post corretto che corrisponde a un valore specifico in post_meta, ho impostato $ mk (meta_key)
Quindi ho impostato $ mv (meta_value) var. (in questo caso il meta valore corrisponde a un postid)
$ mk1- $ mk7 sono i meta_key che desidero da ogni post. (Prenderò i valori nell'istruzione select)
Faccio anche 'ordina per' un var, impostando $ ord
L'istruzione select è la seguente: seleziono l'ID post e il post_title dal POST o 'p.'
Quindi seleziono tutti i metadati di cui ho bisogno selezionandoli con pm1. -> pm.7 e afferrando il meta_value e rinominandoli (AS) in modo che sia più leggibile quando si recuperano i dati dal mio oggetto.
Creo un JOIN SINISTRA per i metadati che devo abbinare al post. (Pm)
Creo 7 join di sinistra per ciascuno dei metadati che devo recuperare. (PM1-PM7)
L'istruzione WHERE si basa sul primo LEFT JOIN (pm) in modo che sappia che ho bisogno solo dei post in cui i metadati corrispondono.
Aggiungo anche un 'AND' per il tipo di post e per i post_status che non sono bozze. (quindi solo post pubblicati)
Infine aggiungo la clausola 'ordina per'.
Funziona velocemente e con gli indici integrati in Wordpress, quindi sembra efficiente.
Non so se qualcosa è meglio di così, ma se lo è, mi piacerebbe usarlo.
Spero che sia di aiuto.
Marcus
get_post_meta
su singole chiavi, 2) eseguireget_post_custom
per ottenere tutti i campi personalizzati di un post in un colpo solo, o 3) creare la tua query usando la classe $ wpdb (get_results()
) per costruire il tuo oggetto di ritorno . (Documentazione della classe $ wpdb: codex.wordpress.org/Class_Reference/wpdb )