Ordnen Sie Beiträge (auf der gesamten Website) nach Metadatendatum

8

Meine benutzerdefinierte Startseite ist so eingestellt, dass meine benutzerdefinierten Beiträge über das benutzerdefinierte Datumsfeld mit diesem (in den benutzerdefinierten Namen aktualisierten) Code in functions.php sortiert werden:

// sort order for home page
add_action('wp', 'wwgo_check_page');
function wwgo_check_page () {
if (is_page()) {
    add_filter('get_previous_post_sort', 'sort_it');
    add_filter('get_next_post_sort', 'sort_it');
    add_filter('posts_orderby', 'sort_it' );
    add_filter('posts_join', 'join_it' );
    add_filter('posts_where', 'where_it' );

    function sort_it () {
        global $wpdb;

        return " $wpdb->postmeta.meta_value ASC ";
    }

    function join_it( $join ) {
        global $wpdb;

        $join .= " LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id) ";

      return $join;
    }

    function where_it( $where ) {
        global $wpdb;
        $where .= "AND $wpdb->postmeta.meta_key = 'deadline' ";

      return $where;
    }
}



}

Welches ist dandy und einfach. Jetzt. Ich möchte, dass dies auf der gesamten Website funktioniert. Ich möchte, dass Beiträge auf Archivseiten, Kategorien usw. zuerst nach dem benutzerdefinierten Datumsfeld sortiert werden.

Irgendwelche Ideen?

Ich habe versucht, das ' if' in zu ändern , is_archive()aber das hatte keine Auswirkung. Ich habe es auch versucht <! is_single()>.

Ich bin sicher, es sollte etwas Einfaches sein. Aber ich bin neu in PHP und daher ahnungslos.

Hier ist die Seite , auf der Sie sehen können, dass die Startseite gut sortiert ist. Wenn Sie jedoch auf "Poesie" klicken (die einzige mit wenigen Beiträgen), funktioniert die Sortierung nicht.

Vorschläge werden mit großer Freude aufgenommen.

Dankesehr.

Josh
quelle
Sie sollten Ihrer gesamten Funktion z. josh_um die Benennung von Kolisionen zu vermeiden.
Kaiser
Meinst du das als gute Praxis oder um dies zu lösen? Ich habe versucht, den Code für 'is_archive' erneut zu kopieren, und ich konnte die Funktion erneut aufrufen, aber das Sortieren hat nicht funktioniert ...
Josh
1
Ja, es ist eine gute Praxis. Plus: Sie sollten Funktionen nicht in Funktionen einschließen.
Kaiser
cool, cool (ich habe gerade den Code von einer Website kopiert, tbh. Ich bin neu bei PHP & WordPress). Gibt es einen Fortschritt, wie dies auf der gesamten Website funktioniert? Ich habe es mit mehr benutzerdefinierten Seiten arbeiten und die gleiche Funktion auf (is_page ()) gesetzt, aber dies tut immer noch nichts für meine Archivseiten. Ich habe keine Ahnung, wie ich sie reparieren kann ...
Josh
1
Verwenden Sie stattdessen eine Klasse, anstatt Funktionen in Funktionen einzufügen.
Manny Fleurmond

Antworten:

2

Verwenden Sie den Filter query_varsoder request , um hinzuzufügen, orderbyob dies orderbynicht in der Abfragezeichenfolge enthalten ist

Maxim Krizhanovsky
quelle
+1 für requestFiltervorschlag
Michal Mau
@josh Schauen Sie sich auch diese Antwort an wordpress.stackexchange.com/a/21378/2110 an, um zu sehen, wie Sie is_archive()so früh im Prozess auf und ähnlich testen können.
Michal Mau
Anforderungsfilter war in der Tat ein guter Ruf.
Josh
0

Warum benutzt du nicht query_posts ()?

<?php
query_posts('meta_key=key_name&orderby=key_name&sort=ASC');
if ( have_posts() ) : while ( have_posts() ) : the_post();

endwhile; else:

endif;

wp_reset_query();

Sie können die Abfrage auch mit dem Hook pre_get_posts ändern und dort Ihre bedingte Sortierung mit is_archive (), is_page () usw. durchführen.

Brian Fegter
quelle
0

Ich schaue auch auf deine andere Frage .

Wenn Sie nach dem Datums-Metawert sortieren möchten, müssen sie natürlich dasselbe Format haben - ich vermute, es ist das Datumsformat ('m-y') von PHP, wie Sie es in Ihrem Code dort angegeben haben?

Wenn dies der Fall ist, stellen Sie möglicherweise fest, dass Sie ein besseres Ergebnis erzielen, wenn Sie Ihren meta_valueCode ändern meta_value_num.

Ich bin mir nicht sicher, ob dies funktionieren wird, aber es könnte einen Versuch wert sein.

djb
quelle