Wordpress全自动SEO,Ai定时生成特定分类文章并发布

介绍

原理是创建定时任务(用宝塔很方便),指定时间段运行php脚本或python脚本并指定关键词,将要求通过API提交到Ai模型,模型返回响应,将响应里的标题、正文提取出来,再通过Wordpress的REST API发布文章

本文脚本使用火山引擎的DeepSeek-R1模型,当时我用的时候火山引擎个人用户是每天用多少第二天就送多少Token,每日最高送50W,但是我在写这篇文章的时候只看到了企业认证赠送,每日最高送500W,个人好像没了?

之前一共用了1800W+的Token来发文OxO

火山引擎配图1
火山引擎配图1

Akali’s Note :https://oxc.us

教程

一、火山引擎部分

1、首先注册或登录火山引擎,点击👉火山引擎

2、登录后进入火山方舟开通管理,点击👉火山方舟

想用哪个模型就开通哪个,全开通也行,开通不要钱,用Token才要钱,每个模型送50W的Token

3、确定你要使用的模型后,点击紫色的模型名称,如DeepSeek-R1,会跳转到介绍页面,点击复制图标将Model ID复制下来,粘贴在脚本的第23行

"model" => "deepseek-r1-250528",
火山引擎配图3

4、再获取模型的API请求地址,点击同页面的右侧,点击API接入,两个按钮都一样,复制STEP 2 快速接入测试里的请求地址,粘贴在脚本的第8行

define('DEEPSEEK_API', 'https://ark.cn-beijing.volces.com/api/v3/chat/completions');
火山引擎配图4
火山引擎配图5

5、接下来进入API Key管理,点击👉API Key管理

名称随意,创建后点击小眼睛图标,再点击复制图标,将Key粘贴到脚本的第13行

'deepseek_key' => 'xxx-xxx-xxx-xxx-xxx'
火山引擎配图6

你已经完成了火山引擎部分的设置,请看下一步!

二、Wordpress部分

由于Akali的服务器过期了,没办法截图Wordpress后台部分,但是文字也很详细

1、进入你的Wordpress后台,在左侧列表找到个人资料,进入页面后下滑找到应用程序密码

此密码用来授权REST API的请求,不是你的登录密码!!!

2、创建密码,然后复制你的应用程序密码,格式:dRDJ DWfd YX1Y Ej1Z sXGU vsaF

3、手动拼接为你的登录账号:dRDJ DWfd YX1Y Ej1Z sXGU vsaF

(注意是英文冒号)

格式:admin:dRDJ DWfd YX1Y Ej1Z sXGU vsaF

4、打开Base64加密网站,点击👉Base64加密

将你拼接后的admin:dRDJ DWfd YX1Y Ej1Z sXGU vsaF粘贴到上方输入框,点击Base64 编码

Base64 编码配图1

5、将编码后的字符串粘贴在脚本的第10行

编码后的格式:YWRtaW46ZFJESiBEV2ZkIFlYMVkgRWoxWiBzWEdVIHZzYUY=

define('WORDPRESS_AUTH', 'Basic YWRtaW46ZFJESiBEV2ZkIFlYMVkgRWoxWiBzWEdVIHZzYUY=');

6、将你的域名粘贴在脚本的第9行

只需替换xxx.com

define('WORDPRESS_API', 'https://xxx.com/wp-json/wp/v2/posts');

恭喜你,完成了Wordpress的账号配置!

三、发文部分

很快了,只剩两步了

1、AI偏好设置

修改脚本的21-32行

第21行默认领域改为你需要的文章领域,此为无关键词时默认的文章领域

如:AI、互联网、前端、后端、生活、电影

第28行第32行的系统设定和用户设定无需更改,当然你可以按照自己喜好来指定,但最好不要修改用户设定里我用来做网站SEO排名后面的文字

    : (isset($_GET['category']) ? $_GET['category'] : '默认领域');
    $payload = [
        "model" => "deepseek-r1-250528",
        "stream" => false,
        "messages" => [
            [
                "role" => "system",
                "content" => "你是一名专注".$category."领域的资深编辑,擅长SEO优化,谈吐生动,有10年行业观察经验。性格幽默犀利。"
            ],
            [
                "role" => "user",
                "content" => "写一篇".$category."领域的攻略,要多样化,生成1000字以上专业文章,我用来做网站SEO排名,文章里不要出现SEO字眼,必须是标准JSON格式,禁用Markdown代码块包装,直接输出{...}对象:title=SEO优化标题,content=html格式正文(不要图片和超链接),imgcode=中文SEO关键词(英文逗号隔开,3个,每个最长5个字)"

2、发文偏好设置

修改脚本的92-100行

title是AI生成的标题,无需更改

content是AI生成的正文,你可以添加自定义开头或结尾文字,也可以不添加

只需要删除'<div><p>你的自定义开头文字</p></div>'..'<div><p>你的自定义结尾文字</p></div>'

注意.是需要删除的

status是发布状态,无需更改

categories是分类ID,修改为你专门用来发布SEO文章的分类,是数字ID,在Wordpress后台-分类列表-鼠标悬停在分类名称-查看左下角预览链接里的数字ID!!!

author是作者ID,你可以直接使用管理员ID 1 来发布,也可以创建一个专门的用户来发布

comment_status是评论是否启用,closed关闭即可

zrz_seo_keywords是文章的关键词,我当时用的B2主题,这是B2主题的关键词字段,但没成功,所以这条无效,留着即可,现在关键词没啥用

    $postData = [
        'title' => $article['title'],
        'content' => '<div><p>你的自定义开头文字</p></div>'.$article['content'].'<div><p>你的自定义结尾文字</p></div>',
        'status' => 'publish',
        'categories' => [1],
        'author' => 1,
        'comment_status' => 'closed',
        'zrz_seo_keywords' => $article['imgcode']
    ];

恭喜你已经完成了全部的设置!

四、使用方法

这是一个PHP脚本,在将脚本内容粘贴到你的PHP文件后,通过定时任务添加文件路径即可

如:/www/wwwroot/xxx/xxx.php?category=你想要的文章领域

Akali’s Note :https://oxc.us

完整脚本内容

<?php
header('Content-Type: application/json');
ini_set('display_errors', 0);
// Akali's Note https://oxc.us
/*------------------------------------------------
 * 配置区
 *----------------------------------------------*/
define('DEEPSEEK_API', 'https://ark.cn-beijing.volces.com/api/v3/chat/completions');
define('WORDPRESS_API', 'https://xxx.com/wp-json/wp/v2/posts');
define('WORDPRESS_AUTH', 'Basic YWRtaW46ZFJESiBEV2ZkIFlYMVkgRWoxWiBzWEdVIHZzYUY=');
date_default_timezone_set('Asia/Shanghai');
$config = [
    'deepseek_key' => 'xxx-xxx-xxx-xxx-xxx'
];


function generateArticle() {
    global $config;
    $category = isset($_SERVER['argv'][1]) 
    ? $_SERVER['argv'][1] 
    : (isset($_GET['category']) ? $_GET['category'] : '默认领域');
    $payload = [
        "model" => "bot-20250226133419-psqqs",
        "stream" => false,
        "messages" => [
            [
                "role" => "system",
                "content" => "你是一名专注".$category."领域的资深编辑,擅长SEO优化,谈吐生动,有10年行业观察经验。性格幽默犀利。"
            ],
            [
                "role" => "user",
                "content" => "写一篇".$category."领域的攻略,要多样化,生成1000字以上专业文章,我用来做网站SEO排名,文章里不要出现SEO字眼,必须是标准JSON格式,禁用Markdown代码块包装,直接输出{...}对象:title=SEO优化标题,content=html格式正文(不要图片和超链接),imgcode=中文SEO关键词(英文逗号隔开,3个,每个最长5个字)"
            ]
        ]
    ];

    $rawResponse = apiRequest(
        DEEPSEEK_API, 
        'POST', 
        $payload, 
        [
            'Authorization: Bearer ' . $config['deepseek_key'],
            'Content-Type: application/json'
        ],
        true
    );
    return $rawResponse;
}
function extractJsonFields($rawString) {
    $pattern = '/"content":\s*"((?:[^"\\\\]|\\\\.)*)"/s';
    if (preg_match($pattern, $rawString, $match) && !empty($match[1])) {
        $content = preg_replace_callback(
            '/\\\\(["\\\\\/bfrt]|u[0-9a-f]{4})/',
            function ($m) {
                $esc = $m[1];
                $map = ['"' => '"', '\\' => '\\', '/' => '/', 'b' => "\b", 'f' => "\f", 'r' => "\r", 't' => "\t"];
                return $map[$esc] ?? (($esc[0] === 'u') ? json_decode('"\u'.substr($esc,1).'"') : $esc);
            },
            $match[1]
        );
        $content = str_replace(["\n", "\\n"], '', $content);
        return $content;
    }
    return '';
}
/*------------------------------------------------
 * 主业务流程
 *----------------------------------------------*/
try {
    
    $article = extractJsonFields(generateArticle());
    echo $article;
    $response = publishToWordPress(json_decode($article, true));
    echo json_encode([
        'status' => 'success',
        'post_id' => $response['id'],
        'link' => $response['link']
    ]);
    
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode([
        'status' => 'error',
        'message' => $e->getMessage()
    ]);
}

/*------------------------------------------------
 * WordPress发布功能
 *----------------------------------------------*/
function publishToWordPress($article) {
    $postData = [
        'title' => $article['title'],
        'content' => '<div><p>你的自定义开头文字</p></div>'.$article['content'].'<div><p>你的自定义结尾文字</p></div>',
        'status' => 'publish',
        'categories' => [1],
        'author' => 1,
        'comment_status' => 'closed',
        'zrz_seo_keywords' => $article['imgcode']
    ];
    $response = apiRequest(
        WORDPRESS_API,
        'POST',
        $postData,
        [
            'Authorization: ' . WORDPRESS_AUTH,
            'Content-Type: application/json'
        ],
        true
    );
    $responseData = json_decode($response, true);
    if (isset($responseData['code'])) {
        throw new Exception("WordPress发布失败: " . $responseData['message']);
    }
    
    return [
        'id' => $responseData['id'],
        'link' => $responseData['link']
    ];
}

/*------------------------------------------------
 * API请求函数
 *----------------------------------------------*/
function apiRequest($url, $method = 'GET', $data = [], $headers = [], $returnRaw = false) {
    $ch = curl_init();
    $options = [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTPHEADER => $headers
    ];

    if ($method == 'POST') {
        $options[CURLOPT_POST] = true;
        $options[CURLOPT_POSTFIELDS] = is_array($data) ? json_encode($data) : $data;
    }

    curl_setopt_array($ch, $options);
    $rawResponse = curl_exec($ch);
    
    if(curl_errno($ch)){
        throw new Exception("cURL请求失败: ".curl_error($ch));
    }
    
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    if ($httpCode >= 400) {
        throw new Exception("API返回错误状态码: $httpCode");
    }
    
    return $returnRaw ? $rawResponse : json_decode($rawResponse, true);
}

Akali’s Note :https://oxc.us

昨天回老家贴对联了
明日方舟科技辅助(官服+B服)-无极