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

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

指定できるパラメータはClass Reference/WP QueryのOrder & Orderby Parametersのところ。

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

url
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.php
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フィルタがある。
これで追加することは可能そうだ。

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

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

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クエリストリングにカスタムフィールドを指定して絞り込み検索する