文章目录[隐藏]
手把手教程:为WordPress实现基于用户画像的个性化弹窗与内容推荐工具
引言:个性化体验在网站运营中的重要性
在当今互联网环境中,用户期望获得与其兴趣和需求高度相关的个性化体验。根据Monetate的研究,93%的企业表示个性化策略显著提升了他们的业务转化率。对于WordPress网站运营者而言,实现个性化内容推荐和智能弹窗功能,不仅能提升用户体验,还能有效提高用户参与度和转化率。
本教程将详细指导您如何通过WordPress代码二次开发,创建一个基于用户画像的个性化弹窗与内容推荐系统。我们将从零开始,逐步构建一个完整的解决方案,涵盖用户数据收集、画像构建、智能推荐算法和弹窗展示等核心功能。
第一部分:项目规划与准备工作
1.1 系统架构设计
在开始编码之前,我们需要规划整个系统的架构:
- 用户数据收集模块:负责收集用户行为数据
- 用户画像构建模块:分析用户数据并创建用户画像
- 内容推荐引擎:根据用户画像匹配相关内容
- 智能弹窗系统:在适当时机展示个性化内容
- 管理后台界面:供管理员配置系统参数
1.2 开发环境准备
确保您的开发环境满足以下要求:
- WordPress 5.0或更高版本
- PHP 7.2或更高版本(推荐7.4+)
- MySQL 5.6或更高版本
- 基本的HTML/CSS/JavaScript知识
- 对WordPress钩子(Hooks)和过滤器(Filters)有基本了解
1.3 创建插件基础结构
首先,我们需要创建一个新的WordPress插件:
- 在
wp-content/plugins/目录下创建新文件夹personalized-popup-recommendations - 在该文件夹中创建主插件文件
personalized-popup-recommendations.php - 添加插件头部信息:
<?php
/**
* Plugin Name: 个性化弹窗与内容推荐工具
* Plugin URI: https://yourwebsite.com/
* Description: 基于用户画像的个性化弹窗与内容推荐系统
* Version: 1.0.0
* Author: 您的名字
* License: GPL v2 or later
* Text Domain: personalized-popup
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 定义插件常量
define('PPR_VERSION', '1.0.0');
define('PPR_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('PPR_PLUGIN_URL', plugin_dir_url(__FILE__));
第二部分:用户数据收集与存储
2.1 创建数据库表结构
我们需要创建数据库表来存储用户行为数据和画像信息。在插件激活时创建这些表:
// 注册激活钩子
register_activation_hook(__FILE__, 'ppr_activate_plugin');
function ppr_activate_plugin() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
$table_prefix = $wpdb->prefix . 'ppr_';
// 用户行为记录表
$user_behavior_table = $table_prefix . 'user_behavior';
$sql1 = "CREATE TABLE IF NOT EXISTS $user_behavior_table (
id bigint(20) NOT NULL AUTO_INCREMENT,
user_id bigint(20) DEFAULT NULL,
session_id varchar(100) NOT NULL,
behavior_type varchar(50) NOT NULL,
object_id bigint(20) DEFAULT NULL,
object_type varchar(50) DEFAULT NULL,
metadata text,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY user_id (user_id),
KEY session_id (session_id),
KEY behavior_type (behavior_type)
) $charset_collate;";
// 用户画像表
$user_profile_table = $table_prefix . 'user_profiles';
$sql2 = "CREATE TABLE IF NOT EXISTS $user_profile_table (
id bigint(20) NOT NULL AUTO_INCREMENT,
user_id bigint(20) DEFAULT NULL,
session_id varchar(100) NOT NULL,
interests text,
behavior_pattern text,
last_updated datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY unique_user_session (user_id, session_id),
KEY session_id (session_id)
) $charset_collate;";
// 推荐记录表
$recommendations_table = $table_prefix . 'recommendations';
$sql3 = "CREATE TABLE IF NOT EXISTS $recommendations_table (
id bigint(20) NOT NULL AUTO_INCREMENT,
user_id bigint(20) DEFAULT NULL,
session_id varchar(100) NOT NULL,
content_id bigint(20) NOT NULL,
recommendation_type varchar(50) NOT NULL,
shown_count int(11) DEFAULT 0,
clicked_count int(11) DEFAULT 0,
last_shown datetime DEFAULT NULL,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY user_session_content (user_id, session_id, content_id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql1);
dbDelta($sql2);
dbDelta($sql3);
// 设置默认选项
add_option('ppr_db_version', PPR_VERSION);
}
2.2 实现用户行为追踪
创建用户行为追踪类,用于记录用户在网站上的各种行为:
class PPR_User_Tracker {
private static $instance = null;
private $session_id;
public static function get_instance() {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct() {
$this->init_session();
$this->setup_hooks();
}
private function init_session() {
if (!session_id()) {
session_start();
}
if (!isset($_SESSION['ppr_session_id'])) {
$_SESSION['ppr_session_id'] = $this->generate_session_id();
}
$this->session_id = $_SESSION['ppr_session_id'];
}
private function generate_session_id() {
return md5(uniqid(wp_rand(), true) . $_SERVER['REMOTE_ADDR'] . time());
}
private function setup_hooks() {
// 追踪页面访问
add_action('wp', array($this, 'track_page_view'));
// 追踪文章阅读
add_action('the_post', array($this, 'track_post_view'));
// 追踪搜索行为
add_action('pre_get_posts', array($this, 'track_search'));
// 追踪点击行为
add_action('wp_footer', array($this, 'add_click_tracking'));
}
public function track_page_view() {
if (is_admin()) return;
$user_id = is_user_logged_in() ? get_current_user_id() : null;
$current_url = home_url($_SERVER['REQUEST_URI']);
$this->record_behavior('page_view', array(
'url' => $current_url,
'page_title' => wp_get_document_title(),
'referrer' => isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''
));
}
public function track_post_view($post) {
if (!is_single() && !is_page()) return;
$user_id = is_user_logged_in() ? get_current_user_id() : null;
$this->record_behavior('post_view', $post->ID, 'post', array(
'post_type' => $post->post_type,
'category_ids' => wp_get_post_categories($post->ID, array('fields' => 'ids')),
'tag_ids' => wp_get_post_tags($post->ID, array('fields' => 'ids'))
));
}
public function track_search($query) {
if (!$query->is_search() || $query->is_admin()) return;
$search_query = get_search_query();
if (empty($search_query)) return;
$user_id = is_user_logged_in() ? get_current_user_id() : null;
$this->record_behavior('search', null, null, array(
'search_query' => $search_query,
'results_count' => $query->found_posts
));
}
public function record_behavior($behavior_type, $object_id = null, $object_type = null, $metadata = array()) {
global $wpdb;
$user_id = is_user_logged_in() ? get_current_user_id() : null;
$table_name = $wpdb->prefix . 'ppr_user_behavior';
$wpdb->insert(
$table_name,
array(
'user_id' => $user_id,
'session_id' => $this->session_id,
'behavior_type' => $behavior_type,
'object_id' => $object_id,
'object_type' => $object_type,
'metadata' => $metadata ? json_encode($metadata) : null
),
array('%d', '%s', '%s', '%d', '%s', '%s')
);
}
public function add_click_tracking() {
if (is_admin()) return;
?>
<script type="text/javascript">
(function($) {
'use strict';
// 追踪链接点击
$(document).on('click', 'a[href*="<?php echo home_url(); ?>"]', function(e) {
var link = $(this);
var href = link.attr('href');
var linkText = link.text().substring(0, 200);
// 发送AJAX请求记录点击
$.ajax({
url: '<?php echo admin_url('admin-ajax.php'); ?>',
type: 'POST',
data: {
action: 'ppr_track_click',
href: href,
link_text: linkText,
nonce: '<?php echo wp_create_nonce('ppr_tracking_nonce'); ?>'
}
});
});
// 追踪按钮点击
$(document).on('click', 'button, input[type="submit"]', function(e) {
var button = $(this);
var buttonText = button.text().substring(0, 200) || button.val().substring(0, 200);
// 发送AJAX请求记录点击
$.ajax({
url: '<?php echo admin_url('admin-ajax.php'); ?>',
type: 'POST',
data: {
action: 'ppr_track_button_click',
button_text: buttonText,
nonce: '<?php echo wp_create_nonce('ppr_tracking_nonce'); ?>'
}
});
});
})(jQuery);
</script>
<?php
}
}
// 初始化追踪器
add_action('init', function() {
PPR_User_Tracker::get_instance();
});
// 处理AJAX点击追踪
add_action('wp_ajax_ppr_track_click', 'ppr_ajax_track_click');
add_action('wp_ajax_nopriv_ppr_track_click', 'ppr_ajax_track_click');
function ppr_ajax_track_click() {
check_ajax_referer('ppr_tracking_nonce', 'nonce');
$tracker = PPR_User_Tracker::get_instance();
$href = sanitize_text_field($_POST['href']);
$link_text = sanitize_text_field($_POST['link_text']);
// 尝试从URL中提取文章ID
$post_id = url_to_postid($href);
$tracker->record_behavior('link_click', $post_id ?: null, $post_id ? 'post' : null, array(
'href' => $href,
'link_text' => $link_text
));
wp_die();
}
第三部分:用户画像构建与分析
3.1 用户画像分析引擎
创建用户画像分析类,用于处理收集到的用户行为数据并构建用户画像:
class PPR_User_Profile_Analyzer {
private $user_id;
private $session_id;
public function __construct($user_id = null, $session_id = null) {
$this->user_id = $user_id;
if ($session_id) {
$this->session_id = $session_id;
} else {
$tracker = PPR_User_Tracker::get_instance();
$this->session_id = $tracker->get_session_id();
}
}
public function analyze_and_update_profile() {
global $wpdb;
$behavior_table = $wpdb->prefix . 'ppr_user_behavior';
$profile_table = $wpdb->prefix . 'ppr_user_profiles';
// 获取用户最近的行为数据
$query = $wpdb->prepare(
"SELECT * FROM $behavior_table
WHERE (user_id = %d OR session_id = %s)
AND created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
ORDER BY created_at DESC
LIMIT 1000",
$this->user_id ?: 0,
$this->session_id
);
$behaviors = $wpdb->get_results($query);
if (empty($behaviors)) {
return false;
}
// 分析行为数据
$interests = $this->analyze_interests($behaviors);
$behavior_pattern = $this->analyze_behavior_pattern($behaviors);
// 更新或插入用户画像
$wpdb->replace(
$profile_table,
array(
'user_id' => $this->user_id,
'session_id' => $this->session_id,
'interests' => json_encode($interests),
'behavior_pattern' => json_encode($behavior_pattern)
),
array('%d', '%s', '%s', '%s')
);
return true;
}
private function analyze_interests($behaviors) {
$interests = array(
'categories' => array(),
'tags' => array(),
'post_types' => array(),
'topics' => array()
);
foreach ($behaviors as $behavior) {
if ($behavior->object_type === 'post' && $behavior->object_id) {
$post_id = $behavior->object_id;
// 分析分类兴趣
$categories = wp_get_post_categories($post_id, array('fields' => 'ids'));
foreach ($categories as $cat_id) {
if (!isset($interests['categories'][$cat_id])) {
$interests['categories'][$cat_id] = 0;
}
$interests['categories'][$cat_id] += $this->get_behavior_weight($behavior->behavior_type);
}
// 分析标签兴趣
$tags = wp_get_post_tags($post_id, array('fields' => 'ids'));
foreach ($tags as $tag_id) {
if (!isset($interests['tags'][$tag_id])) {
$interests['tags'][$tag_id] = 0;
}
$interests['tags'][$tag_id] += $this->get_behavior_weight($behavior->behavior_type);
}
// 分析内容类型兴趣
$post_type = get_post_type($post_id);
if (!isset($interests['post_types'][$post_type])) {
$interests['post_types'][$post_type] = 0;
}
$interests['post_types'][$post_type] += $this->get_behavior_weight($behavior->behavior_type);
}
// 分析搜索关键词
if ($behavior->behavior_type === 'search' && $behavior->metadata) {
$metadata = json_decode($behavior->metadata, true);
if (isset($metadata['search_query'])) {
$keywords = $this->extract_keywords($metadata['search_query']);
foreach ($keywords as $keyword) {
if (!isset($interests['topics'][$keyword])) {
$interests['topics'][$keyword] = 0;
}
$interests['topics'][$keyword] += 1;
}
}
}
}
// 对兴趣进行排序,只保留前20个
foreach ($interests as $type => $items) {
arsort($items);
$interests[$type] = array_slice($items, 0, 20, true);
}
return $interests;
}
private function analyze_behavior_pattern($behaviors) {
$pattern = array(
'visit_frequency' => 0,
'preferred_time' => array(),
'avg_session_duration' => 0,
'preferred_content_types' => array()
);
// 分析访问频率
$visit_dates = array();
foreach ($behaviors as $behavior) {
if ($behavior->behavior_type === 'page_view') {
$date = date('Y-m-d', strtotime($behavior->created_at));
if (!in_array($date, $visit_dates)) {
$visit_dates[] = $date;
}
}
}
$pattern['visit_frequency'] = count($visit_dates) / 30; // 30天内的平均每日访问次数
// 分析偏好访问时间
$hour_counts = array_fill(0, 24, 0);
foreach ($behaviors as $behavior) {
$hour = date('H', strtotime($behavior->created_at));
$hour_counts[(int)$hour]++;
}
arsort($hour_counts);
$pattern['preferred_time'] = array_slice($hour_counts, 0, 3, true);
return $pattern;
}
private function get_behavior_weight($behavior_type) {
$weights = array(
'post_view' => 3,
'link_click' => 2,
'page_view' => 1,
search' => 2
);
return isset($weights[$behavior_type]) ? $weights[$behavior_type] : 1;
}
private function extract_keywords($search_query) {
// 移除停用词
$stop_words = array('的', '了', '在', '是', '我', '有', '和', '就', '不', '人', '都', '一', '一个', '上', '也', '很', '到', '说', '要', '去', '你', '会', '着', '没有', '看', '好', '自己', '这');
$words = preg_split('/[s,.。!!??]+/u', $search_query);
$keywords = array();
foreach ($words as $word) {
$word = trim($word);
if (mb_strlen($word) > 1 && !in_array($word, $stop_words)) {
$keywords[] = $word;
}
}
return $keywords;
}
public function get_user_profile() {
global $wpdb;
$profile_table = $wpdb->prefix . 'ppr_user_profiles';
$query = $wpdb->prepare(
"SELECT * FROM $profile_table
WHERE (user_id = %d OR session_id = %s)
ORDER BY last_updated DESC
LIMIT 1",
$this->user_id ?: 0,
$this->session_id
);
$profile = $wpdb->get_row($query);
if ($profile) {
$profile->interests = json_decode($profile->interests, true);
$profile->behavior_pattern = json_decode($profile->behavior_pattern, true);
}
return $profile;
}
}
// 定期分析用户画像
add_action('ppr_daily_profile_analysis', 'ppr_perform_daily_analysis');
function ppr_perform_daily_analysis() {
global $wpdb;
$behavior_table = $wpdb->prefix . 'ppr_user_behavior';
// 获取最近有活动的用户和会话
$query = "SELECT DISTINCT user_id, session_id FROM $behavior_table
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)";
$users_sessions = $wpdb->get_results($query);
foreach ($users_sessions as $item) {
$analyzer = new PPR_User_Profile_Analyzer($item->user_id, $item->session_id);
$analyzer->analyze_and_update_profile();
}
}
// 设置定时任务
register_activation_hook(__FILE__, function() {
if (!wp_next_scheduled('ppr_daily_profile_analysis')) {
wp_schedule_event(time(), 'daily', 'ppr_daily_profile_analysis');
}
});
register_deactivation_hook(__FILE__, function() {
wp_clear_scheduled_hook('ppr_daily_profile_analysis');
});
## 第四部分:智能内容推荐引擎
### 4.1 推荐算法实现
创建内容推荐引擎类,根据用户画像匹配合适的内容:
class PPR_Content_Recommender {
private $user_profile;
private $analyzer;
public function __construct($user_id = null, $session_id = null) {
$this->analyzer = new PPR_User_Profile_Analyzer($user_id, $session_id);
$this->user_profile = $this->analyzer->get_user_profile();
}
public function get_recommendations($limit = 5, $type = 'mixed') {
if (!$this->user_profile) {
return $this->get_fallback_recommendations($limit);
}
$recommendations = array();
// 基于兴趣的推荐
$interest_based = $this->get_interest_based_recommendations($limit);
$recommendations = array_merge($recommendations, $interest_based);
// 基于协同过滤的推荐(如果有足够数据)
if (count($recommendations) < $limit) {
$collaborative_based = $this->get_collaborative_recommendations($limit - count($recommendations));
$recommendations = array_merge($recommendations, $collaborative_based);
}
// 如果还不够,添加热门内容
if (count($recommendations) < $limit) {
$popular_based = $this->get_popular_recommendations($limit - count($recommendations));
$recommendations = array_merge($recommendations, $popular_based);
}
// 去重并限制数量
$recommendations = $this->deduplicate_recommendations($recommendations);
return array_slice($recommendations, 0, $limit);
}
private function get_interest_based_recommendations($limit) {
$interests = $this->user_profile->interests;
$recommendations = array();
// 基于分类兴趣的推荐
if (!empty($interests['categories'])) {
$category_ids = array_keys($interests['categories']);
$cat_recommendations = $this->get_posts_by_categories($category_ids, ceil($limit / 2));
$recommendations = array_merge($recommendations, $cat_recommendations);
}
// 基于标签兴趣的推荐
if (!empty($interests['tags']) && count($recommendations) < $limit) {
$tag_ids = array_keys($interests['tags']);
$tag_recommendations = $this->get_posts_by_tags($tag_ids, ceil($limit / 3));
$recommendations = array_merge($recommendations, $tag_recommendations);
}
// 基于主题关键词的推荐
if (!empty($interests['topics']) && count($recommendations) < $limit) {
$topics = array_keys($interests['topics']);
$topic_recommendations = $this->get_posts_by_topics($topics, ceil($limit / 4));
$recommendations = array_merge($recommendations, $topic_recommendations);
}
return $recommendations;
}
private function get_posts_by_categories($category_ids, $limit) {
$args = array(
'post_type' => 'post',
'posts_per_page' => $limit * 2, // 获取更多以便筛选
'category__in' => $category_ids,
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
'date_query' => array(
array(
'after' => '30 days ago'
)
)
);
$posts = get_posts($args);
// 根据用户兴趣权重排序
$scored_posts = array();
foreach ($posts as $post) {
$score = $this->calculate_post_score($post, $category_ids);
$scored_posts[] = array(
'post' => $post,
'score' => $score
);
}
// 按分数排序
usort($scored_posts, function($a, $b) {
return $b['score'] <=> $a['score'];
});
// 返回前$limit个
return array_slice(array_column($scored_posts, 'post'), 0, $limit);
}
private function calculate_post_score($post, $preferred_category_ids) {
$score = 0;
// 分类匹配分数
$post_categories = wp_get_post_categories($post->ID);
$matched_categories = array_intersect($post_categories, $preferred_category_ids);
$score += count($matched_categories) * 10;
// 新鲜度分数(越新分数越高)
$post_age = time() - strtotime($post->post_date);
$freshness_score = max(0, 30 - ($post_age / (24 * 3600))); // 30天内有效
$score += $freshness_score;
// 互动分数(评论数)
$score += min($post->comment_count, 10);
return $score;
}
private function get_collaborative_recommendations($limit) {
global $wpdb;
$behavior_table = $wpdb->prefix . 'ppr_user_behavior';
// 查找有相似行为的其他用户
$query = $wpdb->prepare(
"SELECT DISTINCT b2.object_id
FROM $behavior_table b1
JOIN $behavior_table b2 ON b1.object_id = b2.object_id
AND b1.behavior_type = b2.behavior_type
AND (b1.user_id != b2.user_id OR b1.session_id != b2.session_id)
WHERE (b1.user_id = %d OR b1.session_id = %s)
AND b2.object_type = 'post'
AND b2.behavior_type IN ('post_view', 'link_click')
AND b2.created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY b2.object_id
ORDER BY COUNT(*) DESC
LIMIT %d",
$this->user_profile->user_id ?: 0,
$this->user_profile->session_id,
$limit * 2
);
$post_ids = $wpdb->get_col($query);
if (empty($post_ids)) {
return array();
}
// 获取文章详情
$args = array(
'post__in' => $post_ids,
'posts_per_page' => $limit,
'post_type' => 'post',
'post_status' => 'publish',
'orderby' => 'post__in'
);
return get_posts($args);
}
private function get_popular_recommendations($limit) {
// 获取热门文章(基于浏览量)
$args = array(
'post_type' => 'post',
'posts_per_page' => $limit,
'post_status' => 'publish',
'orderby' => 'meta_value_num',
'meta_key' => 'post_views_count',
'order' => 'DESC',
'date_query' => array(
array(
'after' => '30 days ago'
)
)
);
return get_posts($args);
}
private function get_fallback_recommendations($limit) {
// 对于新用户,返回最新或最受欢迎的文章
$args = array(
'post_type' => 'post',
'posts_per_page' => $limit,
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC'
);
return get_posts($args);
}
private function deduplicate_recommendations($recommendations) {
$seen_ids = array();
$unique_recommendations = array();
foreach ($recommendations as $post) {
if (!in_array($post->ID, $seen_ids)) {
$seen_ids[] = $post->ID;
$unique_recommendations[] = $post;
}
}
return $unique_recommendations;
}
public function record_recommendation_shown($content_id, $recommendation_type = 'popup') {
global $wpdb;
$table_name = $wpdb->prefix . 'ppr_recommendations';
$user_id = $this->user_profile ? $this->user_profile->user_id : null;
$session_id = $this->user_profile ? $this->user_profile->session_id : PPR_User_Tracker::get_instance()->get_session_id();
// 检查是否已有记录
$existing = $wpdb->get_row($wpdb->prepare(
"SELECT id, shown_count FROM $table_name
WHERE content_id = %d
AND (user_id = %d OR session_id = %s)
AND recommendation_type = %s",
$content_id,
$user_id ?: 0,
$session_id,
$recommendation_type
));
if ($existing) {
// 更新现有记录
$wpdb->update(
$table_name,
array(
'shown_count' => $existing->shown_count + 1,
'last_shown' => current_time('mysql')
),
array('id' => $existing->id),
array('%d', '%s'),
array('%d')
);
} else {
// 插入新记录
$wpdb->insert(
$table_name,
array(
'user_id' => $user_id,
'session_id' => $session_id,
'content_id' => $content_id,
'recommendation_type' => $recommendation_type,
'shown_count' => 1,
'last_shown' => current_time('mysql')
),
array('%d', '%s', '%d', '%s', '%d', '%s')
);
}
}
}
## 第五部分:个性化弹窗系统
### 5.1 弹窗触发与展示逻辑
创建智能弹窗系统,根据用户行为和画像决定何时显示弹窗:
class PPR_Personalized_Popup {
private $recommender;
private $popup_settings;
public function __construct() {
$this->recommender = new PPR_Content_Recommender();
$this->popup_settings = get_option('ppr_popup_settings', array());
$this->setup_hooks();
}
private function setup_hooks() {
// 在页面底部添加弹窗HTML
add_action('wp_footer', array($this, 'render_popup_html'));
// 添加弹窗样式和脚本
add_action('wp_enqueue_scripts', array($this, 'enqueue_assets'));
// AJAX处理弹窗内容
add_action('wp_ajax_ppr_get_popup_content', array($this, 'ajax_get_popup_content'));
add_action('wp_ajax_nopriv_ppr_get_popup_content', array($this, 'ajax_get_popup_content'));
// 追踪弹窗交互
add_action('wp_ajax_ppr_track_popup_interaction', array($this, 'ajax_track_popup_interaction'));
add_action('wp_ajax_nopriv_ppr_track_popup_interaction', array($this, 'ajax_track_popup_interaction'));
}
public function enqueue_assets() {
if ($this->should_show_popup()) {
wp_enqueue_style(
'ppr-popup-style',
PPR_PLUGIN_URL . 'assets/css/popup.css',
array(),
PPR_VERSION
);
wp_enqueue_script(
'ppr-popup-script',
PPR_PLUGIN_URL . 'assets/js/popup.js',
array('jquery'),
PPR_VERSION,
true
);
wp_localize_script('ppr-popup-script', 'ppr_ajax', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('ppr_popup_nonce')
));
}
}
private function should_show_popup() {
// 检查是否在后台
if (is_admin()) {
return false;
}
// 检查是否已登录且是管理员(通常不给管理员显示弹窗)
if (current_user_can('manage_options')) {
return false;
}
// 检查页面类型排除
$excluded_pages = isset($this->popup_settings['excluded_pages']) ?
$this->popup_settings['excluded_pages'] : array();
if (is_page($excluded_pages) || is_single($excluded_pages)) {
return false;
}
// 检查触发条件
$trigger_condition = isset($this->popup_settings['trigger_condition']) ?
$this->popup_settings['trigger_condition'] : 'time_on_page';
switch ($trigger_condition) {
case 'time_on_page':
return $this->check_time_on_page_trigger();
case 'scroll_depth':
return $this->check_scroll_depth_trigger();
case 'exit_intent':
return $this->check_exit_intent_trigger();
default:
return false;
}
}
private function check_time_on_page_trigger() {
$delay = isset($this->popup_settings['time_delay']) ?
intval($this->popup_settings['time_delay']) : 30;
// 这个检查将在前端JavaScript中完成
return true;
}
public function render_popup_html() {
if (!$this->should_show_popup()) {
return;
}
?>
<div id="ppr-personalized-popup" class="ppr-popup-container" style="display: none;">
<div class="ppr-popup-overlay"></div>
<div class="ppr-popup-content">
<button class="ppr-popup-close">×</button>
<div class="ppr-popup-header">
<h3>为您推荐</h3>
</div>
<div class="ppr-popup-body">
<div class="ppr-loading">
<div class="ppr-spinner"></div>
<p>正在为您生成个性化推荐...</p>
</div>
<div class="ppr-recommendations-container"></div>
</div>
<div class="ppr-popup-footer">
<p class="ppr-privacy-notice">
推荐基于您的浏览行为生成,<a href="<?php echo get_privacy_policy_url(); ?>">了解隐私政策</a>
</p>
</div>
</div>
</div>
<?php
}
