Intereting Posts

Как orderby 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?

Solutions Collecting From Web of "Как orderby meta_value_num с знаком доллара ($)"

Вы также можете использовать фильтр 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' ); 

Вам нужно будет использовать фильтр post_clauses для создания пользовательского SQL:

 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; } 

В принципе, это фильтр, который создает пользовательский код mySQL в вашем запросе всякий раз, когда вы устанавливаете orderby по price . в коде mySQL он принимает значение meta, удаляет знак $ , преобразует его в десятичную. Это позволит корректно отсортировать его сейчас.