| 后一修订版 | 前一修订版 |
| wp:post_63371 [2026/09/11 11:49] – 创建 - 外部编辑 127.0.0.1 | wp:post_63371 [2026/09/11 12:01] (当前版本) – 外部编辑 127.0.0.1 |
|---|
| ====== WordPress → DokuWiki 自动同步教程(同服务器) ====== | ====== WordPress → DokuWiki 自动同步教程(同服务器) ====== |
| |
| <strong>WordPress → DokuWiki </strong><strong>自动同步教程(本地直写文件版,无</strong><strong>RPC</strong><strong>|</strong><strong>IndexMenu</strong><strong>中文标题列表,删除自动消失)</strong> | WordPress → DokuWiki 自动同步教程(同服务器|模式A纯文本,去除HTML标签) |
| <table> | |
| <tbody> | |
| <tr> | |
| <td width="552">方案特点: | 版本:模式 A【纯文本模式,自动剥离全部 HTML 标签】 |
| ✅ <strong>不走</strong><strong> DokuWiki API/RPC</strong><strong>,直接操作服务器</strong><strong> txt </strong><strong>物理文件</strong> | |
| ✅ DokuWiki 首页列表显示<strong>中文文章标题</strong>(读取页面 H1,不是文件名) | |
| ✅ 文件名固定 post_文章ID.txt,<strong>彻底解决中文标题乱命名、</strong><strong>1.txt </strong><strong>异常问题</strong> | |
| ✅ 新增 / 修改 / 删除 WP 文章,DokuWiki 索引列表<strong>自动刷新,删除后条目立刻消失</strong> | |
| | |
| | |
| | |
| | 方案特点: |
| | ✅ 不走 DokuWiki API/RPC,直接操作服务器 txt 物理文件 |
| | ✅ DokuWiki 首页列表显示中文文章标题(读取页面 H1,不是文件名) |
| | ✅ 文件名固定 post_文章ID.txt,彻底解决中文标题乱命名、1.txt 异常问题 |
| | ✅ 自动剥离 WP 文章所有 HTML 标签,DokuWiki 页面只展示干净纯文本,不会输出代码标签 |
| | ✅ 新增 / 修改 / 删除 WP 文章,DokuWiki 索引列表自动刷新,删除后条目立刻消失 |
| ✅ 保留完整缓存自动清理,双重兜底防缓存残留 | ✅ 保留完整缓存自动清理,双重兜底防缓存残留 |
| ✅ 所有操作在 WordPress 侧触发,无需手动在 Doku 后台操作</td> | ✅ 所有操作在 WordPress 侧触发,无需手动在 Doku 后台操作 |
| </tr> | |
| </tbody> | |
| </table> | |
| <strong>一、环境与插件准备(</strong><strong>WordPress </strong><strong>端)</strong> | 一、环境与插件准备(WordPress 端) |
| <ol> | |
| <li><strong>必备插件:</strong><strong>Code Snippets</strong></li> | 必备插件:Code Snippets |
| </ol> | |
| 作用:在 WP 后台直接注入 PHP 代码,不用修改主题functions.php,升级主题不会丢失代码。 | 作用:在 WP 后台直接注入 PHP 代码,不用修改主题functions.php,升级主题不会丢失代码。 |
| <ol> | |
| <li>WP 后台 → 插件 → 安装插件</li> | WP 后台 → 插件 → 安装插件 |
| <li>搜索 Code Snippets,安装并<strong>启用</strong></li> | 搜索 Code Snippets,安装并启用 |
| </ol> | |
| <table> | |
| <tbody> | |
| <tr> | |
| <td width="552">地址:WP 官方插件库直接搜索即可</td> | 地址:WP 官方插件库直接搜索即可 |
| </tr> | |
| </tbody> | |
| </table> | |
| | |
| <table> | |
| <tbody> | |
| <tr> | |
| <td width="552">可选:WP 日志查看插件(如 WP Log Viewer),方便看代码error_log调试信息。</td> | 可选:WP 日志查看插件(如 WP Log Viewer),方便看代码error_log调试信息。 |
| </tr> | |
| </tbody> | |
| </table> | |
| <strong>二、</strong><strong>DokuWiki </strong><strong>端准备</strong> | 二、DokuWiki 端准备 |
| <ol> | |
| <li><strong>安装</strong><strong> IndexMenu </strong><strong>插件</strong></li> | 安装 IndexMenu 插件 |
| </ol> | |
| <table> | |
| <tbody> | |
| <tr> | |
| <td width="552">作用:在 Doku 首页生成文章列表,<strong>读取页面内</strong><strong> H1 </strong><strong>标题展示中文名称</strong>(核心!实现文件名是英文 post_xx,前端显示中文标题)</td> | 作用:在 Doku 首页生成文章列表,读取页面内 H1 标题展示中文名称(核心!实现文件名是英文 post_xx,前端显示中文标题) |
| </tr> | |
| </tbody> | |
| </table> | |
| <ol> | |
| <li>DokuWiki 后台 → 插件管理器(Extension Manager)</li> | DokuWiki 后台 → 插件管理器(Extension Manager) |
| <li>搜索 IndexMenu,在线安装</li> | 搜索 IndexMenu,在线安装 |
| <li>确认插件启用</li> | 确认插件启用 |
| <li><strong>创建命名空间</strong><strong> wp</strong></li> | 创建命名空间 wp |
| <li>访问 Doku,新建页面:wp:start</li> | 访问 Doku,新建页面:wp:start |
| <li>在页面内粘贴下面代码(<strong>开启页面无缓存</strong><strong> + IndexMenu </strong><strong>渲染列表</strong>)</li> | 在页面内粘贴下面代码(开启页面无缓存 + IndexMenu 渲染列表) |
| </ol> | |
| <table> | |
| <tbody> | |
| <tr> | |
| <td width="552">Plain Text | Plain |
| ~~NOCACHE~~ | ~~NOCACHE~~ |
| {{indexmenu>wp#1|-h1 noself sort=mtime sortdir=desc}}</td> | {{indexmenu>wp#1|-h1 noself sort=mtime sortdir=desc}} |
| </tr> | |
| </tbody> | |
| </table> | |
| <ul> | |
| <li>~~NOCACHE~~:强制每次打开这个页面实时渲染,作为缓存兜底保险</li> | ~~NOCACHE~~:强制每次打开这个页面实时渲染,作为缓存兜底保险 |
| <li>indexmenu>wp#1:扫描 wp 命名空间下一级页面</li> | indexmenu>wp#1:扫描 wp 命名空间下一级页面 |
| <li>-h1:<strong>读取页面内部</strong><strong> H1 </strong><strong>标题作为列表显示文字(最关键参数)</strong></li> | -h1:读取页面内部 H1 标题作为列表显示文字(最关键参数) |
| <li>noself:不显示 wp:start 自身</li> | noself:不显示 wp:start 自身 |
| <li>sort=mtime:按文章修改时间排序</li> | sort=mtime:按文章修改时间排序 |
| <li>sortdir=desc:新文章排在最上面</li> | sortdir=desc:新文章排在最上面 |
| </ul> | |
| <table> | |
| <tbody> | |
| <tr> | |
| <td width="552">保存页面,Doku 访问地址示例:https://你的wiki域名/doku.php?id=wp</td> | 保存页面,Doku 访问地址示例:https://你的wiki域名/doku.php?id=wp |
| </tr> | |
| </tbody> | |
| </table> | |
| <ol start="3"> | |
| <li><strong>服务器目录权限(非常关键!)</strong></li> | |
| </ol> | 服务器目录权限(非常关键!) |
| 路径:/www/wwwroot/htdocs/addons/wiki/data/ | 路径:/www/wwwroot/htdocs/addons/wiki/data/ |
| 需要保证 PHP 运行用户(一般是www用户)拥有下面目录<strong>读写</strong><strong> + </strong><strong>删除权限</strong> | 需要保证 PHP 运行用户(一般是www用户)拥有下面目录读写 + 删除权限 |
| <ol> | |
| <li>data/pages/wp/:创建、写入、删除 txt 页面文件</li> | data/pages/wp/:创建、写入、删除 txt 页面文件 |
| <li>data/meta/wp/:创建、写入、删除 meta 元数据文件</li> | data/meta/wp/:创建、写入、删除 meta 元数据文件 |
| <li>data/cache/ + data/cache/indexmenu/:<strong>删除缓存文件(解决删除文章列表残留)</strong></li> | data/cache/ + data/cache/indexmenu/:删除缓存文件(解决删除文章列表残留) |
| </ol> | |
| 推荐权限设置(BT 面板终端执行) | 推荐权限设置(BT 面板终端执行) |
| <table> | |
| <tbody> | |
| <tr> | |
| <td width="552">bash | bash |
| chown -R www:www /www/wwwroot/htdocs/addons/wiki/data | chown -R www:www /www/wwwroot/htdocs/addons/wiki/data |
| chmod -R 755 /www/wwwroot/htdocs/addons/wiki/data</td> | chmod -R 755 /www/wwwroot/htdocs/addons/wiki/data |
| </tr> | |
| </tbody> | |
| </table> | |
| <strong>三、</strong><strong>WordPress Code Snippets </strong><strong>代码部署</strong> | 三、WordPress Code Snippets 代码部署(模式 A:纯文本,去除 HTML 标签) |
| <ol> | |
| <li>WP 后台 → Snippets → Add New</li> | WP 后台 → Snippets → Add New |
| <li>名称:WP同步DokuWiki(本地直写postID命名,IndexMenu)</li> | 名称:WP同步DokuWiki(本地直写postID命名|模式A纯文本,清除HTML) |
| <li>粘贴下面完整代码</li> | 粘贴下面完整代码 |
| <li>选择:<strong>Run snippet everywhere</strong><strong>(全站生效)</strong></li> | 选择:Run snippet everywhere(全站生效) |
| <li>保存并启用</li> | 保存并启用 |
| </ol> | |
| <table> | |
| <tbody> | |
| <tr> | |
| <td width="552">php | php |
| <?php | <?php |
| /** | /** |
| * WP同步DokuWiki【本地直写文件版,无RPC】 | * WP同步DokuWiki【本地直写文件版,无RPC|模式A:纯文本模式,自动清除HTML标签】 |
| * 固定post_文章ID生成文件名,页面内保留中文H1标题,IndexMenu读取H1展示中文目录 | * 固定post_文章ID生成文件名,页面内保留中文H1标题,IndexMenu读取H1展示中文目录 |
| * 自动清理页面缓存、wp:start索引缓存、IndexMenu插件缓存;删除文章索引条目自动消失 | * 自动清理页面缓存、wp:start索引缓存、IndexMenu插件缓存;删除文章索引条目自动消失 |
| */ | */ |
| add_action('save_post', 'wp_save_to_dokuwiki_file', 20, 2); | add_action('save_post', 'wp_save_to_dokuwiki_file', 20, 2); |
| add_action('before_delete_post', 'wp_delete_dokuwiki_file'); | add_action('before_delete_post', 'wp_delete_dokuwiki_file');function wp_save_to_dokuwiki_file($post_id, $post) { |
| | |
| function wp_save_to_dokuwiki_file($post_id, $post) { | |
| // ======================【配置区,请核对服务器路径】====================== | // ======================【配置区,请核对服务器路径】====================== |
| $wiki_root = '/www/wwwroot/htdocs/addons/wiki/'; //DokuWiki根目录,末尾带斜杠 | $wiki_root = '/www/wwwroot/htdocs/addons/wiki/'; //DokuWiki根目录,末尾带斜杠 |
| $file_path = $wiki_page_root . $pagename . '.txt'; | $file_path = $wiki_page_root . $pagename . '.txt'; |
| $meta_path = $wiki_meta_root . $pagename . '.meta'; | $meta_path = $wiki_meta_root . $pagename . '.meta'; |
| // DokuWiki正文模板:首行H1标题,IndexMenu通过-h1读取这个中文标题用于列表展示 | // ============【核心:strip_tags清除全部HTML标签,只保留纯文字】============ |
| $wiki_content = "====== {$raw_title} ======\n\n" . $post->post_content; | $clean_content = strip_tags($post->post_content); |
| | $wiki_content = "====== {$raw_title} ======\n\n" . $clean_content; |
| |
| // 自动创建wp目录(不存在时) | // 自动创建wp目录(不存在时) |
| } | } |
| error_log("DokuWiki页面已删除 wp:{$pagename}"); | error_log("DokuWiki页面已删除 wp:{$pagename}"); |
| }</td> | } |
| </tr> | |
| </tbody> | |
| </table> | |
| | |
| <table> | |
| <tbody> | |
| <tr> | |
| <td width="552">⚠️ 重点:修改代码第一部分$wiki_root路径,<strong>和你服务器实际</strong><strong> Doku </strong><strong>根目录保持一致!</strong></td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <strong>四、测试流程(一步一步验证)</strong> | |
| <ol> | |
| <li>在 WordPress 新建一篇文章,发布</li> | |
| <li>打开服务器目录 /wiki/data/pages/wp/,看到生成 txt</li> | |
| <li>打开 Doku 的 wp 页面,列表出现<strong>中文标题</strong>(取自文章 H1)</li> | |
| <li>在 WP 编辑修改文章并更新 → Doku 内容更新,列表标题同步更新</li> | |
| <li>在 WP 后台<strong>删除该文章</strong></li> | |
| <li>服务器上txt自动消失,<strong>Doku wp </strong><strong>页面刷新,这条条目直接消失</strong></li> | |
| </ol> | |
| <table> | |
| <tbody> | |
| <tr> | |
| <td width="552">调试手段:访问 wiki 地址追加 &purge=true,强制页面清缓存: | |
| https://你的wiki域名/doku.php?id=wp&purge=true</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <strong>五、原理说明(方便后期维护)</strong> | |
| <ol> | |
| <li><strong>文件名</strong>:post_文章txt,永久唯一,不受标题字符影响;</li> | |
| <li><strong>Doku </strong><strong>列表中文来源</strong>:IndexMenu -h1 参数读取 txt 文件第一行 ======文章标题======,<strong>列表展示这个中文,和文件名无关</strong>;</li> | |
| <li><strong>缓存机制</strong>:</li> | |
| </ol> | |
| <ul> | |
| <li>WP 发布 / 删除文章时,PHP 自动删除:文章页面缓存 + wp:start 索引页面缓存 + IndexMenu 插件目录树缓存</li> | |
| <li>~~NOCACHE~~ 作为兜底,就算代码缓存清理失效,页面每次访问都会实时扫描文件;</li> | |
| </ul> | |
| <ol start="4"> | |
| <li><strong>限制说明</strong>:</li> | |
| </ol> | |
| <ul> | |
| <li>仅同步 WP 的post类型文章(普通文章,不是 page 页面,如需同步页面,修改$post->post_type判断)</li> | |
| <li>只同步<strong>已发布</strong><strong> publish</strong>的文章,草稿、自动保存不会生成 Doku 页面</li> | |
| <li>直接操作 Doku 底层 txt 文件,<strong>不要在</strong><strong> DokuWiki </strong><strong>后台手动编辑</strong><strong> wp </strong><strong>命名空间下文章</strong>,会造成文件冲突。</li> | |
| </ul> | |
| <strong>六、常见故障排查清单</strong> | |
| <table> | |
| <tbody> | |
| <tr> | |
| <td width="200">现象</td> | |
| <td width="200">排查方向</td> | |
| </tr> | |
| <tr> | |
| <td width="200">WP 发布文章,服务器 wp 目录没有生成 txt</td> | |
| <td width="200">1. 核对$wiki_root路径;2. 检查 www 用户读写权限;3. 看 WP 错误日志</td> | |
| </tr> | |
| <tr> | |
| <td width="200">文件生成成功,Doku 列表看不到中文标题</td> | |
| <td width="200">1. 确认 IndexMenu 插件启用;2.indexmenu 代码必须带 -h1;3.txt 第一行======标题======不能换行 / 空格错误</td> | |
| </tr> | |
| <tr> | |
| <td width="200">WP 删除文章,Doku 列表还残留旧条目</td> | |
| <td width="200">1. 确认 www 用户有<strong>删除</strong><strong> cache </strong><strong>目录文件权限</strong>;2.wp:start 页面加上~~NOCACHE~~;3. 手动进data/cache/indexmenu删除全部缓存文件测试</td> | |
| </tr> | |
| <tr> | |
| <td width="200">文件名又变成 1.txt</td> | |
| <td width="200">当前代码已经固定 post_id 命名,不会出现;旧版本代码才会有这个问题</td> | |
| </tr> | |
| <tr> | |
| <td width="200">日志报 glob 警告</td> | |
| <td width="200">代码内已增加is_array($files)判断,不会再产生警告</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <strong>七、维护建议</strong> | |
| <ol> | |
| <li>不要在 Doku 后台手动修改wp:下面页面,所有内容由 WP 单方面管理;</li> | |
| <li>定期备份 Doku data/pages/wp、data/meta/wp目录;</li> | |
| <li>如果后续需要过滤 WP 文章里的 HTML 标签、短代码写入 Doku,可以扩展代码;</li> | |
| <li>服务器迁移时,<strong>同步修改代码里</strong><strong>$wiki_root</strong><strong>路径</strong>,否则失效。</li> | |
| </ol> | |
| | |
| |
| 要不要我把教程单独导出成 Markdown 文本,方便你保存到本地或者 wiki 里直接粘贴? | |
| |
| |(注:部分内容可能由 AI 生成) | |
| | ⚠️ 重点:修改代码第一部分$wiki_root路径,和你服务器实际 Doku 根目录保持一致! |
| | |
| | |
| | |
| | 四、测试流程(一步一步验证) |
| | |
| | 进入 WP 后台 → Code Snippets,停用旧版本代码片段,启用上面新模式 A 代码 |
| | 在 WordPress 新建一篇文章,发布 |
| | 打开服务器目录 /wiki/data/pages/wp/,看到生成 txt |
| | 打开 Doku 的 wp 页面,列表出现中文标题,文章内容为纯文本,不再出现 HTML 标签代码 |
| | 在 WP 编辑修改文章并更新 → Doku 内容更新 |
| | 在 WP 后台删除该文章 |
| | 服务器上txt自动消失,Doku wp 页面刷新,这条条目直接消失 |
| | |
| | |
| | |
| | |
| | ⚠️ 重要:已经同步完成的旧文章,需要在 WP 后台打开文章,点一次【更新】,才会重新生成清除 HTML 后的干净文本;新发布文章自动生效。 |
| | 调试手段:访问 wiki 地址追加 &purge=true,强制页面清缓存: |
| | https://你的wiki域名/doku.php?id=wp&purge=true |
| | |
| | |
| | |
| | 五、原理说明(方便后期维护) |
| | |
| | 文件名:post_文章txt,永久唯一,不受标题字符影响; |
| | HTML 处理:strip_tags() 函数自动剔除所有 HTML 标签,只保留正文文字,Doku 页面干净无代码; |
| | Doku 列表中文来源:IndexMenu -h1 参数读取 txt 文件第一行 ======文章标题======,列表展示这个中文,和文件名无关; |
| | 缓存机制: |
| | |
| | |
| | WP 发布 / 删除文章时,PHP 自动删除:文章页面缓存 + wp:start 索引页面缓存 + IndexMenu 插件目录树缓存 |
| | ~~NOCACHE~~ 作为兜底,就算代码缓存清理失效,页面每次访问都会实时扫描文件; |
| | |
| | |
| | 限制说明: |
| | |
| | |
| | 仅同步 WP 的post类型文章(普通文章,不是 page 页面,如需同步页面,修改$post->post_type判断) |
| | 只同步已发布 publish的文章,草稿、自动保存不会生成 Doku 页面 |
| | 直接操作 Doku 底层 txt 文件,不要在 DokuWiki 后台手动编辑 wp 命名空间下文章,会造成文件冲突。 |
| | 模式 A 仅输出纯文字,所有富格式(加粗、表格、图片、链接)都会被移除,只保留文字内容。 |
| | |
| | 六、常见故障排查清单 |
| | |
| | |
| | |
| | 现象 |
| | 排查方向 |
| | |
| | |
| | WP 发布文章,服务器 wp 目录没有生成 txt |
| | 1. 核对$wiki_root路径;2. 检查 www 用户读写权限;3. 看 WP 错误日志 |
| | |
| | |
| | 文件生成成功,Doku 列表看不到中文标题 |
| | 1. 确认 IndexMenu 插件启用;2.indexmenu 代码必须带 -h1;3.txt 第一行======标题======不能换行 / 空格错误 |
| | |
| | |
| | WP 删除文章,Doku 列表还残留旧条目 |
| | 1. 确认 www 用户有删除 cache 目录文件权限;2.wp:start 页面加上~~NOCACHE~~;3. 手动进data/cache/indexmenu删除全部缓存文件测试 |
| | |
| | |
| | 旧文章依然显示 HTML 代码 |
| | 旧文章需要在 WP 后台打开文章,点击【更新】,重新触发同步生成干净内容;新文章直接正常 |
| | |
| | |
| | 日志报 glob 警告 |
| | 代码内已增加is_array($files)判断,不会再产生警告 |
| | |
| | |
| | |
| | 七、维护建议 |
| | |
| | 不要在 Doku 后台手动修改wp:下面页面,所有内容由 WP 单方面管理; |
| | 定期备份 Doku data/pages/wp、data/meta/wp目录; |
| | 如果后续想要保留加粗 / 表格等排版,可以切换到【模式 B HTML 转 Doku 语法】版本; |
| | 服务器迁移时,同步修改代码里\\$wiki_root**路径,否则失效。 |
| | |
| | 1789099274-WordPress → DokuWiki 自动同步教程(本地直写文件版,无RPC|IndexMenu中文标题列表,删除自动消失) |