Recientemente tuve un problema similar, necesitaba obtener 7 piezas de metadatos de un tipo de publicación personalizado, 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. Trataré de 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 configuré el posttipo con $ pt. Para obtener la publicación correcta que coincida con un valor específico en post_meta, configuro $ mk (meta_key)
Luego configuro el $ mv (meta_value) var. (en este caso, el metavalor coincide con un postid)
$ mk1- $ mk7 son las meta_keys que quiero de cada publicación. (Tomaré los valores en la instrucción select)
También hago el 'ordenar por' una var, estableciendo $ ord
La declaración de selección es la siguiente: selecciono el ID de la publicación y el post_title de POST o 'p'.
Luego selecciono todos los metadatos que necesito seleccionándolos con pm1. -> pm.7 y agarrando el meta_valor y renombrándolos (AS) para que sea más legible al recuperar los datos de mi objeto.
Creo una IZQUIERDA ÚNICA para los metadatos que necesito para que coincidan con la publicación. (pm)
Creo 7 combinaciones de izquierda para cada uno de los metadatos que necesito recuperar. (pm1-pm7)
La declaración WHERE se basa en la primera LEFT JOIN (pm) para que sepa que solo necesito las publicaciones donde coinciden los metadatos.
También agrego un 'Y' 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 integrados 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
get_post_meta
en teclas individuales, 2) ejecutarget_post_custom
para obtener todos los campos personalizados de una publicación en una sola toma, o 3) crear su propia consulta utilizando la clase $ wpdb (get_results()
) para construir su propio objeto de retorno . ($ clase de documentación wpdb : codex.wordpress.org/Class_Reference/wpdb )