Lassen Sie get_adjacent_post() über benutzerdefinierte Posttypen hinweg funktionieren

Lesezeit: 3 Minuten

Benutzeravatar von enchance
verschönern

Verwenden get_adjacent_post, previous_post_linkund next_post_link scheint nur Artikel zu erkennen, die vom gleichen Beitragstyp sind. Da ich 2 benutzerdefinierte Beitragstypen habe, gibt es eine Möglichkeit, alle vorherigen und nächsten Beitragstypen zu verknüpfen?

Benutzeravatar von enchance
verschönern

Es scheint, dass diese Frage im gesamten Internet ohne eindeutige Antwort gestellt wurde. Also habe ich meine eigene Funktion aus dem Original erstellt get_adjacent_post und es für alle anderen angepasst, die es brauchen.

Die Funktion

Legen Sie dies in Ihrer functions.php ab

/*
 * 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;
}

Verwendungszweck

Grundlegende Verwendung

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

Zum Erstellen von Zurück/Weiter-Links

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

Sie können den Code noch ändern, wenn Sie die Variablen trotzdem einschließen möchten $in_same_cat und $excluded_categories aber wenn Sie dies tun, schlage ich vor, dass Sie verwenden get_adjacent_post stattdessen, da es dafür ist.

  • Sehr gut gemacht, danke! Wenn es auf einem beliebigen Seitentyp verwendet werden soll, kann man einfach einen dritten (oder eigentlich ersten) Parameter $post hinzufügen, um den benutzerdefinierten Beitragstyp direkt an die Funktion zu übergeben (vergessen Sie dann nicht, den globalen $post zu entfernen).

    – José Faber

    10. Januar 2013 um 14:28 Uhr


  • Benötigt ein Update, um Zeichenfolgen zu verarbeiten $post_type Variable: 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 { $post_types = "'".trim($post_types, "'")."'"; }

    – emv

    25. Juli 2014 um 18:40 Uhr


  • Wie können wir den Code ändern, damit er für Beiträge in derselben Kategorie funktioniert?

    – CyberJunkie

    26. November 2014 um 22:45 Uhr

  • Das ist Goldstaub

    – James Tudsbury

    10. November 2017 um 13:31 Uhr

  • Es ist schon eine Weile her, dass ich das gepostet habe. Kann jemand bestätigen, ob es funktioniert, damit ich es genehmigen kann? Ich arbeite nicht mehr mit PHP, also habe ich nicht die richtige env.

    – bereichern

    19. Dezember 2018 um 14:36 ​​Uhr

Benutzeravatar von martifenosa
martifenosa

Die vorherige Antwort funktioniert nicht mehr. Sieh dir das an

Ich habe mir eine neue ausgedacht, ganz einfach:

  • Fügen Sie dies in Ihre functions.php ein
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;
}

Wo immer Sie jetzt die Next-Prev-Post-ID benötigen, verwenden Sie einfach die Funktion wie folgt:

custom_posttype_get_adjacent_ID('prev', 'project', get_the_ID());

Kommentare:

  • Fühlen Sie sich frei, die zu ersetzen get_the_ID()für Ihre aktuelle Post-ID, wenn Sie Lust dazu haben.
  • Erste Parameter erwarten ‘next’ oder ‘prev’, es fällt auf ‘next’ zurück.
  • Der zweite Parameter muss der Name des benutzerdefinierten Beitragstyps sein. Sie finden es in Ihrem register_post_type()Funktion. Es fällt auf ‘post’ zurück.
  • Wenn der letzte Parameter leer ist, funktioniert es nicht.

Beispiele:

Wenn Sie den Permalink für den nächsten oder vorherigen Beitrag wünschen, können Sie ihn wie folgt verwenden:

<?php echo get_permalink(custom_posttype_get_adjacent_ID('prev', 'project', get_the_ID())); ?>

Also mit dem Tag würde es ungefähr so ​​aussehen:

<a href="https://stackoverflow.com/questions/10376891/<?php echo get_permalink(custom_posttype_get_adjacent_ID("prev', 'project', get_the_ID())); ?>">Previous Project</a>

Konnte es nicht viel testen, also wenn es in einigen Fällen nicht funktioniert, lass es mich wissen und ich werde versuchen, es zu beheben / zu verbessern.

1395170cookie-checkLassen Sie get_adjacent_post() über benutzerdefinierte Posttypen hinweg funktionieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy