カスタムフィールドの値(meta_value)で記事を並べ替える方法です。
活用例としては、
カスタムフィールドに記録された商品価格を基準に、安い順 / 高い順 で表示したいような場合です。
方法としては2つ
- query_postsに渡す配列でorderby=meta_valueを指定する方法
- sql文を使って直接データベースを解析する方法(これは別記事にて)
今回は、meta_valueを直接参照して並べ替えるだけなので、query_postsでよさそうです。
<?php $args['category_name'] = 'カテゴリスラグ'; //カテゴリスラグによる絞り込み $args['orderby'] = meta_value; //メタ(カスタムフィールドの値)でソートすることを宣言 $args['meta_key'] = 'キー名'; //どのキーの値を基準にするか $args['order'] = 'ASC'; //昇順か降順かを指定。ASCは小さい順。DESCは大きい順 $args['posts_per_page'] = 10; //1ページあたりの記事数 $args['paged'] = $paged; //表示中のページが何ページ目か取得して格納 query_posts($args);//実行 ?>
ところがこれでは、文字コード順になってしまいます。
つまり、’560′, ‘980’, ‘1000’という価格なら、並べ替えた順番は、’1000′, ‘560’, ‘980’となってしまいます。カスタムフィールドに入力した値は文字として扱われるからです。
数値としてソートするには、カスタムフィールドの値を数値に変換してquery_postsに渡す必要があります。その方法は、アクションフックposts_orderbyを利用することができます。
function my_orderby($orderby) { global $wpdb; if (get_query_var('meta_key') == 'キー名') { //もちろんここは前述のキー名と同じです $orderby = "CAST($wpdb->postmeta.meta_value AS UNSIGNED) ASC"; } return $orderby; } add_filter('posts_orderby', 'my_orderby');
これで先ほどの例は、数値として認識されて、560, 980, 1000 のように並んでくれます。