织梦英文上下篇如何正确调用?

99ANYc3cd6
预计阅读时长 14 分钟
位置: 首页 织梦建站 正文

织梦默认的上下篇标签 {dede:pre/}{dede:next/} 是基于当前栏目内的文章进行调用的,如果你的网站结构是“中文栏目”和“英文栏目”分开的,那么默认调用就无法实现跨栏目的英文上下篇。

要实现这个功能,主要有两种方法:

  1. 修改数据库查询(推荐,更稳定):直接修改织梦核心文件,让上下篇标签在查询时忽略栏目限制,从而在整个网站的文章中查找。
  2. 使用自定义SQL标签(灵活,但性能稍差):通过织梦的自定义SQL标签,手动编写查询语句来获取上下篇文章。

修改数据库查询(推荐)

这种方法的核心是修改织梦处理上下篇标签的PHP文件,让它查询所有栏目,而不仅仅是当前栏目。

步骤:

  1. 找到核心文件 打开你的织梦程序根目录,找到并编辑以下文件: /include/arc.archives.class.php

  2. 定位并修改函数 在这个文件中,搜索 PreNext 函数,这个函数就是处理 {dede:pre/}{dede:next/} 标签的核心。

  3. 修改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 不会被调用)。
    • 现在这个查询会在整个网站的文章数据库中查找上一篇和下一篇,而不管它们在哪个栏目下。
  4. 保存文件并测试 保存对 arc.archives.class.php 的修改,然后刷新你的网站页面,查看英文文章详情页的上下篇链接是否已经变成全站的了。


使用自定义SQL标签(灵活)

如果你不想修改核心文件(例如为了方便后续升级),可以使用自定义SQL标签来实现。

步骤:

  1. 在模板文件中使用自定义标签 打开你的英文文章详情页模板(通常是 article_article.htm)。

  2. 编写自定义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/]: 获取文章标题。
  3. 保存并测试 保存模板文件,刷新页面即可看到效果。


重要注意事项

  1. 关于排序:这两种方法都是基于文章的ID来排序的,如果你的文章发布顺序和ID顺序不一致,上一篇”和“下一篇”可能不是你期望的逻辑,如果你的文章有特定的排序字段(如 sortrank),你可以修改SQL语句,ORDER BY sortrank DESC 来替代 ORDER BY id DESC

  2. 关于性能

    • 方法一(修改核心文件)因为直接修改了底层逻辑,性能最好。
    • 方法二(自定义SQL)每次页面加载都会执行一次额外的数据库查询,对于高流量网站可能会有轻微的性能影响,但对于普通网站来说完全可以接受。
  3. 上下篇”的逻辑

    • 全站逻辑:以上两种方法实现的是全站的上下篇,即不考虑栏目。
    • 栏目内逻辑:如果你只想在当前英文栏目内调用,但又不希望被中文栏目干扰,那问题就复杂了,你需要确保所有英文文章都在一个特定的父栏目下,或者给英文文章打一个特定的标签(如 flag='e'),然后在SQL查询中增加这个条件,在方法一的SQL中增加 AND flag LIKE '%e%'
方法 优点 缺点 适用场景
修改核心文件 性能最佳,一劳永逸,逻辑清晰。 需要修改核心文件,升级织梦时可能需要重新修改。 追求性能、稳定性,不介意修改核心文件的用户。
自定义SQL标签 灵活,不修改核心文件,升级无忧。 性能稍差,模板代码稍显复杂。 不想修改核心文件,或者需要根据更复杂条件(如文章标签)来调用上下篇的用户。

对于大多数用户来说,方法一是更简单、更高效的解决方案,如果你对织梦底层比较熟悉,强烈推荐使用方法一。

-- 展开阅读全文 --
头像
dede首页调用内容
« 上一篇 今天
dede文章列表空白
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]