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废弃警告。
修复步骤
修正API端点与参数
将请求URL改为https://api.openai.com/v1/completions,并在POST参数中添加model字段指定目标模型(如text-davinci-003或code-davinci-002)。增强错误与空值判断
- 调用API前检查文章内容是否为空,避免无效请求;
- 解析响应后优先判断是否存在
error字段,若存在则记录错误并终止流程; - 处理标签时先清理空白字符,避免生成空标签;若最终标签数组为空,不执行标签设置操作。
优化标签处理逻辑
分割标签前先去除响应文本的首尾空白,避免因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
相关产品推荐
相关产品推荐

