跳到内容

DeepSeek接入WordPress教程:SEO文章一键自动发布的具体方法

您可以直接听这篇文章哦!
0:00 / 0:00

把 DeepSeek 接进 WordPress,做成一条“生成—排版—发布”的自动化流水线,这件事本身并不复杂,难的是把每个环节的边界划清楚:哪些交给模型,哪些交给代码,哪些必须留给人来把关。这篇教程按可落地的顺序,从获取 API Key 开始,一路写到定时自动发布,中间会给出可直接改造的 PHP 代码和几个容易踩的坑。

需要先说明一点:所谓“一键自动发布”,指的是把重复劳动压缩成一次触发,而不是完全撒手不管。搜索引擎对纯机器批量产出内容的容忍度越来越低,所以下面会在关键节点留出人工审核的开关,你可以根据自己的风险偏好决定是否跳过。

卡通插画:编辑按下发布按钮,AI机器人将文章送上传送带,经过人工审核闸门后发布为网页

整体架构:请求是怎么走完一圈的

在动手写代码前,先把数据流向理清楚。整条链路的核心是 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 是个稳妥的做法,避免它出现在主题文件里被误提交到版本库:

Code
define( 'DEEPSEEK_API_KEY', 'sk-你的密钥' );
define( 'DEEPSEEK_API_URL', 'https://api.deepseek.com/chat/completions' );

这样做的好处是,即使主题被导出或分享,密钥也不会跟着泄露。如果你用的是多站点,每个站点可以定义不同的常量值。

第二步:写一个封装好的请求函数

不要在业务逻辑里直接拼接口调用,先写一个通用的请求函数,把鉴权、超时、错误处理都收拢在一处。下面这段代码可以放进主题的 functions.php,或者更规范一点,做成一个小型插件。

Code
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 文章的提示词

模型输出质量的上限,很大程度上由提示词决定。不要只丢一个关键词过去,那样得到的大概率是泛泛而谈的段落。一个可用的提示词模板至少要说清楚四件事:文章主题、目标读者、结构要求、输出格式。

Code
$system = '你是一名中文技术内容编辑,擅长写结构清晰、可读性强的文章。'
        . '不要使用夸张的营销语言,不要编造无法核实的数据。';

$prompt = "请围绕关键词「{$keyword}」写一篇约 1500 字的中文文章。n"
        . "要求:n"
        . "1. 用 Markdown 格式输出,包含 3 到 5 个二级标题;n"
        . "2. 开头有一段自然的引入,不要用「在当今时代」这类套话;n"
        . "3. 内容具体,给出可操作的步骤或例子;n"
        . "4. 只输出文章正文,不要输出标题之外的解释。";

把 system 和 user 分开写,是为了让约束条件在每篇文章里都稳定生效。实践中发现,把“不要编造数据”写进系统提示,能明显减少模型凭空捏造统计数字的情况。

如果你要批量生成,建议把关键词、字数、结构要求做成数组循环,而不是每篇手改提示词。下面是一个简单的批量触发逻辑:

Code
$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。

Code
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() 写入即可:

Code
update_post_meta( $post_id, '_yoast_wpseo_metadesc', $description );
update_post_meta( $post_id, '_yoast_wpseo_focuskw', $keyword );

标签的写入稍微不同,需要先确保标签存在,再建立关联:

Code
wp_set_post_tags( $post_id, $tag_array, false );

wp_set_post_tags() 会自动创建不存在的标签,第三个参数设为 false 表示追加而不是覆盖已有标签。

第六步:用定时任务实现自动触发

到这里,手动点一下按钮就能生成并保存草稿了。要让它真正“自动”,需要借助 WordPress 的定时任务系统 wp_schedule_event()。

Code
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:

Code
*/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 能力直接嵌进你已经在用的文章编辑器里,不额外开后台、不切换工具。

这套流程其实只有两步,但每一步都有几个容易踩坑的细节。下面按实际操作顺序拆开讲,照着做基本不会卡住。

第一步:安装并启用插件

插件安装本身不复杂,关键是别装完就以为完事了——没启用的话,后台菜单里根本不会出现对应入口。

操作路径:

  1. 登录网站https://www.pilipost.net/,进入「下载插件」→「wp的安装插件」页面。
  2. 安装完成后,按钮会变成「启用」,点一下完成激活。
  3. 如果是从外部下载的压缩包,则走「上传插件」→「选择文件」→「现在安装」→「启用插件」这条路径。

验证是否成功: 启用后刷新后台,左侧菜单应出现插件对应的设置入口。如果没有,多半是权限问题或插件与当前版本不兼容,可以先停用其他插件排查冲突。

第二步:配置 AI 线路

这一步的核心是填入可用的模型接口信息。插件本身不带模型能力,它只是个调度层,真正干活的是你填进去的那个接口。

需要准备的信息:

  • 接口地址:模型服务商提供的 API 端点,通常以 /v1 结尾。
  • API Key:服务商后台生成的密钥,注意别把密钥直接写进主题文件或公开仓库。
  • 模型名称:要调用的具体模型标识,比如 gpt-4o、claude-sonnet 之类,填错会直接报错。
  • 其他参数:超时时间、最大 token 数等,一般保持默认即可,遇到长文本截断再调。

填写步骤:

  1. 进入插件设置页,找到「AI 线路」或「模型配置」区域。
  2. 把上面准备好的接口地址、API Key、模型名称依次填入对应字段。
  3. 点击「测试连接」或「保存并验证」。多数插件会返回一个状态提示。
  4. 看到连接成功的提示后,再保存设置。
flowchart TD
    A["安装插件"] --> B["启用插件"]
    B --> C["进入设置页"]
    C --> D["填入接口地址"]
    D --> E["填入 API Key"]
    E --> F["填入模型名称"]
    F --> G{"测试连接"}
    G -->|成功| H["保存配置"]
    G -->|失败| I["检查密钥与地址"]
    I --> G

常见卡点

连接测试失败,先确认三件事:密钥有没有多余空格、接口地址是否带上了正确的协议头、当前服务器能不能访问外网。国内服务器访问部分境外接口需要额外配置代理,这一点容易被忽略。

保存后不生效,检查是否有缓存插件在起作用,清一次缓存再试。另外部分插件要求先保存再测试,顺序反了也会误判。

模型返回内容为空,通常是模型名称写错,或者账户余额不足。先去服务商后台确认额度,再核对模型标识是否拼写正确。

评论区 4

欢迎留下你的意见和想法

  1. 阿鱼

    之前我也折腾过类似的自动发布,最大的坑其实不是写代码,是模型偶尔抽风生成一堆废话,直接发出去简直灾难。所以我现在都留一个人工过一眼的环节,哪怕多花两分钟,也比事后删一堆垃圾强。

  2. 彭志强

    429那个坑我踩过,头大。

  3. 徐可欣

    把模型、代码、人工审核三段边界说清楚这点最实在,很多人一上来就想着全自动,结果接口一抖整条链路就卡死了。

  4. 素年茶客86

    429 重试那块才是真坑。