DCTC AI SEO 1.3.15
============

给 WordPress 用的 SEO 插件。负责标题、描述、站点地图、结构化数据、跳转，以及用 AI 写标题和描述。

新版本在 https://www.mkcmd.com/dctc-seo 发布。装过 1.3.14 及以后的站，WordPress 插件页会检查更新，不必再手工拷文件。站点自己决定是否自动更新。

1.3.15
- 根目录已有 robots.txt 且网页进程写不了时，不再要求改服务器权限。访问 /robots.txt 时当场补上或去掉纯文本地图那一行；其它内容与文件一致。只有请求到不了 WordPress 时，后台才提示把那一行贴进文件。

1.3.14
- 接入 mkcmd.com 的版本检查和下载，后台可以看到更新。

1.3.13
- 后台说明不再拿其它 SEO 插件来介绍本插件的功能。

1.3.12
- 工具页增加「从其它 SEO 插件导入」：Yoast、All in One SEO、The SEO Framework、Rank Math、SEOPress、Squirrly，以及 Redirection、301 Redirects。标题、描述、分享图、规范链接、不收录和跳转会写进本插件。

1.3.11
- 纯文本地图改到文章类型注册之后再输出。原先太早，WooCommerce 商品还没注册，sitemap.txt 会漏掉商品地址。

1.3.10
- 修正写静态文件的定时：已经排好的那一次，即使到点后站点才有访问，也不会被改排到下一周期。改周期时才重排。
- 还原被改名的实体文件时，没改回去的备份仍保留记录，不再整份清掉。

1.3.9
- 纯文本地图开启后，除了开启/保存时立刻检测根目录实体 sitemap.txt，还会在每天站点时区 0 点再巡检一次；发现外来同名文件就改名备份。后台显示下次巡检时间。

1.3.8
- 「写静态文件」的「每天几点」改成「生成周期」：每天一次（指定几点）、每小时一次（指定第几分钟）、每隔若干分钟（1～1440）。每次仍是整份重写，不是追加。
- 定时改成单次任务，跑完立刻排下一次，三种周期都能准到分钟。

1.3.7
- 根目录里如果已经有不是插件写的 sitemap.txt（比如模板或别的插件留下的），打开「纯文本地图」后插件会把它改名成 sitemap.txt.dctc-seo-backup，让 Apache 不再直接发这个实体文件，请求自然落到 WordPress 的动态输出。分页的 sitemap-2.txt 等同样处理。同名备份已存在时，加时间戳，不覆盖。
- 关掉「纯文本地图」或停用插件时，备份会改回原来的文件名。后台会列出当前有哪些文件被改名。
- 不用改 .htaccess，也不需要让 PHP 写 .htaccess。插件自己写的实体文件在动态模式下会自动删掉。
- 「写静态文件」改成先给外来同名文件改名，再写自己那份，不会覆盖别人的内容。
- 「纯文本地图」的说明改成「给不识别 XML 地图的蜘蛛使用」，和「写静态文件」放在同一个框里，说明这两条是二选一的两条路。

1.3.6
- 功能页「纯文本地图」下面增加「写静态文件」和「每天几点」。默认关着，访问时现算。打开后每天到点把 sitemap.txt 写到站点根目录，由 Web 服务器直接发文件，不再为每次访问跑程序。大站（几万条）用这个方案。
- 时间按站点时区（WordPress 设置）。用 WordPress 自己的定时任务触发；站点没有访问时可能晚几分钟到几十分钟。
- 关掉「写静态文件」会删掉插件写出的 sitemap.txt、sitemap-2.txt，恢复现算。停用插件也会删。
- 功能页有「现在生成一次」，可以直接看生成结果和下次时间。

1.3.4
- 功能页增加「纯文本地图」。勾选并且「站点地图」也开着时，才提供 sitemap.txt。不在磁盘上写这个文件，访问时从 XML 子地图抽出页面地址，一行一个。已有站点升级后这一项默认勾上。关掉后该地址不再提供。超过 5 万条时用 sitemap-2.txt、sitemap-3.txt。
- 网站根目录没有实体 robots.txt 时，robots 里会同时写出 sitemap.xml 和 sitemap.txt。根目录已有 robots.txt 的站（如 szbjb）仍以那个文件为准，要自己加一行 Sitemap。

已经做的
- 标题：单篇或模板里写了才覆盖。都留空时，插件用文章标题、分类名、站点名、副标题拼出来。页码用 WordPress 当前语言的译文，不另写中文或英文。搜索页和 404 仍交给 WordPress。商店页用那个页面自己的标题
- 描述、canonical、robots、Open Graph、Twitter 卡片
- sitemap.xml，地址和原来一样（sitemap-post-type-post.xml 等）
- 结构化数据：WebSite、SearchAction、WebPage、Article、Organization、面包屑。社交页可填同一主体网址，写入 sameAs。商品页输出 Product 和 Offer（价格、货币、库存、SKU），不再叠一份 WooCommerce 自己的商品标记。报价列表、商品分类、商店等列表页输出当前这一页的 ItemList，商品条目带上价格
- 页头 / 正文开头 / 页尾代码（统计、广告）
- 面包屑短代码 [dctc_seo_breadcrumbs]
- 图片缺 alt 时用文件名补上。头图的 alt 若是空的，写成站点名
- 主标题只留一个。页面已经有 h1 时，去掉旧的屏幕阅读器补丁多加的那条；首页或单篇完全没有 h1 时才补一条。作者头像的空 alt 不填
- 后台「工具」：程序化自检、坏链和孤立页、404 记录。这些只运行检查，不保存站点设置。会调用 AI 的「分析自检结果」和「检查并补充」在「AI」页
- Feed 末尾加来源链接
- 404 跳首页、404 日志、附件页和作者页自动跳转、自定义跳转。文章、页面、商品改别名后，旧地址 301 到新地址，其它正文里的旧链接一并改掉
- 链接：后台「工具」里检查坏链和孤立页。商品页、商品分类按标题和分类列出相关报价、验机；文章分类列出同名商品分类和验机文。只在前台显示，不写进正文，也不调用 AI
- 启用时如果还没有自己的设置，会把站点上已有的 SEO 设置复制过来

后台入口有三处：左侧菜单「DCTC AI SEO」、插件列表里插件名称下面的「设置」、以及「设置 → DCTC AI SEO」。分栏如下，文字是中文：
- 功能：标题、描述、robots、Open Graph、X 卡片、规范链接、上一页下一页、站点地图、图片替代文字、面包屑、RSS、结构化数据、跳转、去掉分类前缀
- 元标签：每种文章、归档、分类、作者的标题、描述、分享图、不收录。首页是固定页面时，去编辑那一页
- 社交：默认 Facebook / X 图片、Facebook 应用 ID、X 账号、同一主体网址（sameAs）
- 代码：页头、正文开头、页尾
- 跳转：斜杠、自动跳转、www、404 记录（只保留 7 天或 30 天，可一次清空）、404 去向、跳转规则（条件、301/302/307/410、备注）
- 工具：程序化自检、坏链和孤立页、404 记录。旧的「链接」「自检」地址会打开这一页。不调用 AI
- robots.txt：根目录已有这个文件时，页面展示文件原文。搜索引擎访问 /robots.txt 时，插件会按开关当场补上或去掉纯文本地图那一行，不必改这个文件
- AI：总开关，以及写标题、写分享简介、提炼标签、图片替代文字、分类简介、验机长文的相关文章、从正文抽问答、检查并补充。文章或页面第一次发表后，已勾选且还空着的项目会自动写上，已经有的不改。以前发表的用本页「检查并补充」。文章已有标题不算缺标题。分享简介用于搜索结果和社交。标签写入文章标签，并出现在结构化数据里。不写 meta keywords。报价单图片说明按标题日期写成「某日深圳手机报价」，不调用 AI。相关文章和问答跳过标题里带「报价」的文章。问答必须能在正文里对上原文，才会写入结构化数据。分类简介不在发表时自动写，仍用检查并补充。本页还有「分析自检结果」：只读工具页最近一次程序化自检，写处理顺序，不改页面上的文字，也不给不足 3 篇内容的标签写简介。接口地址写死为 https://api.mkcmd.com/v1 ，只能用在 api.mkcmd.com 充值得到的密钥。模型默认 deepseek-flash，可以改成该站上的其它模型。AI 页有「测试是否可用」，用当前模型和密钥发一次几个字的请求
- 文章和分类编辑页：标题、描述、Facebook 图片、X 图片、规范链接、不收录，以及用 AI 写标题、用 AI 写描述

启用后请清一次页面缓存，否则前台可能还是缓存里的旧标签。

1.1.0 商城（只有启用了 WooCommerce 插件才挂上这些处理。sj868 没有这个插件，前台不会跑商品逻辑）
- 商品页分享信息：类型 product、现价、货币、有货/缺货/可预订；在促销时带上原价
- 商品面包屑走商品分类
- 站点地图去掉不在目录里展示的商品；若商店设置了「隐藏缺货商品」，缺货的也不收入
- 购物车、结账、我的账户不用页面里的短代码生成简介
- 模板可用 {{ product.price }}、{{ product.sku }}、{{ product.stock }} 等
- 商品页的 Product / Offer 由本插件输出。启用结构化数据时，不再让 WooCommerce 再输出一份商品标记

上线 szbjb.com
- 上传 1.3.2。工具页只留程序化自检、链接检查、404 记录。分析自检结果和检查并补充在「AI」页
- 社交页填上同一主体网址后，首页 JSON-LD 的 Organization 里应能看到 sameAs
- 打开一台商品页，应有一份 Product / Offer，不应再有 WooCommerce 另起的一份商品 JSON-LD。商品分类或报价分类应有 ItemList
- 商品页、商品分类底部应出现相关报价或验机；文章分类底部应出现验机或同名商品分类
- 后台「工具」里可检查坏链和孤立页。自动跳转开着时，改别名会 301，并改掉其它正文里的旧链接

还没做（不影响现在 sj868 的页面）
- 从 Yoast / Rank Math 导入
- 编辑器里给链接加 nofollow 的按钮
- 旧的 404 日志不搬过来。新的 404 记在自己的表里

szbjb 有商城。1.2.0 起商品页和商品列表会输出商品结构化数据。1.3.0 起头图空 alt 写成站点名，并保证前台只有一个 h1。社交页的同一主体网址要自己填，插件不会猜官微或百科地址。

回退：停用本插件后再清一次页面缓存。
