Intereting Posts
Можно ли определить шаблон для настраиваемого типа сообщения внутри плагина независимо от активной темы? Редактор дополнительных TinyMCE разделяет <p> и теги? Интерфейс, необходимый для передачи содержимого в таблице на веб-странице в интерфейс «Добавить новый продукт» Как заменить bloginfo (template_url) Неустранимая ошибка в плагине отображения формы Force shortcode для отображения, где он встроен Shortcode: текстовый контент заканчивается вне html-тегов Минимальный PHP необходим для WordPress Как добавить описание к виджетам? Различные предварительные настройки wp_get_object_terms (), чтобы получить список всех терминов, прикрепленных ко всем сообщениям в текущем запросе Безопасно удалить это: <? Php comments_template (); ?> при использовании приложения для комментариев сторонней стороны? Как добавить настраиваемый мета-код, когда у вас есть файл шаблона страницы Настройка по умолчанию. Как организовать иерархическую структуру в пользовательском типе сообщений с таксономией (например, с категориями)

Как 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, удаляет знак $ , преобразует его в десятичную. Это позволит корректно отсортировать его сейчас.