From 03ce925ec41fb3aa8fc9680fd1297cbc51cd237b Mon Sep 17 00:00:00 2001 From: nanhaoluo <3075912108@qq.com> Date: Thu, 22 Jan 2026 13:25:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20AI=20=E5=9E=83=E5=9C=BE=E8=AF=84?= =?UTF-8?q?=E8=AE=BA=E6=A3=80=E6=B5=8B=E6=94=AF=E6=8C=81=E8=AF=86=E5=88=AB?= =?UTF-8?q?=E7=A0=81=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为每个检测过的评论生成唯一的 8 位识别码 - 识别码由数字和大写字母组成(排除 I、O) - 扩展 ai-summary-query.php 支持查询垃圾评论检测记录 - 显示评论信息、检测结果、AI 模型等详细信息 - 批量检测时也为所有评论生成识别码 - 所有 AI 相关内容均可通过识别码在 /ai-query 页面查询 --- ai-summary-query.php | 179 +++++++++++++++++++++++++++++++++++++++++-- functions.php | 43 ++++++++++- 2 files changed, 216 insertions(+), 6 deletions(-) diff --git a/ai-summary-query.php b/ai-summary-query.php index cb1461d..3b853e1 100644 --- a/ai-summary-query.php +++ b/ai-summary-query.php @@ -1,6 +1,6 @@ get_var($wpdb->prepare( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_argon_ai_summary_code' AND meta_value = %s", @@ -160,7 +162,9 @@ if (!empty($query_code)) { if ($post_id) { $post = get_post($post_id); if ($post && $post->post_status === 'publish') { + $query_type = 'summary'; $result = [ + 'type' => 'summary', 'post_id' => $post_id, 'post_title' => get_the_title($post_id), 'post_url' => get_permalink($post_id), @@ -194,7 +198,65 @@ if (!empty($query_code)) { $error = __('文章不存在或未发布', 'argon'); } } else { - $error = __('未找到对应的 AI 生成内容记录', 'argon'); + // 查询垃圾评论检测记录 + $comment_id = $wpdb->get_var($wpdb->prepare( + "SELECT comment_id FROM {$wpdb->commentmeta} + WHERE meta_key = '_argon_spam_detection_code' AND meta_value = %s", + $query_code + )); + + if ($comment_id) { + $comment = get_comment($comment_id); + if ($comment) { + $query_type = 'spam_detection'; + $detection_result = get_comment_meta($comment_id, '_argon_spam_detection_result', true); + $detection_time = get_comment_meta($comment_id, '_argon_spam_detection_time', true); + + $result = [ + 'type' => 'spam_detection', + 'comment_id' => $comment_id, + 'comment_author' => $comment->comment_author, + 'comment_email' => $comment->comment_author_email, + 'comment_content' => $comment->comment_content, + 'comment_date' => $comment->comment_date, + 'comment_status' => wp_get_comment_status($comment_id), + 'post_id' => $comment->comment_post_ID, + 'post_title' => get_the_title($comment->comment_post_ID), + 'post_url' => get_permalink($comment->comment_post_ID), + 'comment_url' => get_comment_link($comment), + 'is_spam' => isset($detection_result['is_spam']) ? $detection_result['is_spam'] : false, + 'reason' => isset($detection_result['reason']) ? $detection_result['reason'] : '', + 'action' => isset($detection_result['action']) ? $detection_result['action'] : '', + 'detection_time' => $detection_time, + 'code' => $query_code + ]; + + // 获取 AI 配置信息 + $result['provider'] = get_option('argon_ai_summary_provider', 'openai'); + $result['model'] = get_option('argon_ai_summary_model', ''); + + $provider_names = [ + 'openai' => 'OpenAI', + 'anthropic' => 'Anthropic', + 'deepseek' => 'DeepSeek', + 'qianwen' => '通义千问', + 'wenxin' => '文心一言', + 'doubao' => '豆包', + 'kimi' => 'Kimi', + 'zhipu' => '智谱', + 'siliconflow' => 'SiliconFlow' + ]; + + $result['provider_display'] = isset($provider_names[$result['provider']]) ? $provider_names[$result['provider']] : $result['provider']; + + // 缓存结果(1小时) + set_transient($cache_key, $result, 3600); + } else { + $error = __('评论不存在', 'argon'); + } + } else { + $error = __('未找到对应的 AI 生成内容记录', 'argon'); + } } } } @@ -368,7 +430,7 @@ html.darkmode .ai-verify-subtitle { color: #aaa; } - +

@@ -426,11 +488,118 @@ html.darkmode .ai-verify-subtitle { color: #aaa; } + +
+ +
+ + + + + +
+ +

+
+
+ + +
+
+ + +
+
+ + +
+
+ + + __('已通过', 'argon'), + 'hold' => __('待审核', 'argon'), + 'trash' => __('回收站', 'argon'), + 'spam' => __('垃圾评论', 'argon') + ]; + echo isset($status_labels[$result['comment_status']]) ? esc_html($status_labels[$result['comment_status']]) : esc_html($result['comment_status']); + ?> + +
+
+ + + + +
+
+ +

+
+ +
+ +

+
+
+ + + + + + +
+
+ + +
+ +
+ + + __('已移入回收站', 'argon'), + 'hold' => __('已标记为待审核', 'argon'), + 'mark' => __('仅标记', 'argon') + ]; + echo isset($action_labels[$result['action']]) ? esc_html($action_labels[$result['action']]) : esc_html($result['action']); + ?> + +
+ +
+ + +
+
+ + +
+
+ + +
+
+ +
+ + + + + + + + + +

diff --git a/functions.php b/functions.php index b9cd75a..ad1245c 100644 --- a/functions.php +++ b/functions.php @@ -7680,6 +7680,10 @@ function argon_async_spam_detection_handler($comment_id) { // 记录检测时间(无论成功失败都记录,避免重复检测) update_comment_meta($comment_id, '_argon_spam_detection_time', time()); + // 生成识别码 + $detection_code = argon_generate_detection_code($comment_id); + update_comment_meta($comment_id, '_argon_spam_detection_code', $detection_code); + if ($result && isset($result['is_spam'])) { // 更新用户统计 argon_update_user_spam_stats($comment, $result['is_spam']); @@ -7718,6 +7722,36 @@ function argon_async_spam_detection_handler($comment_id) { } add_action('argon_async_spam_detection', 'argon_async_spam_detection_handler'); +/** + * 生成检测识别码(8位大写字母数字,不含 I、O) + * @param int $comment_id 评论 ID + * @return string 识别码 + */ +function argon_generate_detection_code($comment_id) { + $chars = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ'; // 排除 I 和 O + $code = ''; + $seed = $comment_id . time() . wp_rand(); + + for ($i = 0; $i < 8; $i++) { + $index = abs(crc32($seed . $i)) % strlen($chars); + $code .= $chars[$index]; + } + + // 确保唯一性 + global $wpdb; + $exists = $wpdb->get_var($wpdb->prepare( + "SELECT comment_id FROM {$wpdb->commentmeta} WHERE meta_key = '_argon_spam_detection_code' AND meta_value = %s", + $code + )); + + if ($exists) { + // 如果重复,递归生成新的 + return argon_generate_detection_code($comment_id + 1); + } + + return $code; +} + /** * AJAX: 开始批量扫描(一次性发送所有评论) */ @@ -7790,6 +7824,10 @@ function argon_spam_detection_scan() { // 记录检测时间 update_comment_meta($comment_id, '_argon_spam_detection_time', time()); + // 生成识别码 + $detection_code = argon_generate_detection_code($comment_id); + update_comment_meta($comment_id, '_argon_spam_detection_code', $detection_code); + if (isset($item['is_spam']) && $item['is_spam']) { $comment = get_comment($comment_id); if ($comment) { @@ -7797,7 +7835,8 @@ function argon_spam_detection_scan() { 'comment_id' => $comment_id, 'author' => $comment->comment_author, 'content' => mb_substr(strip_tags($comment->comment_content), 0, 100), - 'reason' => isset($item['reason']) ? $item['reason'] : __('未知原因', 'argon') + 'reason' => isset($item['reason']) ? $item['reason'] : __('未知原因', 'argon'), + 'detection_code' => $detection_code ]; // 保存检测结果 @@ -7819,6 +7858,8 @@ function argon_spam_detection_scan() { foreach ($comments_data as $comment_data) { if (!in_array($comment_data['id'], $checked_ids)) { update_comment_meta($comment_data['id'], '_argon_spam_detection_time', time()); + $detection_code = argon_generate_detection_code($comment_data['id']); + update_comment_meta($comment_data['id'], '_argon_spam_detection_code', $detection_code); } }