Entendendo os internos
A ordem de "classificação" das postagens adjacentes (próximas / anteriores) não é realmente uma "ordem" de classificação. É uma consulta separada em cada solicitação / página, mas classifica a consulta pelo post_date
- ou pelo pai da postagem, se você tiver uma postagem hierárquica como objeto atualmente exibido.
Quando você examina as partes internas de next_post_link()
, vê que é basicamente um wrapper de API para adjacent_post_link()
. A função posterior chama get_adjacent_post()
internamente com o $previous
argumento / sinalizador definido bool(true|false)
para pegar o link de postagem seguinte ou anterior.
O que filtrar?
Depois de aprofundar o assunto, você verá que o get_adjacent_post()
link Origem possui alguns filtros interessantes para sua saída (também conhecido como resultado da consulta): (Nome / Argumentos do Filtro)
"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"`
Então você pode fazer muito com isso. Isso começa com a filtragem da WHERE
cláusula, bem como a JOIN
tabela ed e a ORDER BY
instrução
O resultado é armazenado em cache na memória para a solicitação atual, portanto, não adiciona consultas adicionais se você chamar essa função várias vezes em uma única página.
Construção de consulta automática
Como @StephenHarris apontou nos comentários, há uma função principal que pode ser útil ao criar a Consulta SQL: get_meta_sql()
- Exemplos no Codex . Basicamente, essa função é usada apenas para criar a instrução meta SQL usada WP_Query
, mas você pode usá-la neste caso (ou em outros) também. O argumento que você coloca nele é uma matriz, exatamente o mesmo que seria adicionado a a WP_Query
.
$meta_sql = get_meta_sql(
$meta_query,
'post',
$wpdb->posts,
'ID'
);
O valor de retorno é uma matriz:
$sql => (array) 'join' => array(),
(array) 'where' => array()
Então você pode usar $sql['join']
e $sql['where']
no seu retorno de chamada.
Dependências a serem lembradas
No seu caso, o mais fácil seria interceptá-lo em um pequeno plugin (mu) ou no arquivo functions.php do seu tema e alterá-lo dependendo da $adjacent = $previous ? 'previous' : 'next';
variável e da $order = $previous ? 'DESC' : 'ASC';
variável:
Os nomes reais do filtro
Portanto, os nomes dos filtros são:
get_previous_post_join
, get_next_post_join
get_previous_post_where
, get_next_post_where
get_previous_post_sort
, get_next_post_sort
Embrulhado como um plugin
... e o retorno de chamada do filtro seria (por exemplo) algo como o seguinte:
<?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' );