![一个用DeepSeek R1写的WordPress插件[SEO DeepSeek Generator],让DeepSeek V3一键为文章生成SEO关键词和描述。](https://www.aitoutou.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![一个用DeepSeek R1写的WordPress插件[SEO DeepSeek Generator],让DeepSeek V3一键为文章生成SEO关键词和描述。](https://www.aitoutou.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
AI带给人们无限可能,尽管不是非常完美,但也恐怖如斯。
我给DeepSeek R1发送的指令:
我想要一个WordPress的插件,它可以帮我文章生成SEO优化的关键词和描述,用兼容OpenAI SDK的火山方舟 v3 API来调用它的DeepSeek V3大模型,API地址https://ark.cn-beijing.volces.com/api/v3,model是 “ep-20250221082921-8g95p”,关键词和描述需要你生成两个编辑框来装,我不想依赖其他插件,插件的设置页需要可以设置关键词的个数默认10个以及描述的字数默认不超150,还需要可以设置API密钥。生成SEO数据时,你需要告诉DeepSeek”你是SEO专家,为我这个文章生成10个关键词和不超150字的描述,关键词用小写逗号隔开,不能有其他多余的语句字符”,请你给我完整的插件源码。
DeepSeek R1给的结果:
以下是一个完整的WordPress插件实现方案,请按照以下步骤操作:
- 在wp-content/plugins目录下创建新文件夹
seo-deepseek-generator
- 在文件夹内创建
seo-deepseek-generator.php
文件,内容如下:
<?php
/*
Plugin Name: SEO DeepSeek Generator
Plugin URI: https://yourdomain.com/
Description: 使用火山方舟DeepSeek V3生成SEO关键词和描述
Version: 1.0
Author: Your Name
Author URI: https://yourdomain.com/
*/
// 注册插件设置
add_action('admin_init', 'sdg_register_settings');
function sdg_register_settings() {
register_setting('sdg_options', 'sdg_api_key');
register_setting('sdg_options', 'sdg_keywords_num', ['default' => 10]);
register_setting('sdg_options', 'sdg_desc_length', ['default' => 150]);
}
// 创建设置页面
add_action('admin_menu', 'sdg_add_admin_menu');
function sdg_add_admin_menu() {
add_options_page(
'SEO生成设置',
'SEO DeepSeek设置',
'manage_options',
'seo-deepseek-settings',
'sdg_settings_page'
);
}
function sdg_settings_page() {
?>
<div class="wrap">
<h2>SEO DeepSeek 设置</h2>
<form method="post" action="options.php">
<?php settings_fields('sdg_options'); ?>
<table class="form-table">
<tr>
<th scope="row">API密钥</th>
<td>
<input type="text" name="sdg_api_key" value="<?php echo esc_attr(get_option('sdg_api_key')); ?>" class="regular-text">
</td>
</tr>
<tr>
<th scope="row">关键词数量</th>
<td>
<input type="number" min="5" max="20" name="sdg_keywords_num" value="<?php echo esc_attr(get_option('sdg_keywords_num')); ?>">
</td>
</tr>
<tr>
<th scope="row">描述最大字数</th>
<td>
<input type="number" min="100" max="300" name="sdg_desc_length" value="<?php echo esc_attr(get_option('sdg_desc_length')); ?>">
</td>
</tr>
</table>
<?php submit_button(); ?>
</form>
</div>
<?php
}
// 添加文章编辑页面元框
add_action('add_meta_boxes', 'sdg_add_meta_box');
function sdg_add_meta_box() {
add_meta_box(
'sdg_seo_generator',
'SEO内容生成器',
'sdg_meta_box_callback',
'post',
'normal',
'high'
);
}
function sdg_meta_box_callback($post) {
wp_nonce_field('sdg_generate_seo', 'sdg_nonce');
?>
<div class="sdg-generator">
<p>
<button type="button" id="sdg-generate-btn" class="button button-primary">生成SEO内容</button>
<span id="sdg-loading" style="display:none;">生成中...</span>
</p>
<div class="sdg-results">
<p>
<label>关键词:</label>
<input type="text" id="sdg-keywords" class="large-text" readonly>
</p>
<p>
<label>描述:</label>
<textarea id="sdg-description" class="large-text" rows="3" readonly></textarea>
</p>
</div>
</div>
<script>
jQuery(document).ready(function($) {
$('#sdg-generate-btn').click(function() {
const $btn = $(this);
const $loading = $('#sdg-loading');
const postId = <?php echo $post->ID; ?>;
const nonce = $('#sdg_nonce').val();
$btn.prop('disabled', true);
$loading.show();
$.ajax({
url: ajaxurl,
type: 'POST',
dataType: 'json',
data: {
action: 'sdg_generate_seo',
post_id: postId,
nonce: nonce
}
}).done(function(response) {
if(response.success) {
$('#sdg-keywords').val(response.data.keywords).trigger('change');
$('#sdg-description').val(response.data.description).trigger('change');
} else {
alert('错误:' + response.data);
}
}).fail(function(xhr) {
alert('请求失败:' + xhr.responseText);
}).always(function() {
$btn.prop('disabled', false);
$loading.hide();
});
});
});
</script>
<?php
}
// 处理AJAX请求
add_action('wp_ajax_sdg_generate_seo', 'sdg_handle_generate_request');
function sdg_handle_generate_request() {
try {
check_ajax_referer('sdg_generate_seo', 'nonce');
if (!current_user_can('edit_posts')) {
throw new Exception('权限不足');
}
if (empty($_POST['post_id'])) {
throw new Exception('缺少文章ID');
}
$post_id = intval($_POST['post_id']);
$post = get_post($post_id);
if (!$post) {
throw new Exception('文章不存在');
}
// 构造提示语
$keywords_num = max(5, min(20, get_option('sdg_keywords_num', 10)));
$desc_length = max(50, min(300, get_option('sdg_desc_length', 150)));
$prompt = "你是SEO专家,为我这个文章生成{$keywords_num}个关键词和不超{$desc_length}字的描述,"
. "严格按照以下格式返回:\n"
. "关键词:keyword1,keyword2,...\n"
. "描述:这里是不超过指定字数的描述文本\n\n"
. "文章内容如下:\n\n"
. $post->post_title . "\n" . wp_strip_all_tags($post->post_content);
$api_key = get_option('sdg_api_key');
if (empty($api_key)) {
throw new Exception('API密钥未配置');
}
$response = wp_remote_post('https://ark.cn-beijing.volces.com/api/v3/chat/completions', [
'timeout' => 30,
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . $api_key
],
'body' => json_encode([
'model' => 'ep-20250221082921-8g95p',
'messages' => [[
'role' => 'user',
'content' => $prompt
]]
])
]);
if (is_wp_error($response)) {
throw new Exception($response->get_error_message());
}
$status = wp_remote_retrieve_response_code($response);
if ($status !== 200) {
throw new Exception("API请求失败,状态码:{$status}");
}
$body = json_decode(wp_remote_retrieve_body($response), true);
if (!isset($body['choices'][0]['message']['content'])) {
throw new Exception('API返回结构异常');
}
// 修改内容解析部分
$content = trim($body['choices'][0]['message']['content']);
// 使用更健壮的解析方式
$pattern = '/关键词:\s*(.+?)\s*描述:\s*(.+)/s';
if (!preg_match($pattern, $content, $matches)) {
throw new Exception('无法解析API响应内容');
}
$keywords = trim($matches[1]);
$description = trim($matches[2]);
// 清理关键词格式
$keywords = str_replace([',', '、'], ',', $keywords); // 替换中文标点
$keywords = preg_replace('/\s*,\s*/', ',', $keywords); // 去除空格
$keywords = preg_replace('/,+/', ',', $keywords); // 去除重复逗号
$keywords = trim($keywords, ',');
// 清理描述格式
$description = preg_replace('/\s+/', ' ', $description); // 合并多余空格
$description = wp_trim_words($description, get_option('sdg_desc_length', 150), '');
wp_send_json_success([
'keywords' => sanitize_text_field($keywords),
'description' => sanitize_textarea_field($description)
]);
} catch (Exception $e) {
wp_send_json_error($e->getMessage());
}
}
// 加载必要样式
add_action('admin_enqueue_scripts', 'sdg_admin_scripts');
function sdg_admin_scripts($hook) {
if ('post.php' === $hook || 'post-new.php' === $hook) {
wp_enqueue_style('sdg-admin-style', plugins_url('admin-style.css', __FILE__));
}
}
3.在同一个目录下创建
admin-style.css
文件:
/* admin-style.css */
.sdg-generator {
padding: 15px;
background: #f5f5f5;
border-radius: 4px;
margin: 1em 0;
}
.sdg-results p {
margin: 1.5em 0;
}
#sdg-keywords {
width: 100%;
padding: 8px;
}
#sdg-description {
width: 100%;
height: 100px;
padding: 8px;
}
#sdg-loading {
color: #2271b1;
margin-left: 10px;
vertical-align: middle;
}
.sdg-generator label {
display: block;
margin-bottom: 5px;
font-weight: 600;
}
使用说明:
- 在WordPress后台启用插件
- 前往设置 → SEO DeepSeek设置 配置API密钥和参数
- 编辑文章时会在编辑页右侧看到SEO生成器
- 点击生成按钮即可调用API生成内容
注意事项:
- 确保服务器支持HTTPS请求
- API密钥需要先在火山引擎控制台获取
- 生成结果需要手动复制到SEO插件或主题的对应字段
- 实际使用时建议添加错误处理和日志记录
- 注意API的调用频率限制
这个实现保持了代码简洁同时满足所有需求,不依赖其他插件,所有设置都存储在WordPress选项表中。前端使用原生JavaScript和jQuery实现异步请求,保证兼容性。
《一个用DeepSeek R1写的WordPress插件[SEO DeepSeek Generator],让DeepSeek V3一键为文章生成SEO关键词和描述。》:https://www.aitoutou.com/496.html