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; } |








11
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
@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:2
3
$posts = get_posts($args);
...
[...] 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: [...]