Bestellen Sie die Posts mit dem Titel in aufsteigender Reihenfolge

Ich habe eine Seite, auf der ich die Mannschaften eines Fußballvereins zeige. Ich bestelle diese mit ‘bestellen’ => ‘ASC’. Aber das Problem ist, dass die Teams so bestellen, wie ich es möchte.

Es bestellt so: Team E1, Team E10, Team E11, Team E2

Es muss so sein: Team E1, Team E2 ….. Team E10, Team E11

Was ist die beste Lösung, um dies richtig zu bestellen?

Solutions Collecting From Web of "Bestellen Sie die Posts mit dem Titel in aufsteigender Reihenfolge"

Alte Antwort (die nicht mehr funktioniert):

Eine hinterhältige Methode, MySQL unter der Annahme zu verwenden, dass die Zahl immer am Ende steht, besteht darin, den Titel umzukehren, ihn in eine Zahl ( +0 ) umzuwandeln, dann wieder umzukehren und ihn in eine Zahl umzuwandeln:

 function wpse174646_posts_orderby( $orderby, $query ) { if ( $query->get( 'orderby' ) != 'title_number' ) return $orderby; global $wpdb; return 'REVERSE(REVERSE(TRIM(' . $wpdb->posts . '.post_title))+0)+0 ' . $query->get( 'order' ); } $args = array( 'orderby' => 'title_number', 'order' => 'ASC' ); add_filter( 'posts_orderby', 'wpse174646_posts_orderby', 10, 2 ); $query = new WP_Query( $args ); remove_filter( 'posts_orderby', 'wpse174646_posts_orderby', 10 ); 

Neue Antwort:

Ein robuster (hoffentlich) Weg, dies zu tun, ist die Antwort, die ich auf Stackexchange gepostet habe ( https://Stackoverflow.com/a/28808798/664741 ), eine vereinfachte nicht-udf-Version der besten Antwort von @plaix / Richard Toth / Luke Hoggett, der die (zuerst angetroffene) Zahl mit Nullen ausfüllt:

 add_filter( 'posts_clauses', function ( $pieces, $query ) { if ( $query->get( 'orderby' ) != 'title_number' ) return $pieces; global $wpdb; $field = $wpdb->posts . '.post_title'; $pieces[ 'fields' ] .= $wpdb->prepare( ', LEAST(' . implode( ',', array_fill( 0, 10, 'IFNULL(NULLIF(LOCATE(%s, ' . $field . '), 0), ~0)' ) ) . ') AS first_int', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ); $pieces[ 'orderby' ] = $wpdb->prepare( 'IF(first_int = ~0, ' . $field . ', CONCAT(' . 'SUBSTR(' . $field . ', 1, first_int - 1),' . 'LPAD(CAST(SUBSTR(' . $field . ', first_int) AS UNSIGNED), LENGTH(~0), %s),' . 'SUBSTR(' . $field . ', first_int + LENGTH(CAST(SUBSTR(' . $field . ', first_int) AS UNSIGNED)))' . ')) ' . $query->get( 'order' ) , 0 ); return $pieces; }, 10, 2 ); $args = array( 'orderby' => 'title_number', 'order' => 'ASC' ); $query = new WP_Query( $args ); 

PHP hat ein sort_natural- Flag für seine sort () -function (MySQL nicht). Also, wenn Sie sie in ein Array vor dem Anzeigen von ihnen erstellt haben, könnten Sie es so sortieren.

Etwas wie:

 $teams = array( 'Team E1', 'Team E10', 'Team E2', 'Team E11', ); sort($teams, SORT_NATURAL); print_r($teams); 

Wird ausgegeben:

 Array ( [0] => Team E1 [1] => Team E2 [2] => Team E10 [3] => Team E11 )