织梦默认的上下篇标签 {dede:pre/} 和 {dede:next/} 是基于当前栏目内的文章进行调用的,如果你的网站结构是“中文栏目”和“英文栏目”分开的,那么默认调用就无法实现跨栏目的英文上下篇。
要实现这个功能,主要有两种方法:
- 修改数据库查询(推荐,更稳定):直接修改织梦核心文件,让上下篇标签在查询时忽略栏目限制,从而在整个网站的文章中查找。
- 使用自定义SQL标签(灵活,但性能稍差):通过织梦的自定义SQL标签,手动编写查询语句来获取上下篇文章。
修改数据库查询(推荐)
这种方法的核心是修改织梦处理上下篇标签的PHP文件,让它查询所有栏目,而不仅仅是当前栏目。
步骤:
-
找到核心文件 打开你的织梦程序根目录,找到并编辑以下文件:
/include/arc.archives.class.php -
定位并修改函数 在这个文件中,搜索
PreNext函数,这个函数就是处理{dede:pre/}和{dede:next/}标签的核心。 -
修改SQL查询语句 你会找到类似下面这样的代码(版本不同,行号可能略有差异,但逻辑一致):
// ... 在 PreNext 函数内部 ... // 获取上一篇 if($type=='pre') { $query = "SELECT id,title FROM `#@__archives` WHERE (id < '$aid') AND arcrank > -1 ORDER BY id DESC LIMIT 0, 1"; } // 获取下一篇 else if($type=='next') { $query = "SELECT id,title FROM `#@__archives` WHERE (id > '$aid') AND arcrank > -1 ORDER BY id ASC LIMIT 0, 1"; }修改方法: 你需要修改这个SQL语句,去掉栏目ID的限制,默认情况下,织梦会隐式地加上
AND typeid = '$typeid'的条件,我们就是要干掉它。将上述代码修改为:
// ... 在 PreNext 函数内部 ... // 获取上一篇(修改后) if($type=='pre') { $query = "SELECT id,title FROM `#@__archives` WHERE (id < '$aid') AND arcrank > -1 ORDER BY id DESC LIMIT 0, 1"; } // 获取下一篇(修改后) else if($type=='next') { $query = "SELECT id,title FROM `#@__archives` WHERE (id > '$aid') AND arcrank > -1 ORDER BY id ASC LIMIT 0, 1"; }关键点:
- 我们移除了
typeid的限制条件。 arcrank > -1这个条件保留,它确保只调用已发布的文章(草稿arcrank=-1不会被调用)。- 现在这个查询会在整个网站的文章数据库中查找上一篇和下一篇,而不管它们在哪个栏目下。
- 我们移除了
-
保存文件并测试 保存对
arc.archives.class.php的修改,然后刷新你的网站页面,查看英文文章详情页的上下篇链接是否已经变成全站的了。
使用自定义SQL标签(灵活)
如果你不想修改核心文件(例如为了方便后续升级),可以使用自定义SQL标签来实现。
步骤:
-
在模板文件中使用自定义标签 打开你的英文文章详情页模板(通常是
article_article.htm)。 -
编写自定义SQL代码 将原来的
{dede:pre/}和{dede:next/}替换为下面的自定义SQL标签。<!-- 获取上一篇 --> {dede:sql sql="SELECT id,title FROM `#@__archives` WHERE id < ~aid~ AND arcrank > -1 ORDER BY id DESC LIMIT 1"} <a href="[field:id function='MakeArcUrl(@me)'/]">上一篇:[field:title/]</a> {/dede:sql} <!-- 获取下一篇 --> {dede:sql sql="SELECT id,title FROM `#@__archives` WHERE id > ~aid~ AND arcrank > -1 ORDER BY id ASC LIMIT 1"} <a href="[field:id function='MakeArcUrl(@me)'/]">下一篇:[field:title/]</a> {/dede:sql}代码解释:
{dede:sql ...}: 这是织梦的自定义SQL标签。sql="...": 里面写你的SQL查询语句。~aid~: 这是一个占位符,织梦在解析这个标签时,会自动用当前文章的ID($aid)来替换~aid~。id < ~aid~: 查找ID比当前文章小的,即上一篇。id > ~aid~: 查找ID比当前文章大的,即下一篇。arcrank > -1: 同样,只调用已发布的文章。ORDER BY id DESC/ASC: 按ID降序/升序排列,确保获取的是紧邻的上一篇/下一篇。LIMIT 1: 只取一条结果。[field:id function='MakeArcUrl(@me)'/]: 获取文章ID,并使用MakeArcUrl函数生成正确的文章链接。这个函数非常重要,它能自动处理栏目ID和文章ID,生成完整的URL。[field:title/]: 获取文章标题。
-
保存并测试 保存模板文件,刷新页面即可看到效果。
重要注意事项
-
关于排序:这两种方法都是基于文章的ID来排序的,如果你的文章发布顺序和ID顺序不一致,上一篇”和“下一篇”可能不是你期望的逻辑,如果你的文章有特定的排序字段(如
sortrank),你可以修改SQL语句,ORDER BY sortrank DESC来替代ORDER BY id DESC。 -
关于性能:
- 方法一(修改核心文件)因为直接修改了底层逻辑,性能最好。
- 方法二(自定义SQL)每次页面加载都会执行一次额外的数据库查询,对于高流量网站可能会有轻微的性能影响,但对于普通网站来说完全可以接受。
-
上下篇”的逻辑:
- 全站逻辑:以上两种方法实现的是全站的上下篇,即不考虑栏目。
- 栏目内逻辑:如果你只想在当前英文栏目内调用,但又不希望被中文栏目干扰,那问题就复杂了,你需要确保所有英文文章都在一个特定的父栏目下,或者给英文文章打一个特定的标签(如
flag='e'),然后在SQL查询中增加这个条件,在方法一的SQL中增加AND flag LIKE '%e%'。
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 修改核心文件 | 性能最佳,一劳永逸,逻辑清晰。 | 需要修改核心文件,升级织梦时可能需要重新修改。 | 追求性能、稳定性,不介意修改核心文件的用户。 |
| 自定义SQL标签 | 灵活,不修改核心文件,升级无忧。 | 性能稍差,模板代码稍显复杂。 | 不想修改核心文件,或者需要根据更复杂条件(如文章标签)来调用上下篇的用户。 |
对于大多数用户来说,方法一是更简单、更高效的解决方案,如果你对织梦底层比较熟悉,强烈推荐使用方法一。
