Enlace al siguiente y anterior post SOLO dentro de la categoría
Estoy usando la función next_post_link de WordPress para mostrar enlaces de navegación al "siguiente post en la misma categoría". Todo bien con esto... el problema que tengo es que cuando estoy en el "último" post de una categoría, el enlace "SIGUIENTE" aparece de todos modos y hace lo que no quiero: enlaza al primer post de una categoría diferente. Lo mismo ocurre con el primer post de una categoría, cuando navegamos por el primer post de una categoría, el enlace "ANTERIOR" aparece enlazando al post anterior de otra categoría diferente... Me gustaría que en el primer y último post, estos enlaces no se muestren.
<div id="nav-above" class="navigation">
<div class="nav-previous"><?php previous_post_linknext_post_link( '%link', '<span class="meta-nav">' .
_x( '◄ Anterior', 'Enlace al post anterior','category' ,TRUE ) . '</span>' ); ?></div>
<div class="nav-next"><?php next_post_link( '%link', '<span class="meta-nav">' . _x( 'Siguiente ► ', 'Enlace al siguiente post', 'category',TRUE ) . '</span>' ); ?> </div>
</div><!-- #nav-above -->
http://codex.wordpress.org/Function_Reference/next_post_link

Puedes hacer esto usando previous_post_link()
y next_post_link()
.
Estas funciones crearán los enlaces por ti, y deberías poder eliminar toda la lógica que estás usando para la paginación.
Como deseas enlazar solo a publicaciones de la misma categoría, debes usar las funciones con los siguientes parámetros:
previous_post_link('« %link', '%title', true);
next_post_link('%link »', '%title', true);
Actualización
En respuesta a tu pregunta actualizada con respecto al problema de los enlaces anterior/siguiente cuando son la primera/última publicación, por favor revisa esta línea del Codex tanto para previous_post_link()
como para next_post_link()
en relación con el parámetro $in_same_term
:
Indica si la siguiente publicación debe estar dentro del mismo término de taxonomía que la publicación actual. Si se establece en 'true', solo se mostrarán publicaciones del mismo término de taxonomía. Si la publicación está tanto en la categoría padre como en la subcategoría, o en más de un término, el enlace de la siguiente publicación llevará a la siguiente publicación en cualquiera de esos términos.
Con esto en mente, sospecho que tus primeras/últimas publicaciones pueden estar asociadas con más de una categoría. Si ese es el caso, el filtro wp_get_object_terms
podría ayudarte.
En tu pregunta original (antes de la edición) solo estabas buscando publicaciones en la primera categoría, así que aplicaré esa lógica aquí:
<?php add_filter('wp_get_object_terms', 'my_custom_post_navigation', 4, 99); ?>
<div id="nav-above" class="navigation">
<div class="nav-previous">
<?php previous_post_link( '<span class="meta-nav"> %link </span>', _x( '◄ Anterior', 'Enlace a publicación anterior', 'category') , TRUE ); ?>
</div>
<div class="nav-previous">
<?php next_post_link( '<span class="meta-nav"> %link </span>', _x( 'Siguiente ►', 'Enlace a siguiente publicación', 'category') , TRUE ); ?>
</div>
</div><!-- #nav-above -->
<?php remove_filter('wp_get_object_terms', 'my_custom_post_navigation', 99); ?>
Además de lo anterior, debes colocar esto en tu archivo functions.php:
/**
* Devuelve solo la primera categoría al mostrar los enlaces de publicación anterior/siguiente
*/
function my_custom_post_navigation($terms, $object_ids, $taxonomies, $args){
return array_slice($terms, 0, 1);
}

Hola David, gracias por tu respuesta. He hecho una nueva pregunta mejor formulada, me encantaría escuchar tu opinión: http://wordpress.stackexchange.com/questions/178800/next-post-link-only-within-category

No deberías hacer una nueva pregunta, ya que básicamente es una extensión de esta. Si el código que proporcioné no es correcto, podemos discutirlo aquí, en los comentarios. Y si es necesario, puedes editar tu pregunta para incluir información actualizada.

Pregunta actualizada... gracias por aclarar cómo usar esto correctamente.

la publicación que muestra la función no está en la misma categoría que la publicación que se está viendo... estoy usando el tema twentyten... estoy realmente confundido. ¿hay alguna manera de hacer con PHP para verificar si es la última publicación de una categoría y mostrar un CSS que oculte el enlace "siguiente"... y lo mismo con el enlace "anterior"... suena un poco como un hack... ¿alguna idea? gracias por tu ayuda, estoy aprendiendo mucho.

@dmtnexer - Mira la otra actualización que he publicado y dime si eso ayuda. El comportamiento predeterminado es que el enlace no se muestre si no hay nada a lo que enlazar, por lo que el hecho de que esté enlazando sugiere que debe haber alguna conexión entre esas categorías. En un mundo ideal, $in_same_term
te permitiría pasar un ID/slug de término para enlazar solo a ese y evitar que tengamos que usar los filtros, pero lamentablemente no lo hace.

Querido David, ¡¡¡FUNCIONA!!!!! ¡Gracias! Necesito entender estos filtros... ¿alguna sugerencia sobre dónde puedo encontrar detalles sobre este tipo de filtro?

@dmtnexer - Revisa la página de referencia de filtros. Enumera la mayoría de los filtros disponibles y si el título está en azul significa que hay más información sobre él (rojo está vacío). También deberías consultar la página de referencia de acciones y asegurarte de entender la diferencia entre ambos. Si no estás seguro de si hay una acción/filtro disponible, adéntrate en los archivos principales y mira el código, solo ten cuidado de no alterar el núcleo :)

@dmtnexer - Ah, y si estás satisfecho con mi respuesta, por favor márcalo como aceptada.

Me encantaría, pero mi reputación está por debajo de 15. ¡Gracias por las sugerencias, las revisaré!

@dmtnexer - Eso es para votar. Sería un poco inútil tener un sitio de preguntas y respuestas en el que nadie pudiera aceptar respuestas...

la interfaz de usuario debería mejorarse, no pude encontrar el ícono de aceptar hasta que lo busqué en Google :) gracias

Si necesitas restringir los enlaces de publicación anterior o siguiente para una taxonomía personalizada o término específico, tipo de entrada personalizada, campo personalizado o formato, entonces deberías probar Ambrosite Next/Previous Post Link Plus. Este plugin crea dos nuevas etiquetas de plantilla — next_post_link_plus y previous_post_link_plus — que son versiones mejoradas de las etiquetas de plantilla principales de WordPress next_post_link y previous_post_link.
- Ordenar los enlaces de publicación siguiente/anterior en columnas distintas a post_date (ej. alfabéticamente).
- Ordenar los enlaces siguiente/anterior en campos personalizados (se admiten ordenaciones tanto de cadenas como de enteros).
- Compatibilidad completa con WordPress 3.3, incluyendo soporte para tipos de entrada personalizados, taxonomías personalizadas y formatos de entrada.
- Volver al principio del bucle si no hay una publicación siguiente (y viceversa). Recuperar la primera/última publicación, en lugar de la anterior/siguiente (para enlaces de navegación Primera|Anterior|Siguiente|Última).
- Mostrar miniaturas de las publicaciones junto a los enlaces (WordPress 2.9 o superior).
- Truncar los títulos de los enlaces a cualquier longitud y mostrar texto personalizado en el tooltip.
- Mostrar el título, fecha, autor, categoría y valor meta de los enlaces siguiente/anterior.
- Especificar un formato de fecha personalizado para la variable %date.
- Restringir los enlaces siguiente/anterior a la misma categoría, taxonomía, formato, autor, valor de campo personalizado, lista de IDs de entradas personalizadas o lista de categorías personalizadas.
- Excluir categorías, taxonomías personalizadas, formatos de entrada o IDs de entradas individuales.
- Tres métodos de exclusión de categorías para un mayor control sobre el flujo de navegación.
- Devolver múltiples enlaces siguiente/anterior (ej. los siguientes N enlaces, en una lista HTML).
- Devolver el ID, título, fecha, atributo href u objeto de entrada de los enlaces siguiente/anterior, en lugar de mostrarlos en pantalla.
- Devolver false si no se encuentra un enlace siguiente/anterior, para que los temas puedan mostrar texto alternativo condicionalmente.
- Funciona con Post Types Order y otros populares plugins de reordenamiento de entradas.

Copia la página single.php de tu tema Padre y pégalo en el directorio de tu Child-theme. Abre el archivo single.php del directorio del child-theme y agrega el siguiente código al final del archivo [antes de get_footer(); ]
<?php
$post_id = $post->ID; // Obtener el ID del post actual
$cat = get_the_category();
$current_cat_id = $cat[0]->cat_ID; // Obtener el ID de la categoría actual
$args = array('category'=>$current_cat_id,'orderby'=>'post_date','order'=> 'DESC');
$posts = get_posts($args);
// Obtener IDs de los posts recuperados por la función get_posts
$ids = array();
foreach ($posts as $thepost) {
$ids[] = $thepost->ID;
}
// Obtener y mostrar los enlaces de Anterior y Siguiente post dentro de la misma categoría
$index = array_search($post->ID, $ids);
$prev_post = $ids[$index+1];
$next_post = $ids[$index-1];
?>
<?php if (!empty($prev_post)){ ?> <a class="previous-post" rel="prev" href="<?php echo get_permalink($prev_post) ?>"> <span class="meta-icon"><i class="fa fa-angle-left fa-lg"></i></span> Anterior</a> <?php } ?>
<?php if (!empty($next_post)){ ?> <a class="next-post" rel="next" href="<?php echo get_permalink($next_post) ?>">Siguiente <span class="meta-icon"><i class="fa fa-angle-right fa-lg"></i></span> </a> <?php } ?>
Después de agregar este código, pega el siguiente código en el archivo Style.css de tu child-theme para dar estilo a los enlaces:
a.previous-post, a.next-post {
color: #fff;
background-color: #4498e7;
text-align: center;
height: 34px;
line-height: 34px;
font-size: 14px;
border: 1px solid;
padding: 0 20px;
margin-bottom: 30px;
text-transform: uppercase;
border-radius: 4px;
font-weight: bold;
}
a.previous-post:hover, a.next-post:hover {
color: #4498e7;
background-color: #fff;
}
a.previous-post {
float: left !important;
}
a.next-post {
float: right !important;
}
Cuéntame los resultados :)
