Tengo una serie de publicaciones ordenadas por un valor meta_key. También se pueden organizar por orden de menú, si es necesario.
Los enlaces de publicación siguiente / anterior (generados por next_post_link
, previous_post_link
o posts_nav_link
todos navegan por cronología. Si bien entiendo este comportamiento predeterminado, no entiendo cómo cambiarlo. Descubrí que se asigna a adyacente_post_link en link-template.php, pero entonces comienza a parecer bastante codificado. ¿Se recomienda volver a escribir esto desde cero para reemplazarlo, o hay una mejor solución?
custom-post-types
post-meta
sort
next-post-link
previous-post-link
Jodi Warren
fuente
fuente
Respuestas:
Entendiendo lo interno
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 clasifica la consulta por
post_date
- o la publicación principal si tiene una publicación jerárquica como objeto visualizado actualmente.Cuando echas un vistazo a las partes internas de
next_post_link()
, entonces ves que es básicamente un contenedor API paraadjacent_post_link()
. La función posterior llamaget_adjacent_post()
internamente con el$previous
argumento / indicador configuradobool(true|false)
para tomar el enlace de publicación siguiente o anterior.¿Qué filtrar?
Después de profundizar en él, verá que el
get_adjacent_post()
enlace Fuente tiene algunos filtros agradables para su salida (también conocido como resultado de la consulta): (Nombre del filtro / Argumentos)"get_{$adjacent}_post_join"
"get_{$adjacent}_post_where"
"get_{$adjacent}_post_sort"
Entonces puedes hacer mucho con eso. Eso comienza con el filtrado de la
WHERE
cláusula, así como laJOIN
tabla ed y laORDER BY
declaración.El resultado se almacena en 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.
Consulta automática de construcción
Como @StephenHarris señaló en los comentarios, hay una función central que puede ser útil al crear la consulta SQL:
get_meta_sql()
- Ejemplos en Codex . Básicamente, esta función solo se usa para construir la instrucción meta SQL que se usaWP_Query
, pero también puede usarla en este caso (u otros). El argumento que arroja en él es una matriz, exactamente la misma que se agregaría a aWP_Query
.El valor de retorno es una matriz:
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 complemento (mu) o en su archivo de funciones themes.php y modificarlo según la
$adjacent = $previous ? 'previous' : 'next';
variable y la$order = $previous ? 'DESC' : 'ASC';
variable:Los nombres de filtro reales
Entonces los nombres de filtro 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 así como lo siguiente:
fuente
get_meta_sql()
$meta_query
es solo la matriz a la que pasaríaWP_Query
por elmeta_query
argumento: En este ejemplo:$meta_sql = get_meta_sql( $meta_query, 'post', $wpdb->posts, 'ID');
- esto genera la parteJOIN
y laWHERE
parte de la consulta que debería agregarse.La respuesta de Kaiser es impresionante y exhaustiva, sin embargo, solo cambiar la cláusula ORDER BY no es suficiente a menos que
menu_order
coincida con su orden cronológico.No puedo tomar crédito por esto, pero encontré el siguiente código en esta esencia :
He modificado los nombres de funciones para WP.SE.
Si solo cambia la cláusula ORDER BY, la consulta aún busca publicaciones mayores o menores que la fecha de publicación actual. Si sus publicaciones no están en orden cronológico, no obtendrá la publicación correcta.
Esto cambia la cláusula where para buscar publicaciones donde el menu_order es mayor o menor que el menú_order de la publicación actual, además de modificar la cláusula orderby.
La cláusula orderby tampoco debería estar codificada para usar DESC, ya que tendrá que cambiar en función de si está obteniendo el enlace de publicación siguiente o anterior.
fuente
WHERE
cláusula busca'YYYY-mm-dd HH:mm:ss'
. Si eso no se cumple, no funcionará. Como el DB no establece el valor, sino la Aplicación, primero deberá verificar ese formato al generar la expresión Regular.Intenté conectar sin éxito. Puede ser solo un problema de mi configuración, pero para aquellos que no pueden hacer que el gancho funcione, esta es la solución más simple:
fuente
get_previous_post_where
,get_previous_post_join
yget_previous_post_sort
de jugar bien con los tipos de publicaciones personalizadas y los pedidos complejos que incluyen meta teclas, me di por vencido y usé esto. ¡Gracias!fuente
Basado en la respuesta de @Szabolcs Páll, he creado esta clase de utilidad con métodos auxiliares para poder obtener publicaciones de tipo por orden de menú y obtener la publicación siguiente y anterior por orden de menú también. Además, agregué condiciones para verificar si la publicación actual es la primera o la última publicación para obtener la última o la primera publicación respectivamente.
Por ejemplo:
La clase completa:
fuente
Encuentro este pequeño complemento realmente útil: http://wordpress.org/plugins/wp-query-powered-adarest-post-link/
fuente
Esto funcionó para mí:
Tomado de: https://stackoverflow.com/questions/16495117/how-to-skip-certain-links-on-adarest-posts-in-wordpress
fuente
He encontrado una manera mucho más fácil de lograr una navegación de publicación basada en meta-clave, sin la necesidad de modificar functions.php.
Mi ejemplo: tienes un products.php y quieres cambiar entre productos. El producto anterior es el siguiente más barato, el siguiente producto es el siguiente más caro.
Aquí viene mi solución para single.php :
fuente
query_posts
cuando el códice establece que no debe usarse?WP_Query
debe usarse como en respuestas anteriores.