Cómo ordenar publicaciones de una categoría por fecha y número de comentarios

30 mar 2016, 12:59:46
Vistas: 18.8K
Votos: 0

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

1
Comentarios

¿Puedes ser más específico publicando el recuento de comentarios y la fecha de publicación para esos tres posts con su orden?

Sumit Sumit
30 mar 2016 13:14:25
Todas las respuestas a la pregunta 2
3

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

  1. Otro más
  2. Ejemplo post
  3. Otro ejemplo

Mientras que el nuevo código devolvería las entradas en el orden

  1. Ejemplo post
  2. Otro más
  3. Otro ejemplo

ya que "Ejemplo post" y "Otro más" se publicaron el mismo día, pero "Ejemplo post" tiene más comentarios.

30 mar 2016 13:22:16
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.

Michał Kalkowski Michał Kalkowski
30 mar 2016 13:56:49

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?

engelen engelen
30 mar 2016 16:33:31

No es exactamente lo que esperaba pero tu respuesta me ayuda mucho. En mi situación necesito obtener las publicaciones más nuevas y estas publicaciones deben estar ordenadas por cantidad de comentarios (la publicación más comentada arriba). Saludos

Michał Kalkowski Michał Kalkowski
30 mar 2016 22:35:14
0

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);
?>
30 mar 2016 13:28:28