文章目录[隐藏]
WordPress文创数字藏品柔性空投与营销插件开发教程
一、项目概述与需求分析
在数字文创产业蓬勃发展的今天,数字藏品已成为连接创作者与收藏者的重要桥梁。本教程将指导您开发一个WordPress插件,实现文创数字藏品的"柔性空投"功能——即根据用户行为、身份特征等条件智能分发数字藏品,并结合营销工具提升用户参与度。
核心功能需求:
- 数字藏品管理后台
- 柔性空投规则引擎
- 用户行为追踪系统
- 空投任务与奖励发放
- 营销数据统计面板
二、插件基础架构搭建
首先,我们创建插件的基本文件结构:
<?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">×</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),


