Ordena los post en WordPress mediante un valor personalizado

Fotografía: Cal Evans (Creative Commons)
La organización de las entradas según la fecha de publicación es la más adecuada para la mayoría de los sitios, pero hay casos en los que podemos encontrarnos con necesidades particulares y tenemos que aplicar otras pautas más específicas. Os pongo el ejemplo real de una web de cine infantil, en la que no me convencía el modo en el que se disponían las películas. Por ejemplo, en la sección dedicada a las producciones de Pixar, al usuario podía descolocarle visualizar primero la segunda parte de Toy Story, luego la tercera y después la primera. Es mucho más interesante que estén cronológicamente clasificadas por su año de estreno.
Para añadir un nuevo criterio tenemos una buena información -en este caso en inglés- en el Codex de WordPress. La página hacia la que lleva el enlace, nos da una serie de parámetros para estructurar los contenidos, tales como el título, número de comentarios, autor o la fecha de la última modificación. Entre ellos también está meta_value_num, que sirve para ordenar según un valor numérico y es el que voy a aplicar.
En primer lugar, en el panel de control de WordPress activo los campos personalizados desde las «Opciones de pantalla», cuya pestaña está situada en la parte superior derecha de cualquier post. A continuación, en cada película incluyo el campo «fecha», con su correspondiente valor.
Lo siguiente que tendré que hacer será modificar la consulta que imprime las entradas. Si os fijáis en el código de más abajo, en orderby he sustituido post_date -según fecha de publicación-, por meta_value_num. En la consulta debe figurar un meta_key, en mi caso con el valor fecha insertado como campo personalizado. Por último, establezco el orden descendiente (DESC).
$args = array(
'post_type' => 'post',
'meta_key' => 'fecha',
'orderby' => 'meta_value_num',
'order' => 'DESC',
);
$query = new WP_Query( $args );
Al modificar la consulta, los contenidos se regulan según el nuevo parámetro y supone una experiencia más positiva para el usuario.
Aún se puede afinar un poco más el código, porque ahora me pregunto qué ocurre cuando hay varias películas del mismo año. En el caso de Pixar, que suele presentar una anualmente, quizá no sea demasiado importante, pero en secciones de la web como «Animación 3D», donde a lo largo de 2016 puede que se agreguen 10 ó 15 nuevas, sí que es más significativo. Así es que, voy a introducir un segundo criterio que organice por fecha de publicación a igualdad de año. Siguiendo con el ejemplo de Pixar, hay dos largometrajes de 2015 y quiero que aparezca antes El viaje de Arlo que Del revés, porque se ha estrenado más recientemente. Para ello, en orderby, tras meta_value_num añado post_date.
$args = array(
'post_type' => 'post',
'meta_key' => 'fecha',
'orderby' => 'meta_value_num post_date',
'order' => 'DESC',
);
$query = new WP_Query( $args );
Ahora, El viaje de Arlo y Del revés intercambian sus posiciones con esta nueva pauta y el código está mucho más depurado.
Genioo, gracias
Gracias, Cristian. :)
Hola Alberto,
me gustaría saber qué archivo es el que debería modificar para conseguir cambiar el orden de los post. Tengo un blog con eventos, que me gustaría ordenar por un campo personalizado fecha (día/mes/año). Entiendo que se ordenarian en todas las páginas según este criterio, es decir, la página blog, y todas las de categorias, verdad?
Muchas gracias de antemano por tu ayuda!
Un saludo.
Hola Marina.
La ubicación de este archivo no tiene un lugar fijo. Varía dependiendo del código de cada plantilla.
Sobre la otra cuestión, decirte que se ordenarían bajo ese criterio todas las páginas y categorías vinculadas al mismo diseño. Es decir, las plantillas traen distintos diseños para organizar los posts (una columna, dos, tres…) y, normalmente, la disposición de los posts en cada uno de ellos está regulada por un array diferente.
Espero haber arrojado luz a tus dudas. Un saludo.