Comprendre les internes
L'ordre de "tri" des articles adjacents (suivant / précédent) n'est pas vraiment un "ordre" de tri. Il s'agit d'une requête distincte sur chaque demande / page, mais elle trie la requête par le post_date
- ou le parent du post si vous avez un post hiérarchique comme objet actuellement affiché.
Lorsque vous jetez un œil aux composants internes de next_post_link()
, vous voyez que c'est essentiellement un wrapper API pour adjacent_post_link()
. La dernière fonction appelle en get_adjacent_post()
interne avec l' $previous
argument / indicateur défini sur bool(true|false)
pour saisir le lien de publication suivant ou précédent.
Que filtrer?
Après avoir creusé plus profondément, vous verrez que le get_adjacent_post()
lien source a de bons filtres pour sa sortie (alias résultat de la requête): (Nom du filtre / Arguments)
"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"`
Vous pouvez donc en faire beaucoup . Cela commence par filtrer la WHERE
clause, ainsi que la JOIN
table ed et l' ORDER BY
instruction.
Le résultat est mis en cache en mémoire pour la demande actuelle, il n'ajoute donc pas de requêtes supplémentaires si vous appelez cette fonction plusieurs fois sur une seule page.
Création automatique de requêtes
Comme @StephenHarris l'a souligné dans les commentaires, il existe une fonction de base qui pourrait être utile lors de la construction de la requête SQL: get_meta_sql()
- Exemples dans Codex . Fondamentalement, cette fonction est juste utilisée pour construire l'instruction meta SQL qui est utilisée dans WP_Query
, mais vous pouvez également l'utiliser dans ce cas (ou dans d'autres). L'argument que vous y jetez est un tableau, exactement le même que celui qui ajouterait à a WP_Query
.
$meta_sql = get_meta_sql(
$meta_query,
'post',
$wpdb->posts,
'ID'
);
La valeur de retour est un tableau:
$sql => (array) 'join' => array(),
(array) 'where' => array()
Vous pouvez donc utiliser $sql['join']
et $sql['where']
dans votre rappel.
Dépendances à garder à l'esprit
Dans votre cas, le plus simple serait de l'intercepter dans un petit plugin (mu) ou dans votre fichier themes functions.php et de le modifier en fonction de la $adjacent = $previous ? 'previous' : 'next';
variable et de la $order = $previous ? 'DESC' : 'ASC';
variable:
Les noms de filtre réels
Les noms des filtres sont donc:
get_previous_post_join
, get_next_post_join
get_previous_post_where
, get_next_post_where
get_previous_post_sort
, get_next_post_sort
Enveloppé comme un plugin
... et le rappel du filtre serait (par exemple) quelque chose comme ceci:
<?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' );