Recientemente tuve un problema similar, necesitaba obtener 7 piezas de metadatos de un tipo de publicación personalizada, pero también necesitaba obtener la publicación basada en una pieza de metadatos.
Así que creé la siguiente declaración SQL, la uso a menudo.
Esperemos que ayude a alguien más. Intentaré explicarlo lo mejor que pueda.
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 );
Primero obtengo las funciones de la base de datos de wordpress con $ wpdb global.
Luego establezco el posttype con $ pt.
Para obtener la publicación correcta que coincida con un valor específico en post_meta, establezco $ mk (meta_key)
Luego establezco la variable $ mv (meta_value). (en este caso, el valor meta coincide con un postid)
$ mk1- $ mk7 son las meta_keys que quiero de cada publicación. (Agarraré los valores en la declaración de selección)
También hago el 'order by' a var, estableciendo $ ord
La declaración de selección es la siguiente:
Selecciono la ID de la publicación y el post_título de la POST o 'p.'
Luego selecciono todos los metadatos que necesito seleccionándolos con pm1. - > pm.7 y capturar el meta_valor y cambiar su nombre (AS) para que sea más legible al recuperar los datos de mi objeto.
Creo un IZQUIERDA ÚNICA para los metadatos que necesito para hacer coincidir con la publicación. (pm)
Creo 7 uniones a la izquierda para cada uno de los metadatos que necesito recuperar. (pm1-pm7)
La instrucción WHERE se basa en el primer IZQUIERDA IZQUIERDA (pm) para que sepa que solo necesito las publicaciones donde coincidan los metadatos.
También agrego un 'AND' para el tipo de publicación, y para los post_statuses que no son borradores. (solo publicaciones publicadas)
Finalmente agrego la cláusula "ordenar por".
Esto funciona rápido y con los índices incorporados en Wordpress, por lo que parece eficiente.
No sé si algo es mejor que esto, pero si lo es, me encantaría usarlo.
Espero que esto ayude.
Marcus