つながるnet

カスタムフィールドの値(meta_value)でソート

カスタムフィールドの値(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 のように並んでくれます。

直接メールしてみる

お名前 (必須)
メールアドレス (必須)
件名
ご相談内容
画像文字をご入力ください
captcha

コメントを残す