Wie man mit meta_value_num mit Dollarzeichen ($) bestellt

Die benutzerdefinierten Felder enthalten Preise einschließlich $ -Zeichen und einen Punkt als Trennzeichen.

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

Alles wie folgt formatiert:

$ 24.95 $ 190,00 $ 1,40

Sie werden aufgrund des Dollarzeichens nicht korrekt sortiert. Ist es möglich, das erste Zeichen / $ sign in dieser WP_Query zu ignorieren oder zu entfernen?

Solutions Collecting From Web of "Wie man mit meta_value_num mit Dollarzeichen ($) bestellt"

Sie können auch den posts_orderby Filter verwenden:

 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' ); 

Sie müssen den post_clauses Filter verwenden, um ein benutzerdefiniertes SQL zu erstellen:

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

Im Grunde ist dies ein Filter, der in Ihrer Abfrage benutzerdefinierten mySQL-Code erstellt, wenn Sie orderby auf price . im mySQL-Code nimmt es den Meta-Wert, entfernt das $ -Zeichen, konvertiert sie in eine Dezimalzahl. Dadurch kann es jetzt richtig sortiert werden.