使用get_adjacent_post
,previous_post_link
和next_post_link
似乎只能识别具有相同帖子类型的项目。由于我有 2 种自定义帖子类型,有没有办法在所有上一个和下一个帖子类型之间进行链接?
问问题
10382 次
2 回答
26
似乎这个问题在整个互联网上都被问到了,但没有明确的答案。因此,我从原始函数创建了自己的函数,get_adjacent_post
并为其他需要它的人定制了它。
功能
把它放在你的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;
}
用法
基本用途
// 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');
用于创建上一个/下一个链接
<?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)?>">« 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; ?>
如果您仍想包含变量$in_same_cat
,您仍然可以修改代码,$excluded_categories
但如果您这样做了,那么我建议您改用get_adjacent_post
它,因为这就是它的用途。
于 2012-04-30T10:55:15.417 回答
2
以前的答案不再起作用。看看这个
我想出了一个新的,更简单:
- 将此粘贴到您的functions.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;
}
现在,无论您需要下一个帖子 ID,只要使用如下函数即可:
custom_posttype_get_adjacent_ID('prev', 'project', get_the_ID());
评论:
get_the_ID()
如果您愿意,请随意替换您当前的帖子 ID。- 第一个参数预计是“下一个”或“上一个”,它回落到“下一个”。
- 第二个参数需要是自定义帖子类型名称。你可以在你的
register_post_type()
函数中找到它。它回退到“发布”。 - 如果最后一个参数为空,它将不起作用。
例子:
如果您想要下一个或上一个帖子永久链接,您可以像这样使用它:
<?php echo get_permalink(custom_posttype_get_adjacent_ID('prev', 'project', get_the_ID())); ?>
所以使用标签它看起来像这样:
<a href="<?php echo get_permalink(custom_posttype_get_adjacent_ID('prev', 'project', get_the_ID())); ?>">Previous Project</a>
无法对其进行大量测试,因此如果在某些情况下无法正常工作,请告诉我,我会尝试修复/改进它。
于 2020-04-01T11:38:51.473 回答