Cum să ordonez postările dintr-o categorie după dată și număr de comentarii?

30 mar. 2016, 12:59:46
Vizualizări: 18.8K
Voturi: 0

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ă

1
Comentarii

Poți fi mai specific postând numărul de comentarii și data postării pentru toate cele trei postări împreună cu ordinea lor?

Sumit Sumit
30 mar. 2016 13:14:25
Toate răspunsurile la întrebare 2
3

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

  1. Altul
  2. Post Exemplu
  3. Încă Unul

În timp ce noul cod va returna postările în ordinea

  1. Post Exemplu
  2. Altul
  3. Încă Unul

deoarece "Post Exemplu" și "Altul" au fost publicate în aceeași zi, dar "Post Exemplu" are mai multe comentarii.

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

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

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?

engelen engelen
30 mar. 2016 16:33:31

Nu exact ceea ce mă așteptam, dar răspunsul tău m-a ajutat foarte mult. În situația mea, trebuie să obțin cele mai recente postări, iar aceste postări trebuie să fie sortate după numărul de comentarii (postarea cu cele mai multe comentarii în top). Cu stimă,

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

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