1.预算 2. 出阶策略 3. 国家 4.关键词对应询盘(主要分析产生垃圾的关键词) 这几个列的对广告投放有决策意义吗?-系统架构方案

1.预算 2. 出阶策略 3. 国家 4.关键词对应询盘(主要分析产生垃圾的关键词) 这几个列的对广告投放有决策意义吗?-系统架构方案

有重大决策意义! 这4个维度是谷歌广告优化的核心决策点。让我详细说明每个维度的决策价值:

一、预算分配决策(最重要的决策)

决策意义:

“钱应该花在哪里才能最大化回报?”

数据需求:

php

// 每个预算单位的ROI计算
$roi_by_budget_unit = [
    'campaign' => [
        'spend' => 5000,
        'inquiries' => 50,
        'quality_inquiries' => 30, // 高质量询盘
        'conversions' => 10,
        'revenue' => 30000,
        'roi' => ($revenue - $spend) / $spend * 100
    ],
    'ad_group' => [...],
    'keyword' => [...]
];

具体决策:

  1. 预算再分配
    • 从低ROI广告系列转移到高ROI广告系列
    • 识别“预算不足”的优秀系列(表现好但预算用尽太快)
    • 识别“预算浪费”的差系列(花得多但效果差)
  2. 预算时间分配
    • 哪些时段询盘质量最高?
    • 周末vs工作日的表现差异?
    • 季节性的预算调整建议

二、出价策略优化

决策意义:

“每个点击/转化应该出多少钱?”

需要的数据:

  1. 关键词层级数据:php$keyword_bid_data = [ ‘关键词A’ => [ ‘current_bid’ => 5.00, // 当前出价 ‘avg_cpc’ => 4.80, // 实际平均点击成本 ‘inquiries’ => 15, // 产生的询盘数 ‘quality_score’ => 8.2, // 询盘质量平均分 ‘suggested_bid’ => 6.50 // 建议出价 ] ];
  2. 出价策略评估
    • 最大化点击vs最大化转化vs目标CPA
    • 哪种策略最适合你的业务目标?

具体决策:

  1. 智能调价建议
    • 高质量询盘关键词:提高出价(即使CPC较高)
    • 垃圾询盘关键词:降低出价或暂停
    • 无询盘但高流量词:调整匹配方式或否词
  2. 匹配类型优化:php// 不同匹配类型的表现对比 $match_type_performance = [ ‘exact’ => [‘cpc’ => 8.00, ‘inquiry_rate’ => ‘3.5%’], ‘phrase’ => [‘cpc’ => 6.50, ‘inquiry_rate’ => ‘2.2%’], ‘broad’ => [‘cpc’ => 4.00, ‘inquiry_rate’ => ‘0.8%’], ];

三、国家/地区定向

决策意义:

“应该把钱投给哪个国家的用户?”

关键洞察点:

php

$country_performance = [
    'US' => [
        'spend' => 2000,
        'inquiries' => 25,
        'quality_inquiries' => 18,
        'avg_inquiry_value' => 1200, // 询盘平均价值
        'roas' => 4.5                // 广告花费回报率
    ],
    'UK' => [...],
    'IN' => [                         // 可能问题地区
        'spend' => 800,
        'inquiries' => 40,            // 询盘很多
        'quality_inquiries' => 5,     // 但高质量很少
        'avg_inquiry_value' => 200,
        'roas' => 0.8
    ]
];

具体决策:

  1. 国家优先级排序
    • 高价值国家:加大投放
    • 低质量国家:限制预算或提高出价门槛
    • 测试新市场:小预算测试验证
  2. 本地化策略
    • 不同国家的广告文案优化
    • 时区投放调整
    • 文化适配建议

四、关键词-询盘质量分析(最重要的优化点)

决策意义:

“哪些关键词在浪费我的钱?”

垃圾关键词识别模型:

php

class KeywordQualityAnalyzer {
    
    // 垃圾关键词特征
    private $spam_patterns = [
        'too_general' => ['cheap', 'free', 'buy'],  // 过于宽泛
        'intent_mismatch' => ['job', 'salary', 'learn'], // 意图不匹配
        'low_quality_signals' => [
            'high_clicks_low_inquiries',  // 点击多询盘少
            'high_bounce_rate',           // 跳出率高
            'short_time_on_page',         // 停留时间短
            'repeat_spam_inquiries',      // 重复垃圾询盘
        ]
    ];
    
    public function identify_problem_keywords() {
        // 识别问题关键词并给出具体建议
        return [
            '问题类型' => '垃圾询盘集中',
            '关键词列表' => ['cheap product', 'free sample'],
            '影响程度' => '浪费预算$500/月',
            '建议操作' => '添加为否定关键词',
            '预期节省' => '$400/月'
        ];
    }
}

具体决策:

  1. 否定关键词策略
    • 立即否定:确认的垃圾词
    • 观察名单:疑似垃圾词(设观察期)
    • 搜索词报告分析:发现新的垃圾词模式
  2. 关键词重组建议:php// 基于询盘质量的关键词分组 $keyword_grouping = [ ‘核心转化词’ => [ ‘keywords’ => [‘专业解决方案’, ‘定制服务’], ‘action’ => ‘单独建组,提高出价’, ‘bid_adjustment’ => ‘+20%’ ], ‘流量但低质量词’ => [ ‘keywords’ => [‘便宜产品’, ‘免费试用’], ‘action’ => ‘降低出价,密切监控’, ‘bid_adjustment’ => ‘-50%’ ], ‘问题词’ => [ ‘keywords’ => [‘求职’, ‘学习资料’], ‘action’ => ‘添加为否定关键词’, ‘bid_adjustment’ => ‘排除’ ] ];

整合决策仪表板示例

php

// 综合决策建议生成
class AdDecisionEngine {
    
    public function generate_weekly_decisions() {
        return [
            '预算调整' => [
                'recommendation' => '从Campaign B转移$800到Campaign A',
                'reason' => 'Campaign A的ROI是320%,Campaign B只有80%',
                'expected_impact' => '每月增加$2000收入'
            ],
            '出价策略' => [
                'recommendation' => '为关键词"高端定制"提高出价至$12',
                'reason' => '该词询盘质量分9.2/10,但排名第三',
                'expected_impact' => '排名提升至第一,询盘增加40%'
            ],
            '国家定向' => [
                'recommendation' => '限制印度地区每日预算至$50',
                'reason' => '印度地区75%询盘为垃圾询盘',
                'expected_impact' => '每月节省$600,垃圾询盘减少80%'
            ],
            '关键词优化' => [
                'recommendation' => '新增15个否定关键词',
                'reason' => '这些词在过去30天产生42个垃圾询盘',
                'expected_impact' => '减少垃圾询盘90%,节省人力成本'
            ]
        ];
    }
}

实际业务价值

  1. 直接成本节省
    • 垃圾关键词排除:节省20-40%的无效点击费用
    • 国家定向优化:提升整体ROI 30-50%
    • 预算重新分配:提升有效询盘量25%
  2. 间接价值
    • 销售团队效率:减少处理垃圾询盘的时间
    • 客户质量提升:获得更多高意向客户
    • 决策信心增强:数据驱动的优化,而非猜测
  3. 竞争优势
    • 比竞争对手更快识别无效投放
    • 更精准的获客成本控制
    • 持续优化的广告效果

结论:这四个维度不是”有意义”,而是决定谷歌广告成败的关键决策点。你的询盘管理插件如果能在这四个方面提供深度洞察,将直接带来广告效果的指数级提升。

询盘插件如何在四个方面提供深度洞察,请提供详细指导和建议

一、预算分配洞察系统

1. 数据采集层设计

php

// 数据库表设计 - wp_inquiry_budget_analytics
CREATE TABLE wp_inquiry_budget_analytics (
    id BIGINT(20) AUTO_INCREMENT,
    campaign_id VARCHAR(100),
    campaign_name VARCHAR(255),
    daily_budget DECIMAL(10,2),
    actual_spend DECIMAL(10,2),
    date DATE,
    inquiries_count INT,
    quality_inquiries_count INT,
    conversion_value DECIMAL(10,2),
    source_data JSON, -- 存储广告平台API返回的原始数据
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    INDEX idx_campaign_date (campaign_id, date),
    INDEX idx_date (date)
);

2. 预算效率算法

php

class BudgetInsightEngine {
    
    /**
     * 计算预算利用率与效率
     */
    public function calculate_budget_efficiency($campaign_id, $date_range) {
        global $wpdb;
        
        $data = $wpdb->get_results($wpdb->prepare(
            "SELECT date, daily_budget, actual_spend, 
                    inquiries_count, quality_inquiries_count,
                    conversion_value
             FROM wp_inquiry_budget_analytics
             WHERE campaign_id = %s 
             AND date BETWEEN %s AND %s
             ORDER BY date",
            $campaign_id, $date_range['start'], $date_range['end']
        ));
        
        $insights = [
            'budget_utilization' => 0,
            'efficiency_score' => 0,
            'recommendations' => [],
            'trends' => []
        ];
        
        foreach ($data as $day) {
            // 预算利用率(实际花费/预算)
            $utilization = $day->daily_budget > 0 
                ? ($day->actual_spend / $day->daily_budget) * 100 
                : 0;
            
            // 询盘成本效率
            $cpi = $day->inquiries_count > 0 
                ? $day->actual_spend / $day->inquiries_count 
                : 0;
            
            // 高质量询盘成本
            $quality_cpi = $day->quality_inquiries_count > 0 
                ? $day->actual_spend / $day->quality_inquiries_count 
                : 0;
            
            $insights['trends'][] = [
                'date' => $day->date,
                'utilization' => round($utilization, 1),
                'cpi' => round($cpi, 2),
                'quality_cpi' => round($quality_cpi, 2),
                'roas' => $day->actual_spend > 0 
                    ? ($day->conversion_value / $day->actual_spend) 
                    : 0
            ];
        }
        
        // 生成预算建议
        $insights['recommendations'] = $this->generate_budget_recommendations($insights['trends']);
        
        return $insights;
    }
    
    /**
     * 智能预算调整建议
     */
    private function generate_budget_recommendations($trends) {
        $recommendations = [];
        
        // 分析趋势数据
        $avg_utilization = array_sum(array_column($trends, 'utilization')) / count($trends);
        $avg_roas = array_sum(array_column($trends, 'roas')) / count($trends);
        
        if ($avg_utilization < 70) {
            $recommendations[] = [
                'type' => 'under_spending',
                'title' => '预算利用不足',
                'message' => sprintf('平均预算利用率仅%s%%,考虑降低预算或优化广告获取更多流量', 
                                   round($avg_utilization)),
                'action' => 'reduce_budget',
                'confidence' => 0.8
            ];
        } elseif ($avg_utilization > 95) {
            $recommendations[] = [
                'type' => 'over_spending',
                'title' => '预算使用过度',
                'message' => '预算几乎每天用尽,可能导致错过潜在流量',
                'action' => 'increase_budget',
                'confidence' => 0.9
            ];
        }
        
        // ROAS基准分析
        if ($avg_roas > 3) {
            $recommendations[] = [
                'type' => 'high_performance',
                'title' => '高回报广告系列',
                'message' => sprintf('ROAS达到%s,考虑增加预算获取更多高质量询盘', 
                                   round($avg_roas, 1)),
                'action' => 'increase_budget_aggressively',
                'confidence' => 0.85
            ];
        } elseif ($avg_roas < 1) {
            $recommendations[] = [
                'type' => 'negative_roas',
                'title' => '负回报警告',
                'message' => '广告花费超过产生的价值,需要立即优化',
                'action' => 'decrease_budget_investigate',
                'priority' => 'high',
                'confidence' => 0.95
            ];
        }
        
        return $recommendations;
    }
}

3. 实时预算监控仪表板

php

// 短代码实现预算洞察面板
add_shortcode('inquiry_budget_insights', function($atts) {
    $engine = new BudgetInsightEngine();
    $insights = $engine->calculate_budget_efficiency('all', [
        'start' => date('Y-m-d', strtotime('-30 days')),
        'end' => date('Y-m-d')
    ]);
    
    ob_start();
    ?>
    <div class="budget-insights-dashboard">
        <div class="budget-kpi-cards">
            <div class="kpi-card">
                <h4>平均预算利用率</h4>
                <div class="kpi-value"><?php echo $insights['trends'][0]['utilization']; ?>%</div>
                <div class="kpi-trend">与上月相比: +2.3%</div>
            </div>
            <div class="kpi-card">
                <h4>平均询盘成本</h4>
                <div class="kpi-value">$<?php echo $insights['trends'][0]['cpi']; ?></div>
                <div class="kpi-trend">质量询盘成本: $<?php echo $insights['trends'][0]['quality_cpi']; ?></div>
            </div>
            <div class="kpi-card">
                <h4>平均ROAS</h4>
                <div class="kpi-value"><?php echo round($insights['trends'][0]['roas'], 1); ?>x</div>
                <div class="kpi-trend">行业基准: 2.5x</div>
            </div>
        </div>
        
        <div class="recommendations-section">
            <h3>预算优化建议</h3>
            <?php foreach ($insights['recommendations'] as $rec): ?>
            <div class="recommendation-card priority-<?php echo $rec['priority'] ?? 'medium'; ?>">
                <div class="rec-header">
                    <span class="rec-type"><?php echo $rec['type']; ?></span>
                    <span class="rec-confidence">置信度: <?php echo $rec['confidence'] * 100; ?>%</span>
                </div>
                <h4><?php echo $rec['title']; ?></h4>
                <p><?php echo $rec['message']; ?></p>
                <div class="rec-actions">
                    <button class="btn-apply" data-action="<?php echo $rec['action']; ?>">
                        应用此建议
                    </button>
                    <button class="btn-ignore">暂时忽略</button>
                </div>
            </div>
            <?php endforeach; ?>
        </div>
    </div>
    
    <style>
    .budget-insights-dashboard {
        font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
    }
    .budget-kpi-cards {
        display: grid;
        grid-template-columns: repeat(3, 1fr);
        gap: 20px;
        margin-bottom: 30px;
    }
    .kpi-card {
        background: white;
        border-radius: 8px;
        padding: 20px;
        box-shadow: 0 2px 10px rgba(0,0,0,0.1);
    }
    .kpi-value {
        font-size: 32px;
        font-weight: bold;
        color: #1a73e8;
    }
    .recommendation-card {
        border-left: 4px solid;
        padding: 15px;
        margin-bottom: 15px;
        background: #f8f9fa;
    }
    .priority-high { border-color: #dc3545; }
    .priority-medium { border-color: #ffc107; }
    .priority-low { border-color: #28a745; }
    </style>
    
    <script>
    jQuery(document).ready(function($) {
        $('.btn-apply').click(function() {
            const action = $(this).data('action');
            // AJAX调用执行预算调整
            $.post(ajaxurl, {
                action: 'apply_budget_recommendation',
                recommendation_action: action
            }, function(response) {
                alert('预算调整已提交');
            });
        });
    });
    </script>
    <?php
    
    return ob_get_clean();
});

二、出价策略深度分析

1. 出价效果追踪系统

php

// 出价策略性能追踪表
CREATE TABLE wp_bid_strategy_analysis (
    id BIGINT(20) AUTO_INCREMENT,
    keyword_id VARCHAR(100),
    keyword_text VARCHAR(255),
    match_type ENUM('exact', 'phrase', 'broad'),
    current_bid DECIMAL(8,2),
    quality_score INT(3),
    avg_position DECIMAL(3,1),
    impressions INT,
    clicks INT,
    inquiries INT,
    quality_inquiries INT,
    total_cost DECIMAL(10,2),
    estimated_top_of_page_bid DECIMAL(8,2),
    first_page_bid DECIMAL(8,2),
    analysis_date DATE,
    bid_strategy VARCHAR(50), -- manual_cpc, target_cpa, maximize_conversions
    PRIMARY KEY (id),
    INDEX idx_keyword_date (keyword_id, analysis_date),
    INDEX idx_strategy_performance (bid_strategy, analysis_date)
);

// 出价优化引擎
class BidStrategyOptimizer {
    
    private $thresholds = [
        'quality_score_good' => 7,
        'click_through_rate_good' => 2.0, // %
        'conversion_rate_good' => 3.0, // %
        'target_cpi' => 50, // 目标询盘成本
    ];
    
    /**
     * 智能出价建议生成
     */
    public function get_bid_recommendations($keyword_data) {
        $recommendations = [];
        
        foreach ($keyword_data as $keyword) {
            $rec = $this->analyze_keyword_bid($keyword);
            if ($rec) {
                $recommendations[] = $rec;
            }
        }
        
        // 按优先级排序
        usort($recommendations, function($a, $b) {
            return $b['priority_score'] <=> $a['priority_score'];
        });
        
        return $recommendations;
    }
    
    private function analyze_keyword_bid($keyword) {
        $score = 0;
        $reasoning = [];
        
        // 1. 质量得分分析
        if ($keyword['quality_score'] < 5) {
            $score += 30;
            $reasoning[] = sprintf(
                "质量得分低(%d/10),影响广告排名和点击成本",
                $keyword['quality_score']
            );
        }
        
        // 2. 点击率分析
        $ctr = $keyword['clicks'] / $keyword['impressions'] * 100;
        if ($ctr < $this->thresholds['click_through_rate_good']) {
            $score += 20;
            $reasoning[] = sprintf(
                "点击率偏低(%.1f%%),低于基准%.1f%%",
                $ctr, $this->thresholds['click_through_rate_good']
            );
        }
        
        // 3. 询盘成本分析
        if ($keyword['inquiries'] > 0) {
            $cpi = $keyword['total_cost'] / $keyword['inquiries'];
            if ($cpi > $this->thresholds['target_cpi']) {
                $score += 40;
                $reasoning[] = sprintf(
                    "询盘成本过高($%.2f),超过目标$%.2f",
                    $cpi, $this->thresholds['target_cpi']
                );
            }
            
            // 高质量询盘成本
            if ($keyword['quality_inquiries'] > 0) {
                $quality_cpi = $keyword['total_cost'] / $keyword['quality_inquiries'];
                if ($quality_cpi > $this->thresholds['target_cpi'] * 1.5) {
                    $score += 50;
                    $reasoning[] = sprintf(
                        "高质量询盘成本极高($%.2f)",
                        $quality_cpi
                    );
                }
            }
        }
        
        // 4. 排名机会分析
        if ($keyword['avg_position'] > 3.5 && $keyword['quality_score'] >= 7) {
            $score += 25;
            $reasoning[] = sprintf(
                "目前排名%.1f,有提升至前3名的机会",
                $keyword['avg_position']
            );
        }
        
        if ($score >= 30) {
            return [
                'keyword' => $keyword['keyword_text'],
                'current_bid' => $keyword['current_bid'],
                'recommended_bid' => $this->calculate_optimal_bid($keyword),
                'priority_score' => $score,
                'reasoning' => $reasoning,
                'expected_impact' => $this->estimate_impact($keyword)
            ];
        }
        
        return null;
    }
    
    /**
     * 计算最优出价
     */
    private function calculate_optimal_bid($keyword) {
        $base_bid = $keyword['current_bid'];
        
        // 根据质量得分调整
        if ($keyword['quality_score'] >= 8) {
            $base_bid *= 1.2; // 高质量关键词加价20%
        } elseif ($keyword['quality_score'] <= 4) {
            $base_bid *= 0.7; // 低质量关键词降价30%
        }
        
        // 根据询盘表现调整
        if ($keyword['inquiries'] > 0) {
            $cpi = $keyword['total_cost'] / $keyword['inquiries'];
            $target_ratio = $this->thresholds['target_cpi'] / $cpi;
            
            if ($target_ratio < 0.7) {
                $base_bid *= 0.8; // 成本过高,降价
            } elseif ($target_ratio > 1.3) {
                $base_bid *= 1.25; // 成本良好,加价获取更多流量
            }
        }
        
        // 限制调整范围
        $min_bid = max(0.5, $keyword['current_bid'] * 0.5);
        $max_bid = min(50, $keyword['current_bid'] * 2);
        
        return round(max($min_bid, min($base_bid, $max_bid)), 2);
    }
}

2. 出价策略A/B测试框架

php

class BidStrategyTester {
    
    /**
     * 创建出价策略测试
     */
    public function create_bid_test($test_config) {
        // 将关键词随机分配到不同出价策略组
        $groups = [
            'control' => ['bid_multiplier' => 1.0, 'strategy' => 'current'],
            'test_a' => ['bid_multiplier' => 1.2, 'strategy' => 'aggressive'],
            'test_b' => ['bid_multiplier' => 0.8, 'strategy' => 'conservative']
        ];
        
        // 记录测试配置
        $test_id = wp_insert_post([
            'post_type' => 'bid_test',
            'post_title' => sprintf('出价策略测试 %s', date('Y-m-d')),
            'post_status' => 'publish',
            'meta_input' => [
                '_test_config' => $test_config,
                '_test_groups' => $groups,
                '_start_date' => current_time('mysql'),
                '_status' => 'running'
            ]
        ]);
        
        return $test_id;
    }
    
    /**
     * 分析测试结果
     */
    public function analyze_test_results($test_id) {
        global $wpdb;
        
        $test_data = get_post_meta($test_id, '_test_results', true);
        
        $analysis = [
            'statistical_significance' => false,
            'winner' => null,
            'confidence' => 0,
            'recommendations' => []
        ];
        
        // 计算统计显著性
        $control_performance = $test_data['control'];
        $test_a_performance = $test_data['test_a'];
        
        // T检验(简化版)
        $mean_diff = $test_a_performance['avg_cpi'] - $control_performance['avg_cpi'];
        $variance = pow($control_performance['std_dev'], 2) / $control_performance['sample_size'] 
                   + pow($test_a_performance['std_dev'], 2) / $test_a_performance['sample_size'];
        
        $t_statistic = abs($mean_diff) / sqrt($variance);
        
        // 95%置信水平,自由度足够大的情况下临界值约为1.96
        if ($t_statistic > 1.96) {
            $analysis['statistical_significance'] = true;
            $analysis['confidence'] = 0.95;
            
            // 确定优胜策略
            if ($test_a_performance['avg_cpi'] < $control_performance['avg_cpi']) {
                $analysis['winner'] = 'test_a';
                $analysis['recommendations'][] = [
                    'action' => 'implement_strategy',
                    'strategy' => 'aggressive',
                    'expected_improvement' => round((1 - $test_a_performance['avg_cpi'] / $control_performance['avg_cpi']) * 100, 1) . '%'
                ];
            }
        }
        
        return $analysis;
    }
}

三、国家/地区定向优化

1. 国家表现多层分析系统

php

// 国家层级表现追踪表
CREATE TABLE wp_country_performance (
    id BIGINT(20) AUTO_INCREMENT,
    country_code CHAR(2),
    country_name VARCHAR(100),
    date DATE,
    campaign_id VARCHAR(100),
    spend DECIMAL(10,2),
    impressions BIGINT,
    clicks INT,
    inquiries INT,
    quality_inquiries INT,
    conversions INT,
    revenue DECIMAL(10,2),
    avg_session_duration INT, -- 平均会话时长(秒)
    bounce_rate DECIMAL(5,2), -- 跳出率
    pages_per_session DECIMAL(5,2),
    device_breakdown JSON, -- 设备分布
    time_of_day_breakdown JSON, -- 时段分布
    inquiry_quality_score DECIMAL(5,2),
    fraud_score DECIMAL(5,2), -- 欺诈风险评分
    PRIMARY KEY (id),
    INDEX idx_country_date (country_code, date),
    INDEX idx_performance (country_code, inquiry_quality_score)
);

// 国家智能评估引擎
class CountryPerformanceAnalyzer {
    
    /**
     * 国家分级评估
     */
    public function evaluate_countries($date_range) {
        global $wpdb;
        
        $query = $wpdb->prepare(
            "SELECT 
                country_code,
                country_name,
                SUM(spend) as total_spend,
                SUM(inquiries) as total_inquiries,
                SUM(quality_inquiries) as total_quality_inquiries,
                SUM(revenue) as total_revenue,
                AVG(inquiry_quality_score) as avg_quality_score,
                AVG(bounce_rate) as avg_bounce_rate,
                AVG(avg_session_duration) as avg_session_duration,
                COUNT(DISTINCT DATE(date)) as days_active
             FROM wp_country_performance
             WHERE date BETWEEN %s AND %s
             GROUP BY country_code, country_name
             HAVING total_spend > 0",
            $date_range['start'], $date_range['end']
        );
        
        $countries = $wpdb->get_results($query, ARRAY_A);
        
        $evaluations = [];
        foreach ($countries as $country) {
            $evaluation = $this->calculate_country_score($country);
            $evaluations[] = array_merge($country, $evaluation);
        }
        
        // 按综合评分排序
        usort($evaluations, function($a, $b) {
            return $b['composite_score'] <=> $a['composite_score'];
        });
        
        return $evaluations;
    }
    
    private function calculate_country_score($country_data) {
        $scores = [];
        
        // 1. 投资回报率得分 (0-100)
        $roas = $country_data['total_spend'] > 0 
            ? $country_data['total_revenue'] / $country_data['total_spend'] 
            : 0;
        $scores['roas_score'] = min(100, $roas * 20); // 假设5倍ROAS为满分
        
        // 2. 询盘质量得分
        $quality_ratio = $country_data['total_inquiries'] > 0
            ? $country_data['total_quality_inquiries'] / $country_data['total_inquiries']
            : 0;
        $scores['quality_score'] = $quality_ratio * 100;
        
        // 3. 用户参与度得分
        $engagement_score = 0;
        if ($country_data['avg_bounce_rate'] < 40) $engagement_score += 30;
        if ($country_data['avg_session_duration'] > 60) $engagement_score += 40;
        if ($country_data['avg_session_duration'] > 120) $engagement_score += 30;
        $scores['engagement_score'] = $engagement_score;
        
        // 4. 成本效率得分
        $cpi = $country_data['total_inquiries'] > 0
            ? $country_data['total_spend'] / $country_data['total_inquiries']
            : 0;
        $scores['efficiency_score'] = max(0, 100 - ($cpi * 2)); // 假设$50 CPI为及格线
        
        // 综合评分(加权平均)
        $weights = [
            'roas_score' => 0.4,
            'quality_score' => 0.3,
            'engagement_score' => 0.2,
            'efficiency_score' => 0.1
        ];
        
        $composite_score = 0;
        foreach ($weights as $metric => $weight) {
            $composite_score += $scores[$metric] * $weight;
        }
        
        // 国家分级
        if ($composite_score >= 80) {
            $tier = 'A级 - 核心市场';
            $recommendation = '增加预算投入,扩大市场份额';
        } elseif ($composite_score >= 60) {
            $tier = 'B级 - 成长市场';
            $recommendation = '维持预算,优化落地页和广告创意';
        } elseif ($composite_score >= 40) {
            $tier = 'C级 - 观察市场';
            $recommendation = '限制预算,进行A/B测试寻找突破口';
        } else {
            $tier = 'D级 - 问题市场';
            $recommendation = '考虑暂停投放,深入分析问题原因';
        }
        
        return [
            'scores' => $scores,
            'composite_score' => round($composite_score, 1),
            'tier' => $tier,
            'recommendation' => $recommendation,
            'key_metrics' => [
                'roas' => round($roas, 2),
                'cpi' => round($cpi, 2),
                'quality_ratio' => round($quality_ratio * 100, 1) . '%',
                'bounce_rate' => round($country_data['avg_bounce_rate'], 1) . '%'
            ]
        ];
    }
}

2. 欺诈检测与预防系统

php

class FraudDetectionSystem {
    
    private $fraud_patterns = [
        'high_inquiry_volume' => [
            'threshold' => 50, // 单日询盘量阈值
            'weight' => 30
        ],
        'short_session_duration' => [
            'threshold' => 10, // 秒
            'weight' => 25
        ],
        'high_bounce_rate' => [
            'threshold' => 80, // %
            'weight' => 20
        ],
        'suspicious_ip_pattern' => [
            'patterns' => ['vpn', 'proxy', 'data_center'],
            'weight' => 40
        ],
        'repetitive_content' => [
            'similarity_threshold' => 0.9,
            'weight' => 35
        ]
    ];
    
    /**
     * 实时欺诈检测
     */
    public function detect_fraudulent_inquiry($inquiry_data) {
        $risk_score = 0;
        $red_flags = [];
        
        // 检查会话时长
        if ($inquiry_data['session_duration'] < $this->fraud_patterns['short_session_duration']['threshold']) {
            $risk_score += $this->fraud_patterns['short_session_duration']['weight'];
            $red_flags[] = '会话时长过短';
        }
        
        // 检查跳出率
        if ($inquiry_data['bounce_rate'] > $this->fraud_patterns['high_bounce_rate']['threshold']) {
            $risk_score += $this->fraud_patterns['high_bounce_rate']['weight'];
            $red_flags[] = '跳出率异常高';
        }
        
        // IP地址检查
        if ($this->is_suspicious_ip($inquiry_data['ip_address'])) {
            $risk_score += $this->fraud_patterns['suspicious_ip_pattern']['weight'];
            $red_flags[] = '可疑IP地址';
        }
        
        // 内容相似度检查
        if ($this->check_repetitive_content($inquiry_data['message'], $inquiry_data['country_code'])) {
            $risk_score += $this->fraud_patterns['repetitive_content']['weight'];
            $red_flags[] = '重复内容模式';
        }
        
        // 基于国家历史数据
        $country_risk = $this->get_country_risk_level($inquiry_data['country_code']);
        $risk_score += $country_risk * 20;
        
        // 风险评估
        if ($risk_score >= 70) {
            $action = 'block_immediately';
            $alert_level = 'critical';
        } elseif ($risk_score >= 50) {
            $action = 'require_verification';
            $alert_level = 'high';
        } elseif ($risk_score >= 30) {
            $action = 'flag_for_review';
            $alert_level = 'medium';
        } else {
            $action = 'allow';
            $alert_level = 'low';
        }
        
        return [
            'risk_score' => $risk_score,
            'red_flags' => $red_flags,
            'recommended_action' => $action,
            'alert_level' => $alert_level,
            'timestamp' => current_time('mysql')
        ];
    }
    
    /**
     * 国家欺诈热力图生成
     */
    public function generate_fraud_heatmap($date_range) {
        global $wpdb;
        
        $data = $wpdb->get_results($wpdb->prepare(
            "SELECT 
                country_code,
                COUNT(*) as total_inquiries,
                SUM(CASE WHEN fraud_score >= 70 THEN 1 ELSE 0 END) as high_risk_inquiries,
                SUM(CASE WHEN fraud_score BETWEEN 30 AND 69 THEN 1 ELSE 0 END) as medium_risk_inquiries,
                AVG(fraud_score) as avg_fraud_score,
                SUM(spend) as total_spend
             FROM wp_country_performance
             WHERE date BETWEEN %s AND %s
             GROUP BY country_code
             HAVING total_inquiries >= 10",
            $date_range['start'], $date_range['end']
        ));
        
        $heatmap_data = [];
        foreach ($data as $row) {
            $fraud_rate = $row->total_inquiries > 0 
                ? ($row->high_risk_inquiries / $row->total_inquiries) * 100 
                : 0;
            
            $heatmap_data[] = [
                'country' => $row->country_code,
                'fraud_rate' => round($fraud_rate, 1),
                'total_spend' => $row->total_spend,
                'risk_level' => $this->determine_risk_level($fraud_rate),
                'waste_estimate' => round($row->total_spend * ($fraud_rate / 100), 2)
            ];
        }
        
        // 按欺诈率排序
        usort($heatmap_data, function($a, $b) {
            return $b['fraud_rate'] <=> $a['fraud_rate'];
        });
        
        return $heatmap_data;
    }
}

四、关键词垃圾询盘识别系统

1. 垃圾关键词智能识别引擎

php

// 关键词表现深度分析表
CREATE TABLE wp_keyword_spam_analysis (
    id BIGINT(20) AUTO_INCREMENT,
    keyword_id VARCHAR(100),
    keyword_text VARCHAR(255),
    match_type VARCHAR(20),
    search_term VARCHAR(255),
    date DATE,
    inquiries_generated INT,
    spam_inquiries INT,
    spam_patterns JSON,
    user_behavior_metrics JSON,
    content_analysis JSON,
    spam_score DECIMAL(5,2),
    investigation_status ENUM('pending', 'reviewed', 'resolved'),
    reviewer_notes TEXT,
    auto_action_taken VARCHAR(50),
    PRIMARY KEY (id),
    INDEX idx_keyword_spam (keyword_text(50), spam_score),
    INDEX idx_search_term (search_term(100)),
    FULLTEXT idx_keyword_fulltext (keyword_text, search_term)
);

// 垃圾关键词检测引擎
class KeywordSpamDetector {
    
    private $spam_indicators = [
        // 行为模式指标
        'behavioral' => [
            'avg_session_duration' => ['threshold' => 15, 'weight' => 25],
            'pages_per_session' => ['threshold' => 1.2, 'weight' => 20],
            'form_fill_time' => ['threshold' => 5, 'weight' => 15], // 秒
            'bounce_rate' => ['threshold' => 85, 'weight' => 30]
        ],
        
        // 内容模式指标
        'content' => [
            'message_length' => ['min' => 5, 'max' => 1000, 'weight' => 20],
            'repetitive_patterns' => ['weight' => 35],
            'suspicious_keywords' => [
                'list' => ['free', 'sample', 'trial', 'cheap', 'wholesale', 'distributor'],
                'weight' => 30
            ],
            'email_patterns' => [
                'patterns' => ['@test.', '@example.', 'temp-', 'fake'],
                'weight' => 40
            ]
        ],
        
        // 来源质量指标
        'source' => [
            'device_type' => ['mobile_weight' => 10, 'desktop_weight' => 5],
            'time_of_day' => ['off_hours_weight' => 15],
            'geographic_consistency' => ['weight' => 25]
        ]
    ];
    
    /**
     * 批量分析关键词的垃圾询盘倾向
     */
    public function analyze_keyword_spam_patterns($date_range, $min_inquiries = 10) {
        global $wpdb;
        
        // 获取关键词表现数据
        $keywords = $wpdb->get_results($wpdb->prepare(
            "SELECT 
                k.keyword_text,
                k.match_type,
                COUNT(DISTINCT i.id) as total_inquiries,
                COUNT(DISTINCT CASE WHEN i.quality_score < 3 THEN i.id END) as low_quality_inquiries,
                AVG(i.session_duration) as avg_session_duration,
                AVG(i.pages_viewed) as avg_pages_viewed,
                GROUP_CONCAT(DISTINCT i.search_term SEPARATOR '||') as search_terms,
                GROUP_CONCAT(DISTINCT i.message_content SEPARATOR '||') as messages_sample
             FROM wp_keywords k
             LEFT JOIN wp_inquiries i ON k.keyword_id = i.keyword_id
             WHERE i.date BETWEEN %s AND %s
             GROUP BY k.keyword_text, k.match_type
             HAVING total_inquiries >= %d",
            $date_range['start'], $date_range['end'], $min_inquiries
        ), ARRAY_A);
        
        $analysis_results = [];
        foreach ($keywords as $keyword) {
            $spam_analysis = $this->calculate_keyword_spam_score($keyword);
            
            if ($spam_analysis['spam_score'] >= 60) {
                $analysis_results[] = array_merge($keyword, $spam_analysis);
            }
        }
        
        // 按垃圾分数排序
        usort($analysis_results, function($a, $b) {
            return $b['spam_score'] <=> $a['spam_score'];
        });
        
        return $analysis_results;
    }
    
    private function calculate_keyword_spam_score($keyword_data) {
        $spam_score = 0;
        $indicators = [];
        $patterns_found = [];
        
        // 1. 低质量询盘率分析
        $low_quality_ratio = $keyword_data['total_inquiries'] > 0 
            ? $keyword_data['low_quality_inquiries'] / $keyword_data['total_inquiries'] 
            : 0;
        
        if ($low_quality_ratio > 0.5) {
            $score_component = min(100, $low_quality_ratio * 200);
            $spam_score += $score_component * 0.4;
            $indicators[] = sprintf(
                "低质量询盘率过高: %.1f%%",
                $low_quality_ratio * 100
            );
            $patterns_found[] = 'high_low_quality_ratio';
        }
        
        // 2. 用户行为分析
        if ($keyword_data['avg_session_duration'] < $this->spam_indicators['behavioral']['avg_session_duration']['threshold']) {
            $weight = $this->spam_indicators['behavioral']['avg_session_duration']['weight'];
            $spam_score += $weight;
            $indicators[] = sprintf(
                "平均会话时长过短: %.1f秒",
                $keyword_data['avg_session_duration']
            );
            $patterns_found[] = 'short_session_duration';
        }
        
        if ($keyword_data['avg_pages_viewed'] < $this->spam_indicators['behavioral']['pages_per_session']['threshold']) {
            $weight = $this->spam_indicators['behavioral']['pages_per_session']['weight'];
            $spam_score += $weight;
            $indicators[] = sprintf(
                "平均浏览页面数低: %.1f",
                $keyword_data['avg_pages_viewed']
            );
            $patterns_found[] = 'low_page_views';
        }
        
        // 3. 搜索词内容分析
        $search_terms = explode('||', $keyword_data['search_terms']);
        $content_analysis = $this->analyze_search_term_content($search_terms);
        
        if ($content_analysis['suspicious_terms_count']

本回答由 AI 生成,内容仅供参考,请仔细甄别。

实现上面的功能分析,需要调用哪些接口

实现以上询盘插件的深度分析功能,需要调用多种API接口。以下是完整的接口需求方案:

一、Google Ads API(核心接口)

1. 预算和出价数据

php

// Google Ads API v16
class GoogleAdsAPI {
    private $client;
    
    public function __construct() {
        require_once 'vendor/autoload.php';
        $this->client = new Google\Ads\GoogleAds\Lib\V16\GoogleAdsClient([
            'developerToken' => GOOGLE_ADS_DEVELOPER_TOKEN,
            'loginCustomerId' => CUSTOMER_ID,
            'useCloudShellForOAuth2' => false
        ]);
    }
    
    /**
     * 获取广告系列预算数据
     */
    public function getCampaignBudgets($customerId) {
        $googleAdsServiceClient = $this->client->getGoogleAdsServiceClient();
        
        $query = "
            SELECT 
                campaign.id,
                campaign.name,
                campaign.status,
                campaign.bidding_strategy_type,
                campaign_budget.amount_micros,
                campaign_budget.total_amount_micros,
                campaign_budget.type,
                campaign_budget.period,
                metrics.cost_micros,
                metrics.impressions,
                metrics.clicks,
                metrics.conversions,
                metrics.conversions_value
            FROM campaign
            WHERE segments.date DURING LAST_30_DAYS
            AND campaign.status = 'ENABLED'
        ";
        
        $response = $googleAdsServiceClient->search($customerId, $query);
        
        $budgets = [];
        foreach ($response->iterateAllElements() as $row) {
            $budgets[] = [
                'campaign_id' => $row->getCampaign()->getId(),
                'campaign_name' => $row->getCampaign()->getName(),
                'daily_budget' => $row->getCampaignBudget()->getAmountMicros() / 1000000,
                'total_cost' => $row->getMetrics()->getCostMicros() / 1000000,
                'impressions' => $row->getMetrics()->getImpressions(),
                'clicks' => $row->getMetrics()->getClicks(),
                'conversions' => $row->getMetrics()->getConversions(),
                'conversion_value' => $row->getMetrics()->getConversionsValue()
            ];
        }
        
        return $budgets;
    }
    
    /**
     * 获取关键词出价数据
     */
    public function getKeywordBidData($customerId) {
        $query = "
            SELECT 
                ad_group_criterion.keyword.text,
                ad_group_criterion.keyword.match_type,
                ad_group_criterion.cpc_bid_micros,
                ad_group_criterion.effective_cpc_bid_micros,
                ad_group_criterion.quality_info.score,
                ad_group_criterion.quality_info.creative_quality_score,
                ad_group_criterion.quality_info.post_click_quality_score,
                metrics.average_cpc,
                metrics.impressions,
                metrics.clicks,
                metrics.cost_micros,
                metrics.conversions,
                metrics.search_absolute_top_impression_share,
                metrics.search_impression_share,
                metrics.average_position
            FROM ad_group_criterion
            WHERE ad_group_criterion.type = 'KEYWORD'
            AND segments.date DURING LAST_30_DAYS
            AND metrics.clicks > 0
        ";
        
        // ... 执行查询并处理数据
    }
    
    /**
     * 获取搜索词报告(识别垃圾关键词)
     */
    public function getSearchTermReports($customerId) {
        $query = "
            SELECT 
                search_term_view.search_term,
                search_term_view.status,
                metrics.search_impression_share,
                metrics.search_absolute_top_impression_share,
                metrics.search_top_impression_share,
                metrics.clicks,
                metrics.cost_micros,
                metrics.conversions,
                metrics.all_conversions,
                segments.keyword.info.text,
                segments.keyword.info.match_type,
                segments.device,
                segments.date
            FROM search_term_view
            WHERE segments.date DURING LAST_30_DAYS
            AND metrics.clicks > 0
        ";
        
        // ... 执行查询
    }
    
    /**
     * 实时调整出价(需要认证)
     */
    public function updateKeywordBid($customerId, $adGroupId, $criterionId, $newBid) {
        $adGroupCriterionServiceClient = $this->client->getAdGroupCriterionServiceClient();
        
        $operation = new \Google\Ads\GoogleAds\V16\Services\AdGroupCriterionOperation([
            'update' => new \Google\Ads\GoogleAds\V16\Resources\AdGroupCriterion([
                'resource_name' => ResourceNames::forAdGroupCriterion(
                    $customerId, 
                    $adGroupId, 
                    $criterionId
                ),
                'cpc_bid_micros' => $newBid * 1000000
            ]),
            'update_mask' => FieldMasks::allSetFieldsOf(
                new \Google\Ads\GoogleAds\V16\Resources\AdGroupCriterion()
            )
        ]);
        
        $response = $adGroupCriterionServiceClient->mutateAdGroupCriteria(
            $customerId,
            [$operation]
        );
        
        return $response->getResults()[0]->getResourceName();
    }
}

2. Google Ads API 认证配置

php

// wp-config.php 或专用配置文件
define('GOOGLE_ADS_CLIENT_ID', 'your-client-id.apps.googleusercontent.com');
define('GOOGLE_ADS_CLIENT_SECRET', 'your-client-secret');
define('GOOGLE_ADS_DEVELOPER_TOKEN', 'your-developer-token');
define('GOOGLE_ADS_REFRESH_TOKEN', 'refresh-token-from-oauth');
define('GOOGLE_ADS_CUSTOMER_ID', '123-456-7890');

// OAuth 2.0 认证流程
class GoogleAdsOAuth {
    public function getAccessToken() {
        $client = new Google_Client();
        $client->setClientId(GOOGLE_ADS_CLIENT_ID);
        $client->setClientSecret(GOOGLE_ADS_CLIENT_SECRET);
        $client->setScopes([
            'https://www.googleapis.com/auth/adwords'
        ]);
        
        $client->setAccessType('offline');
        $client->setPrompt('consent');
        
        // 如果有刷新令牌
        if (defined('GOOGLE_ADS_REFRESH_TOKEN')) {
            $client->refreshToken(GOOGLE_ADS_REFRESH_TOKEN);
            return $client->getAccessToken();
        }
        
        // 否则需要用户授权
        $authUrl = $client->createAuthUrl();
        
        // 重定向用户到 $authUrl,获取授权码
        // 然后用授权码获取 access_token 和 refresh_token
        
        return false;
    }
}

二、Google Analytics 4 API

php

// 用于获取用户行为数据,分析询盘质量
class GoogleAnalytics4API {
    private $client;
    
    /**
     * 获取询盘页面的用户行为指标
     */
    public function getInquiryPageBehavior($propertyId) {
        $client = new \Google\Client();
        $client->setAuthConfig('credentials.json');
        $client->addScope('https://www.googleapis.com/auth/analytics.readonly');
        
        $analytics = new \Google\Service\AnalyticsData($client);
        
        $request = new \Google\Service\AnalyticsData\RunReportRequest([
            'dateRanges' => [
                new \Google\Service\AnalyticsData\DateRange([
                    'startDate' => '30daysAgo',
                    'endDate' => 'today'
                ])
            ],
            'dimensions' => [
                new \Google\Service\AnalyticsData\Dimension(['name' => 'pagePath']),
                new \Google\Service\AnalyticsData\Dimension(['name' => 'country']),
                new \Google\Service\AnalyticsData\Dimension(['name' => 'deviceCategory']),
                new \Google\Service\AnalyticsData\Dimension(['name' => 'sessionSource']),
            ],
            'metrics' => [
                new \Google\Service\AnalyticsData\Metric(['name' => 'sessions']),
                new \Google\Service\AnalyticsData\Metric(['name' => 'averageSessionDuration']),
                new \Google\Service\AnalyticsData\Metric(['name' => 'bounceRate']),
                new \Google\Service\AnalyticsData\Metric(['name' => 'screenPageViewsPerSession']),
                new \Google\Service\AnalyticsData\Metric(['name' => 'conversions']),
            ],
            'dimensionFilter' => new \Google\Service\AnalyticsData\FilterExpression([
                'filter' => new \Google\Service\AnalyticsData\Filter([
                    'fieldName' => 'pagePath',
                    'stringFilter' => new \Google\Service\AnalyticsData\StringFilter([
                        'matchType' => 'CONTAINS',
                        'value' => '/contact'
                    ])
                ])
            ])
        ]);
        
        $response = $analytics->properties->runReport("properties/{$propertyId}", $request);
        
        // 处理响应数据
        $behaviorData = [];
        foreach ($response->getRows() as $row) {
            $behaviorData[] = [
                'page_path' => $row->getDimensionValues()[0]->getValue(),
                'country' => $row->getDimensionValues()[1]->getValue(),
                'device' => $row->getDimensionValues()[2]->getValue(),
                'source' => $row->getDimensionValues()[3]->getValue(),
                'sessions' => $row->getMetricValues()[0]->getValue(),
                'avg_duration' => $row->getMetricValues()[1]->getValue(),
                'bounce_rate' => $row->getMetricValues()[2]->getValue(),
                'pages_per_session' => $row->getMetricValues()[3]->getValue(),
                'conversions' => $row->getMetricValues()[4]->getValue()
            ];
        }
        
        return $behaviorData;
    }
    
    /**
     * 获取用户旅程数据(用于归因分析)
     */
    public function getUserJourneyData($propertyId) {
        $request = new \Google\Service\AnalyticsData\RunReportRequest([
            'dateRanges' => [/* ... */],
            'dimensions' => [
                new \Google\Service\AnalyticsData\Dimension(['name' => 'sessionSourceMedium']),
                new \Google\Service\AnalyticsData\Dimension(['name' => 'firstUserSourceMedium']),
                new \Google\Service\AnalyticsData\Dimension(['name' => 'sessionCampaignName']),
                new \Google\Service\AnalyticsData\Dimension(['name' => 'sessionDefaultChannelGroup']),
            ],
            'metrics' => [
                new \Google\Service\AnalyticsData\Metric(['name' => 'sessions']),
                new \Google\Service\AnalyticsData\Metric(['name' => 'userEngagementDuration']),
                new \Google\Service\AnalyticsData\Metric(['name' => 'conversions']),
                new \Google\Service\AnalyticsData\Metric(['name' => 'totalRevenue']),
            ]
        ]);
        
        // ... 执行请求
    }
}

三、IP地理位置和风险API

php

// 用于国家分析和欺诈检测
class GeoIPRiskAPIs {
    
    /**
     * 1. IP地理位置服务(免费版)
     */
    public function getIpGeolocation($ip) {
        // 选项1: ip-api.com (免费,有限制)
        $url = "http://ip-api.com/json/{$ip}?fields=status,message,country,countryCode,region,regionName,city,zip,lat,lon,timezone,isp,org,as,query";
        
        $response = wp_remote_get($url, [
            'timeout' => 3,
            'user-agent' => 'WordPress Inquiry Plugin'
        ]);
        
        if (is_wp_error($response)) {
            // 备用方案:使用 ipinfo.io
            $url = "https://ipinfo.io/{$ip}/json?token=YOUR_TOKEN";
            $response = wp_remote_get($url);
        }
        
        $data = json_decode(wp_remote_retrieve_body($response), true);
        
        return [
            'country_code' => $data['countryCode'] ?? $data['country'] ?? 'Unknown',
            'country_name' => $data['country'] ?? 'Unknown',
            'region' => $data['regionName'] ?? $data['region'] ?? '',
            'city' => $data['city'] ?? '',
            'isp' => $data['isp'] ?? '',
            'organization' => $data['org'] ?? '',
            'proxy' => $this->checkIfProxy($ip, $data)
        ];
    }
    
    /**
     * 2. IP风险检测(专业服务)
     */
    public function checkIpRisk($ip) {
        // 选项1: AbuseIPDB (免费版有限制)
        $api_key = get_option('abuseipdb_api_key');
        $url = "https://api.abuseipdb.com/api/v2/check";
        
        $response = wp_remote_get($url, [
            'headers' => [
                'Key' => $api_key,
                'Accept' => 'application/json'
            ],
            'body' => [
                'ipAddress' => $ip,
                'maxAgeInDays' => 90
            ],
            'timeout' => 5
        ]);
        
        $data = json_decode(wp_remote_retrieve_body($response), true);
        
        return [
            'abuse_score' => $data['data']['abuseConfidenceScore'] ?? 0,
            'total_reports' => $data['data']['totalReports'] ?? 0,
            'last_reported' => $data['data']['lastReportedAt'] ?? null,
            'is_public' => $data['data']['isPublic'] ?? false,
            'is_whitelisted' => $data['data']['isWhitelisted'] ?? false
        ];
    }
    
    /**
     * 3. VPN/代理检测
     */
    public function detectVPNProxy($ip) {
        // ip2proxy.io 或其他专业服务
        $api_key = get_option('ip2proxy_api_key');
        $url = "https://api.ip2proxy.com/?ip={$ip}&key={$api_key}&package=PX11";
        
        $response = wp_remote_get($url);
        $data = json_decode(wp_remote_retrieve_body($response), true);
        
        return [
            'is_proxy' => $data['is_proxy'] ?? false,
            'proxy_type' => $data['proxy_type'] ?? '',
            'threat' => $data['threat'] ?? '',
            'country_code' => $data['country_code'] ?? ''
        ];
    }
}

四、邮件和表单验证API

php

// 用于验证询盘真实性
class EmailVerificationAPI {
    
    /**
     * 邮箱验证服务
     */
    public function verifyEmailAddress($email) {
        // 选项1: Mailboxlayer (免费版100次/月)
        $access_key = get_option('mailboxlayer_api_key');
        $url = "https://apilayer.net/api/check?access_key={$access_key}&email={$email}";
        
        $response = wp_remote_get($url);
        $data = json_decode(wp_remote_retrieve_body($response), true);
        
        return [
            'is_valid_format' => $data['format_valid'] ?? false,
            'is_mx_found' => $data['mx_found'] ?? false,
            'is_smtp_valid' => $data['smtp_check'] ?? false,
            'is_catch_all' => $data['catch_all'] ?? false,
            'is_role_account' => $data['role'] ?? false,
            'is_disposable' => $data['disposable'] ?? false,
            'score' => $data['score'] ?? 0
        ];
    }
    
    /**
     * 电话号码验证
     */
    public function verifyPhoneNumber($phone, $country_code) {
        // NumVerify API
        $access_key = get_option('numverify_api_key');
        $url = "http://apilayer.net/api/validate?access_key={$access_key}&number={$phone}&country_code={$country_code}";
        
        $response = wp_remote_get($url);
        $data = json_decode(wp_remote_retrieve_body($response), true);
        
        return [
            'is_valid' => $data['valid'] ?? false,
            'number' => $data['number'] ?? '',
            'local_format' => $data['local_format'] ?? '',
            'international_format' => $data['international_format'] ?? '',
            'country_prefix' => $data['country_prefix'] ?? '',
            'country_code' => $data['country_code'] ?? '',
            'country_name' => $data['country_name'] ?? '',
            'location' => $data['location'] ?? '',
            'carrier' => $data['carrier'] ?? '',
            'line_type' => $data['line_type'] ?? ''
        ];
    }
}

五、文本分析和内容检测API

php

// 用于垃圾询盘内容分析
class ContentAnalysisAPI {
    
    /**
     * 垃圾内容检测
     */
    public function detectSpamContent($text, $context = 'inquiry') {
        $analysis = [
            'spam_score' => 0,
            'categories' => [],
            'suspicious_patterns' => [],
            'recommendations' => []
        ];
        
        // 1. 本地规则检测
        $analysis = $this->applyLocalRules($text, $analysis);
        
        // 2. AI内容分析 (可选付费服务)
        $analysis = $this->useAIContentAnalysis($text, $analysis);
        
        // 3. 相似度检测(防重复提交)
        $analysis['similarity_score'] = $this->checkContentSimilarity($text);
        
        return $analysis;
    }
    
    private function applyLocalRules($text, $analysis) {
        $spam_patterns = get_option('inquiry_spam_patterns', [
            '/\bfree\s+(sample|trial|download)\b/i',
            '/\b(?:buy|cheap|wholesale|distributor)\b.*\b(?:online|price|cost)\b/i',
            '/\b(?:urgent|immediate|asap)\b.*\b(?:quote|price|response)\b/i',
            '/\b(?:bank|transfer|payment|wire)\b.*\b(?:details|information)\b/i',
            '/\b(?:viagra|cialis|porn|xxx)\b/i',
            '/\b(?:lottery|prize|winner|claim)\b/i',
            '/https?:\/\/[^\s]+/i', // URL链接
            '/\d{10,}/', // 过多数字
        ]);
        
        foreach ($spam_patterns as $pattern) {
            if (preg_match($pattern, $text)) {
                $analysis['spam_score'] += 10;
                $analysis['suspicious_patterns'][] = $pattern;
            }
        }
        
        return $analysis;
    }
    
    /**
     * 使用AI服务进行内容分析(可选)
     */
    private function useAIContentAnalysis($text, $analysis) {
        // 选项1: OpenAI API
        if (get_option('use_openai_spam_detection')) {
            $api_key = get_option('openai_api_key');
            
            $response = wp_remote_post('https://api.openai.com/v1/completions', [
                'headers' => [
                    'Authorization' => 'Bearer ' . $api_key,
                    'Content-Type' => 'application/json'
                ],
                'body' => json_encode([
                    'model' => 'text-davinci-003',
                    'prompt' => "分析以下询盘内容是否为垃圾信息,评分0-100(越高越可能是垃圾):\n\n{$text}\n\n评分:",
                    'max_tokens' => 10,
                    'temperature' => 0.3
                ])
            ]);
            
            $result = json_decode(wp_remote_retrieve_body($response), true);
            
            if (isset($result['choices'][0]['text'])) {
                $ai_score = intval(trim($result['choices'][0]['text']));
                $analysis['spam_score'] = max($analysis['spam_score'], $ai_score);
                $analysis['ai_analysis'] = true;
            }
        }
        
        return $analysis;
    }
}

六、汇率和价格API

php

// 用于跨国价格和ROI计算
class CurrencyAPI {
    
    /**
     * 实时汇率获取
     */
    public function getExchangeRates($base_currency = 'USD') {
        // 选项1: ExchangeRate-API (免费版)
        $api_key = get_option('exchangerate_api_key');
        $url = "https://v6.exchangerate-api.com/v6/{$api_key}/latest/{$base_currency}";
        
        // 使用WordPress瞬态缓存,避免频繁调用
        $cached = get_transient('exchange_rates_' . $base_currency);
        
        if ($cached !== false) {
            return $cached;
        }
        
        $response = wp_remote_get($url);
        $data = json_decode(wp_remote_retrieve_body($response), true);
        
        if ($data['result'] === 'success') {
            // 缓存12小时
            set_transient('exchange_rates_' . $base_currency, $data['conversion_rates'], 12 * HOUR_IN_SECONDS);
            return $data['conversion_rates'];
        }
        
        // 备用方案:使用欧洲央行数据
        return $this->getECBRates();
    }
    
    private function getECBRates() {
        $response = wp_remote_get('https://api.exchangeratesapi.io/latest?base=USD');
        $data = json_decode(wp_remote_retrieve_body($response), true);
        
        return $data['rates'] ?? [];
    }
}

七、WordPress内部API和钩子

php

// WordPress原生功能和钩子
class WordPressInternalAPI {
    
    /**
     * 1. 询盘表单提交处理
     */
    public function setupFormHooks() {
        // 捕获CF7表单提交
        add_action('wpcf7_mail_sent', function($contact_form) {
            $submission = WPCF7_Submission::get_instance();
            if ($submission) {
                $data = $submission->get_posted_data();
                $this->processInquiry($data);
            }
        });
        
        // 捕获Gravity Forms提交
        add_action('gform_after_submission', function($entry, $form) {
            $this->processInquiry($entry);
        }, 10, 2);
        
        // 捕获任何表单POST请求
        add_action('init', function() {
            if ($_SERVER['REQUEST_METHOD'] === 'POST' && 
                (strpos($_SERVER['REQUEST_URI'], '/contact') !== false || 
                 strpos($_SERVER['REQUEST_URI'], '/inquiry') !== false)) {
                $this->processInquiry($_POST);
            }
        });
    }
    
    /**
     * 2. 用户会话追踪
     */
    public function trackUserSession() {
        if (!session_id()) {
            session_start();
        }
        
        // 生成唯一会话ID
        if (!isset($_SESSION['inquiry_session_id'])) {
            $_SESSION['inquiry_session_id'] = uniqid('inq_', true);
            $_SESSION['session_start'] = time();
            $_SESSION['page_views'] = 0;
            $_SESSION['referrer'] = $_SERVER['HTTP_REFERER'] ?? '';
            $_SESSION['landing_page'] = $_SERVER['REQUEST_URI'];
        }
        
        // 捕获UTM参数
        $utm_params = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
        foreach ($utm_params as $param) {
            if (isset($_GET[$param])) {
                $_SESSION[$param] = sanitize_text_field($_GET[$param]);
            }
        }
        
        // 捕获gclid
        if (isset($_GET['gclid'])) {
            $_SESSION['gclid'] = sanitize_text_field($_GET['gclid']);
        }
    }
    
    /**
     * 3. WordPress数据库操作
     */
    public function saveInquiryData($data) {
        global $wpdb;
        
        $wpdb->insert(
            $wpdb->prefix . 'inquiries',
            [
                'session_id' => $_SESSION['inquiry_session_id'] ?? '',
                'form_data' => json_encode($data),
                'utm_source' => $_SESSION['utm_source'] ?? '',
                'utm_medium' => $_SESSION['utm_medium'] ?? '',
                'utm_campaign' => $_SESSION['utm_campaign'] ?? '',
                'utm_term' => $_SESSION['utm_term'] ?? '',
                'utm_content' => $_SESSION['utm_content'] ?? '',
                'gclid' => $_SESSION['gclid'] ?? '',
                'ip_address' => $this->getUserIP(),
                'user_agent' => $_SERVER['HTTP_USER_AGENT'],
                'referrer_url' => $_SESSION['referrer'] ?? '',
                'landing_page' => $_SESSION['landing_page'] ?? '',
                'submitted_at' => current_time('mysql')
            ],
            ['%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s']
        );
        
        return $wpdb->insert_id;
    }
}

八、第三方集成API

php

// 其他可能的集成
class ThirdPartyIntegrations {
    
    /**
     * 1. CRM系统集成
     */
    public function pushToCRM($inquiry_data) {
        // HubSpot API
        if (get_option('enable_hubspot_integration')) {
            $api_key = get_option('hubspot_api_key');
            
            $response = wp_remote_post('https://api.hubapi.com/crm/v3/objects/contacts', [
                'headers' => [
                    'Authorization' => 'Bearer ' . $api_key,
                    'Content-Type' => 'application/json'
                ],
                'body' => json_encode([
                    'properties' => [
                        'email' => $inquiry_data['email'],
                        'firstname' => $inquiry_data['first_name'] ?? '',
                        'lastname' => $inquiry_data['last_name'] ?? '',
                        'phone' => $inquiry_data['phone'] ?? '',
                        'company' => $inquiry_data['company'] ?? '',
                        'website' => $inquiry_data['website'] ?? '',
                        'inquiry_source' => 'Google Ads',
                        'inquiry_content' => $inquiry_data['message'] ?? '',
                        'ad_campaign' => $_SESSION['utm_campaign'] ?? '',
                        'ad_group' => $_SESSION['utm_content'] ?? '',
                        'keyword' => $_SESSION['utm_term'] ?? ''
                    ]
                ])
            ]);
        }
        
        // Salesforce集成
        if (get_option('enable_salesforce_integration')) {
            // Salesforce REST API 实现
        }
    }
    
    /**
     * 2. 自动化工具集成
     */
    public function triggerAutomations($inquiry_data) {
        // Zapier Webhook
        $zapier_webhook = get_option('zapier_inquiry_webhook');
        if ($zapier_webhook) {
            wp_remote_post($zapier_webhook, [
                'body' => json_encode($inquiry_data),
                'headers' => ['Content-Type' => 'application/json']
            ]);
        }
        
        // Make.com (Integromat)
        $make_webhook = get_option('make_inquiry_webhook');
        if ($make_webhook) {
            // 类似实现
        }
    }
}

九、API调用管理和优化

php

// API调用管理和错误处理
class APIManager {
    private $rate_limits = [];
    
    /**
     * 智能API调用,避免超限
     */
    public function smartApiCall($api_name, $callback) {
        // 检查速率限制
        if ($this->isRateLimited($api_name)) {
            error_log("API {$api_name} rate limited");
            return $this->getCachedResponse($api_name);
        }
        
        try {
            $result = call_user_func($callback);
            
            // 记录调用时间
            $this->recordApiCall($api_name);
            
            // 缓存结果
            $this->cacheResponse($api_name, $result);
            
            return $result;
            
        } catch (Exception $e) {
            error_log("API {$api_name} error: " . $e->getMessage());
            
            // 回退到缓存
            return $this->getCachedResponse($api_name);
        }
    }
    
    private function isRateLimited($api_name) {
        $calls = get_transient("api_calls_{$api_name}") ?: [];
        
        // 移除超过1小时的记录
        $hour_ago = time() - 3600;
        $recent_calls = array_filter($calls, function($time) use ($hour_ago) {
            return $time > $hour_ago;
        });
        
        // 检查是否超限
        $limits = [
            'google_ads' => 10000, // Google Ads API 每日限制
            'ga4' => 1000, // GA4 API 限制
            'ip_api' => 150, // ip-api.com 限制
            'abuseipdb' => 1000, // AbuseIPDB 限制
        ];
        
        return count($recent_calls) >= ($limits[$api_name] ?? 100);
    }
}

十、完整的插件初始化配置

php

// 主插件文件
class InquiryAnalyticsPlugin {
    
    public function __construct() {
        // 1. 注册WordPress钩子
        add_action('init', [$this, 'initializePlugin']);
        
        // 2. 创建数据库表
        register_activation_hook(__FILE__, [$this, 'createDatabaseTables']);
        
        // 3. 设置管理菜单
        add_action('admin_menu', [$this, 'addAdminMenu']);
        
        // 4. 注册短代码
        add_shortcode('inquiry_dashboard', [$this, 'renderDashboard']);
        
        // 5. 注册AJAX处理器
        add_action('wp_ajax_get_inquiry_insights', [$this, 'ajaxGetInsights']);
        add_action('wp_ajax_nopriv_get_inquiry_insights', [$this, 'ajaxGetInsights']);
    }
    
    public function initializePlugin() {
        // 初始化API客户端
        $this->apis = [
            'google_ads' => new GoogleAdsAPI(),
            'ga4' => new GoogleAnalytics4API(),
            'geo_ip' => new GeoIPRiskAPIs(),
            'email_verify' => new EmailVerificationAPI(),
            'content_analysis' => new ContentAnalysisAPI(),
            'currency' => new CurrencyAPI(),
            'wordpress' => new WordPressInternalAPI(),
            'third_party' => new ThirdPartyIntegrations(),
            'api_manager' => new APIManager()
        ];
        
        // 设置会话追踪
        $this->apis['wordpress']->trackUserSession();
    }
    
    /**
     * 创建必要的数据库表
     */
    public function createDatabaseTables() {
        global $wpdb;
        
        $charset_collate = $wpdb->get_charset_collate();
        
        $tables = [
            "CREATE TABLE {$wpdb->prefix}inquiries (
                id BIGINT(20) UNSIGNED AUTO_INCREMENT,
                -- ... 字段定义
                PRIMARY KEY (id)
            ) $charset_collate;",
            
            "CREATE TABLE {$wpdb->prefix}keyword_analysis (
                -- ... 字段定义
            ) $charset_collate;",
            
            "CREATE TABLE {$wpdb->prefix}country_performance (
                -- ... 字段定义
            ) $charset_collate;"
        ];
        
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        
        foreach ($tables as $table_sql) {
            dbDelta($table_sql);
        }
    }
}

实施建议和注意事项

1. API密钥管理

php

// 建议使用WordPress选项页面存储API密钥
add_action('admin_init', function() {
    register_setting('inquiry_analytics_options', 'google_ads_api_key');
    register_setting('inquiry_analytics_options', 'ga4_property_id');
    register_setting('inquiry_analytics_options', 'abuseipdb_api_key');
    // ... 其他API密钥
});

2. 错误处理和降级策略

  • 所有API调用都应该有try-catch
  • 实现合理的缓存策略
  • 准备降级方案(如使用本地规则替代AI分析)

3. 数据隐私合规

  • 遵守GDPR、CCPA等法规
  • 提供数据导出和删除功能
  • 匿名化敏感数据

4. 性能优化

  • 使用WordPress瞬态API缓存
  • 实现懒加载和异步处理
  • 定期清理旧数据

5. 监控和日志

php

// 添加API调用日志
add_action('inquiry_api_call', function($api_name, $success, $response_time) {
    // 记录到日志文件或数据库
    error_log("API {$api_name}: " . ($success ? 'success' : 'failed') . 
              " in {$response_time}ms");
}, 10, 3);

这样的API架构可以支持前面提到的所有深度分析功能,同时保证了系统的稳定性和可扩展性。

Comments are closed.