web-dev-qa-db-ja.com

Orderbyとmeta_value_numを使用して最初に数字を、次にストリングを順序付ける

"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」の価格を最後に設定するための簡単な方法はありますか。

14
Shaun

OrderBy引数は複数のパラメータを取ることができるので、解決策は変更することでした:

'orderby' => 'meta_value_num',

に:

'orderby' => 'meta_value meta_value_num',
22
Bainternet

私は@bongerと https://stackoverflow.com/questions/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' );
2
Gangesh