J'ai eu un problème similaire récemment, j'avais besoin d'obtenir 7 morceaux de métadonnées à partir d'un type de message personnalisé, mais j'avais également besoin d'obtenir le message en fonction d'un morceau de métadonnées.
J'ai donc créé l'instruction SQL suivante, je l'utilise souvent. J'espère que cela aidera quelqu'un d'autre. Je vais essayer de l'expliquer du mieux que je peux.
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 );
D'abord, j'obtiens les fonctions de base de données wordpress avec global $ wpdb. Ensuite, j'ai défini le post-type avec $ pt. Pour obtenir le message correct qui correspond à une valeur spécifique dans post_meta, j'ai défini le $ mk (meta_key)
Ensuite, j'ai défini la var $ mv (meta_value). (dans ce cas, la méta-valeur correspond à un postid)
$ mk1- $ mk7 sont les meta_keys que je veux de chaque article. (Je vais saisir les valeurs dans l'instruction select)
Je fais aussi la 'commande par' une var, en mettant $ ord
L'instruction select se présente comme suit: je sélectionne l'ID du post et le post_title dans le POST ou 'p.'
Ensuite, je sélectionne toutes les métadonnées dont j'ai besoin en les sélectionnant avec pm1. -> pm.7 et en saisissant la méta_valeur et en les renommant (AS) afin qu'elle soit plus lisible lors de la récupération des données de mon objet.
Je crée un LEFT JOIN pour les métadonnées dont j'ai besoin pour correspondre à la publication. (pm)
Je crée 7 jointures de gauche pour chacune des métadonnées que je dois récupérer. (pm1-pm7)
L'instruction WHERE est basée sur la première LEFT JOIN (pm) afin qu'elle sache que je n'ai besoin que des publications où les métadonnées correspondent.
J'ajoute également un «ET» pour le type de message et pour les post_status qui ne sont pas des brouillons. (donc seuls les articles publiés)
Enfin, j'ajoute la clause «order by».
Cela fonctionne rapidement et avec les index intégrés dans Wordpress, donc cela semble efficace.
Je ne sais pas si quelque chose est meilleur que ça, mais si c'est le cas, j'adorerais l'utiliser.
J'espère que cela t'aides.
Marcus
get_post_meta
sur des clés individuelles, 2) exécuterget_post_custom
pour obtenir tous les champs personnalisés d'un article en une seule fois, ou 3) créer votre propre requête à l'aide de la classe $ wpdb (get_results()
) pour créer votre propre objet de retour . (Documentation de la classe $ wpdb: codex.wordpress.org/Class_Reference/wpdb )