Ich habe eine Reihe von Posts, die nach einem meta_key-Wert sortiert sind. Sie können bei Bedarf auch nach Menüreihenfolge arrangiert werden.
Die Links für den nächsten / vorherigen Beitrag (generiert von next_post_link
, previous_post_link
oder posts_nav_link
alle navigieren nach Chronologie. Obwohl ich dieses Standardverhalten verstehe, verstehe ich nicht, wie ich es ändern kann dann sieht es ziemlich hart aus. Wird empfohlen, dies von Grund auf neu zu schreiben, um es zu ersetzen, oder gibt es eine bessere Lösung.
custom-post-types
post-meta
sort
next-post-link
previous-post-link
Jodi Warren
quelle
quelle
Antworten:
Interna verstehen
Die "Sortierreihenfolge" benachbarter (nächster / vorheriger) Beiträge ist eigentlich keine "Sortierreihenfolge". Es ist eine separate Abfrage auf jeder Anfrage / Seite, aber sie sortiert die Abfrage nach
post_date
- oder dem übergeordneten Element, wenn Sie einen hierarchischen Beitrag als aktuell angezeigtes Objekt haben.Wenn Sie sich die Interna von ansehen
next_post_link()
, sehen Sie, dass es sich im Grunde um einen API-Wrapper handeltadjacent_post_link()
. Die spätere Funktion ruftget_adjacent_post()
intern mit dem$previous
Argument / Flag auf, das gesetzt istbool(true|false)
, um den nächsten oder vorherigen Beitragslink zu erfassen.Was filtern?
Nachdem Sie sich näher damit befasst haben, werden Sie feststellen, dass der
get_adjacent_post()
Quelllink einige schöne Filter für seine Ausgabe enthält (auch als Abfrageergebnis bekannt): (Filtername / Argumente)"get_{$adjacent}_post_join"
"get_{$adjacent}_post_where"
"get_{$adjacent}_post_sort"
Sie können also viel damit anfangen . Das beginnt mit dem Filtern der
WHERE
Klausel sowie derJOIN
ed-Tabelle und derORDER BY
Anweisung.Das Ergebnis wird für die aktuelle Anforderung im Arbeitsspeicher zwischengespeichert, sodass keine zusätzlichen Abfragen hinzugefügt werden, wenn Sie diese Funktion mehrmals auf einer einzelnen Seite aufrufen.
Automatische Abfrageerstellung
Wie @StephenHarris in den Kommentaren hervorhob , gibt es eine Kernfunktion, die sich beim Erstellen der SQL-Abfrage als nützlich erweisen könnte:
get_meta_sql()
- Beispiele im Codex . Grundsätzlich wird diese Funktion nur verwendet, um die Meta-SQL-Anweisung zu erstellen, in der sie verwendetWP_Query
wird. Sie können sie jedoch auch in diesem Fall (oder in anderen Fällen) verwenden. Das Argument, das Sie hineinwerfen, ist ein Array, genau dasselbe, das zu einem hinzufügen würdeWP_Query
.Der Rückgabewert ist ein Array:
So können Sie
$sql['join']
und$sql['where']
in Ihrem Rückruf nutzen.Abhängigkeiten im Hinterkopf behalten
In Ihrem Fall ist es am einfachsten, es in einem kleinen (mu) Plugin oder in der Datei functions.php Ihres Themes abzufangen und abhängig von der
$adjacent = $previous ? 'previous' : 'next';
Variablen und der$order = $previous ? 'DESC' : 'ASC';
Variablen zu ändern :Die tatsächlichen Filternamen
Die Filternamen lauten also:
get_previous_post_join
,get_next_post_join
get_previous_post_where
,get_next_post_where
get_previous_post_sort
,get_next_post_sort
Als Plugin eingepackt
... und der Filter-Callback wäre (zum Beispiel) so ähnlich wie der folgende:
quelle
get_meta_sql()
$meta_query
ist nur das Array, an das SieWP_Query
dasmeta_query
Argument übergeben würden: In diesem Beispiel:$meta_sql = get_meta_sql( $meta_query, 'post', $wpdb->posts, 'ID');
- wird der TeilJOIN
undWHERE
der Abfrage generiert, der hinzugefügt werden müsste.Kaisers Antwort ist großartig und gründlich, es reicht jedoch nicht aus, die ORDER BY-Klausel zu ändern, es sei denn, Sie
menu_order
stimmen mit Ihrer chronologischen Reihenfolge überein.Ich kann das nicht gutschreiben , aber ich habe den folgenden Code in dieser Übersicht gefunden :
Ich habe die Funktionsnamen für WP.SE geändert.
Wenn Sie nur die ORDER BY-Klausel ändern, sucht die Abfrage weiterhin nach Beiträgen, die größer oder kleiner als das aktuelle Beitragsdatum sind. Wenn Ihre Beiträge nicht chronologisch geordnet sind, erhalten Sie nicht den richtigen Beitrag.
Dadurch wird die where-Klausel geändert, um nach Posts zu suchen, bei denen menu_order größer oder kleiner als menu_order des aktuellen Posts ist. Außerdem wird die orderby-Klausel geändert.
Die orderby-Klausel sollte auch nicht hartcodiert sein, um DESC zu verwenden, da sie abhängig davon wechseln muss, ob Sie den nächsten oder den vorherigen Beitragslink erhalten.
quelle
WHERE
Klausel sucht'YYYY-mm-dd HH:mm:ss'
. Wenn das nicht erfüllt ist, wird es nicht funktionieren. Da der Wert nicht von der Datenbank, sondern von der Anwendung festgelegt wird, müssen Sie beim Erstellen des regulären Ausdrucks zuerst nach diesem Format suchen.Versuchte, ohne Erfolg einzuhaken. Könnte nur ein Problem meiner Konfiguration sein, aber für diejenigen, die den Hook nicht zum Laufen bringen können, ist hier die einfachste Lösung:
quelle
get_previous_post_where
,get_previous_post_join
undget_previous_post_sort
zu spielen schön mit benutzerdefinierten Post - Typen und komplexe Anordnung , die Meta - Schlüssel enthält, gab ich auf und verwendet diese. Vielen Dank!quelle
Basierend auf der Antwort von @Szabolcs Páll habe ich diese Utility-Klasse mit Hilfsmethoden erstellt, um Einträge nach Menüreihenfolge und Einträge nach Menüreihenfolge abzurufen . Ich habe außerdem Bedingungen hinzugefügt, um zu überprüfen, ob der aktuelle Beitrag der erste oder der letzte ist, um den letzten bzw. den ersten Beitrag zu erhalten.
Beispielsweise:
Die volle Klasse:
quelle
Ich finde dieses kleine Plugin sehr praktisch: http://wordpress.org/plugins/wp-query-powered-adjacent-post-link/
quelle
Das hat bei mir funktioniert:
Entnommen aus: https://stackoverflow.com/questions/16495117/how-to-skip-certain-links-on-adjacent-posts-in-wordpress
quelle
Ich habe einen viel einfacheren Weg gefunden, um eine Meta-Key-basierte Post-Navigation zu erreichen, ohne dass die functions.php geändert werden muss.
Mein Beispiel: Sie haben eine products.php und möchten zwischen Produkten wechseln. Das vorherige Produkt ist das nächstbilligere, das nächste Produkt das nächstteuerere.
Hier kommt meine Lösung für single.php :
quelle
query_posts
wenn der Codex angibt, dass es nicht verwendet werden sollte?WP_Query
sollte wie in den vorherigen Antworten verwendet werden.