Come ordinare i post di una categoria per data e numero di commenti?
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
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
- Un Altro
- Esempio post
- Ancora Uno
Mentre il nuovo codice restituirebbe i post nell'ordine
- Esempio post
- Un Altro
- Ancora Uno
poiché "Esempio post" e "Un Altro" sono stati pubblicati nello stesso giorno, ma "Esempio post" ha più 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.

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?

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
?>
