Entendiendo los aspectos internos
El orden de "clasificación" de las publicaciones adyacentes (siguiente / anterior) no es realmente un "orden de clasificación". Es una consulta separada en cada solicitud / página, pero ordena la consulta por el post_date
, o el padre de la publicación si tiene una publicación jerárquica como objeto actualmente mostrado.
Cuando echa un vistazo a las partes internas de next_post_link()
, verá que es básicamente un contenedor de API para < a href="http://queryposts.com/function/adjacent_post_link/"> adjacent_post_link()
. La función más reciente llama a get_adjacent_post()
internamente con el argumento / flag $previous
establecido en bool(true|false)
para capturar el siguiente o el anterior publicar enlace.
¿Qué filtrar?
Después de profundizar en él, verás que get_adjacent_post()
Enlace de origen tiene algunos filtros agradables para su salida (también conocido como resultado de la consulta): (Nombre / Argumentos del 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"'
Así que puedes hacer mucho con él. Esto comienza con el filtrado de la cláusula WHERE
, así como la tabla JOIN
ed y la declaración ORDER BY
.
El resultado se almacena en la memoria caché para la solicitud actual, por lo que no agrega consultas adicionales si llama a esa función varias veces en una sola página.
Creación automática de consultas
Como @StephenHarris en los comentarios, hay una función central que puede ser útil cuando construyendo la consulta SQL: get_meta_sql()
- Ejemplos en Codex . Básicamente, esta función solo se usa para generar la sentencia meta SQL que se usa en WP_Query
, pero también puede usarla en este caso (u otros). El argumento que le lanzas es una matriz, exactamente la misma que se agregaría a un WP_Query
.
$meta_sql = get_meta_sql(
$meta_query,
'post',
$wpdb->posts,
'ID'
);
El valor de retorno es una matriz:
$sql => (array) 'join' => array(),
(array) 'where' => array()
Para que pueda usar $sql['join']
y $sql['where']
en su devolución de llamada.
Dependencias a tener en cuenta
En su caso, lo más fácil sería interceptarlo en un pequeño plugin (mu) o en su archivo de funciones functions.php de temas y modificarlo según la variable $adjacent = $previous ? 'previous' : 'next';
y la variable $order = $previous ? 'DESC' : 'ASC';
:
Los nombres de filtro reales
Los nombres de los filtros son:
-
get_previous_post_join
, get_next_post_join
-
get_previous_post_where
, get_next_post_where
-
get_previous_post_sort
, get_next_post_sort
Envuelto como un complemento
... y la devolución de llamada del filtro sería (por ejemplo) algo como lo siguiente:
<?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' );