web-dev-qa-db-ja.com

Meta_value_numをドル記号($)で並べ替える方法

すべてのカスタムフィールドには、$記号と区切り文字としてのドットを含む価格があります。

$theQuery = new WP_Query(array(
'orderby' => 'meta_value_num',
'meta_key' => 'price',
'order' => ASC  
));

すべてこのようにフォーマットされています:

$ 24.95 $ 190.00 $ 1.40

ドル記号のために正しくソートされません。このWP_Queryの最初の文字/ $記号を無視または削除することは可能ですか?

1
coder

posts_orderbyフィルタを使うこともできます。

function wpse155827_posts_orderby_price( $orderby ) {
    return str_replace( 'wp_postmeta.meta_value', 'substr(wp_postmeta.meta_value, 1)', $orderby );
}
add_filter( 'posts_orderby', 'wpse155827_posts_orderby_price' );
$theQuery = new WP_Query( array(
    'orderby' => 'meta_value_num',
    'meta_key' => 'price',
    'order' => 'ASC',
    'suppress_filters' => false,
) );
remove_filter( 'posts_orderby', 'wpse155827_posts_orderby_price' );
3
bonger

カスタムSQLを作成するにはpost_clausesフィルタを使用する必要があります。

add_filter( 'posts_clauses', 'wpse155827_price_sort', 10, 2 );

function wpse155827_price_sort( $clauses, $wp_query ) {
    $orderby = $wp_query->get( 'orderby' ); 
    $order = ( $wp_query->get( 'order' ) == 'desc') ? 'DESC' : 'ASC';
    if( 'price' === $orderby ) {
        $clauses['join'] .= " LEFT JOIN {$wpdb->postmeta} price ON( {$wpdb->posts }.ID = price.post_id AND price.meta_key = 'price') ";
        $clauses['orderby'] = " CONVERT( REPLACE(price.meta_value, '$', ''), DECIMAL(13,2) ) " . $order;
    }

    return $clauses;
}

基本的に、これはorderbypriceに設定するときはいつでもあなたの問い合わせの中にカスタムのmySQLコードを作成するフィルタです。 mySQLコードでは、メタ値を取り、$記号を削除し、それらを10進数に変換します。これにより、正しくソートできるようになります。

0
Manny Fleurmond