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' => [...]
];
具体决策:
- 预算再分配:
- 从低ROI广告系列转移到高ROI广告系列
- 识别“预算不足”的优秀系列(表现好但预算用尽太快)
- 识别“预算浪费”的差系列(花得多但效果差)
- 预算时间分配:
- 哪些时段询盘质量最高?
- 周末vs工作日的表现差异?
- 季节性的预算调整建议
二、出价策略优化
决策意义:
“每个点击/转化应该出多少钱?”
需要的数据:
- 关键词层级数据:php$keyword_bid_data = [ ‘关键词A’ => [ ‘current_bid’ => 5.00, // 当前出价 ‘avg_cpc’ => 4.80, // 实际平均点击成本 ‘inquiries’ => 15, // 产生的询盘数 ‘quality_score’ => 8.2, // 询盘质量平均分 ‘suggested_bid’ => 6.50 // 建议出价 ] ];
- 出价策略评估:
- 最大化点击vs最大化转化vs目标CPA
- 哪种策略最适合你的业务目标?
具体决策:
- 智能调价建议:
- 高质量询盘关键词:提高出价(即使CPC较高)
- 垃圾询盘关键词:降低出价或暂停
- 无询盘但高流量词:调整匹配方式或否词
- 匹配类型优化: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
]
];
具体决策:
- 国家优先级排序:
- 高价值国家:加大投放
- 低质量国家:限制预算或提高出价门槛
- 测试新市场:小预算测试验证
- 本地化策略:
- 不同国家的广告文案优化
- 时区投放调整
- 文化适配建议
四、关键词-询盘质量分析(最重要的优化点)
决策意义:
“哪些关键词在浪费我的钱?”
垃圾关键词识别模型:
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/月'
];
}
}
具体决策:
- 否定关键词策略:
- 立即否定:确认的垃圾词
- 观察名单:疑似垃圾词(设观察期)
- 搜索词报告分析:发现新的垃圾词模式
- 关键词重组建议: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%,节省人力成本'
]
];
}
}
实际业务价值
- 直接成本节省:
- 垃圾关键词排除:节省20-40%的无效点击费用
- 国家定向优化:提升整体ROI 30-50%
- 预算重新分配:提升有效询盘量25%
- 间接价值:
- 销售团队效率:减少处理垃圾询盘的时间
- 客户质量提升:获得更多高意向客户
- 决策信心增强:数据驱动的优化,而非猜测
- 竞争优势:
- 比竞争对手更快识别无效投放
- 更精准的获客成本控制
- 持续优化的广告效果
结论:这四个维度不是”有意义”,而是决定谷歌广告成败的关键决策点。你的询盘管理插件如果能在这四个方面提供深度洞察,将直接带来广告效果的指数级提升。
询盘插件如何在四个方面提供深度洞察,请提供详细指导和建议
一、预算分配洞察系统
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架构可以支持前面提到的所有深度分析功能,同时保证了系统的稳定性和可扩展性。