获取下一个和上一个帖子通过WordPress中的自定义查询链接

时间:2016-11-27 17:33:40

标签: wordpress

我正在尝试通过自定义查询获取文章帖子页面(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来获取我的单个文章页面上的下一个和上一个帖子的链接。有什么想法吗?

2 个答案:

答案 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 po​​st对象的数组。

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多个帖子中都不需要这段代码。

希望您发现它有用!