Recentemente, tive um problema semelhante, precisava obter 7 partes de metadados de um tipo de postagem personalizado, mas também precisava obter a postagem com base em uma parte de metadados.
Então, eu criei a seguinte instrução SQL, eu a uso frequentemente. Espero que ajude alguém. Vou tentar explicar da melhor maneira possível.
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 );
Primeiro, recebo as funções do banco de dados wordpress com o global $ wpdb. Depois, defino o posttype com $ pt. Para obter a postagem correta que corresponda a um valor específico em post_meta, defino o $ mk (meta_key)
Então eu defino a var $ mv (meta_value). (nesse caso, o valor meta corresponde a um postid)
$ mk1- $ mk7 são as meta_keys que eu quero de cada post. (Vou pegar os valores na instrução select)
Também faço o 'order by' a var, definindo $ ord
A instrução select é a seguinte: seleciono o ID da postagem e o post_title no POST ou 'p'.
Depois, seleciono todos os metadados necessários para selecioná-los com pm1. -> pm.7 e pegando o meta_value e renomeando-os (AS) para ficar mais legível ao recuperar os dados do meu objeto.
Eu crio um JOIN ESQUERDO para os metadados que preciso corresponder à postagem. (PM)
Eu crio 7 junções esquerdas para cada um dos metadados que preciso recuperar. (pm1-pm7)
A instrução WHERE é baseada no primeiro LEFT JOIN (pm), para que saiba que eu preciso apenas das postagens onde os metadados correspondem.
Também adiciono um 'AND' para o tipo de postagem e para os post_statuses que não são rascunhos. (apenas postagens publicadas)
Finalmente, adiciono a cláusula 'order by'.
Isso funciona rápido e com os índices internos do Wordpress, por isso parece eficiente.
Não sei se algo é melhor que isso, mas se for, eu adoraria usá-lo.
Espero que isto ajude.
Marcus
get_post_meta
em chaves individuais, 2) executarget_post_custom
para obter todos os campos personalizados de uma postagem de uma só vez ou 3) criar sua própria consulta usando a classe $ wpdb (get_results()
) para criar seu próprio objeto de retorno . (documentação da classe $ wpdb: codex.wordpress.org/Class_Reference/wpdb )