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 handelt adjacent_post_link()
. Die spätere Funktion ruft get_adjacent_post()
intern mit dem $previous
Argument / Flag auf, das gesetzt ist bool(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"
$join
// Only if `$in_same_cat`
// or: ! empty( $excluded_categories`
// and then:
// " INNER JOIN $wpdb->term_relationships AS tr
// ON p.ID = tr.object_id
// INNER JOIN $wpdb->term_taxonomy tt
// ON tr.term_taxonomy_id = tt.term_taxonomy_id";
// and if $in_same_cat then it APPENDS:
// " AND tt.taxonomy = 'category'
// AND tt.term_id IN (" . implode(',', $cat_array) . ")";
$in_same_cat
$excluded_categories
"get_{$adjacent}_post_where"
$wpdb->prepare(
// $op = $previous ? '<' : '>'; | $current_post_date
"WHERE p.post_date $op %s "
// $post->post_type
."AND p.post_type = %s "
// $posts_in_ex_cats_sql = " AND tt.taxonomy = 'category'
// AND tt.term_id NOT IN (" . implode($excluded_categories, ',') . ')';
// OR empty string if $in_same_cat || ! empty( $excluded_categories
."AND p.post_status = 'publish' $posts_in_ex_cats_sql "
",
$current_post_date,
$post->post_type
)
$in_same_cat
$excluded_categories
"get_{$adjacent}_post_sort"
"ORDER BY p.post_date $order LIMIT 1"`
Sie können also viel damit anfangen . Das beginnt mit dem Filtern der WHERE
Klausel sowie der JOIN
ed-Tabelle und der ORDER 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 verwendet WP_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ürde WP_Query
.
$meta_sql = get_meta_sql(
$meta_query,
'post',
$wpdb->posts,
'ID'
);
Der Rückgabewert ist ein Array:
$sql => (array) 'join' => array(),
(array) 'where' => 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:
<?php
/** Plugin Name: (#73190) Alter adjacent post link sort order */
function wpse73190_adjacent_post_sort( $orderby )
{
return "ORDER BY p.menu_order DESC LIMIT 1";
}
add_filter( 'get_previous_post_sort', 'wpse73190_adjacent_post_sort' );
add_filter( 'get_next_post_sort', 'wpse73190_adjacent_post_sort' );