=== KennyDTC Smart Publisher ===
Contributors: KennyDTC
Tags: content import, scheduled posts, image sideload, Yoast SEO, bulk publishing
Requires at least: 6.2
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.6.1
License: GPLv2 or later

把其他项目生成的文章、图片和 SEO 信息快速导入 WordPress，在人工审核后定时或批量错峰发布。

== 1.6.1 修复说明 ==

修复在“本批文章分类”勾选分类后直接发布或排期，统一分类被忽略而仍使用 Blog 等旧分类的问题。
统一分类随批量立即发布、按每篇时间排期和错峰排期提交保存；无需先点击“应用并保存分类”。
替换会移除未勾选的旧分类，追加会保留旧分类；统一分类优先于文章卡片分类。
统一分类区不预勾选默认分类，避免无意覆盖单篇修改；默认导入分类仍在导入时应用。
发布时读取所选卡片当前分类，不依赖是否触发勾选变更事件。
已排期、已发布的旧文章不会仅因升级自动变更分类，可通过 WordPress 原生快速编辑纠正并保留原计划时间。
直接上传 ZIP 替换当前插件，详细说明见 docs/UPGRADE-1.6.1.md。

== 1.6.0 升级说明 ==

前台 Home 与 Table of Contents 默认英文，可在插件设置切换中文。
修复分类勾选被误当作正文未保存修改而阻止批量发布：分类随发布或排期一并保存。
新增默认导入分类统一管理，以及错峰排期区的整批分类替换／追加，覆盖其他分页的待审核文章。
正文、标题与 SEO 未保存提醒保留；批次分类不会修改其他批次或已发布、已排期文章。
直接上传 ZIP 替换当前插件，详细说明见 docs/UPGRADE-1.6.0.md。

== 1.5.1 修复说明 ==

修复含较大内嵌图片的 DOCX 导入后正文为空：SEO 信息提取改用 DOM 段落解析，避免正则回溯上限导致整篇正文丢失。
增加正文解析前后及优化后的空内容检查，失败时返回明确错误，不再创建空白草稿。
用实际报告文件验证正文段落、图片、WebP 特色图和 SEO 字段。
已在旧版导入成空白的文章需要从原始 DOCX 重新导入；升级无法恢复未保存的正文。
直接上传 ZIP 替换当前插件，不要先卸载。详细说明见 docs/UPGRADE-1.5.1.md。

== 1.5.0 升级说明 ==

新增 Yoast 自动设置开关：智能发布 → 插件设置 → 分类与 SEO，默认开启。
关闭后不生成或写入 SEO 标题、描述、焦点关键词，也不清空旧 TDK；文章正文、Slug 和摘要仍可正常保存。
审核页中的 TDK 显示为只读，仍可在 Yoast 自身面板手动编辑。重新开启本身不会批量改写旧文章。

新增按日、按周、按月的错峰排期：选择每周期篇数、开始／截止时间、文章最小间隔及每天发布时段。
按周可选星期；按月可选每月 1–31 日的日期范围。自然周为周一至周日，自然月为每月首日至末日。
间隔支持分钟、小时、天、周、月。篇数为上限，不是平均分配；按列表顺序寻找满足所有规则的最早时刻。
截止时间可留空以继续后续周期；填写后若容纳不下全部所选文章，本批不会执行排期。
既有导入文章（含其他批次的已发布及已排期文章）计入本周期上限。

安装：直接上传本 ZIP 并选择替换当前插件，无需先卸载。完整规则和示例见 docs/UPGRADE-1.5.0.md。

== 1.4.0 升级说明 ==

已修复：草稿错峰排期变成立即发布；跨批次排期冲突；Yoast 关键词字段识别和双向同步。
后台改为浅色工作台，新增搜索结果预览、未保存修改提示、审核分页和逾期状态提示。

安装：WordPress 后台 → 插件 → 安装插件 → 上传插件，选择本 ZIP，点击“使用上传的插件替换当前插件”。
保持插件目录 kenny-dtc-smart-publisher 不变。无需先删除插件，既有文章和设置继续使用。

错峰发布：导入 → 审核并保存 → 勾选文章 → 设置开始时间、间隔、每日上限、时间段 → 确认错峰排期。
“立即发布”会将所选文章同时上线，不使用错峰参数。
旧版已误发布的文章不会自动下线；在“发布队列 → 已发布”中选择文章并点击“移回草稿重新排期”。

关键词：优先使用文件中明确填写的单个焦点短语。DOCX 可单独填写“关键词：马赛克拼图”。
JSON/XLSX 推荐使用 focus_keyphrase 字段；同时兼容 keyword、keywords、focus_keyword、中文关键词字段和 Yoast 原字段。
自动生成的关键词是可编辑建议；界面出现位置检查不是 Yoast SEO 分数，也不保证搜索排名。
启用 Yoast 时，WordPress 原生编辑页的 SEO 字段请在 Yoast 面板编辑，以免两个面板互相覆盖。

完整修改说明和验证范围见 docs/UPGRADE-1.4.0.md；界面截图见 docs/preview-import.png。

== 主要功能 ==

* 单篇或多篇复制粘贴，支持富文本、HTML 和常用 Markdown。
* 上传 DOCX、XLSX、JSON；一次可选多个文件。
* DOCX 智能识别封面主标题；保留颜色、字号、段落间距、提示色块、表格底色与边框、合并单元格、标题层级、列表、文字格式、超链接、图注和内嵌图片；缺少标题样式时按首段、编号、字号和加粗智能推断层级。
* 下载远程图片或内嵌图片到媒体库，替换正文网址。
* 自动生成图片文件名、ALT、Caption；特色图支持完整保留以及左/中/右/上/下取景。
* 自动把新静态图片转换并压缩为 WebP，可限制最大宽度和调整质量。
* 自动使用语义 Figure 排版图片，并把单独上传的图片均匀放入正文段落。
* 优先按分类名称精确匹配网站现有分类，无法匹配时按正文推荐。
* 自动生成 SEO Title、Meta Description、Focus Keyphrase、Slug 和摘要。
* Yoast 自动设置默认开启，可关闭以停止生成与写入 TDK，并保留旧字段。
* 每篇指定日期时间，或按日／周／月周期、星期／日期范围、最小间隔和起止时间错峰排期。
* 导入后直接在审核队列实时编辑标题、正文层级、分类、TDK、发布时间和特色图。
* 审核队列内支持单篇或批量保存、立即发布、定时发布、错峰排期和移入回收站。
* 发布队列按“待发布、已发布、回收站”分栏，支持标题/正文关键词搜索、日期筛选、编辑和恢复。
* 清理 Word/Google Docs 多余 HTML：删除无效代码、无用 class/id、空标签、注释和连续空格，同时保留 DOCX 导入器生成的安全排版样式。
* 自动生成“首页 > 分类 > 文章”面包屑与 H2/H3 可折叠文章目录。
* 按关键词搜索正文并插入自定义锚文本 URL，支持次数、Follow/Nofollow/Sponsored 和新窗口规则。

== 安装 ==

1. WordPress 后台进入“插件 > 安装插件 > 上传插件”。
2. 上传 kenny-dtc-smart-publisher.zip 并启用。
3. 左侧菜单进入“智能发布 > 插件设置”检查默认规则。
4. 进入“智能导入”粘贴文章或上传文件。

== 推荐流程 ==

智能导入 -> 在内容审核页直接编辑/发布/删除 -> 指定或批量排期 -> 发布队列。

插件不会在导入时直接公开文章。所有内容先保存为草稿，确认后才加入 WordPress 的定时发布队列。

== 批量粘贴格式 ==

多篇文章之间使用下列分隔符：

===ARTICLE===

如果没有分隔符，批量模式也会尝试按多个 H1 或 Markdown # 标题拆分。

可选的文章头信息示例：

---
Title: Article title
Category: Existing category name
SEO Title:
Meta Description:
Focus Keyphrase:
Publish At: 2026-09-01 09:30:00
---

正文从这里开始。

== XLSX 与 JSON 字段 ==

title, content, images, categories, scheduled_at, seo_title, meta_description, focus_keyphrase, slug, excerpt

XLSX 第一行必须是字段名，每一行是一篇文章。images 和 categories 有多个值时可用逗号、分号或竖线分隔。JSON 可直接使用文章数组，或使用 {"articles": [...]}。

== 服务器要求 ==

* PHP 7.4 或更高版本。
* WordPress 6.2 或更高版本。
* DOCX/XLSX 解析需要 PHP ZipArchive。
* 图片和 DOCX 解析需要 DOM；XLSX 需要 SimpleXML。
* PHP 必须允许 WordPress 写入 uploads 和临时目录。

== 定时发布提示 ==

插件使用 WordPress 原生 future 状态和发布事件。低访问量网站仅依赖 WP-Cron 时可能延迟。正式站建议在服务器控制面板中每 5 分钟调用一次 wp-cron.php，或配置系统 Cron 后禁用页面访问触发的 WP-Cron。

== 图片与 WebP ==

新导入的 JPG、PNG、WebP、AVIF 静态图片会在进入媒体库前通过 WordPress 图片编辑器转换为 WebP。默认质量为 82，最大宽度为 1920px。动态 GIF 为防止丢失动画而保留原格式；服务器不支持 WebP 时也会安全保留原图。

默认将正文第一张图额外生成特色图片文件，并使用“完整保留”模式避免切掉文字封面。审核队列会显示完整图而非方形缩略图，可逐篇改成居中、左侧、右侧、顶部或底部取景；正文原图始终不变。可以在“智能发布 > 插件设置 > 图片处理”中修改默认模式和目标尺寸。

== HTML 清理 ==

导入及正式排期前都会清除 Word、WPS 和 Google Docs 常见的脏代码，包括不受信任的内联 style、无用 class/id、HTML 注释、空标签、连续不换行空格和多余 DIV/SPAN/FONT 包装。链接、图片、表格结构及 DOCX 导入器生成并经过白名单过滤的排版样式会保留。

== 面包屑与文章目录 ==

文章前端默认显示简洁面包屑和可折叠目录。目录自动读取 H2/H3，生成唯一锚点，不把导航 HTML 永久写入正文，因此分类、文章标题或固定链接变化后仍会自动更新。可在插件设置中分别关闭。

== 锚文本规则 ==

进入“智能发布 > 锚文本规则”，为每条规则填写搜索关键词、显示锚文本、目标 URL、每篇次数和链接属性。插件不会修改 H1-H6、代码块或已经存在的链接。建议每条规则每篇最多 1 次，并设置每篇总链接上限。

== TDK 说明 ==

Google 已基本不使用传统 Meta Keywords。插件把“K”写入 Yoast Focus Keyphrase，不输出无效的 meta keywords 标签。自动生成采用本地规则，不会把文章发送给外部 AI 服务；发布前应人工审核。

== 数据安全 ==

仅具备编辑他人文章权限的用户可以导入和排期。所有写操作带 WordPress nonce 校验，远程图片地址通过 WordPress 安全 URL 校验。卸载插件不会删除已经导入的文章或媒体。

插件不会统计安装域名，不会收集 WordPress 管理员邮箱，不会上传文章内容，也不会发送隐藏追踪请求。插件设置页中的 KennyDTC 官方资源链接仅在 WordPress 管理后台显示；只有管理员主动点击时才会访问官网，并携带用于识别插件来源的 UTM 参数。

== 官方资源 ==

* 下载页：https://kennydtc.com/wordpress-smart-publisher/
* 使用教程：https://kennydtc.com/wordpress-smart-publisher/#installation
* 更新日志：https://kennydtc.com/wordpress-smart-publisher/#changelog
* 问题反馈：https://kennydtc.com/contact/

== Changelog ==

= 1.4.0 =
* Rebuilt admin workspace and responsive review flow.
* Fixed draft scheduling with explicit edit_date and checked native cron/state.
* Allocated staggered dates against other imported scheduled/published posts with an atomic batch lock.
* Added strict local datetime validation, publish permission checks, and reliable publish-now behavior.
* Fixed Yoast field aliases, explicit DOCX metadata extraction, canonical field synchronization and indexable refresh.
* Preserved user-written keyphrases and SEO during structural repair.
* Fixed repeated image normalization, Excel timezone drift, shared-media metadata overwrites, and custom anchor reprocessing.
* Added archive/download bounds, import limit feedback, unsaved edit checks, review pagination and published-to-draft recovery.


= 1.3.1 - 2026-09-09 =

* 重写 DOCX 正文解析流程，按照 Word 文档中的真实区块顺序导入段落、表格和图片。
* 支持 Word 表格、横向/纵向合并单元格和表头，并为手机端增加横向滚动排版。
* 保留原稿颜色、字号、段落间距、对齐方式、提示色块、表格底色与列宽，以及标题、列表和常用文字格式。
* 支持 Word 复杂域超链接，保留内嵌图片原始 ALT，并避免与原稿图注重复。
* 优先识别封面中的大字号主标题；无标题样式时继续按首段、编号、字号和加粗推断标题层级。
* Word 固定分页及页眉页脚转换为网页连续排版。
* 修复表格内容被拆成普通段落、图片集中到段落末尾、排版混乱，以及部分环境写入内嵌图片临时文件时的致命错误。

= 1.3.0 - 2026-08-28 =

* 重做智能导入页：复制粘贴与文件上传并排，导入按钮位于两种方式中间，隐藏冗长识别规则与文件字段说明。
* 修复内容审核页错峰排期栏中“文章间隔、每日上限”输入框与单位错位的问题，并适配窄屏。
* 发布队列升级为文章管理中心，增加待发布、已发布、回收站三个状态分栏及数量统计。
* 增加标题、正文、摘要关键词搜索，以及开始/结束日期筛选和分页。
* 已发布文章可继续编辑，回收站文章支持“恢复并编辑”及批量恢复到内容审核。
* 队列以 WordPress 实际文章状态为准，修复文章发布或删除后从插件页面消失的问题。

= 1.2.2 - 2026-08-28 =

* 修复 Word 标题使用手动换行时把副标题一并写入文章标题和 Slug 的问题。
* 混合中英文标题默认生成简短 ASCII Slug，例如 2026-guest-post。
* 已发布文章的 KennyDTC 审核框增加“修复标题、短链接、TDK与文章导航”入口。
* 审核页检测 WordPress 固定链接中的日期结构，并提供“文章名”设置入口。
* 明确文章目录产生的 #section-N 是页内锚点，不属于文章永久链接。

= 1.2.1 - 2026-08-28 =

* 清理文件名式文章标题、SEO Title、焦点关键词和 Slug，不再把下划线写入 Yoast TDK。
* Meta Description 改为提取正文第一段有信息量的内容，跳过重复标题和封面副标题。
* 审核队列增加“重新识别旧稿标题、TDK与导航”，可修复已经导入的旧草稿而无需重新上传。
* 旧稿修复会根据中文编号、数字编号和加粗短段落恢复 H2/H3，供文章目录读取。
* 放宽前台导航的主题兼容条件，修复部分自定义主题不显示面包屑的问题。
* 审核卡片增加面包屑与文章目录预览，并明确 Gutenberg 编辑器不会显示前台动态导航。

= 1.2.0 - 2026-08-28 =

* 重做内容审核页：无需进入 WordPress 文章编辑器，即可实时编辑标题、正文、H2/H3、分类、Yoast TDK、发布时间和特色图。
* 增加单篇与批量立即发布、定时发布、错峰排期和移入回收站操作。
* DOCX 在缺少 Word 标题样式时，按首段、中文/数字编号、字号和加粗推断标题层级。
* 首个文字段落直接作为文章标题，避免错误使用上传文件名。
* 特色图默认完整保留文字封面，并支持左/中/右/上/下焦点重裁。
* 禁止为特色图派生文件再次生成方形缩略图，修复 Gutenberg 右侧预览显示为错误局部的问题。

= 1.1.2 - 2026-08-28 =

* 修复 DOCX 标题层级丢失：读取 styles.xml、样式继承和段落大纲级别，正确恢复 H1-H6。
* 文档第一个 H1 自动作为 WordPress 文章标题，正文继续保留 H2/H3，额外 H1 自动降为 H2。
* 增加独立特色图裁剪，默认生成 1200 × 675 居中裁剪附件，避免主题调用整张原图。
* 增加特色图裁剪开关与宽高设置，正文中的原始图片保持不变。

= 1.1.1 - 2026-08-27 =

* 在插件设置页增加官方下载、教程、更新日志、问题反馈、SEO 内容规划和外链方案入口。
* 明确数据隐私说明：不统计安装域名、不收集管理员邮箱、不上传文章内容、不发送隐藏追踪请求。
* 所有官网入口仅显示在 WordPress 管理后台，并统一增加来源识别参数。
* 加强 DOCX/XLSX XML 解析与内嵌图片的大小限制，降低异常文件造成的资源风险。

= 1.1.0 - 2026-08-27 =

* 增加图片 Figure/Caption 自动排版与 WebP 转换压缩。
* 增加 Word/Docs HTML 清理、文章面包屑、H2/H3 可折叠目录。
* 增加关键词锚文本规则及 Follow、Nofollow、Sponsored 选项。
