我正在尝试通过自定义查询获取文章帖子页面(single.php)上的下一个和上一个帖子链接。我尝试使用previous_post_link()和next_post_link()函数,但他们按ID获取帖子。我的索引页面上有以下循环查询:
$args = array(
'post_type' => 'auction_dates',
'paged' => $paged,
'posts_per_page' => 1,
'meta_key' => 'date_of_auction',
'orderby' => 'meta_value_num',
'order' => 'ASC');
正如您所知,帖子按自定义字段'date_of_auction'排序,而不是ID。我想要使用该自定义字段而不是ID来获取我的单个文章页面上的下一个和上一个帖子的链接。有什么想法吗?
答案 0 :(得分:0)
您可以使用函数get_adjacent_post()
,此函数可用于检索下一个和上一个帖子对象。第三个参数必须设置为true才能检索前一个和false以用于下一个帖子。最后一个参数允许在选择和限制的分类中获得相邻的帖子。
$previous_adjacent_post = get_adjacent_post(true,'',true, 'product_cat');
$next_adjacent_post = get_adjacent_post(true,'',false, 'product_cat');
if(is_a($previous_adjacent_post, 'WP_Post')){
$previous_link = get_permalink($previous_adjacent_post->ID);
$previous_title = $previous_adjacent_post->post_title;
}
if(is_a($next_adjacent_post, 'WP_Post')){
$next_link = get_permalink($next_adjacent_post->ID);
$next_title = $next_adjacent_post->post_title;
}
在此示例中,is_a()
条件在没有找到响应时避免错误(尝试从响应为空或空时从字符串中获取对象)。
更多详细信息和示例get_adjacent_post()
您最终可以使用过滤器"get_{$adjacent}_post_where":
按自定义字段进行过滤。
编辑:
通过您添加的链接和说明,您似乎可以使用您使用的插件执行此操作:
in_same_meta
指示下一个/上一个帖子是否必须具有相同的内容 自定义字段值作为当前帖子。你必须传递的名称 自定义字段要匹配。例如,如果您有自定义字段 命名为“发布者”,您希望下一个/上一个链接指向 来自同一出版商的标题:
<?php next_post_link_plus( array('in_same_meta' => 'publisher') ); ?>
请注意,in_same_meta与自定义字段不兼容 排序。如果order_by设置为'custom'或'numeric', in_same_meta已禁用。
希望它有所帮助!
答案 1 :(得分:0)
previous_post_link()和next_post_link()必须在循环之内。但是后期单身呢?您打开一个帖子,即使使用全局查询对象,它也不会具有与您的帖子列表相同的查询数据-给您带来奇怪和/或循环的结果。
对于仍在寻找答案的任何人,我创建了一个简单的函数 get_adjacent_posts()(不要与get_adjacent_post()本机wordpress函数混淆),该函数总是可以上一个和下一个帖子,无论查询和功能的位置如何。
您需要做的就是提供查询args数组作为参数,它将返回一个包含上一个和下一个WP post对象的数组。
function get_adjacent_posts($args) {
global $post;
$all_posts = get_posts($args);
$len = count($all_posts);
$np = null;
$cp = $post;
$pp = null;
if ($len > 1) {
for ($i=0; $i < $len; $i++) {
if ($all_posts[$i]->ID === $cp->ID) {
if (array_key_exists($i-1, $all_posts)) {
$pp = $all_posts[$i-1];
} else {
$new_key = $len-1;
$pp = $all_posts[$new_key];
while ($pp->ID === $cp->ID) {
$new_key -= 1;
$pp = $all_posts[$new_key];
}
}
if (array_key_exists($i+1, $all_posts)) {
$np = $all_posts[$i+1];
} else {
$new_key = 0;
$np = $all_posts[$new_key];
while ($pp->ID === $cp->ID) {
$new_key += 1;
$np = $all_posts[$new_key];
}
}
break;
}
}
}
return array('next' => $np, 'prev' => $pp);
}
用法示例:
$args = array(
'post_type' => 'custom_post_type',
'posts_per_page' => -1,
'order' => 'ASC',
'orderby' => 'title'
);
$adjacent = get_adjacent_posts($args);
$next_title = $adjacent['next']->post_title;
$next_image = get_the_post_thumbnail_url($adjacent['next']->ID, 'square');
$next_url = get_permalink($adjacent['next']);
$prev_title = $adjacent['prev']->post_title;
$prev_image = get_the_post_thumbnail_url($adjacent['next']->ID, 'square');
$prev_url = get_permalink($adjacent['prev']);
警告::此功能耗费资源,因此,如果有很多帖子,请不要使用它。它从提供的查询中加载并迭代所有帖子,以查找下一个和上一个帖子(如您在代码中所见)。
有一个更好的方法可以直接对数据库进行调用,但是无论如何我都太懒了,而且我在100多个帖子中都不需要这段代码。
希望您发现它有用!