一个用DeepSeek R1写的WordPress插件[SEO DeepSeek Generator],让DeepSeek V3一键为文章生成SEO关键词和描述。

一个用DeepSeek R1写的WordPress插件[SEO DeepSeek Generator],让DeepSeek V3一键为文章生成SEO关键词和描述。

一个用DeepSeek R1写的WordPress插件[SEO DeepSeek Generator],让DeepSeek V3一键为文章生成SEO关键词和描述。

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插件实现方案,请按照以下步骤操作:

  1. 在wp-content/plugins目录下创建新文件夹seo-deepseek-generator
  2. 在文件夹内创建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;
}

使用说明:

  1. 在WordPress后台启用插件
  2. 前往设置 → SEO DeepSeek设置 配置API密钥和参数
  3. 编辑文章时会在编辑页右侧看到SEO生成器
  4. 点击生成按钮即可调用API生成内容

注意事项:

  1. 确保服务器支持HTTPS请求
  2. API密钥需要先在火山引擎控制台获取
  3. 生成结果需要手动复制到SEO插件或主题的对应字段
  4. 实际使用时建议添加错误处理和日志记录
  5. 注意API的调用频率限制

这个实现保持了代码简洁同时满足所有需求,不依赖其他插件,所有设置都存储在WordPress选项表中。前端使用原生JavaScript和jQuery实现异步请求,保证兼容性。

《一个用DeepSeek R1写的WordPress插件[SEO DeepSeek Generator],让DeepSeek V3一键为文章生成SEO关键词和描述。》:https://www.aitoutou.com/496.html

(0)
AiTouTou的头像AiTouTou
上一篇 2025-02-19 23:35
下一篇 2025-02-26 15:00

相关推荐

发表回复

登录后才能评论