Cum să ordonez postările dintr-o categorie după dată și număr de comentarii?
Exact cum spune în titlu, încerc să ordonez postările dintr-o categorie după dată și comment_count dar codul de mai jos nu funcționează:
<?php
// obține postări din categoria curentă
$category = get_the_category();
$category_ID = $category[0]->term_id;
$args = array(
'cat' => $category_ID,
// limitează postările la 3
'posts_per_page' => 3,
'ignore_sticky_posts' => true,
// ordonează postările după dată și comentarii
'orderby' => array(
'date' => 'DESC',
'comment_count' => 'DESC',
),
);
$the_query = new WP_Query($args);
?>
Postările sunt ordonate doar după dată
Interogarea pe care o aveți în prezent va ordona postările după proprietatea post_date
, care este o coloană SQL de tip datetime
. Acest tip stochează data, dar și ora (ore, minute și secunde). A doua opțiune de sortare, comment_count
, este aplicată doar postărilor cu același timestamp, adică care au fost publicate exact în aceeași secundă.
Deci, soluția la problema dvs. este să sortați după dată și nu după datetime. Pentru a face acest lucru, puteți filtra partea de interogare orderby
din WP_Query
folosind filtrul posts_orderby
. Cu acest filtru, puteți înlocui clauzele SQL ORDER
pentru a utiliza ziua în loc de datetime.
Codul de mai jos face acest lucru: adaugă o funcție la filtrul posts_orderby
care înlocuiește {$wpdb->posts}.post_date
(de exemplu, wp_posts.post_date
) cu CAST({$wpdb->posts}.post_date AS DATE)
, care convertește câmpul datetime în format YYYY-MM-DD
. După executarea interogării, elimină filtrul, asigurându-se că alte interogări nu sunt afectate.
function wpse222104_query_orderby_day( $orderby, $query ) {
global $wpdb;
return str_replace( "{$wpdb->posts}.post_date", "CAST({$wpdb->posts}.post_date AS DATE)", $orderby );
}
// Adaugă filtrul pentru a modifica clauza ORDER
add_filter( 'posts_orderby', 'wpse222104_query_orderby_day', 10, 2 );
// Rulează interogarea cu filtrele
$query = new WP_Query( $args );
// Elimină filtrul
remove_filter( 'posts_orderby', 'wpse222104_query_orderby_day' );
Acest lucru presupune același $args
pe care îl aveați deja: nu era nimic greșit cu ei.
Testarea codului
Testarea codului arată că clauza ORDER BY
este modificată corect: clauza originală era
wp_posts.post_date DESC, wp_posts.comment_count DESC
în timp ce cea nouă este
CAST(wp_posts.post_date AS DATE) DESC, wp_posts.comment_count DESC
Exemplu
Timpul exact în care postarea a fost publicată nu va mai fi luat în considerare la sortare: doar data publicării. De exemplu, luați în considerare următoarele postări:
Titlu Dată Număr comentarii
Post Exemplu 2014-12-16 10:12:16 6
Altul 2014-12-16 21:50:07 4
Încă Unul 2012-08-02 11:15:20 25
Aici, interogarea dvs. originală va returna postările în ordinea
- Altul
- Post Exemplu
- Încă Unul
În timp ce noul cod va returna postările în ordinea
- Post Exemplu
- Altul
- Încă Unul
deoarece "Post Exemplu" și "Altul" au fost publicate în aceeași zi, dar "Post Exemplu" are mai multe comentarii.

OK, mulțumesc. Deci, acest lucru nu poate fi realizat prin închiderea comenzii pentru că am nevoie și de cele mai recente postări ordonate după numărul de comentarii.

Le ordonează pe postări mai întâi după zi, iar dacă două sau mai multe postări au aceeași dată de publicare, sunt ordonate după numărul de comentarii. Răspunde la întrebarea ta?

Se pare că utilizați o versiune de WordPress anterioară versiunii 4.x. Versiunile mai vechi nu acceptă array()
ca valoare pentru orderby
. Utilizați în schimb 'orderby' => 'date comment_count'
:
<?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', // data este principalul criteriu
'order' => 'DESC' // nu este necesar deoarece este valoarea implicită
);
$the_query = new WP_Query($args);
?>
