Alterar a ordem dos custom posts no WordPress

O facto do WordPress não ter nascido como CMS ainda se nota com alguma regularidade. Um exemplo disso é quando queremos mostrar, com uma ordem definida por nós, um série de elementos pertencentes a um custom post type, que por sua vez pertencem a uma custom taxonomy  (num URL do tipo /<taxonomy-name>/<taxonomy-term>). Por defeito são mostrados por ordem de criação.

Isto implica criar uma nova instância do WP_Query com todos os argumentos necessários para obter o que pretendemos.

Criar o array com os argumentos tem que se lhe diga. Principalmente porque é preciso saber quais são, quais precisamos, quais podemos ignorar, etc. A forma mais simples de criar esse array é aproveitar o trabalho que o WordPress já fez.

Basta aceder ao array da query original e juntar-lhe apenas os argumentos que queremos alterados. Neste exemplo, o orderby e o order. Fazemos isso com a função do PHP array_merge , que concatena uma série de arrays usando sempre os valores do último array em caso de conflito (exactamente o que pretendemos).

<?php

// aceder à variável global
global $wp_query;

// juntar o nossos valores aos valores originais
$args = array_merge(
    $wp_query->query_vars,
    ['orderby' => 'menu_order', 'order' => 'ASC']
);

// nova query com os novos argumentos
$query = new WP_Query($args);

?>

Simples e eficaz.

Dica relacionada: Alternativamente a definir a ordem na página de edição de cada post é melhor usar um plugin como o Simple Page Ordering.