WP.

Sorteren op custom taxonomie in WordPress

Voor een project met eigen post types, maatwerk velden, en een maatwerk taxonomie structuur (Categorieën van tags zijn bijvoorbeeld een taxonomie), was het nodig om te kunnen sorteren op een taxonomie. Dit is niet standaard mogelijk in WordPress, maar het kan natuurlijk wel!

Enig zoekwerk leverde deze link op. Dit is een goed uitgangspunt, maar nog niet echt generiek. Met een paar kleine wijzigingen, zoals een check of de orderby waarde een taxonomie is, en het vervangen van alle vaste strings door de variabele $taxonomy.

Je kan nu gewoon als argumenten aan je wp_query meegeven:

$args = array(
‘orderby’ => ‘jouwtaxonomie’,
‘order’ => ‘ASC’,
)
/*
if an orderby clause exists as taxonomy, sort by that taxonomy.
*/

function dtc_taxonomy_ordering( $clauses, $wp_query ) {
global $wpdb;
//if no ordering was set, exit immediately
if ( !isset( $wp_query->query[‘orderby’] )) return $clauses;

$taxonomy = $wp_query->query[‘orderby’];
//check if this really is a taxonomy, otherwise exit.
if (!taxonomy_exists($taxonomy)) return $clauses;

$clauses[‘fields’] .= “, wp_term_relationships.object_id, GROUP_CONCAT(wp_terms.name ORDER BY name ASC) AS “.$taxonomy;
$clauses[‘join’] .=”
LEFT OUTER JOIN {$wpdb->term_relationships} ON wp_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)
“;
$clauses[‘where’] .= ” AND taxonomy = ‘”.$taxonomy.”‘ “;
$clauses[‘groupby’] = “object_id”;
$order = ( ‘ASC’ == strtoupper( $wp_query->get(‘order’) ) ) ? ‘ASC’ : ‘DESC’;
$clauses[‘orderby’] = “GROUP_CONCAT(wp_terms.name ORDER BY name ASC) {$order}”;
return $clauses;
}
add_filter( ‘posts_clauses’, ‘dtc_taxonomy_ordering’, 10, 2 );