首页 / 教程文章 / WordPress文创数字藏品柔性空投与营销插件开发教程

WordPress文创数字藏品柔性空投与营销插件开发教程

本教程指导开发一款WordPress插件,旨在实现文创数字藏品的“柔性空投”与营销功能。插件核心包括数字藏品管理后台、基于用户行为与身份特征的智能空投规则引擎、用户追踪系统、任务奖励发放及营销数据统计面板。教程从项目需求分析入手,逐步详解基础架构搭建、藏品管理模块开发、规则引擎设计、前端用户界面创建以及营销与统计功能集成,帮助开发者构建一个能提升用户参与度的智能数字藏品分发与营销平台。

WordPress文创数字藏品柔性空投与营销插件开发教程

一、项目概述与需求分析

在数字文创产业蓬勃发展的今天,数字藏品已成为连接创作者与收藏者的重要桥梁。本教程将指导您开发一个WordPress插件,实现文创数字藏品的"柔性空投"功能——即根据用户行为、身份特征等条件智能分发数字藏品,并结合营销工具提升用户参与度。

核心功能需求:

  1. 数字藏品管理后台
  2. 柔性空投规则引擎
  3. 用户行为追踪系统
  4. 空投任务与奖励发放
  5. 营销数据统计面板

二、插件基础架构搭建

首先,我们创建插件的基本文件结构:

<?php
/**
 * Plugin Name: 文创数字藏品柔性空投系统
 * Plugin URI: https://yourwebsite.com/
 * Description: WordPress文创数字藏品柔性空投与营销插件
 * Version: 1.0.0
 * Author: 您的名称
 * License: GPL v2 or later
 */

// 防止直接访问
if (!defined('ABSPATH')) {
    exit;
}

// 定义插件常量
define('DIGITAL_COLLECTIVES_VERSION', '1.0.0');
define('DIGITAL_COLLECTIVES_PATH', plugin_dir_path(__FILE__));
define('DIGITAL_COLLECTIVES_URL', plugin_dir_url(__FILE__));

// 初始化插件
class DigitalCollectivesAirdrop {
    
    private static $instance = null;
    
    public static function get_instance() {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    private function __construct() {
        $this->init_hooks();
    }
    
    // 初始化钩子
    private function init_hooks() {
        // 激活/停用钩子
        register_activation_hook(__FILE__, array($this, 'activate'));
        register_deactivation_hook(__FILE__, array($this, 'deactivate'));
        
        // 管理菜单
        add_action('admin_menu', array($this, 'add_admin_menu'));
        
        // 加载脚本和样式
        add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_assets'));
        add_action('wp_enqueue_scripts', array($this, 'enqueue_frontend_assets'));
        
        // AJAX处理
        add_action('wp_ajax_process_airdrop', array($this, 'process_airdrop_ajax'));
        add_action('wp_ajax_nopriv_process_airdrop', array($this, 'process_airdrop_ajax'));
    }
    
    // 插件激活时创建数据库表
    public function activate() {
        $this->create_database_tables();
        flush_rewrite_rules();
    }
    
    // 插件停用
    public function deactivate() {
        flush_rewrite_rules();
    }
    
    // 创建数据库表
    private function create_database_tables() {
        global $wpdb;
        
        $charset_collate = $wpdb->get_charset_collate();
        $table_name = $wpdb->prefix . 'digital_collectives';
        
        $sql = "CREATE TABLE IF NOT EXISTS $table_name (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            user_id mediumint(9) NOT NULL,
            collectible_id varchar(100) NOT NULL,
            collectible_name varchar(255) NOT NULL,
            collectible_metadata text,
            airdrop_rule_id mediumint(9),
            claimed_at datetime DEFAULT CURRENT_TIMESTAMP,
            status varchar(50) DEFAULT 'pending',
            transaction_hash varchar(255),
            PRIMARY KEY (id),
            KEY user_id (user_id),
            KEY collectible_id (collectible_id)
        ) $charset_collate;";
        
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
        
        // 创建空投规则表
        $rules_table = $wpdb->prefix . 'airdrop_rules';
        $rules_sql = "CREATE TABLE IF NOT EXISTS $rules_table (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            rule_name varchar(255) NOT NULL,
            rule_type varchar(100) NOT NULL,
            conditions text NOT NULL,
            collectible_ids text NOT NULL,
            start_date datetime,
            end_date datetime,
            max_claims int DEFAULT 0,
            current_claims int DEFAULT 0,
            status varchar(50) DEFAULT 'active',
            created_at datetime DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY (id)
        ) $charset_collate;";
        
        dbDelta($rules_sql);
    }
}

// 初始化插件
DigitalCollectivesAirdrop::get_instance();
?>

三、数字藏品管理模块开发

接下来,我们创建数字藏品的管理界面:

<?php
// 在DigitalCollectivesAirdrop类中添加以下方法

// 添加管理菜单
public function add_admin_menu() {
    add_menu_page(
        '数字藏品空投系统',
        '数字藏品',
        'manage_options',
        'digital-collectives',
        array($this, 'render_admin_dashboard'),
        'dashicons-images-alt2',
        30
    );
    
    add_submenu_page(
        'digital-collectives',
        '藏品管理',
        '藏品管理',
        'manage_options',
        'digital-collectives-items',
        array($this, 'render_collectibles_page')
    );
    
    add_submenu_page(
        'digital-collectives',
        '空投规则',
        '空投规则',
        'manage_options',
        'digital-collectives-rules',
        array($this, 'render_rules_page')
    );
    
    add_submenu_page(
        'digital-collectives',
        '空投记录',
        '空投记录',
        'manage_options',
        'digital-collectives-logs',
        array($this, 'render_logs_page')
    );
}

// 渲染藏品管理页面
public function render_collectibles_page() {
    ?>
    <div class="wrap">
        <h1 class="wp-heading-inline">数字藏品管理</h1>
        <button id="add-new-collectible" class="page-title-action">添加新藏品</button>
        <hr class="wp-header-end">
        
        <div id="collectible-form" style="display:none; margin-bottom: 20px; padding: 20px; background: #fff; border: 1px solid #ccd0d4;">
            <h3>添加/编辑数字藏品</h3>
            <form id="collectible-data-form">
                <input type="hidden" id="collectible_id" name="collectible_id" value="">
                
                <table class="form-table">
                    <tr>
                        <th scope="row"><label for="collectible_name">藏品名称</label></th>
                        <td><input type="text" id="collectible_name" name="collectible_name" class="regular-text" required></td>
                    </tr>
                    <tr>
                        <th scope="row"><label for="collectible_description">藏品描述</label></th>
                        <td><textarea id="collectible_description" name="collectible_description" rows="3" class="large-text"></textarea></td>
                    </tr>
                    <tr>
                        <th scope="row"><label for="collectible_image">藏品图片URL</label></th>
                        <td>
                            <input type="text" id="collectible_image" name="collectible_image" class="regular-text">
                            <button type="button" class="button" id="upload-image-btn">上传图片</button>
                        </td>
                    </tr>
                    <tr>
                        <th scope="row"><label for="blockchain_metadata">区块链元数据</label></th>
                        <td>
                            <textarea id="blockchain_metadata" name="blockchain_metadata" rows="5" class="large-text" placeholder='{"contract_address": "0x...", "token_id": 1, "token_standard": "ERC-721"}'></textarea>
                            <p class="description">JSON格式的区块链元数据</p>
                        </td>
                    </tr>
                    <tr>
                        <th scope="row"><label for="total_supply">发行总量</label></th>
                        <td><input type="number" id="total_supply" name="total_supply" min="1" value="100"></td>
                    </tr>
                </table>
                
                <p class="submit">
                    <button type="submit" class="button button-primary">保存藏品</button>
                    <button type="button" class="button" id="cancel-form">取消</button>
                </p>
            </form>
        </div>
        
        <div class="tablenav top">
            <div class="alignleft actions">
                <select name="bulk-action" id="bulk-action-selector-top">
                    <option value="-1">批量操作</option>
                    <option value="delete">删除</option>
                </select>
                <button id="doaction" class="button action">应用</button>
            </div>
            <br class="clear">
        </div>
        
        <table class="wp-list-table widefat fixed striped">
            <thead>
                <tr>
                    <td class="manage-column column-cb check-column"><input type="checkbox" id="cb-select-all-1"></td>
                    <th scope="col" class="manage-column">藏品名称</th>
                    <th scope="col" class="manage-column">图片</th>
                    <th scope="col" class="manage-column">发行量</th>
                    <th scope="col" class="manage-column">已空投</th>
                    <th scope="col" class="manage-column">状态</th>
                    <th scope="col" class="manage-column">操作</th>
                </tr>
            </thead>
            <tbody id="collectibles-list">
                <!-- 通过AJAX动态加载 -->
            </tbody>
        </table>
    </div>
    
    <script>
    jQuery(document).ready(function($) {
        // 加载藏品列表
        loadCollectibles();
        
        // 显示/隐藏表单
        $('#add-new-collectible').click(function() {
            $('#collectible-form').slideToggle();
            $('#collectible-data-form')[0].reset();
            $('#collectible_id').val('');
        });
        
        $('#cancel-form').click(function() {
            $('#collectible-form').slideUp();
            $('#collectible-data-form')[0].reset();
        });
        
        // 表单提交
        $('#collectible-data-form').submit(function(e) {
            e.preventDefault();
            saveCollectible();
        });
        
        // 图片上传
        $('#upload-image-btn').click(function(e) {
            e.preventDefault();
            var frame = wp.media({
                title: '选择或上传图片',
                button: { text: '使用此图片' },
                multiple: false
            });
            
            frame.on('select', function() {
                var attachment = frame.state().get('selection').first().toJSON();
                $('#collectible_image').val(attachment.url);
            });
            
            frame.open();
        });
    });
    
    function loadCollectibles() {
        jQuery.ajax({
            url: ajaxurl,
            type: 'POST',
            data: {
                action: 'get_collectibles_list',
                nonce: '<?php echo wp_create_nonce('digital_collectives_nonce'); ?>'
            },
            success: function(response) {
                if (response.success) {
                    $('#collectibles-list').html(response.data.html);
                }
            }
        });
    }
    
    function saveCollectible() {
        var formData = jQuery('#collectible-data-form').serialize();
        formData += '&action=save_collectible&nonce=<?php echo wp_create_nonce("digital_collectives_nonce"); ?>';
        
        jQuery.ajax({
            url: ajaxurl,
            type: 'POST',
            data: formData,
            success: function(response) {
                if (response.success) {
                    alert('保存成功!');
                    $('#collectible-form').slideUp();
                    loadCollectibles();
                } else {
                    alert('保存失败:' + response.data.message);
                }
            }
        });
    }
    </script>
    <?php
}
?>

四、柔性空投规则引擎

柔性空投的核心是规则引擎,它根据多种条件智能分发藏品:

<?php
// 在DigitalCollectivesAirdrop类中添加规则引擎方法

// 空投规则类
class AirdropRuleEngine {
    
    /**
     * 检查用户是否符合空投条件
     * @param int $user_id 用户ID
     * @param array $rule 空投规则
     * @return bool|string 是否符合条件,或错误信息
     */
    public static function check_user_eligibility($user_id, $rule) {
        $user = get_userdata($user_id);
        if (!$user) {
            return '用户不存在';
        }
        
        $conditions = json_decode($rule['conditions'], true);
        
        // 检查时间条件
        if (!self::check_time_condition($rule)) {
            return '不在活动时间内';
        }
        
        // 检查用户角色条件
        if (isset($conditions['user_roles']) && !empty($conditions['user_roles'])) {
            if (!self::check_user_role($user, $conditions['user_roles'])) {
                return '用户角色不符合要求';
            }
        }
        
        // 检查用户注册时间
        if (isset($conditions['min_registration_days'])) {
            if (!self::check_registration_days($user, $conditions['min_registration_days'])) {
                return '注册时间不足';
            }
        }
        
        // 检查用户行为条件
        if (isset($conditions['user_actions'])) {
            if (!self::check_user_actions($user_id, $conditions['user_actions'])) {
                return '用户行为不符合要求';
            }
        }
        
        // 检查持有特定藏品条件
        if (isset($conditions['require_collectibles'])) {
            if (!self::check_required_collectibles($user_id, $conditions['require_collectibles'])) {
                return '未持有要求的藏品';
            }
        }
        
        // 检查空投数量限制
        if ($rule['max_claims'] > 0 && $rule['current_claims'] >= $rule['max_claims']) {
            return '空投数量已达上限';
        }
        
        // 检查用户是否已领取过此规则的空投
        if (self::has_user_claimed($user_id, $rule['id'])) {
            return '已领取过此空投';
        }
        
        return true;
    }
    
    /**
     * 检查时间条件
     */
    private static function check_time_condition($rule) {
        $now = current_time('timestamp');
        
        if (!empty($rule['start_date']) && strtotime($rule['start_date']) > $now) {
            return false;
        }
        
        if (!empty($rule['end_date']) && strtotime($rule['end_date']) < $now) {
            return false;
        }
        
        return true;
    }
    
    /**
     * 检查用户角色
     */
    private static function check_user_role($user, $required_roles) {
        $user_roles = $user->roles;
        
        foreach ($required_roles as $role) {
            if (in_array($role, $user_roles)) {
                return true;
            }
        }
        
        return false;
    }
    
    /**
     * 检查用户注册天数
     */
    private static function check_registration_days($user, $min_days) {
        $registered = strtotime($user->user_registered);
        $now = current_time('timestamp');
        $days_registered = floor(($now - $registered) / (60 * 60 * 24));
        
        return $days_registered >= $min_days;
    }
    
    /**
     * 检查用户行为
     */
    private static function check_user_actions($user_id, $actions) {
        global $wpdb;
        
        foreach ($actions as $action_type => $action_config) {
            switch ($action_type) {
                case 'min_posts':
                    $post_count = count_user_posts($user_id);
                    if ($post_count < $action_config['count']) {
                        return false;
                    }
                    break;
                    
                case 'min_comments':
                    $comment_count = get_comments(array(
                        'user_id' => $user_id,
                        'count' => true
                    ));
                    if ($comment_count < $action_config['count']) {
                        return false;
                    }
                    break;
                    
                case 'completed_task':
                    // 检查是否完成特定任务
                    $task_table = $wpdb->prefix . 'user_tasks';
                    $completed = $wpdb->get_var($wpdb->prepare(
                        "SELECT COUNT(*) FROM $task_table WHERE user_id = %d AND task_id = %d AND status = 'completed'",
                        $user_id,
                        $action_config['task_id']
                    ));
                    
                    if (!$completed) {
                        return false;
                    }
                    break;
            }
        }
        
        return true;
    }
    
    /**
     * 执行空投
     */
    public static function execute_airdrop($user_id, $rule_id) {
        global $wpdb;
        
        // 获取规则信息
        $rules_table = $wpdb->prefix . 'airdrop_rules';
        $rule = $wpdb->get_row($wpdb->prepare(
            "SELECT * FROM $rules_table WHERE id = %d AND status = 'active'",
            $rule_id
        ), ARRAY_A);
        
        if (!$rule) {
            return array('success' => false, 'message' => '规则不存在或已禁用');
        }
        
        // 检查用户资格
        $eligibility = self::check_user_eligibility($user_id, $rule);
        if ($eligibility !== true) {
            return array('success' => false, 'message' => $eligibility);
        }
        
        // 获取要空投的藏品
        $collectible_ids = json_decode($rule['collectible_ids'], true);
        
        // 随机选择一个藏品(如果有多个)
        $collectible_id = $collectible_ids[array_rand($collectible_ids)];
        
        // 发放藏品
        $result = self::issue_collectible($user_id, $collectible_id, $rule_id);
        
        if ($result['success']) {
            // 更新空投计数
            // 更新空投计数
            $wpdb->update(
                $rules_table,
                array('current_claims' => $rule['current_claims'] + 1),
                array('id' => $rule_id)
            );
            
            // 记录空投日志
            self::log_airdrop($user_id, $collectible_id, $rule_id, 'success');
            
            return array(
                'success' => true, 
                'message' => '空投成功!',
                'collectible_id' => $collectible_id,
                'transaction_hash' => $result['transaction_hash']
            );
        }
        
        return array('success' => false, 'message' => '空投失败:' . $result['message']);
    }
    
    /**
     * 发放数字藏品
     */
    private static function issue_collectible($user_id, $collectible_id, $rule_id) {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'digital_collectives';
        
        // 检查是否已拥有该藏品
        $existing = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM $table_name WHERE user_id = %d AND collectible_id = %s",
            $user_id,
            $collectible_id
        ));
        
        if ($existing > 0) {
            return array('success' => false, 'message' => '用户已拥有该藏品');
        }
        
        // 获取藏品信息
        $collectible_data = get_option('digital_collectible_' . $collectible_id, array());
        
        if (empty($collectible_data)) {
            return array('success' => false, 'message' => '藏品不存在');
        }
        
        // 模拟区块链交易(实际开发中应连接真实区块链)
        $transaction_hash = self::simulate_blockchain_transaction($user_id, $collectible_data);
        
        // 保存到数据库
        $wpdb->insert(
            $table_name,
            array(
                'user_id' => $user_id,
                'collectible_id' => $collectible_id,
                'collectible_name' => $collectible_data['name'],
                'collectible_metadata' => json_encode($collectible_data),
                'airdrop_rule_id' => $rule_id,
                'status' => 'claimed',
                'transaction_hash' => $transaction_hash,
                'claimed_at' => current_time('mysql')
            ),
            array('%d', '%s', '%s', '%s', '%d', '%s', '%s', '%s')
        );
        
        // 发送通知邮件
        self::send_airdrop_notification($user_id, $collectible_data);
        
        return array('success' => true, 'transaction_hash' => $transaction_hash);
    }
    
    /**
     * 模拟区块链交易
     */
    private static function simulate_blockchain_transaction($user_id, $collectible_data) {
        // 在实际应用中,这里应该调用区块链API
        // 例如:以太坊、Polygon、Flow等
        
        $user_data = get_userdata($user_id);
        $wallet_address = get_user_meta($user_id, 'wallet_address', true);
        
        if (empty($wallet_address)) {
            // 如果没有绑定钱包,生成一个临时交易哈希
            return '0x' . bin2hex(random_bytes(32));
        }
        
        // 这里应该是真实的区块链交互代码
        // 示例:调用智能合约的mint函数
        /*
        $web3 = new Web3('https://mainnet.infura.io/v3/YOUR_PROJECT_ID');
        $contract = new Contract($web3->provider, $collectible_data['contract_abi']);
        
        $transaction = $contract->send('mint', [
            $wallet_address,
            $collectible_data['token_id']
        ], [
            'from' => ADMIN_WALLET_ADDRESS,
            'gas' => 300000
        ]);
        
        return $transaction;
        */
        
        // 模拟返回交易哈希
        return '0x' . hash('sha256', $user_id . $collectible_data['name'] . time());
    }
    
    /**
     * 发送空投通知
     */
    private static function send_airdrop_notification($user_id, $collectible_data) {
        $user = get_userdata($user_id);
        $to = $user->user_email;
        $subject = '恭喜获得数字藏品空投!';
        
        $message = sprintf(
            "亲爱的%s,nn恭喜您成功获得数字藏品空投!nn" .
            "藏品名称:%sn" .
            "藏品描述:%snn" .
            "您可以在您的账户中查看和管理您的数字藏品。nn" .
            "感谢您的参与!nn" .
            "%s团队",
            $user->display_name,
            $collectible_data['name'],
            $collectible_data['description'],
            get_bloginfo('name')
        );
        
        wp_mail($to, $subject, $message);
    }
}
?>

五、前端用户界面与交互

创建用户前端界面,让用户可以查看和领取空投:

<?php
// 在DigitalCollectivesAirdrop类中添加前端方法

// 加载前端资源
public function enqueue_frontend_assets() {
    if (is_user_logged_in()) {
        wp_enqueue_style(
            'digital-collectives-frontend',
            DIGITAL_COLLECTIVES_URL . 'assets/css/frontend.css',
            array(),
            DIGITAL_COLLECTIVES_VERSION
        );
        
        wp_enqueue_script(
            'digital-collectives-frontend',
            DIGITAL_COLLECTIVES_URL . 'assets/js/frontend.js',
            array('jquery'),
            DIGITAL_COLLECTIVES_VERSION,
            true
        );
        
        wp_localize_script('digital-collectives-frontend', 'dc_ajax', array(
            'ajax_url' => admin_url('admin-ajax.php'),
            'nonce' => wp_create_nonce('digital_collectives_frontend_nonce')
        ));
    }
}

// 添加快捷码支持
public function add_shortcodes() {
    add_shortcode('digital_collectibles_gallery', array($this, 'render_collectibles_gallery'));
    add_shortcode('airdrop_center', array($this, 'render_airdrop_center'));
    add_shortcode('my_collectibles', array($this, 'render_my_collectibles'));
}

// 渲染空投中心
public function render_airdrop_center() {
    if (!is_user_logged_in()) {
        return '<div class="dc-notice">请先登录以查看空投活动</div>';
    }
    
    $user_id = get_current_user_id();
    $available_airdrops = $this->get_available_airdrops($user_id);
    
    ob_start();
    ?>
    <div class="digital-collectives-container">
        <h2>数字藏品空投中心</h2>
        
        <?php if (empty($available_airdrops)): ?>
            <div class="dc-empty-state">
                <p>当前没有可参与的空投活动</p>
            </div>
        <?php else: ?>
            <div class="airdrop-grid">
                <?php foreach ($available_airdrops as $airdrop): ?>
                <div class="airdrop-card" data-rule-id="<?php echo esc_attr($airdrop['id']); ?>">
                    <div class="airdrop-header">
                        <h3><?php echo esc_html($airdrop['rule_name']); ?></h3>
                        <span class="airdrop-badge">进行中</span>
                    </div>
                    
                    <div class="airdrop-content">
                        <p><?php echo esc_html($airdrop['description']); ?></p>
                        
                        <div class="airdrop-conditions">
                            <h4>参与条件:</h4>
                            <ul>
                                <?php 
                                $conditions = json_decode($airdrop['conditions'], true);
                                foreach ($conditions as $key => $value):
                                    echo '<li>' . $this->format_condition($key, $value) . '</li>';
                                endforeach;
                                ?>
                            </ul>
                        </div>
                        
                        <div class="airdrop-progress">
                            <div class="progress-bar">
                                <div class="progress-fill" style="width: <?php echo ($airdrop['current_claims'] / max(1, $airdrop['max_claims'])) * 100; ?>%"></div>
                            </div>
                            <div class="progress-text">
                                已领取:<?php echo intval($airdrop['current_claims']); ?>/<?php echo intval($airdrop['max_claims']); ?>
                            </div>
                        </div>
                    </div>
                    
                    <div class="airdrop-footer">
                        <button class="dc-button claim-airdrop-btn" 
                                data-rule-id="<?php echo esc_attr($airdrop['id']); ?>">
                            立即领取
                        </button>
                    </div>
                </div>
                <?php endforeach; ?>
            </div>
        <?php endif; ?>
        
        <div id="airdrop-result-modal" class="dc-modal" style="display:none;">
            <div class="modal-content">
                <span class="close-modal">&times;</span>
                <div id="airdrop-result-content"></div>
            </div>
        </div>
    </div>
    <?php
    return ob_get_clean();
}

// 获取可用空投
private function get_available_airdrops($user_id) {
    global $wpdb;
    
    $rules_table = $wpdb->prefix . 'airdrop_rules';
    $now = current_time('mysql');
    
    $available_rules = $wpdb->get_results($wpdb->prepare(
        "SELECT * FROM $rules_table 
        WHERE status = 'active' 
        AND (start_date IS NULL OR start_date <= %s)
        AND (end_date IS NULL OR end_date >= %s)
        AND (max_claims = 0 OR current_claims < max_claims)
        ORDER BY created_at DESC",
        $now,
        $now
    ), ARRAY_A);
    
    $eligible_airdrops = array();
    
    foreach ($available_rules as $rule) {
        $eligibility = AirdropRuleEngine::check_user_eligibility($user_id, $rule);
        if ($eligibility === true) {
            // 添加描述信息
            $rule['description'] = $this->generate_rule_description($rule);
            $eligible_airdrops[] = $rule;
        }
    }
    
    return $eligible_airdrops;
}

// 格式化条件显示
private function format_condition($key, $value) {
    $conditions_map = array(
        'user_roles' => '用户角色:',
        'min_registration_days' => '注册天数≥',
        'min_posts' => '发布文章≥',
        'min_comments' => '发表评论≥',
        'require_collectibles' => '需持有藏品:'
    );
    
    $display_key = isset($conditions_map[$key]) ? $conditions_map[$key] : $key . ':';
    
    if (is_array($value)) {
        return $display_key . implode(', ', $value);
    }
    
    return $display_key . $value;
}

// AJAX处理空投领取
public function process_airdrop_ajax() {
    check_ajax_referer('digital_collectives_frontend_nonce', 'nonce');
    
    if (!is_user_logged_in()) {
        wp_send_json_error(array('message' => '请先登录'));
    }
    
    $user_id = get_current_user_id();
    $rule_id = intval($_POST['rule_id']);
    
    $result = AirdropRuleEngine::execute_airdrop($user_id, $rule_id);
    
    if ($result['success']) {
        wp_send_json_success(array(
            'message' => $result['message'],
            'collectible_id' => $result['collectible_id'],
            'transaction_hash' => $result['transaction_hash']
        ));
    } else {
        wp_send_json_error(array('message' => $result['message']));
    }
}
?>

六、营销功能与数据统计

添加营销工具和数据统计功能:

<?php
// 营销工具类
class DigitalCollectivesMarketing {
    
    /**
     * 创建分享任务
     */
    public static function create_share_task($task_config) {
        global $wpdb;
        
        $tasks_table = $wpdb->prefix . 'marketing_tasks';
        
        $wpdb->insert(
            $tasks_table,
            array(
                'task_name' => $task_config['name'],
                'task_type' => 'share',
                'task_config' => json_encode($task_config),
                'reward_rule_id' => $task_config['reward_rule_id'],
                'status' => 'active',
                'created_at' => current_time('mysql')
            ),
            array('%s', '%s', '%s', '%d', '%s', '%s')
        );
        
        return $wpdb->insert_id;
    }
    
    /**
     * 检查分享任务完成情况
     */
    public static function check_share_task($user_id, $task_id, $platform) {
        global $wpdb;
        
        $tasks_table = $wpdb->prefix . 'marketing_tasks';
        $user_tasks_table = $wpdb->prefix . 'user_tasks';
        
        // 获取任务配置
        $task = $wpdb->get_row($wpdb->prepare(
            "SELECT * FROM $tasks_table WHERE id = %d",
            $task_id
        ), ARRAY_A);
        
        if (!$task || $task['status'] !== 'active') {
            return false;
        }
        
        $task_config = json_decode($task['task_config'], true);
        
        // 检查是否已分享
        $shared = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM $user_tasks_table 
            WHERE user_id = %d AND task_id = %d AND platform = %s",
            $user_id, $task_id, $platform
        ));
        
        if ($shared > 0) {
            return false; // 已分享过
        }
        
        // 记录分享
        $wpdb->insert(
            $user_tasks_table,
            array(
                'user_id' => $user_id,
                'task_id' => $task_id,
                'platform' => $platform,
                'status' => 'completed',
                'completed_at' => current_time('mysql')
            ),
            array('%d', '%d', '%s', '%s', '%s')
        );
        
        // 检查是否满足奖励条件
        $total_shares = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM $user_tasks_table 
            WHERE user_id = %d AND task_id = %d",
            $user_id, $task_id
        ));
        
        if ($total_shares >= $task_config['required_shares']) {
            // 发放奖励
            AirdropRuleEngine::execute_airdrop($user_id, $task['reward_rule_id']);
            return true;
        }
        
        return false;
    }
    
    /**
     * 生成邀请码
     */
    public static function generate_invite_code($user_id, $expiry_days = 30) {
        $code = strtoupper(substr(md5($user_id . time()), 0, 8));
        
        update_user_meta($user_id, 'invite_code', $code);
        update_user_meta($user_id, 'invite_code_expiry', 
            date('Y-m-d H:i:s', strtotime("+{$expiry_days} days")));
        
        return $code;
    }
    
    /**
     * 处理邀请注册
     */
    public static function process_invitation($invite_code, $new_user_id) {
        global $wpdb;
        
        // 查找邀请人
        $inviter_id = $wpdb->get_var($wpdb->prepare(
            "SELECT user_id FROM {$wpdb->usermeta} 
            WHERE meta_key = 'invite_code' AND meta_value = %s",
            $invite_code
        ));
        
        if (!$inviter_id) {
            return false;
        }
        
        // 检查邀请码是否过期
        $expiry = get_user_meta($inviter_id, 'invite_code_expiry', true);
        if (strtotime($expiry) < time()) {
            return false;
        }
        
        // 记录邀请关系
        $invites_table = $wpdb->prefix . 'user_invites';
        $wpdb->insert(
            $invites_table,
            array(
                'inviter_id' => $inviter_id,
                'invitee_id' => $new_user_id,
                'invite_code' => $invite_code,
                'invited_at' => current_time('mysql')
            ),
            array('%d', '%d', '%s', '%s')
        );
        
        // 更新邀请人统计数据
        $invite_count = intval(get_user_meta($inviter_id, 'total_invites', true));
        update_user_meta($inviter_id, 'total_invites', $invite_count + 1);
        
        // 检查是否达到奖励条件
        self::check_invitation_rewards($inviter_id, $invite_count + 1);
        
        return true;
    }
}

// 数据统计面板
class DigitalCollectivesAnalytics {
    
    public static function get_dashboard_stats($period = '7days') {
        global $wpdb;
        
        $collectives_table = $wpdb->prefix . 'digital_collectives';
        $rules_table = $wpdb->prefix . 'airdrop_rules';
        
        $end_date = current_time('mysql');
        $start_date = date('Y-m-d H:i:s', strtotime("-{$period}"));
        
        // 总统计数据
        $stats = array(
            'total_collectibles' => $wpdb->get_var("SELECT COUNT(*) FROM $collectives_table"),
            'total_airdrops' => $wpdb->get_var("SELECT COUNT(*) FROM $rules_table"),
            'active_users' => self::get_active_users_count($period),
本文来自网络投稿,不代表本站点的立场,转载请注明出处:https://www.gongxiangcang.com/6521.html

溯源库®作者

漳州柔性供应链服务有限公司 小批量订单定制化服务商( 投稿邮箱:vip@jiaochengku.com)
上一篇
下一篇

为您推荐

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@suyuanku.com

工作时间:周一至周五,9:00-17:30,节假日休息
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部