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.