织梦如何修改重复的文章标题?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 织梦建站 正文
  1. 后台发布文章时,提示“标题已经存在”:这是最常见的情况,织梦为了防止重复发布内容,默认开启了标题唯一性检查。
  2. 数据库中已经存在大量重复标题的文章:这是历史遗留问题,需要通过数据库操作来批量处理。

下面我将针对这两种情况,提供详细的解决方案。

织梦修改文章标题重复
(图片来源网络,侵删)

发布文章时提示“标题已经存在”

这是织梦的后台保护机制,如果你想强制发布,或者绕过这个检查,可以修改核心文件。

警告: 修改核心文件可能会导致网站升级困难,请在操作前备份网站文件和数据库

解决方案:修改 archives_add.php 文件

这个文件是处理新增文章的核心逻辑文件。

  1. 找到文件: 通过FTP或你的主机控制面板,登录网站根目录,找到并下载以下文件: /dede/archives_add.php

    织梦修改文章标题重复
    (图片来源网络,侵删)
  2. 编辑文件: 用代码编辑器(如VS Code, Sublime Text, Dreamweaver)打开 archives_add.php 文件。

  3. 检查代码: 在文件中,找到下面这段代码(大约在第37-42行,不同版本可能略有差异):

    //检查标题是否重复
    if($typeid==0)
    {
        ShowMsg('请选择文档的栏目!', '-1');
        exit();
    }
    // ... 其他代码 ...
    $query = "SELECT title FROM `dede_archives` WHERE title='$title' ";
    $row = $dsql->GetOne($query);
    if(is_array($row))
    {
        ShowMsg('发布文档标题已经存在,请更换一个新的标题!', '-1');
        exit();
    }

    我们需要将检查标题重复的 if 判断块注释掉,用 将其包裹起来。

    修改后的代码如下:

    织梦修改文章标题重复
    (图片来源网络,侵删)
    //检查标题是否重复
    if($typeid==0)
    {
        ShowMsg('请选择文档的栏目!', '-1');
        exit();
    }
    // ... 其他代码 ...
    /*
    $query = "SELECT title FROM `dede_archives` WHERE title='$title' ";
    $row = $dsql->GetOne($query);
    if(is_array($row))
    {
        ShowMsg('发布文档标题已经存在,请更换一个新的标题!', '-1');
        exit();
    }
    */
  4. 保存文件并上传: 将修改后的 archives_add.php 文件重新上传到你的服务器原位置,覆盖旧文件。

完成! 现在你再尝试发布标题重复的文章,系统就不会再拦截了。


数据库中已存在大量重复标题的文章

这种情况比较复杂,需要分步处理,核心思路是:找出重复的标题 -> 给它们加上唯一标识(如日期、序号)-> 更新数据库

警告: 数据库操作有风险,请务必备份数据库! 建议在本地环境或测试环境中先操作。

解决方案:分步处理

假设你的数据表前缀是 dede_(如果不是,请自行替换)。

第一步:查询重复的标题

我们需要找出哪些标题是重复的,以及重复了多少次。

在phpMyAdmin中,选择你的织梦数据库,然后点击“SQL”选项卡,执行以下查询语句:

SELECT title, COUNT(*) as count
FROM dede_archives
GROUP BY title
HAVING count > 1
ORDER BY count DESC;

执行后,你会看到一个列表,显示了所有重复的标题和它们的重复次数,记下这些标题。

第二步:批量修改重复标题(核心步骤)

这一步是修改的关键,我们将为重复的标题添加一个后缀,格式为 - 副本1 - 副本2 等。

重要提示: 在执行任何 UPDATE 语句前,务必先用 SELECT 语句测试,确保查询的结果是你想要修改的数据。

使用变量(推荐,更精确)

这种方法可以确保每个重复的标题都被正确地加上序号,而不会重复。

-- 创建一个临时变量来存储当前处理的标题和计数
SET @current_title = '';
SET @counter = 0;
-- 创建一个临时表来存储需要更新的标题和它们的ID
CREATE TEMPORARY TABLE temp_duplicates AS
SELECT id, title
FROM dede_archives
WHERE title IN (
    -- 这里填入你从第一步查询到的重复标题列表
    -- '重复标题1', '重复标题2', '重复标题3'
    '这是一个重复的标题', '另一个重复标题'
)
ORDER BY title, id; -- 按标题和ID排序,确保顺序一致
-- 遍历临时表并更新
UPDATE dede_archives a
JOIN (
    SELECT id, title,
           @counter := IF(@current_title = title, @counter + 1, 1) AS dup_count,
           @current_title := title AS current_title
    FROM temp_duplicates
    ORDER BY title, id
) t ON a.id = t.id
SET a.title = CONCAT(t.title, ' - 副本', t.dup_count);
-- 删除临时表
DROP TEMPORARY TABLE temp_duplicates;

如何使用上面的SQL:

  1. '这是一个重复的标题', '另一个重复标题' 替换为你实际查询到的重复标题列表。
  2. 执行这段SQL,它会先创建一个临时表,然后按顺序为每个重复的标题添加序号,最后删除临时表。

使用子查询(相对简单,但可能不够严谨)

如果你的重复标题不多,可以用这种方法,它会把同一个标题的所有文章都加上一个固定的后缀。

-- 假设我们要修改标题为 '这是一个重复的标题' 的所有文章
UPDATE dede_archives= CONCAT(title, ' - 副本')
WHERE title = '这是一个重复的标题';

你需要为每一个重复的标题都执行一次这样的 UPDATE 语句,如果重复标题很多,这种方法会很繁琐。

第三步:更新文档表(dede_archives)和副表(dede_arctiny)

织梦的文章信息存储在两个主要表中:

  • dede_archives:主表,包含标题、发布时间等核心信息。
  • dede_arctiny:副表(也叫微表),用于列表调用,也包含标题。

如果你只修改了主表,那么在前台列表页调用标题时,可能会显示旧标题,两个表都需要更新。

更新副表的SQL语句与主表类似:

-- 假设我们要修改标题为 '这是一个重复的标题' 的所有文章的副表
UPDATE dede_arctiny= CONCAT(title, ' - 副本')
WHERE title = '这是一个重复的标题';

同样,如果你使用了方法一,也需要为副表写一个类似的更新逻辑。

第四步:验证结果

再次执行第一步的查询语句,看看是否还有重复的标题。

SELECT title, COUNT(*) as count
FROM dede_archives
GROUP BY title
HAVING count > 1;

如果查询结果为空,或者只有你不想修改的标题(比如一些本身就合法的重复标题,如“公司公告”),则说明修改成功。


总结与建议

问题场景 解决方案 优点 缺点
发布时被拦截 修改 archives_add.php,注释掉标题检查逻辑。 简单快速,无需操作数据库。 可能导致垃圾内容泛滥,不利于SEO;网站升级后需重改。
数据库已存在重复 通过SQL查询和批量更新数据库。 从根本上解决问题,数据整洁,利于SEO。 操作复杂,有风险,需要备份数据库,需要一定的SQL知识。

最佳实践建议:

  1. 从源头控制:尽量不要修改核心文件,在发布文章时,养成良好习惯,为文章添加唯一标识,

    • - 发布日期 (如:2025年度总结 - 2025-12-31)
    • - 作者名
    • - 序号 (如:产品介绍(一)、产品介绍(二))
  2. 定期维护量大的网站,可以定期(如每季度)使用SQL查询检查并清理重复标题,保持数据库的健康。

希望以上详细的步骤能帮助你解决问题!

-- 展开阅读全文 --
头像
C语言唯一三目运算符是哪个?
« 上一篇 今天
dede博客自适应模板如何适配多设备?
下一篇 » 今天

相关文章

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

目录[+]