Home » Web Development » WordPress » Ordinare i post per tassonomia in WordPress (tenendo conto solo delle tassonomie di primo livello)

Ordinare i post per tassonomia in WordPress (tenendo conto solo delle tassonomie di primo livello)

trucchi wordpress
Un paio di settimane fa abbiamo visto come ordinare i risultati del WP_Query di WordPress per Tassonomia, e oggi vorrei riprendere l’argomento per implementare una modifica che può risultare molto utile.

Come certamente saprete in WordPress è possibile definire diversi valori per le nostro tassonomie, e addirittura possiamo definire una gerarchia tra questi valori. L’esempio classico della tassonomia più comune è quella delle Categorie usate per i post. E, benchè non ne sia molto fan, per l’uso che solitamente riserbo alle tassonomie, è possibile assegnare più valori di una Tassonomia al nostro post. Facciamo un esempio:

Immaginiamo di lavorare con le catogorie dei nostri articoli come tassonomia, e di avere una categoria News, con delle sottocategorie tipo Spettacolo, Sport e Eventi. Quando noi andremo ad ordinare i nostri post per Tassonomia, come detto nello scorso articolo, noteremo che l’ordinamento tiene conto di tutte le categorie assegnate ai post, per cui se abbiamo selezionato sia la categoria padre (News), sia quella figlia (Spettacolo) verrà tutto ordinato di conseguenza.

Questo, quando abbiamo diverse categorie madri potrebbe portare a della confusione, o comunque a non dare il risultato sperato. Per cui potremmo voler ordinare tenendo conto soltanto delle tassonomie di primo livello e per farlo dovremo modificare la funzione di ordinamento nel functions.php in questa maniera:

Come era la funzione per ordinare i post per tassonomia in WordPress

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function orderby_tax_clauses( $clauses, $wp_query ) {
	global $wpdb;
	$taxonomies = get_taxonomies();
	foreach ($taxonomies as $taxonomy) {
    		if ( isset( $wp_query->query['orderby'] ) && $taxonomy == $wp_query->query['orderby']     ) {
			$clauses['join'] .=<<term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
				LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
				LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
			SQL;
            		$clauses['where'] .= " AND (taxonomy = '{$taxonomy}' OR taxonomy IS NULL)";
            		$clauses['groupby'] = "object_id";
            		$clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
            		$clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ?     'ASC' : 'DESC';
        	}
    	}
    	return $clauses;
}

Come deve cambiare la funzione per tenere conto solo delle tassonomie di primo livello

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function orderby_tax_clauses( $clauses, $wp_query ) {
	global $wpdb;
	$taxonomies = get_taxonomies();
	foreach ($taxonomies as $taxonomy) {
    		if ( isset( $wp_query->query['orderby'] ) && $taxonomy == $wp_query->query['orderby']     ) {
			$clauses['join'] .=<<term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
				LEFT OUTER JOIN {$wpdb->term_taxonomy} ON {$wpdb->term_taxonomy}.term_taxonomy_id = {$wpdb->term_relationships}.term_taxonomy_id 
					AND {$wpdb->term_taxonomy}.parent = 0
				LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
			SQL;
            		$clauses['where'] .= " AND (taxonomy = '{$taxonomy}' OR taxonomy IS NULL)";
            		$clauses['groupby'] = "object_id";
            		$clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
            		$clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ?     'ASC' : 'DESC';
        	}
    	}
    	return $clauses;
}

Se notate ho modificato a riga 8 lo USING utilizzato nella JOIN di sql utilizzando il classico ON, in questo modo ho potuto aggiungere un’ulteriore condizione:

8
9
	LEFT OUTER JOIN {$wpdb->term_taxonomy} ON {$wpdb->term_taxonomy}.term_taxonomy_id = {$wpdb->term_relationships}.term_taxonomy_id 
		AND {$wpdb->term_taxonomy}.parent = 0

Con quel {$wpdb->term_taxonomy}.parent = 0 dico alla mia funzione di tenere in considerazione solo quei valori di tassonomia che non hanno genitori, quindi quelli di primo livello! Ovviamente adesso potrete giocare con questa nuova informazione, ad esempio evitando di proposito i termini di primo livello o altro, a voi la fantasia!

Resta sempre aggiornato

Stai tranquillo! Non invio E-mail di Spam e non faccio decine di invi ogni settimana. Ti invierò di tanto in tanto un messaggio per tenerti aggiornato sulle novità e sui nuovi articoli!
Email
Secure and Spam free...