WordPressの記事一覧をURLパラメータでソートする方法

WordPressでsidebarからカテゴリの記事一覧へリンクし、カテゴリ毎に異なるソートオーダーにしたかったため、URLパラメータの指定でソート順を変更できないか調べてみた。 どうも、WordPressの標準の機能で、URLにorderby,orderを指定すると、ソートできるようだ。

http://www.xxx.com/category/dog?orderby=title&order=DESC

指定できるパラメータは次のURLで確認できる。

Order & Orderby Parameters WP_Query | Class | WordPress Developer Resources

ただし今回はWelcartの商品コードのカスタムフィールドでソートをしたい。
残念ながらorderby=meta_valueを指定してmeta_keyを設定してもソートされない。

NG。ソートされない。
http://www.xxx.com/category/item?orderby=meta_value&order=DESC&meta_key=_itemCode

WordPressのソースclass-wp.php:265, WP->parse\_request()では、WP::public_query_varsに格納されていないURLパラメータは取り込まないようだ。

public_query_vars に入っているのは次の値。


class WP {
	/**
	 * Public query variables.
	 *
	 * Long list of public query variables.
	 *
	 * @since 2.0.0
	 * @access public
	 * @var array
	 */
	var $public_query_vars = array(
	'm',
	'p',
	'posts',
	'w',
	'cat',
	'withcomments',
	'withoutcomments',
	's',
	'search',
	'exact',
	'sentence',
	'calendar',
	'page',
	'paged',
	'more',
	'tb',
	'pb',
	'author',
	'order',
	'orderby',
	'year',
	'monthnum',
	'day',
	'hour',
	'minute',
	'second',
	'name',
	'category_name',
	'tag',
	'feed',
	'author_name',
	'static',
	'pagename',
	'page_id',
	'error',
	'comments_popup',
	'attachment',
	'attachment_id',
	'subpost',
	'subpost_id',
	'preview',
	'robots',
	'taxonomy',
	'term',
	'cpage',
	'post_type'
   );



よく見るとその直前に、query_varsフィルタがある。 これで追加することもできそうだ。

$this->public_query_vars = apply_filters( 'query_vars', $this->public_query_vars );

試しに、functions.phpにフィルタを追加。すると、ソートできた!

add_filter('query_vars', 'my_query_vars', 9);
function my_query_vars(  $qvars ){
	$qvars[] = 'meta_key';
	return $qvars;
}

ここまでくると

  • query_varsフィルターで独自のパラメーターを追加。

  • pre_get_postsで自前のソート条件を指定。

で結構自由にソートできるのではないだろうか?

と思ったら、すでに実現されている方が! 素晴らしい! WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する  |  wpxtreme