| Drupal是一个非常好的CMS开源系统,虽然开源模块非常的多,但目前符合“相关文章”功能仅有Related Links, Relevance, Relevant Content, Similar Entries,但都多多少少不尽如人意,所以自己动手写了一个简单的Block。本文将向您介绍Drupal如何实现“相关文章”的功能。 | ![]() |
原创文章请注明转载自咋办网,本文链接:Drupal如何实现“相关文章”的功能
预备条件:
- Drupal 6.x (其他版本也可以参考)
- 启用Search模块
- 启用CSplitter模块
- 启用Taxonomy模块,并且文章中设置了Tag或Taxnomy(相关文章的检索条件)
步骤:
本人做Drupal不专业,写的东西可能不太好看,也可能还有更好的方法,在此请高手多多指导:) 我实现相关文章的功能实际上是创建了一个Block,里面写了几行代码,调用了do_search api实现的,代码的具体逻辑为,读取当前页面node,再获取其Taxonomy,然后调用do_search API获取搜索结果,将结果中的node列出来,具体步骤如下。
- 创建一个Block。创建Block的路径是 管理->站点创建->区块,页面上方有一个“增加区块”的链接。

- 区块说明:related_articles;区块标题:以下文章可能对您有所帮助,这两个其实都可以随便填,需要注意一下区块标题,如果你只是填写一个“相关文章”,可能对读者的吸引力不够,这个就看你如何吸引读者的眼球了。
- 区块内容:放置php代码,并将输入格式设置为PHP Code,需要注意的是,你需要启用模块中的PHP Filter,否则你是看不到PHP Code,PHP代码如下:
<?php//$current_node用来存储当前页面上的node//$current_node用来存储当前页面上的node的关键字
$current_node = node_load(arg(1));
$current_terms = taxonomy_node_get_terms($current_node );//$current_keyword用来存储合成的关键字(用于Drupal do_search API调用,检索相关文章)
$current_keyword = '';//将关键字连接起来,用'OR'连接,如果直接用空格连接表示与的关系
foreach ($current_terms as $local_kw)
{
$current_keyword .= $local_kw->name;
$current_keyword .= ' OR ';
$current_keyword .= ' ';
}
//去掉前后空格
$current_keyword = trim($current_keyword);
//字符串长度
$keylength = strlen($current_keyword);//Drupal API do_search的关键字长度大于2才执行搜索,这个设置与搜索设置中的最小关键字长度设置有关
if($keylength > 2)
{//$related_results保存的是通过drupal API do_search查询结果,结果就是相关文章
$related_results = do_search($current_keyword, 'node', $join1 = '', $where1 = '1 = 1', $arguments1 = array(), $columns2 = 'i.relevance AS score', $join2 = '', $arguments2 = array(), $sort_parameters = 'ORDER BY score DESC');
//格式化相关文章标题及链接为ul列表
$output .= '<ul>';
foreach ($related_results as $local_item){
$related_results = node_load($local_item->sid);
if($current_node->nid <> $related_results->nid)
{
$linkurl = url("node/$related_results->nid", array('absolute' => FALSE));
$output .= '<li>';
$output .= "<a href=\"$linkurl\">";
$output .= $related_results->title;
$output .= '</a>';
$output .= '</li>';
}
}
$output .= '</ul>';
}//输出
print $output;
?> - 设置页面可见性:只在下列页面中显示,设置值为:node*
- 保存区块
- 在管理区块页面将区块放在content部分,区块将出现在内容最下方
- 由于相关文章功能对搜索功能有所依赖,如果你还没有为站点内容创建索引,那么赶快创建吧
- 效果如下,下面的链接来自于如何制作手机播放的RMVB格式电影这篇文章,本文最后也有相关文章列表。
以下文章可能对您有所帮助
- 其他可用模块
- Relevant Content
relevant_content模块使用了一个Select SQL实现的查询,没有使用Search模块,也没有使用do_search API,自然也就不能对中文分词支持了,搜索结果也没有按照相关度排序,所以“相关”并非很准确。 - Similar Entries
similar entry找到的相关内容比较少,但是结果顺序和本文的方法是一样的,similar entry一样没有用do_search api,对中文分词支持不好,因此也有一些缺憾。 - Relevance
relevance模块比上面两个都要好一些,还可以根据Taxonomy、日期、时间等因素设定权重,结果还可以显示性能相关数据,relevance模块虽然没有直接使用do_search API,但是其中的SQL仍然按照relevance度排序,只是不支持中文分词。推荐使用此模块。
- Relevant Content
提示&注意事项:
- 启用Search 模块后,需要建立索引才能使用相关文章中调用的do_search API
- 启用CSplitter模块会影响一些速度,建立索引的速度会很低,但是会精确得多,如果网站是中文内容,一定得启用该模块
- 如果你的网站只有中文,没有日、韩文字,最好将CSplitter中的中日韩文字那项设置去掉,提高性能
- Search模块需要Cron计划任务,否则要手动运行才行
参考资料:
- Drupal do_search API
- Related Links(只支持4.7.x, 5.x)
- Relevant Content
- Similar Entries
- Relevance
附件下载
请注册并登录后下载附件:登录/注册


欢迎订阅咋办网的Feed更新~~ 请猛击此链接
评论
发表新评论