把 DeepSeek 接进 WordPress,做成一条“生成—排版—发布”的自动化流水线,这件事本身并不复杂,难的是把每个环节的边界划清楚:哪些交给模型,哪些交给代码,哪些必须留给人来把关。这篇教程按可落地的顺序,从获取 API Key 开始,一路写到定时自动发布,中间会给出可直接改造的 PHP 代码和几个容易踩的坑。
需要先说明一点:所谓“一键自动发布”,指的是把重复劳动压缩成一次触发,而不是完全撒手不管。搜索引擎对纯机器批量产出内容的容忍度越来越低,所以下面会在关键节点留出人工审核的开关,你可以根据自己的风险偏好决定是否跳过。

整体架构:请求是怎么走完一圈的
在动手写代码前,先把数据流向理清楚。整条链路的核心是 WordPress 的 wp_remote_post() 函数,它负责向 DeepSeek 的接口发起请求,拿到返回的 JSON 后再解析、组装成文章数组,最后交给 wp_insert_post() 写入数据库。
flowchart TD
A["触发:定时任务或手动按钮"] --> B["读取关键词与提示词模板"]
B --> C["wp_remote_post 请求 DeepSeek API"]
C --> D{"返回状态码 200"}
D -->|是| E["解析 JSON 取出正文"]
D -->|否| F["记录错误日志并终止"]
E --> G["组装 post_title / post_content"]
G --> H["wp_insert_post 写入草稿或直接发布"]
H --> I["写入 SEO 元数据与标签"]
I --> J["可选:推送搜索引擎"]这张图里有一个判断节点,它对应的是实际开发中最容易被忽略的部分——接口失败时的处理。DeepSeek 的接口偶尔会返回 429(请求过于频繁)或 503,如果不做重试和日志,你会以为文章发出去了,实际上什么都没写进数据库。
第一步:拿到 DeepSeek 的 API Key
DeepSeek 的接口与 OpenAI 的 Chat Completions 格式基本兼容,这意味着你现有的很多 OpenAI 代码可以稍作修改就复用。先到 DeepSeek 开放平台注册账号,在控制台里创建一个 API Key,复制下来妥善保存——它只会完整显示一次。
接口的基础地址是 https://api.deepseek.com,对话补全的路径为 /chat/completions。目前常用的模型标识是 deepseek-chat,如果你的场景需要更强的推理能力,可以换成对应的推理模型,但成本和响应时间都会上升。
把 Key 存进 wp-config.php 是个稳妥的做法,避免它出现在主题文件里被误提交到版本库:
define( 'DEEPSEEK_API_KEY', 'sk-你的密钥' );
define( 'DEEPSEEK_API_URL', 'https://api.deepseek.com/chat/completions' );这样做的好处是,即使主题被导出或分享,密钥也不会跟着泄露。如果你用的是多站点,每个站点可以定义不同的常量值。
第二步:写一个封装好的请求函数
不要在业务逻辑里直接拼接口调用,先写一个通用的请求函数,把鉴权、超时、错误处理都收拢在一处。下面这段代码可以放进主题的 functions.php,或者更规范一点,做成一个小型插件。
function deepseek_request( $prompt, $system = '', $max_tokens = 3000 ) {
$messages = array();
if ( $system ) {
$messages[] = array( 'role' => 'system', 'content' => $system );
}
$messages[] = array( 'role' => 'user', 'content' => $prompt );
$body = array(
'model' => 'deepseek-chat',
'messages' => $messages,
'max_tokens' => $max_tokens,
'temperature' => 0.7,
);
$response = wp_remote_post(
DEEPSEEK_API_URL,
array(
'timeout' => 120,
'headers' => array(
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . DEEPSEEK_API_KEY,
),
'body' => wp_json_encode( $body ),
)
);
if ( is_wp_error( $response ) ) {
error_log( 'DeepSeek 请求失败:' . $response->get_error_message() );
return false;
}
$code = wp_remote_retrieve_response_code( $response );
if ( 200 !== $code ) {
error_log( 'DeepSeek 返回状态码:' . $code );
return false;
}
$data = json_decode( wp_remote_retrieve_body( $response ), true );
return isset( $data['choices'][0]['message']['content'] )
? $data['choices'][0]['message']['content']
: false;
}这里把 timeout 设成 120 秒是有原因的。生成长文时,模型输出几千个 token 可能需要几十秒,默认的 5 秒超时几乎必然失败。temperature 设为 0.7 是内容创作场景的常用值,如果你希望输出更稳定、更少发散,可以降到 0.3 到 0.5 之间。
第三步:设计能产出 SEO 文章的提示词
模型输出质量的上限,很大程度上由提示词决定。不要只丢一个关键词过去,那样得到的大概率是泛泛而谈的段落。一个可用的提示词模板至少要说清楚四件事:文章主题、目标读者、结构要求、输出格式。
$system = '你是一名中文技术内容编辑,擅长写结构清晰、可读性强的文章。'
. '不要使用夸张的营销语言,不要编造无法核实的数据。';
$prompt = "请围绕关键词「{$keyword}」写一篇约 1500 字的中文文章。n"
. "要求:n"
. "1. 用 Markdown 格式输出,包含 3 到 5 个二级标题;n"
. "2. 开头有一段自然的引入,不要用「在当今时代」这类套话;n"
. "3. 内容具体,给出可操作的步骤或例子;n"
. "4. 只输出文章正文,不要输出标题之外的解释。";把 system 和 user 分开写,是为了让约束条件在每篇文章里都稳定生效。实践中发现,把“不要编造数据”写进系统提示,能明显减少模型凭空捏造统计数字的情况。
如果你要批量生成,建议把关键词、字数、结构要求做成数组循环,而不是每篇手改提示词。下面是一个简单的批量触发逻辑:
$keywords = array( 'WordPress 缓存优化', 'WordPress 图片压缩', 'WordPress 数据库清理' );
foreach ( $keywords as $kw ) {
$content = deepseek_request( build_prompt( $kw ), $system );
if ( $content ) {
save_as_draft( $kw, $content );
}
sleep( 2 ); // 控制请求频率,避免触发限流
}sleep(2) 这一步别省。DeepSeek 对并发和频率有限制,连续快速请求容易拿到 429,加个短暂停顿能显著提升成功率。
第四步:把返回内容写入 WordPress
拿到 Markdown 正文后,需要把它变成 WordPress 能识别的文章。wp_insert_post() 是核心函数,它接受一个数组,返回新文章的 ID。
function save_as_draft( $title, $content ) {
$post_id = wp_insert_post(
array(
'post_title' => wp_strip_all_tags( $title ),
'post_content' => $content,
'post_status' => 'draft',
'post_author' => 1,
'post_type' => 'post',
)
);
if ( is_wp_error( $post_id ) ) {
error_log( '写入文章失败:' . $post_id->get_error_message() );
return false;
}
return $post_id;
}这里把状态设为 draft 而不是 publish,是我强烈建议保留的一道人工关口。你可以先预览、修改、补充内链,确认没问题再发布。等流程跑顺了、你对输出质量有把握了,再考虑改成 publish 实现真正的无人值守。
如果模型返回的是 Markdown,而你的编辑器用古腾堡,直接写入 post_content 时 Markdown 语法不会自动转换。两个处理方向:一是安装支持 Markdown 解析的插件,二是在写入前用 Parsedown 这类库把 Markdown 转成 HTML。后者更可控,但需要引入外部依赖。
第五步:自动补全 SEO 元数据
文章写完了,标题和正文都有了,但 SEO 还差几块拼图:meta description、slug、标签。这些同样可以让模型顺手生成,也可以由代码规则化处理。
| 字段 | 生成方式 | 建议长度 |
|---|---|---|
| post_title | 模型生成或关键词加工 | 12–32 字 |
| post_name(slug) | 标题转拼音或英文 | 3–6 个词 |
| meta description | 模型从正文提炼 | 70–120 字 |
| tags | 从正文抽取高频专名 | 5–8 个 |
如果你用的是 Yoast SEO 或 Rank Math,它们把描述存在 _yoast_wpseo_metadesc 或 rank_math_description 这样的自定义字段里,用 update_post_meta() 写入即可:
update_post_meta( $post_id, '_yoast_wpseo_metadesc', $description );
update_post_meta( $post_id, '_yoast_wpseo_focuskw', $keyword );标签的写入稍微不同,需要先确保标签存在,再建立关联:
wp_set_post_tags( $post_id, $tag_array, false );wp_set_post_tags() 会自动创建不存在的标签,第三个参数设为 false 表示追加而不是覆盖已有标签。
第六步:用定时任务实现自动触发
到这里,手动点一下按钮就能生成并保存草稿了。要让它真正“自动”,需要借助 WordPress 的定时任务系统 wp_schedule_event()。
if ( ! wp_next_scheduled( 'deepseek_auto_publish_event' ) ) {
wp_schedule_event( time(), 'hourly', 'deepseek_auto_publish_event' );
}
add_action( 'deepseek_auto_publish_event', 'deepseek_auto_publish_handler' );
function deepseek_auto_publish_handler() {
$queue = get_option( 'deepseek_keyword_queue', array() );
if ( empty( $queue ) ) {
return;
}
$keyword = array_shift( $queue );
update_option( 'deepseek_keyword_queue', $queue );
$content = deepseek_request( build_prompt( $keyword ), get_system_prompt() );
if ( $content ) {
save_as_draft( $keyword, $content );
}
}这套逻辑的思路是维护一个关键词队列,每次定时任务触发时取出一个词生成一篇,生成完从队列里移除。这样既能控制发布节奏,又不会因为一次请求太多而超时。
需要提醒的是,WordPress 的定时任务依赖访客访问来触发,如果站点流量很低,任务可能不准时。解决办法是在服务器上配置真实的 cron:
*/10 * * * * wget -q -O - https://你的域名/wp-cron.php?doing_wp_cron同时在 wp-config.php 里加上 define('DISABLE_WP_CRON', true);,让 WordPress 不再自己触发,完全交给系统 cron 调度。
几个必须注意的坑
接口超时与重试。 生成长文时接口响应可能超过 60 秒,除了把 timeout 调大,还应该在失败时做有限次重试。重试要带退避,比如第一次等 3 秒、第二次等 9 秒,避免把限流撞得更狠。
成本控制。 每次请求都消耗 token,批量生成时费用会累积。建议在队列处理里加一个每日上限,比如每天最多生成 10 篇,超过就暂停,等第二天再继续。
内容质量把关。 模型会写出语法通顺但事实错误的句子,尤其是涉及具体版本号、函数名、参数默认值时。发布前至少扫一遍技术细节,这一步目前还没有可靠的自动化替代方案。
避免重复内容。 如果关键词高度相似,生成的文章可能大面积雷同。可以在提示词里要求模型换角度切入,或者对同一主题的不同文章指定不同的子话题。
备份与回滚。 自动化写入数据库前,确保有定期备份。一旦提示词写错导致批量生成垃圾内容,能快速回滚比逐篇删除省事得多。
为什么值得把 AI 接入 WordPress 写作流程
把 DeepSeek 接入 WordPress 做自动发布,技术门槛主要集中在三个地方:接口请求的健壮性、提示词的约束力,以及定时任务的可靠性。这三块处理好了,剩下的基本就是流程编排的事。
不过工具再顺手,也不该替代判断。自动化的价值在于把时间从重复劳动里省出来,让你能花在选题、核实和打磨上,而不是相反。先从生成草稿开始跑,跑顺了再逐步放开权限,这个节奏比一上来就全自动要稳得多。
更好的推荐:wp闪电快稿:安装即用的 AI 写作插件
wp闪电快稿是一款面向 WordPress 的 AI 内容创作插件,核心思路很简单:把 AI 能力直接嵌进你已经在用的文章编辑器里,不额外开后台、不切换工具。
这套流程其实只有两步,但每一步都有几个容易踩坑的细节。下面按实际操作顺序拆开讲,照着做基本不会卡住。
第一步:安装并启用插件
插件安装本身不复杂,关键是别装完就以为完事了——没启用的话,后台菜单里根本不会出现对应入口。
操作路径:
- 登录网站https://www.pilipost.net/,进入「下载插件」→「wp的安装插件」页面。
- 安装完成后,按钮会变成「启用」,点一下完成激活。
- 如果是从外部下载的压缩包,则走「上传插件」→「选择文件」→「现在安装」→「启用插件」这条路径。
验证是否成功: 启用后刷新后台,左侧菜单应出现插件对应的设置入口。如果没有,多半是权限问题或插件与当前版本不兼容,可以先停用其他插件排查冲突。
第二步:配置 AI 线路
这一步的核心是填入可用的模型接口信息。插件本身不带模型能力,它只是个调度层,真正干活的是你填进去的那个接口。
需要准备的信息:
- 接口地址:模型服务商提供的 API 端点,通常以 /v1 结尾。
- API Key:服务商后台生成的密钥,注意别把密钥直接写进主题文件或公开仓库。
- 模型名称:要调用的具体模型标识,比如 gpt-4o、claude-sonnet 之类,填错会直接报错。
- 其他参数:超时时间、最大 token 数等,一般保持默认即可,遇到长文本截断再调。
填写步骤:
- 进入插件设置页,找到「AI 线路」或「模型配置」区域。
- 把上面准备好的接口地址、API Key、模型名称依次填入对应字段。
- 点击「测试连接」或「保存并验证」。多数插件会返回一个状态提示。
- 看到连接成功的提示后,再保存设置。
flowchart TD
A["安装插件"] --> B["启用插件"]
B --> C["进入设置页"]
C --> D["填入接口地址"]
D --> E["填入 API Key"]
E --> F["填入模型名称"]
F --> G{"测试连接"}
G -->|成功| H["保存配置"]
G -->|失败| I["检查密钥与地址"]
I --> G常见卡点
连接测试失败,先确认三件事:密钥有没有多余空格、接口地址是否带上了正确的协议头、当前服务器能不能访问外网。国内服务器访问部分境外接口需要额外配置代理,这一点容易被忽略。
保存后不生效,检查是否有缓存插件在起作用,清一次缓存再试。另外部分插件要求先保存再测试,顺序反了也会误判。
模型返回内容为空,通常是模型名称写错,或者账户余额不足。先去服务商后台确认额度,再核对模型标识是否拼写正确。
评论区 4
欢迎留下你的意见和想法
之前我也折腾过类似的自动发布,最大的坑其实不是写代码,是模型偶尔抽风生成一堆废话,直接发出去简直灾难。所以我现在都留一个人工过一眼的环节,哪怕多花两分钟,也比事后删一堆垃圾强。
429那个坑我踩过,头大。
把模型、代码、人工审核三段边界说清楚这点最实在,很多人一上来就想着全自动,结果接口一抖整条链路就卡死了。
429 重试那块才是真坑。