mejorar
Usando get_adjacent_post
, previous_post_link
y next_post_link
solo parece reconocer elementos que son del mismo tipo de publicación. Dado que tengo 2 tipos de publicaciones personalizadas, ¿hay alguna forma de vincular todos los tipos de publicaciones anteriores y siguientes?
mejorar
Parece que esta pregunta se ha hecho en todo Internet sin una respuesta definitiva. Así que creé mi propia función a partir de la original. get_adjacent_post
y lo personalizamos para cualquier otra persona que lo necesite.
La función
Deja esto en tus funciones.php
/*
* Replacement for get_adjacent_post()
*
* This supports only the custom post types you identify and does not
* look at categories anymore. This allows you to go from one custom post type
* to another which was not possible with the default get_adjacent_post().
* Orig: wp-includes/link-template.php
*
* @param string $direction: Can be either 'prev' or 'next'
* @param multi $post_types: Can be a string or an array of strings
*/
function mod_get_adjacent_post($direction = 'prev', $post_types="post") {
global $post, $wpdb;
if(empty($post)) return NULL;
if(!$post_types) return NULL;
if(is_array($post_types)){
$txt="";
for($i = 0; $i <= count($post_types) - 1; $i++){
$txt .= "'".$post_types[$i]."'";
if($i != count($post_types) - 1) $txt .= ', ';
}
$post_types = $txt;
}
$current_post_date = $post->post_date;
$join = '';
$in_same_cat = FALSE;
$excluded_categories="";
$adjacent = $direction == 'prev' ? 'previous' : 'next';
$op = $direction == 'prev' ? '<' : '>';
$order = $direction == 'prev' ? 'DESC' : 'ASC';
$join = apply_filters( "get_{$adjacent}_post_join", $join, $in_same_cat, $excluded_categories );
$where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare("WHERE p.post_date $op %s AND p.post_type IN({$post_types}) AND p.post_status="publish"", $current_post_date), $in_same_cat, $excluded_categories );
$sort = apply_filters( "get_{$adjacent}_post_sort", "ORDER BY p.post_date $order LIMIT 1" );
$query = "SELECT p.* FROM $wpdb->posts AS p $join $where $sort";
$query_key = 'adjacent_post_' . md5($query);
$result = wp_cache_get($query_key, 'counts');
if ( false !== $result )
return $result;
$result = $wpdb->get_row("SELECT p.* FROM $wpdb->posts AS p $join $where $sort");
if ( null === $result )
$result="";
wp_cache_set($query_key, $result, 'counts');
return $result;
}
Uso
Uso básico
// Custom post types can be array() or string
$post1 = mod_get_adjacent_post('prev', array('post', 'custom1', 'custom2'));
$post2 = mod_get_adjacent_post('next', 'custom2');
Para crear enlaces anterior/siguiente
<?php
$prev = mod_get_adjacent_post('prev', array('post', 'custom1', 'custom2'));
$next = mod_get_adjacent_post('next', array('post', 'custom1', 'custom2'));
?>
<?php if($prev) : ?>
<a href="https://stackoverflow.com/questions/10376891/<?php echo get_permalink($prev->ID)?>">« Go back in time</a>
<?php endif; ?>
<?php if($next) : ?>
<a href="<?php echo get_permalink($next->ID)?>">Next: <?php echo $next->post_title; ?> »</a>
<?php endif; ?>
Todavía puede modificar el código si aún desea incluir las variables $in_same_cat
y $excluded_categories
pero si lo hace, le sugiero que use get_adjacent_post
en cambio, ya que para eso es.
-
¡Muy bien hecho, gracias! Si se va a usar en cualquier tipo de página, se puede agregar fácilmente un tercer (o en realidad, el primero) parámetro $post para pasar el tipo de publicación personalizada directamente a la función (no olvide eliminar el $post global entonces).
– José Fabro
10 de enero de 2013 a las 14:28
-
necesita una actualización para manejar la cadena
$post_type
variable: if(is_array($post_types)){ $txt = ”; for($i = 0; $i– emc
25/07/2014 a las 18:40
-
¿Cómo podemos modificar el código para que funcione para publicaciones en la misma categoría?
– CyberJunkie
26 de noviembre de 2014 a las 22:45
-
esto es polvo de oro
–James Tudsbury
10 de noviembre de 2017 a las 13:31
-
Ha pasado un tiempo desde que publiqué esto. ¿Alguien puede confirmar si funciona para poder aprobarlo? Ya no estoy trabajando con PHP, así que no tengo el env correcto.
– mejorar
19 de diciembre de 2018 a las 14:36
martifenosa
La respuesta anterior ya no funciona. mira este
Se me ocurrió uno nuevo, bastante más simple:
- Pegue esto en sus funciones.php
function custom_posttype_get_adjacent_ID($direction = 'next', $type="post", $current) {
// Get all posts with this custom post type
$posts = get_posts('posts_per_page=-1&order=DESC&post_type=".$type);
$postsLength = sizeof($posts)-1;
$currentIndex = 0;
$index = 0;
$result = 0;
// Iterate all posts in order to find the current one
foreach($posts as $p){
if($p->ID == $current) $currentIndex = $index;
$index++;
}
if($direction == "prev') {
// If it's 'prev' return the previous one unless it's the first one, in this case return the last.
$result = !$currentIndex ? $posts[$postsLength]->ID : $posts[$currentIndex - 1]->ID;
} else {
// If it's 'next' return the next one unless it's the last one, in this case return the first.
$result = $currentIndex == $postsLength ? $posts[0]->ID : $posts[$currentIndex + 1]->ID;
}
return $result;
}
Ahora, donde sea que necesite la ID de publicación siguiente-anterior, simplemente use la función como esta:
custom_posttype_get_adjacent_ID('prev', 'project', get_the_ID());
Comentarios:
- Siéntase libre de reemplazar el
get_the_ID()
para su ID de publicación actual si lo desea. - Los primeros parámetros esperan ser ‘siguiente’ o ‘anterior’, vuelve a ‘siguiente’.
- El segundo parámetro debe ser el nombre del tipo de publicación personalizada. Puedes encontrarlo en tu
register_post_type()
función. Vuelve a ‘post’. - Si el último parámetro está vacío, no funcionará.
Ejemplos:
Si desea el enlace permanente de la publicación siguiente o anterior, puede usarlo así:
<?php echo get_permalink(custom_posttype_get_adjacent_ID('prev', 'project', get_the_ID())); ?>
Así que con la etiqueta se vería así:
<a href="https://stackoverflow.com/questions/10376891/<?php echo get_permalink(custom_posttype_get_adjacent_ID("prev', 'project', get_the_ID())); ?>">Previous Project</a>
No pude probarlo mucho, así que si no funciona en algunos casos, házmelo saber e intentaré arreglarlo/mejorarlo.