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








7
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: [...]
Scusa se la mia domanda ti risulta incomprensibile, mi dispiace ma non conosco la tarminologia esatta per farmi comprendere al meglio.
Gestisco un blog creato da un amico, che ora nor riesce più a seguirlo.
Abbiamo creato una tabella che fa da indice a vari link. Creo delle pagine “deck” e i link a queste vengono inseriti automaticamente nella tabella. Al momento però non ho la possibilità di ordinare questi link in maniera arbitraria !
Essi vengono visualizzati in ordine decrescente di inserimento.
C’è la possibilità d’implementare un codice affinchè possa, di volta in volta, decidere dove inserire i link alla pagine che ho editato all’interno della tabella?
Ed esempio: “in ordine alfabetico” o “per tipologia” o “per importanza” ?
grazie mille della tua disponibilità!
Lorenzo
@Lorenzo_l: In parte penso di aver capito e, ovviamente la cosa è possibile. In primis ti basterebbe rintracciare dove viene effettuata la SELECT SQL che estrae i dati e lì aggiungere l’ordinamento desiderato. Avresti bisogno, in definitiva, di un intervento tecnico che dovrebbe risolversi in pochi minuti.
Se vuoi provare, ovviamente con le poche indicazioni in mio possesso, puoi provare ad aggiungere l’ordinamento anche da solo.
La SELECT dovrebbe presentarsi tipo:
Adesso non conosco i nomi dei campi, ma basta che inserisci alla fine:
Dove è
campoil nome del campo il tabella, tiponomeo non so.Difficile essere esaustivo da qui…