[wp-hackers] sortable taxonomy columns for taxonomy metadata

Roberto Sanchez roberto at digitalbrands.com
Tue Jan 15 20:38:33 UTC 2013

A few more details I didn't add in my last reply:

The first Scribu post dealing with sorting columns helped with sorting
pages on a custom post type I had. However, I am now trying to sort on a
custom taxonomy for that custom post type. One other difference is that the
custom post type uses /wp-admin/edit.php, while the custom taxonomy uses
/wp-admin/edit-tags.php. As such, the filters in the first Scribu post
don't work for the custom taxonomy. The page edit.php uses
WP_Posts_List_Table, while edit-tags.php uses WP_Terms_List_Table. I've
been trying to dig in there to find which filters are used differently
between the two list tables but haven't had much luck with that.

Starting from the second post I found on Scribu, I came up with this:

    add_filter( 'posts_clauses', 'sort_by_pageviews', 10, 2 );

   function sort_by_pageviews( $clauses, $wp_query ) {
       global $wpdb;

        if ( isset( $_GET['orderby'] ) && 'pageviews' == $_GET['orderby'] )
            $clauses['join'] .= "LEFT JOIN (
                SELECT object_id, GROUP_CONCAT(meta_value ORDER BY
meta_value ASC) AS pageviews
                FROM $wpdb->term_relationships
                INNER JOIN $wpdb->term_taxonomy USING (term_taxonomy_id)
                INNER JOIN $wpdb->taxonomymeta ON
($wpdb->taxonomymeta.taxonomy_id =
                WHERE taxonomy = 'merchant'
                AND $wpdb->taxonomymeta.meta_key = 'pageviews'
                GROUP BY object_id
            ) AS pageviews_terms ON ( $wpdb->posts.ID =
            $clauses['orderby'] = "pageviews_terms.pageviews ";
            $clauses['orderby'] .= ( isset( $_GET['order'] ) && 'ASC' ==
strtoupper( $_GET['order'] ) ) ? 'ASC' : 'DESC';

        return $clauses;

A couple of things here:

I'm not sure if I'm even using the correct filter here, since
$wp_query->query['orderby'] is not being set. This is why I needed to check
the $_GET variables instead. I don't understand why the query doesn't use
the variables passed by $_GET.

Additionally, I'm using the Taxonomy Metadata plugin:


I'm pretty sure this plugin adds the wp_taxonomymeta table to the DB, but
the table name is still accessible via $wpdb->taxonomymeta.

This method and the previous method don't work for sorting the taxonomy by
the pageviews metadata.

More information about the wp-hackers mailing list