添加相关文章(非插件)

曾经在安装插件中介绍过一款水煮鱼发布的 WordPress Related Posts 插件。这个插件能够抓取中文 tags 形成关联文章,还是很不错的。但是后来我采用了无觅的关联插件,效果更好,还能在无觅网络中找到相关文章。所以虽然右下角有无觅的链接也无可厚非。不过,也不知道为什么,我还是觉得如果能用代码实现只属于网站内部的关联文章整体性更强一些,而且无觅转出的链接地址很长,跳转速度也不快。正好,昨天我看到了土木坛子的这篇博文优化独立博客提高访问速度,于是也下决心把版面改一改:去掉了作者信息(尊重的人不需要提醒,不尊重的人提醒也没用);去掉了单行的谷歌广告,把条幅广告移到文末;增加代码实现的相关文章5篇和最受欢迎文章5篇(利用 WP-PostViews Plus 插件实现,参考显示文章浏览数)。至此,又砍掉一个插件。

由于我不用 tag,所以水煮鱼的插件都显示的是随机文章。后来找到过一个以 category 关联的代码,但是加上以后评论和文章会出现错乱(A文章下的评论是属于B文章的)。最后还好找到 Willin 大师的 A9 主題的特色(失效),终于搞定。效果如下:

相关文章
相关文章

这段代码有两个特征(引用自 Willin):

  1. 先取每個 tags 的文章, 當 tags 文章數量不足, 再取 category 補足.
  2. 使用 $post 暫存, 代碼放在網頁任何地方都不會搞亂 $post 順序.

所以可以说通用了。即使不用 tag 也照样能用这段代码,只是不用 tag 的关联文章都是默认显示最新的,即如果用 category 显示关联文章,那么就是显示此 category 下最近的几篇文章。结合我的主题,代码修改如下:

<div style="margin:10px 0 0; padding:0 0 35px; font-style: normal; background-color: #fff; border-top: 1px solid #eee;">
<h3 style="padding-bottom:5px;">Related Posts</h3>
<?php
$post_num = 5; // 數量設定.
global $post;
$tmp_post = $post;
$tags = ''; $i = 0; // 先取 tags 文章.
$exclude_id = $post->ID;
$posttags = get_the_tags();
if ( $posttags ) {
foreach ( $posttags as $tag ) $tags .= $tag->name . ',';
$tags = strtr(rtrim($tags, ','), ' ', '-');
$myposts = get_posts('numberposts='.$post_num.'&tag='.$tags.'&exclude='.$exclude_id);
foreach($myposts as $post) {
setup_postdata($post);
?>
<li><a href="<?php the_permalink(); ?>" target="_blank" title="<?php the_title(); ?>"><?php the_title(); ?></a> - <?php comments_number(); ?></li>
<?php
$exclude_id .= ','.$post->ID; $i ++;
}
}
if ( $i < $post_num ) { // 當 tags 文章數量不足, 再取 category 補足.
$post = $tmp_post; setup_postdata($post);
$cats = ''; $post_num -= $i;
foreach ( get_the_category() as $cat ) $cats .= $cat->cat_ID . ',';
$cats = strtr(rtrim($cats, ','), ' ', '-');
$myposts = get_posts('numberposts='.$post_num.'&category='.$cats.'&exclude='.$exclude_id);
foreach($myposts as $post) {
setup_postdata($post);
?>
<li><a href="<?php the_permalink(); ?>" target="_blank" title="<?php the_title(); ?>"><?php the_title(); ?></a> - <?php comments_number(); ?></li>
<?php
$i ++;
}
}
if ( $i == 0 ) echo '<li>No Related Posts</li>';
$post = $tmp_post; setup_postdata($post);
?>
</div>

<div style="padding:0; font-style: normal; background-color: #fff; border-top: 1px solid #eee;">
 <h3 style="padding-bottom:5px;">Most Viewed Posts</h3>
 <?php if (function_exists('get_most_viewed')): ?>
 <?php get_most_viewed('post',5); ?>
 <?php endif; ?></div>