首页 / 应用软件 / 手把手教程,为WordPress实现基于用户画像的个性化弹窗与内容推荐工具

手把手教程,为WordPress实现基于用户画像的个性化弹窗与内容推荐工具

手把手教程:为WordPress实现基于用户画像的个性化弹窗与内容推荐工具

引言:个性化体验在网站运营中的重要性

在当今互联网环境中,用户期望获得与其兴趣和需求高度相关的个性化体验。根据Monetate的研究,93%的企业表示个性化策略显著提升了他们的业务转化率。对于WordPress网站运营者而言,实现个性化内容推荐和智能弹窗功能,不仅能提升用户体验,还能有效提高用户参与度和转化率。

本教程将详细指导您如何通过WordPress代码二次开发,创建一个基于用户画像的个性化弹窗与内容推荐系统。我们将从零开始,逐步构建一个完整的解决方案,涵盖用户数据收集、画像构建、智能推荐算法和弹窗展示等核心功能。

第一部分:项目规划与准备工作

1.1 系统架构设计

在开始编码之前,我们需要规划整个系统的架构:

  1. 用户数据收集模块:负责收集用户行为数据
  2. 用户画像构建模块:分析用户数据并创建用户画像
  3. 内容推荐引擎:根据用户画像匹配相关内容
  4. 智能弹窗系统:在适当时机展示个性化内容
  5. 管理后台界面:供管理员配置系统参数

1.2 开发环境准备

确保您的开发环境满足以下要求:

  • WordPress 5.0或更高版本
  • PHP 7.2或更高版本(推荐7.4+)
  • MySQL 5.6或更高版本
  • 基本的HTML/CSS/JavaScript知识
  • 对WordPress钩子(Hooks)和过滤器(Filters)有基本了解

1.3 创建插件基础结构

首先,我们需要创建一个新的WordPress插件:

  1. wp-content/plugins/目录下创建新文件夹personalized-popup-recommendations
  2. 在该文件夹中创建主插件文件personalized-popup-recommendations.php
  3. 添加插件头部信息:
<?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">&times;</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
}

本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5330.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

工作时间:周一至周五,9:00-17:30,节假日休息
返回顶部