it-swarm.com.de

query_posts werden in mehrere Richtungen sortiert

Ich versuche, meine Postsortierung mithilfe mehrerer Kriterien zu verbessern, möchte jedoch bestimmte Aufträge für unterschiedliche Werte. Zum Beispiel habe ich einen meta_key mit dem Namen 'featured', mit dem ich einen beliebigen Beitrag nach oben verschieben möchte. Für die Übereinstimmung mit "Hervorgehoben" sollte nach Titel sortiert werden.

Das Problem ist, dass ich in der Funktion query_posts nur einen "order" -Schlüssel definieren kann.

$args=array(
                                        'post_type'         => 'portfolio-item',
                                        'post_status'       => 'publish',
                                        'caller_get_posts'  => 1,
                                        'paged'             => $paged,
                                        'meta_key'          => 'featured',
                                        'orderby'           => 'meta_value title',
                                        'order'             => 'desc asc',
                                    );

Dies ist das Parameter-Array, das ich verwenden möchte (beachten Sie die Werte für die Mehrfachreihenfolge. Leider scheint dies nicht die richtige Form zu sein. Irgendwelche Vorschläge?

2
MechEngineer

Sortieren nach

Die Abfragefunktionen wie get_posts(), query_posts() rufen einen new WP_Query im Inneren auf - sie sind nur Wrapper.

Das Wichtigste ist, was im class WP_Query vor sich geht. Speziell in WP_Query -> get_posts(). Wenn Sie ein orderby-Argument hinzufügen, geschieht Folgendes:

  1. WP prüft ob es gesetzt ist. Wenn nicht, verwendet es den $wpdb->posts.post_date und hängt den `order-Wert daran an.
  2. Wenn Sie 'none' angeben, wird keine Reihenfolge angewendet.
  3. In allen anderen Fällen wird die Bestellung verwendet.

Aber ... es gibt "orderby" -Werte:

$allowed_keys = array('name', 'author', 'date', 'title', 'modified', 'menu_order', 'parent', 'ID', 'Rand', 'comment_count');

Für Metaschlüssel/Wert-Paare gibt es einen Sonderfall : Wenn der Metaschlüssel nicht leer ist, wird der Wert meta_key zu den zulässigen Schlüsseln sowie meta_value und meta_value_num hinzugefügt.

Die Funktion zerlegt dann die Zeichenfolge orderby in ein Array und durchläuft eine Schleife. Alles, was passt, wird zu einem neuen Array hinzugefügt, das nach der Schleife implodiert (durch ein Komma getrennt) und der SQL-Abfragezeichenfolge hinzugefügt wird. Wenn das resultierende Array leer war, wird - erneut - der "$wpdb->posts.post_date" gefolgt von der order genommen. Wenn das auch leer ist, sehen Sie das gleiche Ergebnis wie bei none.

Wenn Sie also etwas wie einen Metaschlüssel und einen Metawert hinzufügen, sollten Sie Ihrer Abfrage Folgendes hinzufügen:

"$wpdb->postmeta.meta_value,$wpdb->postmeta.meta_value,$wpdb->posts.post_title"

Beitragstyp (en)

Ihr Beitragstyp arg wird wie folgt zur WHERE-Klausel hinzugefügt:

 AND $wpdb->posts.post_type = 'portfolio-item'

Was ich denke, ist hier falsch:

  1. Sie können asc desc nicht als order-Anweisung hinzufügen. Die Reihenfolge muss entweder ASC oder DESC (Groß-/Kleinschreibung nicht) sein ist egal). Dies wird nicht funktionieren und wird wahrscheinlich brechen.
  2. Ich bin mir ziemlich sicher, dass 'portfolio-item' nicht der tatsächliche Name des Beitragstyps ist. Ich denke, es ist nur portfolio. Rufen Sie auf jeden Fall den Post-Typ an, der darin angegeben ist

    var_dump( array_keys( (array) $GLOBALS['wp_post_types'] ) );
    
  3. caller_get_posts ist ein Argument vor 3.1. Sie sollten bereits am Anfang/Anfang Ihres Codes eine Notiz erhalten, da die folgende _deprecated_argument() aufgerufen wird , bevor überhaupt eine Abfragezeichenfolge erstellt wird:

    "caller_get_posts" is deprecated. Use "ignore_sticky_posts" instead.
    
1
kaiser