Cómo ordenar publicaciones de una categoría por fecha y número de comentarios
Como menciona el tema, estoy intentando ordenar publicaciones de una categoría por fecha y comment_count pero el siguiente código no funciona:
<?php
//obtener publicaciones de la categoría actual
$category = get_the_category();
$category_ID = $category[0]->term_id;
$args = array(
'cat' => $category_ID,
//limitar publicaciones a 3
'posts_per_page' => 3,
'ignore_sticky_posts' => true,
//ordenar publicaciones por fecha y comentarios
'orderby' => array(
'date' => 'DESC',
'comment_count' => 'DESC',
),
);
$the_query = new WP_Query($args);
?>
Las publicaciones solo se ordenan por fecha

La consulta que tienes actualmente ordena las publicaciones por su propiedad post_date
, que es una columna SQL de tipo datetime
. Este tipo almacena la fecha, pero también la hora (horas, minutos y segundos). La segunda opción de ordenación, comment_count
, solo se aplica a publicaciones con la misma marca de tiempo, es decir, que se publicaron exactamente en el mismo segundo.
Por lo tanto, la solución a tu problema es ordenar por fecha de publicación en lugar de fecha y hora. Para hacerlo, puedes filtrar la parte orderby
de la consulta en WP_Query
usando el filtro posts_orderby
. Con este filtro, puedes reemplazar las cláusulas SQL ORDER
para usar el día en lugar del datetime.
El siguiente código hace esto: agrega una función al filtro posts_orderby
que reemplaza {$wpdb->posts}.post_date
(por ejemplo, wp_posts.post_date
) por CAST({$wpdb->posts}.post_date AS DATE)
, lo que convierte el campo datetime al formato YYYY-MM-DD
. Después de ejecutar la consulta, elimina el filtro, asegurando que otras consultas no se vean afectadas.
function wpse222104_query_orderby_day( $orderby, $query ) {
global $wpdb;
return str_replace( "{$wpdb->posts}.post_date", "CAST({$wpdb->posts}.post_date AS DATE)", $orderby );
}
// Añadir el filtro para cambiar la cláusula ORDER
add_filter( 'posts_orderby', 'wpse222104_query_orderby_day', 10, 2 );
// Ejecutar la consulta con los filtros
$query = new WP_Query( $args );
// Eliminar el filtro
remove_filter( 'posts_orderby', 'wpse222104_query_orderby_day' );
Esto asume los mismos $args
que ya tenías: no había nada malo con ellos.
Probando el código
Probar el código muestra que la cláusula ORDER BY
se cambia correctamente: la cláusula original era
wp_posts.post_date DESC, wp_posts.comment_count DESC
mientras que la nueva es
CAST(wp_posts.post_date AS DATE) DESC, wp_posts.comment_count DESC
Ejemplo
La hora exacta en que se publicó la entrada ahora no se tendrá en cuenta en el ordenamiento: solo la fecha de publicación. Por ejemplo, considera las siguientes entradas:
Título Fecha Comentarios
Ejemplo Post 2014-12-16 10:12:16 6
Otro más 2014-12-16 21:50:07 4
Otro ejemplo 2012-08-02 11:15:20 25
Aquí, tu consulta original devolvería las entradas en el orden
- Otro más
- Ejemplo post
- Otro ejemplo
Mientras que el nuevo código devolvería las entradas en el orden
- Ejemplo post
- Otro más
- Otro ejemplo
ya que "Ejemplo post" y "Otro más" se publicaron el mismo día, pero "Ejemplo post" tiene más comentarios.

OK gracias. Entonces esto no se puede hacer mediante el cierre de pedidos porque también necesito las publicaciones más nuevas ordenadas por cantidad de comentarios.

Ordena las publicaciones por día primero, y si dos o más publicaciones comparten la misma fecha de publicación, se ordenan por cantidad de comentarios. ¿Responde eso a tu pregunta?

Parece que estás usando una versión anterior a la 4.x de WordPress. Las versiones antiguas no admiten array()
como valor de orderby
. Utiliza 'orderby' => 'date comment_count'
en su lugar:
<?php
$category = get_the_category();
$category_ID = $category[0]->term_id;
$args = array(
'cat' => $category_ID,
'posts_per_page' => 3,
'ignore_sticky_posts' => true,
'orderby' => 'date comment_count', // la fecha es el criterio principal
'order' => 'DESC' // no es obligatorio porque es el valor por defecto
);
$the_query = new WP_Query($args);
?>
