Hacer que get_adjacent_post() funcione en tipos de publicaciones personalizadas

3 minutos de lectura

avatar de usuario
mejorar

Usando get_adjacent_post, previous_post_linky 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?

avatar de usuario
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)?>">&laquo; Go back in time</a>
<?php endif; ?>

<?php if($next) : ?>
    <a href="<?php echo get_permalink($next->ID)?>">Next: <?php echo $next->post_title; ?> &raquo;</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

avatar de usuario
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.

¿Ha sido útil esta solución?