Não estamos aceitando novos projetos no momento, saiba mais
Há algum tempo enfrentamos este problema em um projeto: como pegar o maior valor de um meta field dentre todos os posts no WordPress?
Possuíamos um CPT (custom post type) registrado, a este CPT havia associado um meta field numérico de preço. No projeto era necessário criar um filtro por valor, um slider, definindo valor máximo e valor mínimo.
Pensando em como resolver essa tarefa, pesquisamos primeiro para saber se o WordPress não tinha algo pronto, mas não encontrei nada. Logo pensei que teria de escrever minha query SQL. Evito a criação de uma query própria no desenvolvimento WordPress por dois motivos:
- O WordPress possui a classe WP_Query para realizar suas consultas. A WP_Query atende muitos casos e deve ser priorizada. (Inclusive dizem que, caso não seja possível fazer uma query com ela, que entre em contato com o time do core que irão aprimorar o código para compreender o caso encontrado).
- Não sou nenhum profundo conhecedor de SQL (muito pelo contrário).
Obtendo o maior valor de um meta field com WP_Query
A solução não podia ser mais simples: utilizando a classe WP_Query criei uma consulta ao meu CPT, buscando um único resultado, ordenando pelo meu meta field em ordem decrescente. Ou seja, a consulta retornaria um único resultado que seria o post com o valor mais alto salvo na meta. Para ordenar por um meta field numérico é preciso, além de passar o meta_key com o identificador do campo, passar meta_value_num no parâmetro orderby da query.
$posts = new WP_Query( array( 'post_type' => 'meu_post_type', 'posts_per_page' => 1, 'meta_key' => 'my_meta_key', 'orderby' => 'meta_value_num' ));
Quais as vantagens desta abordagem? Primeiro ela é simples e utiliza a API do WordPress. Segundo, qualquer plugin de cache está preparado para lidar com WP_Query e essa consulta será cacheada, oferecendo uma boa performance.
Com o post armazenado em $posts, basta realizar o loop normalmente e pegar o maior valor de um meta field dentre todos os posts, que é o associado ao posts que puxamos com nossa query:
while( $posts->have_posts() ) { $posts->the_post(); $max_value = get_post_meta( get_the_ID(), 'my_meta_key', 1 ); echo $max_value; }
Obtendo o menor valor de um meta field com WP_Query
E caso eu queira buscar pelo menor valor de um meta field dentre meus posts? O princípio é o mesmo, um loop ordenado pelo meta_key, porém como desejamos o menor valor precisamos passar um parâmetro adicional. Com o order definido como DESC (descendente) dizemos que os resultados da nossa query serão do menor para o maior, mas como buscamos apenas um item (posts_per_page => 1) o item retornado será o de menor valor, pois estamos ordenando pelo meta field.
$posts = new WP_Query( array( 'post_type' => 'meu_post_type', 'posts_per_page' => 1, 'meta_key' => 'my_meta_key', 'orderby' => 'meta_value_num', 'order' => 'DESC' ));