Orderbyとmeta_value_numを使用して、最初に数字を、次に文字列を並べ替えます


16

製品のリストがあり、それぞれが「2.50」や「5.00」などのテキストとして保存されているカスタムフィールドに価格があり、価格で並べ替えるカスタムクエリでページに表示しています。

    if(!$wp_query) {
        global $wp_query;
    }

    $args = array(
        'meta_key' => 'price',
        'orderby' => 'meta_value_num',
        'order' => 'ASC'
    );

    query_posts( array_merge( $args , $wp_query->query ) );

これは価格に対しては正常に機能しますが、一部の価格は「POA」であり、最後に表示したいと思いますが、「POA」が最初に表示されるような上記の注文です。

これを変更する方法はありますか、または後で配列を並べ替えて「POA」価格を最後に付けるために使用できる簡単なハックがありますか?


に変更'orderby' => 'meta_value_num', してみてください'orderby' => 'meta_value_num meta_value',
-Bainternet

ありがとう、それは動作しません:(
ショーン

あぁ!しかし、逆の方法でも機能しmeta_value meta_value_numます!ありがとう!投票できるように回答を書きたいですか?
ショーン

1
コメントを読んでいない人への回答として投稿されました。
-Bainternet

POAは「質問の価格」を意味しますen.wikipedia.org/wiki/Price_on_application
sudip

回答:


23

OrderByソリューションが変更にしたので、引数がもっとして一つのパラメータを取ることができます。

'orderby' => 'meta_value_num',

に:

'orderby' => 'meta_value meta_value_num',

3
2番目のパラメーターはノーオペレーションであり、同じフィールドをソートしても効果がないため、これはアルファベット順にソートされます。ソート数値的に数字とアルファがアルファベット順にあなたがSQLケーシング、例えば、何らかの使用するORDERBYをカスタマイズするためにフィルタを使用する必要があるだろうというようにこれを行うにはORDER BY CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC
bonger

@bongerありがとうございます!あなたの解決策は、この問題に対する完全な解決策です。そして、ここにクエリが配置される残りのコードがあります。新しい訪問者への回答として投稿します。
ガンゲシュ

2

@bongerと/programming/18084199/wordpress-query-order-by-case-whenのコードを組み合わせて、このソリューションを見つけました

そしてそれはうまく機能します。

関数

function filter_case($orderby = '') {
  $orderby .= "CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC";
  return $orderby;
}

クエリの前

add_filter( 'posts_orderby', 'filter_case' );

$wp_query = new WP_Query($args);

remove_filter( 'posts_orderby', 'filter_case' );
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.