すべてのカスタムフィールドには、$記号と区切り文字としてのドットを含む価格があります。
$theQuery = new WP_Query(array(
'orderby' => 'meta_value_num',
'meta_key' => 'price',
'order' => ASC
));
すべてこのようにフォーマットされています:
$ 24.95 $ 190.00 $ 1.40
ドル記号のために正しくソートされません。このWP_Queryの最初の文字/ $記号を無視または削除することは可能ですか?
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' );
カスタム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;
}
基本的に、これはorderby
をprice
に設定するときはいつでもあなたの問い合わせの中にカスタムのmySQLコードを作成するフィルタです。 mySQLコードでは、メタ値を取り、$
記号を削除し、それらを10進数に変換します。これにより、正しくソートできるようになります。