Es ist relativ einfach Posts von WordPress anhand von post_meta values zu sortieren. Sie die Metadaten jedoch unstrukturiert ist dies nur mit einigen mysql Kniffen möglich. Bei einem aktuellen Projekt haben wir folgender string in den post_meta 23/2001. Es soll nun anhand der der Jahre und der Erscheinungsnummer sortiert werden.
/** * Reorder value with substr 23/2001 => 200123 * Cast the value as unsigned 23/2001 => 23 * Cast as unsigned to order */ add_filter ('posts_orderby', function($order = '') { if( \Roots\Sage\Setup\display_complaint_sidebar() ) { global $wpdb; $field = $wpdb->postmeta . '.meta_value'; $order = str_replace($field, 'CAST(CONCAT(SUBSTR('.$field.', -4), LPAD(CAST('.$field.' AS UNSIGNED), 2, 0)) AS UNSIGNED)', $order); return $order; } return $order; });
In einem ersten Schritt wird die Jahreszahl extrahiert. Dazu verwenden wir die Mysql_Funktion SUBSTR und erhalten 2001. Danach casten wir den gesamten string als UNSIGNED und erhalten die Zahl 23. Diese beiden Zahlen fügen wir wieder zusammen bekommen einen sortierbare Nummer 200123.