Come ordinare i post di una categoria per data e numero di commenti?

30 mar 2016, 12:59:46
Visualizzazioni: 18.8K
Voti: 0

Come da titolo, sto cercando di ordinare i post di una categoria sia per data che per numero di commenti, ma il codice qui sotto non funziona:

<?php
// Ottieni i post dalla categoria corrente  
$category       = get_the_category();
$category_ID    = $category[0]->term_id;
$args = array(
    'cat'               => $category_ID,
    // Limita a 3 post
    'posts_per_page'    => 3,
    'ignore_sticky_posts'   => true,
    // Ordina per data e commenti
    'orderby' => array(
        'date'          => 'DESC', 
        'comment_count' => 'DESC',
    ),
);
$the_query = new WP_Query($args);
?>

I post vengono ordinati solo per data

1
Commenti

Puoi essere più specifico pubblicando il conteggio dei commenti e la data di pubblicazione per tutti e tre i post con il loro ordine?

Sumit Sumit
30 mar 2016 13:14:25
Tutte le risposte alla domanda 2
3

La query che hai attualmente ordinerà i post in base alla loro proprietà post_date, che è una colonna SQL di tipo datetime. Questo tipo memorizza la data, ma anche l'ora (ore, minuti e secondi). La seconda opzione di ordinamento, comment_count, viene applicata solo ai post con lo stesso timestamp, cioè quelli pubblicati nello stesso esatto secondo.

Quindi, la soluzione al tuo problema è ordinare per data del post anziché per datetime. Per farlo, puoi filtrare la parte della query orderby in WP_Query utilizzando il filtro posts_orderby. Con questo filtro, puoi sostituire le clausole SQL ORDER per utilizzare il giorno invece del datetime.

Il codice seguente fa proprio questo: aggiunge una funzione al filtro posts_orderby che sostituisce {$wpdb->posts}.post_date (ad esempio wp_posts.post_date) con CAST({$wpdb->posts}.post_date AS DATE), che converte il campo datetime nel formato YYYY-MM-DD. Dopo aver eseguito la query, rimuove il filtro, assicurandosi che altre query non vengano influenzate.

function wpse222104_query_orderby_day( $orderby, $query ) {
    global $wpdb;

    return str_replace( "{$wpdb->posts}.post_date", "CAST({$wpdb->posts}.post_date AS DATE)", $orderby );
}

// Aggiungi il filtro per modificare la clausola ORDER
add_filter( 'posts_orderby', 'wpse222104_query_orderby_day', 10, 2 );

// Esegui la query con i filtri
$query = new WP_Query( $args );

// Rimuovi il filtro
remove_filter( 'posts_orderby', 'wpse222104_query_orderby_day' );

Questo presuppone gli stessi $args che avevi già: non c'era nulla di sbagliato in essi.

Testare il codice

Testare il codice mostra che la clausola ORDER BY viene modificata correttamente: la clausola originale era

wp_posts.post_date DESC, wp_posts.comment_count DESC

mentre la nuova è

CAST(wp_posts.post_date AS DATE) DESC, wp_posts.comment_count DESC

Esempio

L'ora precisa in cui il post è stato pubblicato ora non verrà considerata nell'ordinamento: solo la data di pubblicazione. Ad esempio, considera i seguenti post:

Titolo           Data                    Conteggio commenti
Esempio Post     2014-12-16 10:12:16     6
Un Altro         2014-12-16 21:50:07     4
Ancora Uno       2012-08-02 11:15:20     25

Qui, la tua query originale restituirebbe i post nell'ordine

  1. Un Altro
  2. Esempio post
  3. Ancora Uno

Mentre il nuovo codice restituirebbe i post nell'ordine

  1. Esempio post
  2. Un Altro
  3. Ancora Uno

poiché "Esempio post" e "Un Altro" sono stati pubblicati nello stesso giorno, ma "Esempio post" ha più commenti.

30 mar 2016 13:22:16
Commenti

OK grazie. Quindi questo non può essere fatto chiudendo l'ordinamento perché ho bisogno che i post più recenti siano ordinati anche in base al numero di commenti.

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

Ordina i post prima per giorno e, se due o più post hanno la stessa data di pubblicazione, vengono ordinati in base al numero di commenti. Risponde alla tua domanda?

engelen engelen
30 mar 2016 16:33:31

Non esattamente quello che mi aspettavo, ma la tua risposta mi è stata molto utile. Nel mio caso ho bisogno di ottenere i post più recenti e questi post devono essere ordinati in base al numero di commenti (i post con più commenti in cima). Saluti

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

Sembra che tu stia utilizzando una versione di WordPress precedente alla 4.x. Le versioni più vecchie non supportano array() come valore per orderby. Utilizza invece 'orderby' => 'date comment_count':

<?php
$category       = get_the_category();
$category_ID    = $category[0]->term_id;
$args = array(
    'cat'                 => $category_ID, // ID della categoria
    'posts_per_page'      => 3, // Numero di post da mostrare
    'ignore_sticky_posts' => true, // Ignora i post in evidenza
    'orderby'             => 'date comment_count', // data è il criterio primario
    'order'               => 'DESC' // non obbligatorio perché è il valore predefinito
);
$the_query = new WP_Query($args); // Esegue la query
?>
30 mar 2016 13:28:28