Ordem aleatória (order by rand) na lista de posts da API REST

  • Última modificação: 27/08/2022
  • Tempo de leitura: 3 min.
  • Read in English

Há algum tempo, depois de anunciar a chegada do primeiro beta do WordPress 5.1 no grupo WordPress Brasil no Facebook, um usuário perguntou quando viria a opção de ordenar aleatoriamente os posts na API REST do WordPress. Expliquei que não era preciso ter isso no core e criei um código para habilitar esta funcionalidade.

O código abaixo usa o filtro rest_{$this->post_type}_collection_params para incluir rand como uma entrada no array que enumera os valores possíveis para a ordenação. Este filtro é usado no final do método get_collection_params da classe WP_REST_Posts_Controller, como você pode ver aqui. A parte {$this->post_type} do filtro é variável e no código eu uso para alterar a lista de posts.

Para usar basta chamar /wp-json/wp/v2/posts?orderby=rand. Se você estiver usando alguma solução para cache, o funcionamento pode ser afetado.

<?php
/**
 * Plugin Name: REST API - Post list randomize
 * Description: Randomize the content list in REST API passing `orderby=rand` as parameter.
 * Version:     1.0.0
 * Author:      Felipe Elia | Codeable
 * Author URI:  https://codeable.io/developers/felipe-elia?ref=qGTOJ
 */

/**
 * Add `rand` as an option for orderby param in REST API.
 * Hook to `rest_{$this->post_type}_collection_params` filter.
 *
 * @param array $query_params Accepted parameters.
 * @return array
 */
function add_rand_orderby_rest_post_collection_params( $query_params ) {
	$query_params['orderby']['enum'][] = 'rand';
	return $query_params;
}
add_filter( 'rest_post_collection_params', 'add_rand_orderby_rest_post_collection_params' );

É só salvar o código como um arquivo php e colocar o arquivo na pasta plugins. O código também está disponível no gist.

Felipe Elia

Associate Director of Platform Engineering na 10up, WordPress Core Contributor, Global Polyglots Mentor na comunidade internacional do WordPress e Locale Manager na comunidade WordPress Brasil.