You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress PHP调用OpenAI API报错:Invalid URL (POST /v4/engines/davinci-codex/completions)

问题分析与修复方案:WordPress自动生成标签功能故障

问题原因解析

从错误日志和代码来看,故障由以下3个核心问题导致:

  • API端点版本错误:代码中使用的https://api.openai.com/v4/engines/davinci-codex/completions是OpenAI已废弃的旧版端点,当前官方API统一使用v1版本,且模型指定方式已从路径改为请求参数。
  • API响应容错缺失:未处理API返回错误的场景(如日志中的无效URL错误),直接尝试解析响应内容,导致后续逻辑触发"无标签"错误。
  • 空内容与空标签处理不足:未判断文章内容是否为空,且当标签处理后为空数组时,仍调用wp_set_post_tags,触发PHP废弃警告。

修复步骤

  1. 修正API端点与参数
    将请求URL改为https://api.openai.com/v1/completions,并在POST参数中添加model字段指定目标模型(如text-davinci-003或code-davinci-002)。

  2. 增强错误与空值判断

    • 调用API前检查文章内容是否为空,避免无效请求;
    • 解析响应后优先判断是否存在error字段,若存在则记录错误并终止流程;
    • 处理标签时先清理空白字符,避免生成空标签;若最终标签数组为空,不执行标签设置操作。
  3. 优化标签处理逻辑
    分割标签前先去除响应文本的首尾空白,避免因API返回的多余空格生成无效标签;调整标签长度判断逻辑,确保过滤规则生效。

修正后的完整代码

function add_tags_with_gpt($post_ID) {
    // 跳过自动保存或修订版本
    if (wp_is_post_autosave($post_ID) || wp_is_post_revision($post_ID)) {
        return;
    }

    // 获取文章内容并检查变更
    $post = get_post($post_ID);
    $old_content = get_post_meta($post_ID, '_old_content', true);
    $new_content = $post->post_content;

    // 内容未变更或为空时直接返回
    if ($old_content === $new_content || empty(trim($new_content))) {
        return;
    }
    update_post_meta($post_ID, '_old_content', $new_content);

    // 调用OpenAI API生成标签
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://api.openai.com/v1/completions');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array(
        'model' => 'text-davinci-003', // 可替换为code-davinci-002等可用模型
        'prompt' => 'Generate comma-separated tags for a blog post, keep tags concise (2-20 characters): ' . $new_content,
        'max_tokens' => 60,
        'temperature' => 0.7
    )));
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Authorization: Bearer your_openai_api_key', // 替换为你的API密钥
        'Content-Type: application/json'
    ));
    $response = curl_exec($ch);
    if (!$response) {
        error_log('标签生成失败: ' . curl_error($ch));
        curl_close($ch);
        return;
    }
    curl_close($ch);

    error_log('OpenAI API响应: ' . $response);
    $response_data = json_decode($response, true);

    // 处理API错误响应
    if (isset($response_data['error'])) {
        error_log('API错误: ' . $response_data['error']['message']);
        return;
    }

    // 验证响应结构与内容
    if (!isset($response_data['choices'][0]['text']) || empty(trim($response_data['choices'][0]['text']))) {
        error_log('错误: API未返回有效标签');
        return;
    }

    // 处理标签
    $tags_text = trim($response_data['choices'][0]['text']);
    $tags = explode(',', $tags_text);
    $tags = array_slice($tags, 0, 8);

    // 清理与过滤标签
    $tags = array_map(function($tag) {
        return trim(sanitize_text_field(wp_strip_all_tags($tag)));
    }, $tags);
    $tags = array_filter($tags, function($tag) {
        $len = strlen($tag);
        return $len > 2 && $len <= 20;
    });
    $tags = array_unique($tags); // 去重

    // 仅当有有效标签时设置
    if (!empty($tags)) {
        wp_set_post_tags($post_ID, $tags, true);
    }
}
add_action('save_post', 'add_tags_with_gpt');

额外说明

  • 请确保替换代码中的your_openai_api_key为你的真实OpenAI API密钥;
  • 可根据需求调整model参数,当前推荐使用text-davinci-003或更优的GPT-3.5系列模型(若使用Chat Completions端点需调整代码结构);
  • 新增了跳过自动保存和修订版本的逻辑,避免重复触发API请求。

内容的提问来源于stack exchange,提问作者Greg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:54:51