Uma abordagem possível seria usar um dos métodos auxiliares na classe WPDB para fazer uma consulta baseada em meta mais refinada. A ressalva de usar algumas dessas funções, no entanto, é que você normalmente não recebe uma matriz simples de dados e geralmente precisa fazer referências desnecessárias às propriedades do objeto, mesmo que esteja apenas chamando por uma coluna ou linha.
Obviamente, nem todas as funções são a mesma, e uma menção proposital sai para o método WPDB , get_col
que retorna uma matriz simples e simples dos dados consultados, faço essa menção especificamente porque o exemplo a seguir irá recorrer a esse método .
WordPress - WPDB Selecionando uma coluna de dados
$ wpdb-> get_col ()
Aqui está um exemplo de função que consulta o banco de dados em busca de todas as postagens de um tipo de postagem escolhido, status da postagem e com uma meta-chave específica (ou campo personalizado para os menos preocupados tecnicamente).
function get_meta_values( $key = '', $type = 'post', $status = 'publish' ) {
global $wpdb;
if( empty( $key ) )
return;
$r = $wpdb->get_col( $wpdb->prepare( "
SELECT pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = %s
AND p.post_status = %s
AND p.post_type = %s
", $key, $status, $type ) );
return $r;
}
Por exemplo, se você deseja descobrir quais postagens têm uma meta-chave de classificação , para os filmes do tipo post e gostaria de armazenar essas informações em uma variável, um exemplo dessa chamada seria ..
$movie_ratings = get_meta_values( 'rating', 'movies' );
Se você quiser fazer nada além de imprimir esses dados na tela, a função implode do PHP pode rapidamente dividir essa matriz simples em linhas de dados.
// Print the meta values seperate by a line break
echo implode( '<br />', get_meta_values( 'YOURKEY' ));
Você também pode usar os dados retornados para descobrir quantas postagens têm esses meta-valores executando um loop simples sobre os dados retornados e criando uma matriz de contagens, por exemplo.
$movie_ratings = get_meta_values( 'rating', 'movies' );
if( !empty( $movie_ratings ) ) {
$num_of_ratings = array();
foreach( $movie_ratings as $meta_value )
$num_of_ratings[$meta_value] = ( isset( $num_of_ratings[$meta_value] ) ) ? $num_of_ratings[$meta_value] + 1 : 1;
}
/*
Result:
Array(
[5] => 10
[9] => 2
)
// ie. there are 10 movie posts with a rating of 5 and 2 movie posts with a rating of 9.
*/
Essa lógica pode ser aplicada a vários tipos de dados e estendida para funcionar de várias maneiras diferentes. Espero que meus exemplos tenham sido úteis e simples o suficiente para serem seguidos.