文章目录[隐藏]
详细指南:开发网站会员每日签到与连续登录奖励积分体系
摘要
在当今互联网时代,用户参与度和忠诚度是网站成功的关键因素之一。每日签到与连续登录奖励体系作为一种有效的用户激励策略,已被广泛应用于各类网站和应用程序中。本文将详细介绍如何通过WordPress程序的代码二次开发,实现一个功能完善的会员每日签到与连续登录奖励积分体系。我们将从系统设计、数据库结构、前端界面到后端逻辑进行全面讲解,帮助您打造一个能够提升用户活跃度的实用工具。
一、系统需求分析与设计
1.1 功能需求分析
在开始开发之前,我们需要明确系统应具备的核心功能:
- 每日签到功能:用户每天可进行一次签到,获得基础积分奖励
- 连续登录奖励:根据用户连续登录天数提供递增的积分奖励
- 签到日历展示:直观显示用户本月签到情况
- 积分记录查询:用户可查看自己的积分获取和消费记录
- 奖励规则配置:管理员可灵活配置签到奖励规则
- 用户等级体系:根据积分或连续签到天数划分用户等级
- 断签处理机制:定义连续签到中断后的处理规则
1.2 技术架构设计
本系统将基于WordPress平台开发,主要技术栈包括:
- 前端:HTML5、CSS3、JavaScript(jQuery)、AJAX
- 后端:PHP(WordPress核心API)
- 数据库:MySQL(WordPress数据库)
- 安全机制:WordPress非ces、数据验证与清理
1.3 数据库设计
我们需要在WordPress现有数据库结构基础上,添加以下自定义表:
-- 用户签到记录表
CREATE TABLE wp_signin_records (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT(20) NOT NULL,
sign_date DATE NOT NULL,
sign_time DATETIME NOT NULL,
points_earned INT NOT NULL,
continuous_days INT NOT NULL,
UNIQUE KEY user_date (user_id, sign_date)
);
-- 用户积分总表
CREATE TABLE wp_user_points (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT(20) NOT NULL UNIQUE,
total_points INT DEFAULT 0,
current_points INT DEFAULT 0,
last_sign_date DATE,
continuous_days INT DEFAULT 0,
max_continuous_days INT DEFAULT 0
);
-- 积分变动记录表
CREATE TABLE wp_points_log (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT(20) NOT NULL,
points_change INT NOT NULL,
change_type VARCHAR(50) NOT NULL,
change_reason VARCHAR(255),
change_time DATETIME NOT NULL,
related_id BIGINT(20)
);
二、开发环境搭建与准备工作
2.1 开发环境配置
- 本地开发环境:安装XAMPP/MAMP或Local by Flywheel
- WordPress安装:下载最新版WordPress并完成基本配置
- 代码编辑器:推荐使用VS Code、PHPStorm或Sublime Text
- 浏览器开发者工具:用于调试前端代码
2.2 创建WordPress插件
我们将以插件形式实现签到功能,确保与主题的独立性:
- 在
wp-content/plugins/目录下创建新文件夹daily-signin-rewards - 创建主插件文件
daily-signin-rewards.php:
<?php
/**
* Plugin Name: 每日签到与连续登录奖励系统
* Plugin URI: https://yourwebsite.com/
* Description: 为WordPress网站添加会员每日签到与连续登录奖励积分功能
* Version: 1.0.0
* Author: 您的名称
* License: GPL v2 or later
* Text Domain: daily-signin
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 定义插件常量
define('DSR_VERSION', '1.0.0');
define('DSR_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('DSR_PLUGIN_URL', plugin_dir_url(__FILE__));
// 初始化插件
require_once DSR_PLUGIN_DIR . 'includes/class-dsr-core.php';
function dsr_init() {
$plugin = new DSR_Core();
$plugin->run();
}
add_action('plugins_loaded', 'dsr_init');
2.3 创建数据库表
在插件激活时创建所需数据库表:
// 在class-dsr-core.php中添加
class DSR_Core {
// ... 其他代码
public function activate() {
$this->create_tables();
$this->set_default_options();
}
private function create_tables() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
// 创建签到记录表
$table_name = $wpdb->prefix . 'signin_records';
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT(20) NOT NULL,
sign_date DATE NOT NULL,
sign_time DATETIME NOT NULL,
points_earned INT NOT NULL,
continuous_days INT NOT NULL,
UNIQUE KEY user_date (user_id, sign_date)
) $charset_collate;";
// 创建其他表...
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
}
三、核心功能模块开发
3.1 用户签到功能实现
3.1.1 签到逻辑处理
class DSR_Signin_Handler {
// 处理用户签到请求
public function process_signin($user_id) {
// 检查用户是否已签到
if ($this->has_signed_today($user_id)) {
return array(
'success' => false,
'message' => '您今天已经签到过了,请明天再来!'
);
}
// 获取连续签到天数
$continuous_days = $this->calculate_continuous_days($user_id);
$continuous_days++;
// 计算本次签到应得积分
$points = $this->calculate_points($continuous_days);
// 记录签到
$this->record_signin($user_id, $points, $continuous_days);
// 更新用户积分
$this->update_user_points($user_id, $points, $continuous_days);
// 记录积分变动
$this->log_points_change($user_id, $points, 'daily_signin', '每日签到奖励');
return array(
'success' => true,
'points' => $points,
'continuous_days' => $continuous_days,
'message' => sprintf('签到成功!获得%d积分,已连续签到%d天', $points, $continuous_days)
);
}
// 检查用户今天是否已签到
private function has_signed_today($user_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'signin_records';
$today = current_time('Y-m-d');
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $table_name WHERE user_id = %d AND sign_date = %s",
$user_id, $today
));
return $count > 0;
}
// 计算连续签到天数
private function calculate_continuous_days($user_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'user_points';
$result = $wpdb->get_row($wpdb->prepare(
"SELECT last_sign_date, continuous_days FROM $table_name WHERE user_id = %d",
$user_id
));
if (!$result) {
return 0;
}
$last_sign_date = $result->last_sign_date;
$yesterday = date('Y-m-d', strtotime('-1 day'));
// 如果昨天签到过,连续天数加1,否则重置为0
if ($last_sign_date == $yesterday) {
return $result->continuous_days;
} else {
return 0;
}
}
// 计算签到积分(可根据连续天数递增)
private function calculate_points($continuous_days) {
$base_points = get_option('dsr_base_points', 10);
// 连续签到奖励规则
$continuous_bonus = 0;
if ($continuous_days >= 7) {
$continuous_bonus = get_option('dsr_week_bonus', 20);
} elseif ($continuous_days >= 30) {
$continuous_bonus = get_option('dsr_month_bonus', 50);
}
return $base_points + $continuous_bonus;
}
}
3.1.2 AJAX签到接口
// 添加AJAX处理钩子
add_action('wp_ajax_dsr_signin', 'dsr_ajax_signin');
add_action('wp_ajax_nopriv_dsr_signin', 'dsr_ajax_signin_nopriv');
function dsr_ajax_signin() {
// 安全检查
check_ajax_referer('dsr_signin_nonce', 'nonce');
// 验证用户登录状态
if (!is_user_logged_in()) {
wp_send_json_error(array('message' => '请先登录'));
return;
}
$user_id = get_current_user_id();
$signin_handler = new DSR_Signin_Handler();
$result = $signin_handler->process_signin($user_id);
if ($result['success']) {
wp_send_json_success($result);
} else {
wp_send_json_error(array('message' => $result['message']));
}
}
function dsr_ajax_signin_nopriv() {
wp_send_json_error(array('message' => '请先登录'));
}
3.2 签到界面与交互设计
3.2.1 前端签到组件
<!-- 在插件中创建签到界面模板 -->
<div class="dsr-signin-container">
<div class="dsr-signin-header">
<h3>每日签到</h3>
<p class="dsr-user-stats">
当前积分: <span id="dsr-current-points">0</span> |
连续签到: <span id="dsr-continuous-days">0</span>天
</p>
</div>
<div class="dsr-signin-calendar">
<div class="dsr-calendar-header">
<button class="dsr-prev-month"><</button>
<h4 id="dsr-current-month">2023年10月</h4>
<button class="dsr-next-month">></button>
</div>
<div class="dsr-calendar-days">
<!-- 通过JavaScript动态生成日历 -->
</div>
</div>
<div class="dsr-signin-action">
<button id="dsr-signin-btn" class="dsr-signin-button">
<span class="dsr-button-text">立即签到</span>
<span class="dsr-button-points">+10积分</span>
</button>
<p class="dsr-signin-tip" id="dsr-signin-status">今日尚未签到</p>
</div>
<div class="dsr-rewards-rules">
<h4>签到规则</h4>
<ul>
<li>每日签到可获得10基础积分</li>
<li>连续签到7天额外奖励20积分</li>
<li>连续签到30天额外奖励50积分</li>
<li>中断签到后连续天数将重新计算</li>
</ul>
</div>
</div>
3.2.2 日历生成与签到状态显示
// 前端JavaScript代码
jQuery(document).ready(function($) {
// 初始化签到系统
function initSigninSystem() {
// 获取用户签到数据
$.ajax({
url: dsr_ajax.ajax_url,
type: 'POST',
data: {
action: 'dsr_get_signin_data',
nonce: dsr_ajax.nonce
},
success: function(response) {
if (response.success) {
updateUserStats(response.data);
renderCalendar(response.data.calendar);
updateSigninButton(response.data.signed_today);
}
}
});
// 绑定签到按钮事件
$('#dsr-signin-btn').on('click', function() {
if ($(this).hasClass('signed')) {
return;
}
$.ajax({
url: dsr_ajax.ajax_url,
type: 'POST',
data: {
action: 'dsr_signin',
nonce: dsr_ajax.signin_nonce
},
success: function(response) {
if (response.success) {
showSigninSuccess(response.data);
} else {
alert(response.data.message);
}
}
});
});
}
// 渲染签到日历
function renderCalendar(calendarData) {
const $calendar = $('.dsr-calendar-days');
$calendar.empty();
// 生成日历标题行(星期)
const weekdays = ['日', '一', '二', '三', '四', '五', '六'];
weekdays.forEach(day => {
$calendar.append(`<div class="dsr-weekday">${day}</div>`);
});
// 生成日期格子
calendarData.days.forEach(day => {
let dayClass = 'dsr-calendar-day';
if (day.is_today) dayClass += ' dsr-today';
if (day.signed) dayClass += ' dsr-signed';
if (!day.in_month) dayClass += ' dsr-other-month';
const dayHtml = `
<div class="${dayClass}" data-date="${day.date}">
<div class="dsr-day-number">${day.day}</div>
${day.signed ? '<div class="dsr-signed-icon">✓</div>' : ''}
${day.points ? `<div class="dsr-day-points">+${day.points}</div>` : ''}
</div>
`;
$calendar.append(dayHtml);
});
}
// 显示签到成功效果
function showSigninSuccess(data) {
const $btn = $('#dsr-signin-btn');
$btn.addClass('signed').html('今日已签到');
$('#dsr-signin-status').text('签到成功!');
// 显示积分动画
const $points = $('#dsr-current-points');
const currentPoints = parseInt($points.text());
const newPoints = currentPoints + data.points;
animatePoints(currentPoints, newPoints, $points);
$('#dsr-continuous-days').text(data.continuous_days);
// 显示签到成功提示
const $tip = $('<div class="dsr-success-tip">签到成功!+' + data.points + '积分</div>');
$('.dsr-signin-action').append($tip);
setTimeout(() => $tip.fadeOut(), 3000);
}
// 初始化
initSigninSystem();
});
3.3 积分管理与等级系统
3.3.1 用户等级计算
class DSR_Level_System {
// 根据积分计算用户等级
public function calculate_level($points) {
$levels = $this->get_levels_config();
foreach ($levels as $level => $requirement) {
if ($points >= $requirement['min_points']) {
$current_level = $level;
} else {
break;
}
}
return isset($current_level) ? $current_level : 1;
}
// 获取等级配置
private function get_levels_config() {
return array(
1 => array('name' => '新手', 'min_points' => 0, 'icon' => '⭐'),
2 => array('name' => '青铜', 'min_points' => 100, 'icon' => '🥉'),
3 => array('name' => '白银', 'min_points' => 500, 'icon' => '🥈'),
4 => array('name' => '黄金', 'min_points' => 2000, 'icon' => '🥇'),
5 => array('name' => '铂金', 'min_points' => 5000, 'icon' => '💎'),
6 => array('name' => '钻石', 'min_points' => 10000, 'icon' => '👑'),
7 => array('name' => '至尊', 'min_points' => 20000, 'icon' => '🏆')
);
}
// 获取用户等级信息
public function get_user_level_info($user_id) {
$points = $this->get_user_points($user_id);
$level = $this->calculate_level($points);
$levels = $this->get_levels_config();
$current_level_info = $levels[$level];
$next_level = $level + 1;
$next_level_info = isset($levels[$next_level]) ? $levels[$next_level] : null;
return array(
'level' => $level,
'level_name' => $current_level_info['name'],
'level_icon' => $current_level_info['icon'],
'current_points' => $points,
'next_level_points' => $next_level_info ? $next_level_info['min_points'] : null,
'points_to_next' => $next_level_info ? $next_level_info['min_points'] - $points : 0,
'progress_percentage' => $next_level_info ?
min(100, round(($points / $next_level_info['min_points']) * 100, 2)) : 100
);
}
}
3.3
3.3.2 积分消费与兑换功能
class DSR_Points_Exchange {
// 处理积分兑换请求
public function process_exchange($user_id, $item_id, $quantity = 1) {
// 获取兑换物品信息
$exchange_item = $this->get_exchange_item($item_id);
if (!$exchange_item) {
return array(
'success' => false,
'message' => '兑换物品不存在'
);
}
// 检查库存
if ($exchange_item['stock'] !== -1 && $exchange_item['stock'] < $quantity) {
return array(
'success' => false,
'message' => '库存不足'
);
}
// 计算所需总积分
$total_points_needed = $exchange_item['points'] * $quantity;
// 检查用户积分是否足够
$user_points = $this->get_user_available_points($user_id);
if ($user_points < $total_points_needed) {
return array(
'success' => false,
'message' => '积分不足,还需要' . ($total_points_needed - $user_points) . '积分'
);
}
// 执行兑换
$exchange_id = $this->record_exchange($user_id, $item_id, $quantity, $total_points_needed);
// 扣除积分
$this->deduct_points($user_id, $total_points_needed, $exchange_id);
// 更新库存
if ($exchange_item['stock'] !== -1) {
$this->update_item_stock($item_id, $quantity);
}
// 发送兑换成功通知
$this->send_exchange_notification($user_id, $exchange_item, $quantity);
return array(
'success' => true,
'exchange_id' => $exchange_id,
'message' => '兑换成功!' . $exchange_item['name'] . '×' . $quantity
);
}
// 获取可兑换物品列表
public function get_exchange_items($category = 'all') {
global $wpdb;
$table_name = $wpdb->prefix . 'dsr_exchange_items';
$where = "status = 'publish'";
if ($category !== 'all') {
$where .= $wpdb->prepare(" AND category = %s", $category);
}
$items = $wpdb->get_results(
"SELECT * FROM $table_name WHERE $where ORDER BY sort_order ASC, id DESC",
ARRAY_A
);
return $items;
}
}
四、后台管理功能开发
4.1 管理菜单与界面
class DSR_Admin {
public function __construct() {
add_action('admin_menu', array($this, 'add_admin_menu'));
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
}
// 添加管理菜单
public function add_admin_menu() {
add_menu_page(
'签到系统',
'签到系统',
'manage_options',
'dsr-dashboard',
array($this, 'render_dashboard'),
'dashicons-calendar-alt',
30
);
add_submenu_page(
'dsr-dashboard',
'签到统计',
'签到统计',
'manage_options',
'dsr-statistics',
array($this, 'render_statistics')
);
add_submenu_page(
'dsr-dashboard',
'奖励设置',
'奖励设置',
'manage_options',
'dsr-settings',
array($this, 'render_settings')
);
add_submenu_page(
'dsr-dashboard',
'积分兑换',
'积分兑换',
'manage_options',
'dsr-exchange',
array($this, 'render_exchange')
);
add_submenu_page(
'dsr-dashboard',
'用户积分',
'用户积分',
'manage_options',
'dsr-users',
array($this, 'render_users')
);
}
// 渲染仪表盘
public function render_dashboard() {
?>
<div class="wrap dsr-admin-dashboard">
<h1>签到系统仪表盘</h1>
<div class="dsr-stats-cards">
<div class="dsr-stat-card">
<h3>今日签到人数</h3>
<p class="dsr-stat-number"><?php echo $this->get_today_signin_count(); ?></p>
</div>
<div class="dsr-stat-card">
<h3>本月签到总数</h3>
<p class="dsr-stat-number"><?php echo $this->get_month_signin_count(); ?></p>
</div>
<div class="dsr-stat-card">
<h3>总发放积分</h3>
<p class="dsr-stat-number"><?php echo $this->get_total_points_given(); ?></p>
</div>
<div class="dsr-stat-card">
<h3>活跃用户数</h3>
<p class="dsr-stat-number"><?php echo $this->get_active_users_count(); ?></p>
</div>
</div>
<div class="dsr-charts-section">
<h2>最近30天签到趋势</h2>
<canvas id="dsr-signin-chart" width="800" height="300"></canvas>
</div>
<div class="dsr-recent-activity">
<h2>最近签到记录</h2>
<table class="wp-list-table widefat fixed striped">
<thead>
<tr>
<th>用户</th>
<th>签到时间</th>
<th>获得积分</th>
<th>连续天数</th>
</tr>
</thead>
<tbody>
<?php $this->display_recent_signins(); ?>
</tbody>
</table>
</div>
</div>
<?php
}
}
4.2 奖励规则设置界面
// 奖励设置页面
public function render_settings() {
// 保存设置
if (isset($_POST['submit']) && check_admin_referer('dsr_settings_save')) {
$this->save_settings($_POST);
echo '<div class="notice notice-success"><p>设置已保存!</p></div>';
}
$settings = $this->get_settings();
?>
<div class="wrap">
<h1>签到奖励设置</h1>
<form method="post" action="">
<?php wp_nonce_field('dsr_settings_save'); ?>
<table class="form-table">
<tr>
<th scope="row">基础积分</th>
<td>
<input type="number" name="base_points"
value="<?php echo esc_attr($settings['base_points']); ?>"
min="1" max="1000" />
<p class="description">用户每日签到可获得的基础积分</p>
</td>
</tr>
<tr>
<th scope="row">连续签到7天奖励</th>
<td>
<input type="number" name="week_bonus"
value="<?php echo esc_attr($settings['week_bonus']); ?>"
min="0" max="1000" />
<p class="description">连续签到7天时的额外奖励积分</p>
</td>
</tr>
<tr>
<th scope="row">连续签到30天奖励</th>
<td>
<input type="number" name="month_bonus"
value="<?php echo esc_attr($settings['month_bonus']); ?>"
min="0" max="5000" />
<p class="description">连续签到30天时的额外奖励积分</p>
</td>
</tr>
<tr>
<th scope="row">补签卡消耗积分</th>
<td>
<input type="number" name="re_sign_cost"
value="<?php echo esc_attr($settings['re_sign_cost']); ?>"
min="0" max="1000" />
<p class="description">使用补签卡需要消耗的积分</p>
</td>
</tr>
<tr>
<th scope="row">断签规则</th>
<td>
<select name="break_rule">
<option value="reset" <?php selected($settings['break_rule'], 'reset'); ?>>
完全重置
</option>
<option value="keep_half" <?php selected($settings['break_rule'], 'keep_half'); ?>>
保留一半连续天数
</option>
<option value="keep_max" <?php selected($settings['break_rule'], 'keep_max'); ?>>
保留历史最高记录
</option>
</select>
<p class="description">连续签到中断后的处理方式</p>
</td>
</tr>
<tr>
<th scope="row">特殊日期奖励</th>
<td>
<textarea name="special_dates" rows="5" cols="50"><?php
echo esc_textarea($settings['special_dates']);
?></textarea>
<p class="description">格式:日期=奖励积分,每行一个,如:01-01=100(元旦)</p>
</td>
</tr>
</table>
<?php submit_button('保存设置'); ?>
</form>
</div>
<?php
}
五、高级功能扩展
5.1 补签卡功能
class DSR_ReSign_Card {
// 使用补签卡
public function use_resign_card($user_id, $target_date) {
// 检查目标日期是否合法
if (!$this->is_valid_resign_date($target_date)) {
return array(
'success' => false,
'message' => '该日期不可补签'
);
}
// 检查是否已签到
if ($this->has_signed_on_date($user_id, $target_date)) {
return array(
'success' => false,
'message' => '该日期已签到'
);
}
// 检查补签卡数量
$card_count = $this->get_user_resign_card_count($user_id);
if ($card_count < 1) {
return array(
'success' => false,
'message' => '补签卡不足'
);
}
// 消耗补签卡
$this->deduct_resign_card($user_id, 1);
// 执行补签
$signin_handler = new DSR_Signin_Handler();
$result = $signin_handler->process_resign($user_id, $target_date);
if ($result['success']) {
// 记录补签日志
$this->log_resign_usage($user_id, $target_date);
return array(
'success' => true,
'message' => '补签成功!',
'data' => $result
);
}
return $result;
}
// 购买补签卡
public function buy_resign_card($user_id, $quantity = 1) {
$card_price = get_option('dsr_resign_card_price', 100);
$total_cost = $card_price * $quantity;
// 检查用户积分
$user_points = $this->get_user_points($user_id);
if ($user_points < $total_cost) {
return array(
'success' => false,
'message' => '积分不足'
);
}
// 扣除积分
$this->deduct_points($user_id, $total_cost);
// 增加补签卡
$this->add_resign_cards($user_id, $quantity);
// 记录交易
$this->log_card_purchase($user_id, $quantity, $total_cost);
return array(
'success' => true,
'message' => "成功购买{$quantity}张补签卡,消耗{$total_cost}积分"
);
}
}
5.2 签到提醒与推送
class DSR_Notifications {
// 发送每日签到提醒
public function send_daily_reminder() {
// 获取今天未签到的活跃用户
$users = $this->get_unsigned_active_users();
foreach ($users as $user) {
// 发送站内信
$this->send_site_message($user->ID);
// 发送邮件提醒(如果用户开启了邮件通知)
if ($this->user_wants_email($user->ID)) {
$this->send_email_reminder($user);
}
// 发送微信/APP推送(如果有集成)
if ($this->has_wechat_integration()) {
$this->send_wechat_push($user->ID);
}
}
}
// 发送连续签到成就通知
public function send_achievement_notification($user_id, $achievement_type, $data) {
$user = get_userdata($user_id);
$message = '';
switch ($achievement_type) {
case 'continuous_7':
$message = "恭喜您连续签到7天!获得额外奖励积分。";
break;
case 'continuous_30':
$message = "恭喜您连续签到30天!获得月度签到王称号。";
break;
case 'total_points':
$message = "恭喜您总积分达到{$data['points']}!升级为{$data['level']}。";
break;
}
// 添加站内通知
$this->add_site_notification($user_id, $message, 'achievement');
// 发送邮件
$this->send_achievement_email($user, $message);
}
}
5.3 社交分享激励
class DSR_Social_Share {
// 处理社交分享奖励
public function process_share_reward($user_id, $platform, $content_type) {
// 检查今日是否已分享
if ($this->has_shared_today($user_id, $platform)) {
return array(
'success' => false,
'message' => '今日已通过此平台分享'
);
}
// 获取分享奖励积分
$points = $this->get_share_points($platform, $content_type);
// 记录分享
$this->record_share($user_id, $platform, $content_type, $points);
// 奖励积分
$this->add_points($user_id, $points, 'social_share', "{$platform}分享奖励");
return array(
'success' => true,
'points' => $points,
'message' => "分享成功!获得{$points}积分"
);
}
// 获取分享按钮HTML
public function get_share_buttons($post_id = null) {
$post_id = $post_id ?: get_the_ID();
$share_url = get_permalink($post_id);
$title = get_the_title($post_id);
$buttons = array(
'wechat' => array(
'name' => '微信',
'icon' => 'wechat',
'url' => 'javascript:;',
'class' => 'dsr-share-wechat',
'points' => 5
),
'weibo' => array(
'name' => '微博',
'icon' => 'weibo',
'url' => "http://service.weibo.com/share/share.php?url={$share_url}&title={$title}",
'class' => 'dsr-share-weibo',
'points' => 10
),
'qq' => array(
'name' => 'QQ',
'icon' => 'qq',
'url' => "https://connect.qq.com/widget/shareqq/index.html?url={$share_url}&title={$title}",
'class' => 'dsr-share-qq',
'points' => 8
)
);
ob_start();
?>
<div class="dsr-share-buttons">
<p>分享到社交网络可获得额外积分:</p>
<div class="dsr-share-platforms">
<?php foreach ($buttons as $platform => $button): ?>
<a href="<?php echo $button['url']; ?>"
class="dsr-share-button <?php echo $button['class']; ?>"
data-platform="<?php echo $platform; ?>"
data-points="<?php echo $button['points']; ?>"
target="_blank">
<span class="dsr-share-icon"><?php echo $button['icon']; ?></span>
<span class="dsr-share-text"><?php echo $button['name']; ?></span>
<span class="dsr-share-points">+<?php echo $button['points']; ?>积分</span>
</a>
<?php endforeach; ?>
</div>
</div>
<?php
return ob_get_clean();
}
}
六、性能优化与安全加固
6.1 数据库查询优化
class DSR_Optimizer {
// 使用缓存优化频繁查询
public function get_user_points_cached($user_id) {
$cache_key = "dsr_user_points_{$user_id}";
$points = wp_cache_get($cache_key, 'dsr');
if (false === $points) {
global $wpdb;
$table_name = $wpdb->prefix . 'user_points';
$points = $wpdb->get_var($wpdb->prepare(
"SELECT current_points FROM $table_name WHERE user_id = %d",
$user_id
));
if (is_null($points)) {
$points = 0;
}
