dede文章页如何调用专题?

99ANYc3cd6
预计阅读时长 17 分钟
位置: 首页 DEDE建站 正文

使用DedeCMS内置的“相关专题”功能(最简单)

这是DedeCMS系统自带的功能,适用于“这篇文章属于某个专题”的场景,它需要在后台添加文章时,手动选择或创建专题。

dede文章页调用专题
(图片来源网络,侵删)

操作步骤:

  1. 添加文章时勾选专题

    • 登录DedeCMS后台,进入“[核心] -> [内容发布管理] -> [添加文档]”。
    • 在文章编辑页面,向下滚动,找到“专题属性”部分。
    • 点击“选择专题”,在弹出的窗口中,您可以选择已有的专题,或者点击“新建专题”来创建一个新专题并关联到当前文章。
    • 填写完文章内容后,点击“保存”或“发布”。
  2. 在文章页模板中调用

    • 进入“[模板] -> [默认模板管理]”,找到您当前使用的文章页模板文件,通常是 article_article.htm
    • 在您希望显示专题列表的位置,插入以下DedeCMS标签代码:
    {dede:field name='typeid' runphp='yes'}
        // 如果typeid不为空,则查询专题
        if(@me != ''){
            @me = "<div class='related-specials'><h3>相关专题</h3>";
            @me .= "<ul>";
            @me .= "<li><a href='/special/index.php'>查看所有专题</a></li>";
            @me .= "</ul></div>";
        }else{
            @me = "";
        }
    {/dede:field}
    {dede:field name='body'/}

    注意: 上面的代码只是一个框架,它并不能直接调用出专题,DedeCMS原生标签中,并没有一个像 {dede:arclist} 那样可以直接调用文章关联专题的标签,更通用的方法是使用 方法二

    dede文章页调用专题
    (图片来源网络,侵删)

使用自定义SQL查询(最常用、最灵活)

这种方法的核心思想是:通过文章的ID,去 dede_archives 表中找到其专题ID(存储在 typeid 字段,如果专题文章的话),或者去 dede_specialtopic 表中查找关联,但更常见的是,我们通过专题的关联文章ID来反向查找。

这里我们采用一个更普适的思路:查找所有包含了当前文章的专题

操作步骤:

  1. 修改文章页模板

    • 同样地,打开您的文章页模板 article_article.htm
    • 在需要显示专题的位置,放入以下代码块:
    <!-- 调用包含当前文章的专题 -->
    {dede:sql sql="SELECT st.*, stb.body FROM `dede_specialtopic` st LEFT JOIN `dede_specialtopic_data` stb ON st.id = stb.tid WHERE FIND_IN_SET('~aid~', st.aid) ORDER BY st.id DESC"}
        <div class="article-special">
            <h3>本文所属专题:<a href='[field:phpurl/]/special/index.php?id=[field:id/]'>[field:title/]</a></h3>
            [field:body/]
        </div>
    {/dede:sql}
  2. 代码解释与重要修正

    • 上面的SQL代码有一个关键问题:st.aid 字段通常存储的是专题的封面文章ID,而不是包含的所有文章ID,包含所有文章ID的字段是 dede_specialtopic_data 表里的 aid 字段。
    • 正确的查询应该是:从 dede_specialtopic_data 表中查找 aid 字段里包含当前文章ID的记录,然后通过 tid 关联到 dede_specialtopic 表。
    • 修正后的代码如下:
    <!-- 调用包含当前文章的专题 (推荐方法) -->
    {dede:sql sql="
        SELECT 
            s.id, s.title, s.typename, s.description, s.litpic, s.pubdate
        FROM 
            `dede_specialtopic` s
        INNER JOIN 
            `dede_specialtopic_data` d ON s.id = d.tid
        WHERE 
            d.aid = '~aid~'
        LIMIT 1
    "}
        <div class="article-special">
            <h3>本文所属专题:</h3>
            <div class="special-box">
                <a href='[field:phpurl/]/special/index.php?id=[field:id/]'>
                    <img src='[field:litpic/]' alt='[field:title/]' />
                </a>
                <div class="special-info">
                    <h4><a href='[field:phpurl/]/special/index.php?id=[field:id/]'>[field:title/]</a></h4>
                    <p>[field:description function='cn_substr(@me, 100)'/]...</p>
                </div>
            </div>
        </div>
    {/dede:sql}
    • 代码详解:
      • ~aid~:这是DedeCMS模板引擎的一个特殊占位符,它会自动被当前页面的文章ID所替换。
      • dede_specialtopic:专题主表,存储专题的基本信息(标题、描述、图片等)。
      • dede_specialtopic_data:专题数据表,存储专题和文章的关联关系(tid是专题ID,aid是文章ID)。
      • INNER JOIN ... ON s.id = d.tid:将专题表和关联表通过ID连接起来。
      • WHERE d.aid = '~aid~':筛选出关联了当前文章的专题。
      • LIMIT 1:一篇文章通常只属于一个专题,加上这个可以限制只显示一个,提高效率,如果一篇文章可以属于多个专题,请去掉此句。
      • [field:phpurl/]:调用网站后台设置的“程序路径”,通常是 。
      • [field:litpic/]:调用专题封面图。
      • [field:title/]:调用专题标题。
      • [field:description/]:调用专题描述,并用 cn_substr 函数截取前100个字符。

调用网站所有专题(不区分文章)

如果您想在文章页展示整个网站的所有专题列表,而不是与当前文章相关的专题,那就非常简单了。

操作步骤:

  1. 在文章页模板中插入代码

    • 打开 article_article.htm
    • 放入以下代码:
    <!-- 调用网站所有专题 -->
    {dede:sql sql="SELECT id, title, litpic FROM `dede_specialtopic` WHERE ismake=1 ORDER BY id DESC LIMIT 0, 10"}
        <a href='[field:phpurl/]/special/index.php?id=[field:id/]'>
            <img src='[field:litpic/]' alt='[field:title/]' />
            <span>[field:title/]</span>
        </a>
    {/dede:sql}
  2. 代码解释

    • ismake=1:这个条件很重要,它只调用后台已经“生成”的专题,草稿状态的专题(ismake=0)不会被显示。
    • ORDER BY id DESC:按专题ID降序排列,即最新的专题排在前面。
    • LIMIT 0, 10:从第0条开始,共显示10条专题,您可以根据需要修改这个数字。

总结与建议

方法 适用场景 优点 缺点
方法一 文章在发布时被明确指定到某个专题 系统自带,无需额外代码 功能较弱,调用方式不直观,灵活性差
方法二 最推荐,需要动态显示与当前文章内容相关的专题 非常灵活,能精确找到包含当前文章的专题,逻辑清晰 需要写SQL语句,对表结构有一定了解
方法三 在文章页展示全站的专题列表,作为网站导航 简单快捷,代码量少 与当前文章内容无关,属于通用模块

对于绝大多数需求,方法二 是最佳选择,它实现了“智能关联”,用户体验更好,如果您只是想在侧边栏加一个“专题入口”,那么方法三就足够了。

最后的小提示:在修改模板文件前,请务必备份原文件,以防修改出错导致网站前台显示异常,修改后,请到后台“[生成] -> [更新HTML]”中更新相关页面,才能看到效果。

-- 展开阅读全文 --
头像
dede网站换源码具体步骤是什么?
« 上一篇 03-08
C语言如何提取输入数字的个位数字?
下一篇 » 03-08

相关文章

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

目录[+]