wordpress进阶教程(三十三):获取当前文章的前几篇文章和后几篇文章

本站中的教程都是成系列的文章,所以为了提高用户体验,我在每篇教程的后面列出当前文章的前3篇文章和后3篇文章,这个可以当成是相关文章吧。

代码乃是我参考wp自带的get_adjacent_post函数修改而来,get_adjacent_post函数是wordpress用来获取上一篇和下一篇文章的基本函数。哎呀文采不好就不废话了函数代码:

函数作用:获取当前文章同分类下的前几篇文章和后几篇文章

参数:$previous为true时获取之前的文章,为false的时候获取之后的文章

$number为获取文章数量

  1. //author:www.ashuwp.com   
  2. function ashu_get_adjacent_posts( $previous = true, $number = 1 ) {   
  3.   
  4.     //global当前文章变量 $post 和数据库操作类wpdb   
  5.     global $post$wpdb;   
  6.     if ( empty$post ) )   
  7.         return null;   
  8.   
  9.     $current_post_date = $post->post_date;//当前文章的时间   
  10.   
  11.     $join = '';   
  12.     $posts_in_ex_cats_sql = '';   
  13.     //加入表   
  14.     $join = " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id";   
  15.     //获取当前文章所属分类,可以同属多个分类,如果是自定义的分类法,将category换成对应的分类法即可   
  16.     $cat_array = wp_get_object_terms($post->ID, 'level', array('fields' => 'ids'));   
  17.     $join .= " AND tt.taxonomy = 'level' AND tt.term_id IN (" . implode(',', $cat_array) . ")";   
  18.   
  19.     //判断时间是大于还是小雨   
  20.     $op = $previous ? '<' : '>';   
  21.     //排序   
  22.     $order = $previous ? 'DESC' : 'ASC';   
  23.        
  24.     $where = $wpdb->prepare("WHERE p.post_date $op %s AND p.post_type = %s AND p.post_status = 'publish' "$current_post_date$post->post_type);   
  25.     $sort  = "ORDER BY p.post_date $order LIMIT 0, $number";   
  26.   
  27.     $query = "SELECT p.* FROM $wpdb->posts AS p $join $where $sort";   
  28.     $query_key = 'adjacent_post_' . md5($query);   
  29.     $result = wp_cache_get($query_key, 'counts');   
  30.     if ( false !== $result )   
  31.         return $result;   
  32.   
  33.     $result = $wpdb->get_results("SELECT p.* FROM $wpdb->posts AS p $join $where $sort");   
  34.     if ( null === $result )   
  35.         $result = '';   
  36.     wp_cache_set($query_key$result, 'counts');   
  37.     return $result;   
  38. }  

将该函数放在主题的functions.php文件中即可,调用该函数的时候会返回一个数组,使用示例:

  1. <h4>本篇教程之前的几篇教程是</h4>   
  2.             <ul>   
  3.             <?php   
  4.             $preposts = ashu_get_adjacent_posts(true,3);   
  5.             foreach$preposts as $postt ){   
  6.                 echo '<li><a href="'.get_permalink($postt->ID).'" title="'.$postt->post_title .'">'.$postt->post_title .'</a></li>';   
  7.             };   
  8.             ?>   
  9.             </ul>   
  10.             <h4>本篇教程之后的几篇教程是</h4>   
  11.             <ul>   
  12.             <?php   
  13.             $nextposts = ashu_get_adjacent_posts(false,3);   
  14.             foreach$nextposts as $postt ){   
  15.                 echo '<li><a href="'.get_permalink($postt->ID).'" title="'.$postt->post_title .'">'.$postt->post_title .'</a></li>';   
  16.             };   
  17.             ?>   
  18.             </ul>  

效果预览:

relate

已有19条评论

  1. 西木
    西木 : 回复

    $join .= ” AND tt.taxonomy = ‘level’ AND tt.term_id IN (” . implode(‘,’, $cat_array) . “)”;
    这一行报错 implode(): Invalid arguments passed 请问是什么问题?
    找了很多没有研究明白

    • 阿树工作室
      阿树工作室 回复西木: 回复

      意思是那一行 implode()函数里面的参数错误,imploade函数是把数组组合为字符串,第二个参数$cat_array必须是数组,所以检查一下前一行 $cat_array赋值有没有错。

  2. 好犀利
    好犀利 : 回复

    跟3楼的问题一样.但是不会解决

  3. 淡淡的忧伤
    淡淡的忧伤 : 回复

    请教楼主,不报错,就是内容调不出来。。。

  4. 邓永祥
    邓永祥 : 回复

    我想要获取当前文章上一篇下一篇拥有相同自定义字段的文章该怎么做

  5. odayou
    odayou : 回复

    ashu,

    直接报implode(): Invalid arguments passed 

    说明$cat_array = get_the_terms($post->ID, ‘level’, array(‘fields’ => ‘ids’));得到的是空内容。我是自定义文章类型,请问有什么需要注意的?

    • odayou
      odayou 回复odayou: 回复

      啊哈 ,阿树 实在不好意思误会了,你的没问题。我粗心了 

      改进下

       function ashu_get_adjacent_posts( $previous = true, $number = 1 ,$taxonomy = 'post' ) 
      
      
      
      
      
       $join .= " AND tt.taxonomy = '$taxonomy' AND tt.term_id IN (" . implode(',', $cat_array) . ")";

      调用时第三个参数传入指定的

      taxonomy
    • odayou
      odayou 回复odayou: 回复

      补充下: 我的分类product taxonomy是products 所以我用这样定义 $cat_array = get_the_terms($post->ID, $taxonomy, array(‘fields’ => ‘ids’)); 传入的是products 。

      var_dump($cat_array)结果如下

      array (size=1) 8 => object(stdClass)[2381] public 'term_id' => int8 public 'name' => string'mobile' (length=6) public 'slug' => string'mobile' (length=6) public 'term_group' => int0 public 'term_taxonomy_id' => int9 public 'taxonomy' => string'products' (length=8) public 'description' => string'' (length=0) public 'parent' => int0 public 'count' => int5 public 'object_id' => int58 public 'filter' => string'raw' (length=3)

      而且你用wp_get_object_terms或取出来也是数组,所以你用implode(‘,’, $cat_array)是不是有问题呀

      • 阿树工作室
        阿树工作室 回复odayou: 回复

        get_the_terms函数不是这么用的,,请自己去搜索get_the_terms函数。。

        我用的wp_get_object_terms的第三个数组参数中feilds=ids意思就是获取的分类只返回ID,仅仅是一个一维数组。

        用implode无问题

        • odayou
          odayou 回复阿树工作室: 回复

          嗯,对的 我用那个函数只是有人说他是从缓存取内容,是没有问题。后来我根据自己的理解写完竟然和你一样,话说你的博客真给力~!

  6. vEk
    vEk : 回复

    提示  $join .= ” AND tt.taxonomy = ‘level’ AND tt.term_id IN (” . implode(‘,’, $cat_array) . “)”;   这行错误 不知道哪里出错了

    • 阿树工作室
      阿树工作室 回复vEk: 回复

      报什么错。。

  7. 问题
    问题 : 回复

    用了几次都不行,调用不显示,不知道代码什么地方出问题了….楼主测试兼容性没有?

  8. 哈哈
    哈哈 : 回复

    刚才我去试了试。。。对于自定义文章类型,这代码没有效果。。。

    • 阿树工作室
      阿树工作室 回复哈哈: 回复

      请自己检查问题。。你现在所在的教程页面就是自定义文章类型。

  9. 哈哈
    哈哈 : 回复

    好厉害!!!另外这个代码可以用在自定义文章类型里吗?因为之前创建过自定义文章类型,用wp自带的上一篇下一篇竟然是无效的。

  10. 暗淡的黑
    暗淡的黑 : 回复

    使用之后提示代码错误,function ashu_get_adjacent_posts( $previous = true, $number = 1 ) { 第一行错误。

    • 阿树工作室
      阿树工作室 回复暗淡的黑: 回复

      在代码中搜索 empty,也就是本页面第一段代码的第6行,有个emptyempty,这里只需要一个empty。

      本页面代码已修改

      • 暗淡的黑
        暗淡的黑 回复阿树工作室: 回复

        这么晚了还没睡。。。刚躺下床手机收到邮件。赶明儿测试下,谢谢回复。

发表评论