2017-10-20 1 views
0

Ich habe ein Problem, das ich gerade versuche zu lösen und ein Problem zu finden, einen Weg zu finden, es richtig zu machen.Wordpress Sortierung nach Metawerten

Ich habe eine College-Vortragsreihe, die ich sortieren muss Ich kann es durch ein Meta-Feld für Jahr einfach gut sortieren. Aber wenn ich sortiere nach Semester sortiere es in alphabetischer Reihenfolge und so endet es sortiert nach Winter, Frühling, Herbst oder Herbst, Frühling, Winter je nachdem, ob ich es ASC oder DESC sage.

ich brauche, um herauszufinden, wie um diese vorzugsweise in der richtigen Reihenfolge zu tun, ohne ein weiteres Feld an den Pfosten für die Sortpriorität Hinzufügen

Abfrage args zur Zeit wie folgt geschrieben, das offensichtlich ein bisschen chaotisch ist.

$args = array(
       'post_type' => 'mcm_geri-ed', 
       'posts_per_page' => $posts_per_page, 

       'meta_query' => array(
        'semester' => array(
         'key' => 'semester', 

       ), 
        'year' => array(
         'key' => 'year' 
       ) 
      ), 
       'orderby' => array(

        'year' => 'DESC', 
        'semester' => array(
        'value' => 'date' 
       ) 
      ), 
       'paged' => $paged 
      ); 

Antwort

1

Ich glaube nicht, es gibt eine Möglichkeit, dies mit WP_Query direkt zu tun. Wie wäre es mit der Verwendung von posts_orderby und der Manipulation des ORDER-Teils der SQL, um so etwas wie meta_year DESC, meta_semester = 'Spring' DESC, meta_semester = 'Fall' DESC zu sein. Sehen Sie sich das erzeugte SQL an, um zu sehen, welche Namen Sie für Meta_Jahr und Meta_Semester (oder Trimester, wirklich) verwenden sollten.

Dies ist nicht so effektiv wie Semester auf einen numerischen Wert ändern und den Namen während der Ausgabe hinzufügen, aber es wird funktionieren.

+0

Ich würde das auch empfehlen - oder sie alle auswählen und die Sortierung manuell durchführen, wenn es nicht zu viele gibt. Es sollte jedoch möglich sein, mit WP_Query zu arbeiten. – Mikk3lRo

+1

Ich stimme dem Prinzip zu, aber ich würde vorzugsweise 'FIND_IN_SET (meta_semester,' Fall, Spring, Winter ') ASC' verwenden. FIND_IN_SET gibt die Position des ersten Arguments in der zweiten durch Kommas getrennten Zeichenfolge zurück, so dass sie nur in der gewünschten Reihenfolge in dort aufgeführt werden müssen. – CBroe

+1

Ich nehme meinen Kommentar über die Möglichkeit mit WP_Query zurück, nachdem ich eine Stunde lang versucht habe. Sie können [die Fähigkeit hinzufügen] (https://gist.github.com/mikeschinkel/6402058) jedoch. Und es ist ziemlich einfach, den 'posts_orderby'-Hook zu verwenden, wie von janh vorgeschlagen. – Mikk3lRo

0

Das habe ich letztendlich getan. Es war etwas anderes als das, was vorgeschlagen wurde, aber die Verwendung des vorgeschlagenen Filters, um das Ergebnis zu erhalten. Die if-Anweisung hat noch ein paar andere Vorbehalte, weil ich ein Sortiersystem für die Seitenvorlage erstellt habe. Ich habe das auch in einer Testumgebung geschrieben, daher der unterschiedliche Posttyp aus dem Originalcode.

// Custom Orderby filter to return the correct order for semester values. 
add_filter('posts_orderby', 'orderby_pages_callback', 10, 2); 
function orderby_pages_callback($orderby_statement, $wp_query) { 
    //Making sure this only happens when it needs to. Which is the right post type and if it isn't getting sorted by other functions. 
    if ($wp_query->get("post_type") === "test_semester" && !is_admin() && !isset($_GET['order']) && !isset($_GET['sort'])) { 
     return "CAST(mt1.meta_value AS CHAR) DESC, wp_postmeta.meta_value = 'Fall' DESC, wp_postmeta.meta_value = 'Winter' DESC, wp_postmeta.meta_value = 'Spring' DESC,wp_postmeta.meta_value = 'Summer' DESC"; 

    } else { 
     //return your regularly scheduled programming 
     return $orderby_statement; 
    } 
}