WP_Queryにてカテゴリ名でソートする
この記事はにメンテナンスが行われています。
WP_Query()
を用いてカテゴリ名(またはタクソノミー)でソートするにはposts_clausesフィルターを使用すると容易に実現できます。
add_filter( 'posts_clauses', 'sort_posts_by_category', 10, 2 );function sort_posts_by_category( $clauses, $wp_query ) { global $wpdb;
// 'sort_by_category' フラグが設定されていない場合は処理しない if ( ! $wp_query->get( 'sort_by_category' ) ) { return $clauses; }
// タクソノミーテーブルを JOIN $clauses['join'] .= " LEFT JOIN {$wpdb->term_relationships} AS tr ON ({$wpdb->posts}.ID = tr.object_id) LEFT JOIN {$wpdb->term_taxonomy} AS tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) LEFT JOIN {$wpdb->terms} AS t ON (tt.term_id = t.term_id) ";
// 'category' タクソノミーに限定 $clauses['where'] .= " AND tt.taxonomy = 'category'";
// 'order' パラメーターを取得し、デフォルトは 'ASC' $order = strtoupper( $wp_query->get( 'order' ) ); if ( 'ASC' !== $order && 'DESC' !== $order ) { $order = 'ASC'; }
// カテゴリ名でソート $clauses['orderby'] = "t.name $order";
// 重複を防ぐためにグループ化 $clauses['groupby'] = "{$wpdb->posts}.ID";
return $clauses;}
使用するには、WP_Query
のsort_by_category
パラメーターをtrue
に設定します。
// クエリ取得.$args = array( 'post_type' => 'post', 'order' => 'ASC', // 'ASC' または 'DESC' 'sort_by_category' => 'category' === $query_orderby,);$query = new WP_Query( $args );
WP_Query()
のorderby
ではデフォルトで幾つかのパラメーターを指定できますが、カテゴリ名の様にサポートされていない場合はposts_clauses
フィルターを使用して柔軟にソートを行うと良いでしょう。