2012-04-29 15 views

risposta

23

Sembra che questa domanda sia stata fatta in tutto il sito internet senza una risposta precisa. Così ho creato la mia funzione dall'originale get_adjacent_post e personalizzata per chiunque altro ne avesse bisogno.

La funzione

Goccia questo nella vostra functions.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 di base

// 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'); 

Per la creazione di prev/seguente link

<?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="<?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; ?> 

È ancora possibile modificare il codice se si vuole ancora per includere le variabili $in_same_cat e $excluded_categories, ma se lo fai, allora vi consiglio di utilizzare get_adjacent_post invece dato che è quello che serve.

+0

Molto ben fatto, grazie! Se da utilizzare su qualsiasi tipo di pagina, si può facilmente aggiungere un terzo (o addirittura, primo) parametro $ post per passare il tipo di post personalizzato direttamente alla funzione (non dimenticare di rimuovere il post $ globale quindi). – JosFabre

+1

ha bisogno di un aggiornamento per gestire la variabile '$ post_type' stringa: 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; } else { \t $ post_types = "'" .trim ($ post_types, "'"). "'"; } – emc

+0

come possiamo modificare il codice per lavorare per i post nella stessa categoria? – CyberJunkie

Problemi correlati