Obtendo o maior valor de um meta do seu post type no WordPress

Obtendo o maior valor de um meta do seu post type no WordPress

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:

  1. 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).
  2. 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'
));

Allyson Souza

Tecnólogo em Jogos Digitais pela FATEC São Caetano do Sul, é Designer e Programador. Co-fundador da Haste Design, estúdio que desenvolve projetos diversos de design e web. Desenvolve com WordPress há cerca de 4 anos. Organiza os meetups da comunidade WP São Paulo e busca sempre que possível contribuir com a comunidade.

Deixe uma resposta

Fechar Menu
×
×

Carrinho