2010年11月29日 157条评论

willin相关文章代码修正

一个月前,应该是吧,记不清了,a.shun 就跟我说过 willin 的相关代码有问题,老是出现当前文章本身,因为忙我就一直没去分析代码。

直到昨晚,我在回复评论时看到自己博客的相关文章才突然想起,于是分析了代码一下,a.shun 所说的问题很容易解决,就是去掉下面 willin 相关文章代码里面第 5 行的注释即可——即去掉前面的 2 条斜杠。

如下面 willin 相关文章原代码(提取自 A9 主题),把下面的 //$exclude_id = $post->ID; // 單獨使用要開此行 改为 $exclude_id = $post->ID; // 單獨使用要開此行

<h3>Related Posts</h3>
<ul>
<?php
$post_num = 5; // 數量設定.
//$exclude_id = $post->ID; // 單獨使用要開此行
$posttags = get_the_tags(); $i = 0;
if ( $posttags ) { $tags = ''; foreach ( $posttags as $tag ) $tags .= $tag->name . ',';
$args = array(
	'post_status' => 'publish',
	'tag_slug__in' => explode(',', $tags), // 只選 tags 的文章.
	'post__not_in' => explode(',', $exclude_id), // 排除已出現過的文章.
	'caller_get_posts' => 1, // 排除置頂文章.
	'orderby' => 'comment_date', // 依評論日期排序.
	'posts_per_page' => $post_num
);
query_posts($args); // query_posts() since 2.0.0 /wp-includes/classes.php
 while( have_posts() ) { the_post(); ?>
    <li>&#9829; <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php
    $exclude_id .= ',' . $post->ID; $i ++;
 } wp_reset_query();
}
if ( $i < $post_num ) { // 當 tags 文章數量不足, 再取 category 補足.
$cats = ''; foreach ( get_the_category() as $cat ) $cats .= $cat->cat_ID . ',';
$args = array(
	'category__in' => explode(',', $cats), // 只選 category 的文章.
	'post__not_in' => explode(',', $exclude_id),
	'caller_get_posts' => 1,
	'orderby' => 'comment_date',
	'posts_per_page' => $post_num - $i
);
query_posts($args);
 while( have_posts() ) { the_post(); ?>
    <li>&#9829; <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php
    $i ++;
 } wp_reset_query();
}
if ( $i  == 0 )  echo '<li>尚無相關文章</li>';
?>
</ul>

本来这样就解决了,但随即 a.shun 又发现貌似我博客的都是取得同分类的文章,而不是先取得同标签的文章。

于是我又重新分析代码,发现我的博客文章中文标签名的取不到相关文章,但英文标签的文章就能取到相关文章,看来代码问题出在标签(tag)的获取上。

经过细心发现,willin 忘了考虑中文博客很多标签名和标签的别名(slug)是不同的,而代码取得的是当前文章的标签名,而获取相关文章的代码用的是别名(slug),所以才会出现有些标签的文章不能获取相关文章。(这段很拗口。。。看得懂的看看,看不懂就飘吧。)

下面是我纠正后的代码,具体效果看我博客文章后面的相关文章。
2010.11.30 Update: 漏了个$i++和忘了去掉文章标题截取,请Copy过[2010.11.30前]的朋友重新Copy)

<h3>Related Posts</h3>
<ul>
<?php
$post_num = 5; // 數量設定.
$exclude_id = $post->ID; // 單獨使用要開此行 //zww: edit
$posttags = get_the_tags(); $i = 0;
if ( $posttags ) {
	$tags = ''; foreach ( $posttags as $tag ) $tags .= $tag->term_id . ','; //zww: edit
	$args = array(
		'post_status' => 'publish',
		'tag__in' => explode(',', $tags), // 只選 tags 的文章. //zww: edit
		'post__not_in' => explode(',', $exclude_id), // 排除已出現過的文章.
		'caller_get_posts' => 1,
		'orderby' => 'comment_date', // 依評論日期排序.
		'posts_per_page' => $post_num
	);
	query_posts($args);
	while( have_posts() ) { the_post(); ?>
		<li><a rel="bookmark" href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></li>
	<?php
		$exclude_id .= ',' . $post->ID; $i ++;
	} wp_reset_query();
}
if ( $i < $post_num ) { // 當 tags 文章數量不足, 再取 category 補足.
	$cats = ''; foreach ( get_the_category() as $cat ) $cats .= $cat->cat_ID . ',';
	$args = array(
		'category__in' => explode(',', $cats), // 只選 category 的文章.
		'post__not_in' => explode(',', $exclude_id),
		'caller_get_posts' => 1,
		'orderby' => 'comment_date',
		'posts_per_page' => $post_num - $i
	);
	query_posts($args);
	while( have_posts() ) { the_post(); ?>
		<li><a rel="bookmark" href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
	<?php $i++;
	} wp_reset_query();
}
if ( $i  == 0 )  echo '<li>没有相关文章!</li>';
?>
</ul>

有用这段代码的朋友自己纠正吧,willin 那里我也通知了,不过他退隐“博湖”好一段时间了,期待他的复出。

zww
or
oooo

“willin相关文章代码修正”有157条评论

  1. 博主给力...!!!!!!

  2. zigbee says:

    有空用一下这个code. :razz:

    1. zwwooooo says:

      @zigbee
      看来你很忙啊。

    2. zigbee says:

      @zwwooooo
      主要是太懒惰啦。。。。。

  3. 还在用的插件搞定这个

    1. @亿品元素
      我也是插件,懒人

  4. :smile: 来看哈,好久没来了哩

  5. 如此复杂,我路过吧

  6. 流年 says:

    我用的也是这个代码,倒没认真瞧过得到的都是哪些文章,改改去

    1. zwwooooo says:

      @流年
      嗯,很容易忽略

  7. mice says:

    我记得我也改过这个东西来着..对比下看看.. :mrgreen:

    1. zwwooooo says:

      @mice
      可能你改正了 :lol:

  8. 优趣 says:

    额、用的插件!

    1. zwwooooo says:

      @优趣
      插件方便

  9. 福州地铁 / Blog Archive / 我的相关日志代码(侧边栏) says:

    [...] 我参考了这篇文章《willin相关文章代码修正》,添加了一些符合当前主题lukoo的标记、在单篇日志显示“相关日志”的判断语句、修改成在没有相关标签日志和相关分类日志时显示“没有相关日志”。虽然它显得太长,但是还是有必要记录下来凑合着看。 [...]

  10. 球犯 says:

    对于插件我不懂 对于你们牛人我真是顶礼膜拜呀~ :mrgreen:

    1. zwwooooo says:

      @球犯
      别膜拜,互相学习就好

  11. Kars says:

    相关文章 不够时,能用 不重复的随机文章 补足不?

    1. zwwooooo says:

      @Kars
      可以吧,计数器上判断

    2. zwwooooo says:

      @Kars
      不错,哈

  12. Arks Absolute Area says:

    WordPress 相关文章代码 (修改自 willin 与 zwwooooo)...

    在每篇文章页面,也就是 single.php 的下方 使用了 zwwooooo大酥 修改的 willin相关文章代码后,会出现一个问题:像我这个新开的博客时常会凑不齐 5篇相关文章,所以,就想用 随机文章来 进行补足、、 好了,全部代码如下: <h3>Related Posts</h3> <ul> <?php $post_num = 5; $exclude_id = $post->ID; $posttags = get_the_tags(); $i =...

  13. zrqx008 says:

    能不能加进function,然后在边栏调用?

    1. zwwooooo says:

      @zrqx008
      可以,要改一下

  14. zrqx008 says:

    发现这个代码对标签的获取还是很弱。

    1. zwwooooo says:

      @zrqx008
      只能基本实现

  15. 酷剑 says:

    奇怪了,本地测试还是不行呀。还是获取当前分类下的最新文章。而且你的好像也不行呀。

    1. zwwooooo says:

      @酷剑
      检查细节(如文章同标签的文章有没有等),很多朋友直接copy是ok的

  16. 免插件实现相关文章显示 | Simnovo says:

    [...] 以下两段相关文章显示代码分别来自万戈和zww。 [...]

  17. [...] 部分代码学习了《willin相关文章代码修正》,css样式自己设计。 [...]

  18. alluse says:

    看一个效果~

  19. Laycher says:

    奇怪,为什么放在我本地测试的时候,没有文章的时候显示空白的,而且还是五条空白,有些文章还显示四条。。。

    1. zwwooooo says:

      @Laycher
      不太清楚你说的空白是指什么,这代码会先找同标签的文章,如果数量不够才会找同分类的文章补齐

    2. Laycher says:

      @zwwooooo
      我明白了,the_title是获取不了了,用get_the_title才能获取。

  20. 倡萌 says:

    这段代码是目前网络上搜集到的比较强大的 果断拿走了