Comprensione degli interni
L'ordine di "ordinamento" dei post adiacenti (successivo / precedente) non è in realtà un "ordinamento" di ordinamento. È una query separata su ogni richiesta / pagina, ma ordina la query in base al post_date
- o al genitore post se si dispone di un post gerarchico come oggetto attualmente visualizzato.
Quando dai un'occhiata all'interno di next_post_link()
, allora vedi che è fondamentalmente un wrapper API per adjacent_post_link()
. La funzione successiva chiama get_adjacent_post()
internamente con l' $previous
argomento / flag impostato bool(true|false)
per afferrare il post successivo o precedente.
Cosa filtrare?
Dopo aver scavato più a fondo, vedrai che il get_adjacent_post()
link Sorgente ha alcuni filtri utili per il suo output (aka risultato della query): (Nome filtro / Argomenti)
"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"`
Quindi puoi fare molto con esso. Ciò inizia con il filtraggio della WHERE
clausola, nonché della JOIN
tabella ed e ORDER BY
dell'istruzione.
Il risultato viene memorizzato nella cache per la richiesta corrente, quindi non aggiunge ulteriori query se si chiama quella funzione più volte su una singola pagina.
Creazione automatica di query
Come sottolineato da @StephenHarris nei commenti, c'è una funzione principale che potrebbe tornare utile quando si crea la query SQL: get_meta_sql()
- Esempi in Codex . Fondamentalmente questa funzione viene utilizzata solo per creare l'istruzione meta SQL in cui viene utilizzata WP_Query
, ma è possibile utilizzarla anche in questo caso (o in altri). L'argomento che ci si lancia è un array, esattamente lo stesso che si aggiungerebbe a WP_Query
.
$meta_sql = get_meta_sql(
$meta_query,
'post',
$wpdb->posts,
'ID'
);
Il valore restituito è un array:
$sql => (array) 'join' => array(),
(array) 'where' => array()
Quindi puoi usare $sql['join']
e $sql['where']
nel tuo callback.
Dipendenze da tenere a mente
Nel tuo caso, la cosa più semplice sarebbe intercettarlo in un piccolo plugin (mu) o nel tuo file Functions.php di temi e modificarlo a seconda della $adjacent = $previous ? 'previous' : 'next';
variabile e della $order = $previous ? 'DESC' : 'ASC';
variabile:
I nomi dei filtri effettivi
Quindi i nomi dei filtri sono:
get_previous_post_join
, get_next_post_join
get_previous_post_where
, get_next_post_where
get_previous_post_sort
, get_next_post_sort
Avvolto come un plugin
... e il callback del filtro sarebbe (per esempio) qualcosa di simile al seguente:
<?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' );