Verwenden get_adjacent_post
, previous_post_link
und 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?
Lassen Sie get_adjacent_post() über benutzerdefinierte Posttypen hinweg funktionieren
verschönern
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)?>">« 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; ?>
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
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.