Sortieren nach post_meta

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.