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.