WordPress: ordinare una serie di post per un campo qualsiasi

La tecnica che illustro qui è utile in molte situazioni dove, ad esempio, abbiamo un array di array o un array di oggetti. In WordPress può capitare di dover manipolare un elenco di post, nel formato standard di array di stdClass Object, senza aver accesso alla select originale (sul database) che ha generato l’elenco (array) stesso:

1
2
3
4
5
6
7
Array
(
    [0] => stdClass Object
        (
            [ID] => 104
            [post_author] => 37
    ...

È possibile tuttavia ordinare un tale array in un momento successivo, senza passare per il database, sfruttando la funzione php usort(). Questa permette di eseguire un ordinamento tramite una funzione callback personale. Ad esempio immaginiamo di voler ordinare i nostri post per post_author o per un qualsiasi altro campo che, a sua volta, può essere un array o un altro stdClass Object:

1
2
3
4
5
6
7
8
9
10
/**
 * $posts è il nostro array di oggetti "post" stdClass Object
 */

usort( $posts, "__sort" );

function __sort( $a, $b ) {
    if( $a->post_author == $b->post_author ) return 0;
    return ($a->post_author > $b->post_author) ? -1 : 1;   // decrescente
    // return ($a->post_author < $b->post_author) ? -1 : 1;   // crescente
}

Giocando sul maggiore “>” e minore “<" dell'ultima istruzione è possibile ordinare in modo decrescente o crescente.

Queste situazioni possono essere molto frequenti in contesti avanzati dove, ad esempio, si hanno una serie di elenchi da sottoporre a scansione. Un altro esempio è nel caso di aggregazioni, dove più liste di post, recuperati al limite da blog diversi, devono essere ordinate.

1
2
3
4
5
6
7
8
9
10
11
array_push( $posts, $lista_1, $lista_2, $lista_3, ..., $lista_n );
/**
 * $posts è un array di liste, elenchi di post recuperati chissà
 * dove e chissà come...
 */

usort( $posts, "__sort" );

function __sort( $a, $b ) {
    if( $a->ID == $b->ID ) return 0;
    return ($a->ID < $b->ID) ? -1 : 1;
}

3 commenti a: “WordPress: ordinare una serie di post per un campo qualsiasi”

  1. 28 mar, 2011 elia:

    ciao,
    ho letto il tuo articolo e si avvicina a quello che dovrei fare.
    io devo ordinare i post in base al valore di diversi custom field;
    per esempio ordinare per:
    - prezzo
    - nome
    - luogo
    qual è il modo migliore di procedere?
    grazie

  2. 03 nov, 2011 Giovambattista Fazioli:

    @elia:: il modo migliore è quello di usare le meta_query, introdotte con la versione 3.1 di WordPress. Trovi esempi e documentazione qui. Ad esempio puoi recuperare tutti i post che hanno una meta_key prezzo uguale a 100:

    1
    2
    3
    $args = array('meta_key' => 'prezzo', 'meta_value' => '100');
    $posts = get_posts($args);
    ...
  3. 03 nov, 2011 Ordinare un array di array in PHP - Undolog.com - Undolog.com:

    [...] funzione PHP usort() vista in WordPress: ordinare una serie di post per un campo qualsiasi può essere utilizzata facilmente anche per ordinare array di array. Ad esempio se abbiamo: [...]

Lascia un commento

TAG XHTML PERMESSI: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> INSERIMENTO CODICE:
<pre></pre> // blocco generico
					<code></code> // blocco generico
					[cc_actionscript][/cc_actionscript] // Actionscript
					[cc_actionscript3][/cc_actionscript3] // Actionscript 3
					[cc_css][/cc_css] // CSS Style Sheet
					[cc_html][/cc_html] // HTML
					[cc_js][/cc_js] // Javascript
					[cc_objc][/cc_objc] // Objective-C
					[cc_php][/cc_objc] // PHP
					[cc_sql][/cc_sql] // SQL


Stop SOPA