Inversarea ordinii postărilor DUPA executarea interogării

3 apr. 2012, 06:59:14
Vizualizări: 13.7K
Voturi: 6

Afisez ultimele 5 postări ale unui custom post type 'show'.

Asta îmi oferă cea mai recentă postare prima.

<?php
$args = array(
    'post_type' => 'show',
    'posts_per_page' => 5,
    'order' => 'DESC'
    );
$home_shows = new WP_Query($args);
var_dump($home_shows);
?>

Ce am nevoie este să am cele mai vechi postări (din array-ul cu ultimele spectacole) primele, iar cel mai recent spectacol (din acel array) ultimul.

În prezent primesc (data spectacolului printr-o valoare meta custom field):

11/03/12, 7/03/12, 4/03/12, 2/03/12, 30/02/12 etc.

Am nevoie de: 30/02/12, 1/03/12, 4/03/12, 7/03/12, 11/03/12,

Am încercat să folosesc array_reverse din php astfel (adăugat la codul de mai sus):

$reversed_shows = array_reverse( $home_shows->posts );

Ceea ce mi-a dat rezultate foarte ciudate (afișa părți complet diferite ale postării, ordinea în array era greșită).

Alte idei?

0
Toate răspunsurile la întrebare 4
1

Am realizat ce greșeam. O simplă greșeală de începător.

Array_reverse funcționa corect, dar nu am reatribuit apoi array-ul inversat înapoi la WP_Query-ul $home_shows, motiv pentru care nu vedeam nicio modificare.

Iată răspunsul și codul meu revizuit.

<?php
                    $args = array(
                        'post_type' => 'show',
                        'posts_per_page' => 5,
                        'order' => 'DESC',
                    );
                    $home_shows = new WP_Query($args);
                    //inversează ordinea postărilor, cele mai recente ultimele
                    $array_rev = array_reverse($home_shows->posts);
                    //reatribuie array-ul de postări inversat obiectului $home_shows
                    $home_shows->posts = $array_rev;
                ?>
                <?php $captions = array(); ?>
                <?php if ( $home_shows->have_posts() ) : ?>         
                    <?php while ( $home_shows->have_posts() ) : $home_shows->the_post(); ?>

Mulțumesc pentru răspunsuri, mă bucur că am rezolvat această problemă.

3 apr. 2012 17:07:22
Comentarii

Nu uitați să marcați răspunsul dumneavoastră ca acceptat!

Burgi Burgi
21 nov. 2016 13:39:16
3

Elimină toată mizeria cu câmpurile personalizate și adaugă un 'order' => 'ASC' la array-ul args! Și gata!

3 apr. 2012 07:04:22
Comentarii

Ce dezordine cu câmpurile personalizate? Tipul de postare personalizat? Este necesar, deoarece site-ul are câteva tipuri de postări personalizate pentru a organiza lucrurile. Voi încerca să explic mai bine prin editarea unei postări

Squadrons Squadrons
3 apr. 2012 07:18:22

Îmi cer scuze pentru alegerea greșită a cuvintelor. Câmpurile personalizate sunt disponibile și pentru tipurile de postări implicite. Doar pentru că este un tip de postare personalizat, tot ce ai nevoie este un 'post_type', pe care îl ai deja. Este adevărat că vrei să afișezi ultimele postări primele?

Rutwick Gangurde Rutwick Gangurde
3 apr. 2012 07:27:40

aceasta nu rezolvă de fapt problema pentru că dacă interoghezi doar cele mai recente 10 postări și rulezi ordonarea ASC, îți va returna cele mai vechi 10 postări.

Jacob Raccuia Jacob Raccuia
27 iul. 2016 02:42:36
5
    <?php
    $args = array(
        'post_type' => 'show', // tipul de postare personalizat
        'posts_per_page' => 5, // număr de postări pe pagină
        'order' => 'desc' // ordinea descrescătoare
        );
    $home_shows = new WP_Query($args);
 //   var_dump($home_shows); // pentru debugging

echo "<pre>";
print_r($home_shows->posts);
echo "</pre>";



$array_rev = array_reverse($home_shows->posts);
echo "<pre>";
print_r($array_rev);
echo "</pre>";
  ?>

Am încercat codul de mai sus pentru tipul meu de postare personalizat...

rezultatele ID-urilor postărilor: 240,239,238,237 pentru inversare: 237,238,239,240

Trebuie să fie altceva în neregulă la tine...

3 apr. 2012 09:28:58
Comentarii

Orderby este setat implicit la data!

Rutwick Gangurde Rutwick Gangurde
3 apr. 2012 09:33:30

@RutwickGangurde a editat răspunsul meu...

Rajeev Vyas Rajeev Vyas
3 apr. 2012 09:52:35

De ce inversezi array-ul? Doar schimbă ordinea în ASC și vei obține ultimele postări primele.

Rutwick Gangurde Rutwick Gangurde
3 apr. 2012 09:58:31

@RutwickGangurde Cred că nu ai înțeles cerința lui... ceea ce vrea el este să obțină ultimele 5 postări și apoi să le afișeze în ordine astfel încât cea mai veche postare din acele cinci să fie prima...

Rajeev Vyas Rajeev Vyas
3 apr. 2012 10:03:56

Bine, nu am observat asta mai devreme. Tocmai am citit întrebarea lui editată!

Rutwick Gangurde Rutwick Gangurde
3 apr. 2012 10:15:04
0

Dacă trebuie să reordonați interogarea principală, vă sugerez să utilizați următorul hook:

add_action('the_posts',function($posts,$query){
    
    if( $query->is_main_query() ){
        
        usort($posts,function ($a, $b) {
            
            return strtotime($b->post_modified) - strtotime($a->post_modified);
        });
    }
    
    return $posts;
    
},10,2);

În acest exemplu, reordonez postările după data post_modified, dar puteți folosi o altă logică.

31 ian. 2024 04:58:43