文章目录[隐藏]
手把手教程:为WordPress实现基于用户分层的差异化内容访问控制工具
引言:为什么WordPress需要用户分层内容控制?
在当今互联网环境中,个性化体验已成为网站成功的关键因素之一。根据Monetate的研究,93%的企业表示个性化策略显著提高了收入。对于WordPress网站而言,实现基于用户分层的差异化内容访问控制不仅能提升用户体验,还能有效提高转化率、用户粘性和内容价值。
传统的WordPress用户角色系统虽然提供了基本的权限管理,但在面对复杂的内容访问策略时显得力不从心。许多网站管理员需要根据用户等级、订阅状态、积分体系或购买历史等因素,为不同用户群体展示不同的内容。本教程将手把手指导您通过代码二次开发,实现一个功能完善的用户分层内容访问控制工具。
第一部分:理解WordPress用户系统与权限架构
1.1 WordPress默认用户角色与能力
WordPress内置了五种基本用户角色:订阅者、投稿者、作者、编辑和管理员。每个角色都有一组特定的"能力"(capabilities),这些能力决定了用户可以执行哪些操作。
// 查看WordPress默认能力
global $wp_roles;
print_r($wp_roles->roles);
然而,这些默认角色和能力主要针对内容管理,而非内容访问控制。要实现基于用户分层的差异化访问,我们需要扩展这一系统。
1.2 用户分层策略设计
在开始编码之前,我们需要设计合理的用户分层策略。常见的分层维度包括:
- 会员等级:免费用户、基础会员、高级会员、VIP
- 订阅状态:试用期用户、活跃订阅用户、过期用户
- 行为积分:根据互动行为积累的积分等级
- 购买历史:基于消费金额或频率的分层
- 用户标签:基于兴趣、职业等特征的手动标签
在本教程中,我们将以会员等级为核心,创建一个四级分层系统:
- 等级0:未注册游客
- 等级1:免费注册用户
- 等级2:基础会员
- 等级3:高级会员
第二部分:构建用户分层管理系统
2.1 创建用户等级数据库字段
首先,我们需要在用户数据表中添加等级字段。虽然WordPress提供了wp_usermeta表存储用户元数据,但为了性能考虑,我们将使用专门的数据表来管理用户等级信息。
// 创建用户等级数据表
function create_user_level_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'user_levels';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
user_id bigint(20) NOT NULL,
user_level int(2) NOT NULL DEFAULT 1,
level_expiry datetime DEFAULT NULL,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY user_id (user_id),
KEY user_level (user_level)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'create_user_level_table');
2.2 用户等级管理后台界面
接下来,我们创建一个用户等级管理后台页面,让管理员可以轻松调整用户等级。
// 添加用户等级管理菜单
function add_user_level_admin_menu() {
add_users_page(
'用户等级管理',
'用户等级',
'manage_options',
'user-level-manager',
'render_user_level_admin_page'
);
}
add_action('admin_menu', 'add_user_level_admin_menu');
// 渲染用户等级管理页面
function render_user_level_admin_page() {
global $wpdb;
$table_name = $wpdb->prefix . 'user_levels';
// 处理表单提交
if (isset($_POST['update_user_level'])) {
$user_id = intval($_POST['user_id']);
$new_level = intval($_POST['user_level']);
$expiry_date = sanitize_text_field($_POST['level_expiry']);
update_user_level($user_id, $new_level, $expiry_date);
echo '<div class="notice notice-success"><p>用户等级已更新</p></div>';
}
// 分页逻辑
$per_page = 20;
$current_page = isset($_GET['paged']) ? max(1, intval($_GET['paged'])) : 1;
$offset = ($current_page - 1) * $per_page;
// 获取用户数据
$users = $wpdb->get_results(
$wpdb->prepare(
"SELECT u.ID, u.user_login, u.user_email, ul.user_level, ul.level_expiry
FROM {$wpdb->users} u
LEFT JOIN $table_name ul ON u.ID = ul.user_id
ORDER BY u.ID DESC
LIMIT %d OFFSET %d",
$per_page, $offset
)
);
// 计算总页数
$total_users = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->users}");
$total_pages = ceil($total_users / $per_page);
// 渲染页面HTML
?>
<div class="wrap">
<h1 class="wp-heading-inline">用户等级管理</h1>
<table class="wp-list-table widefat fixed striped">
<thead>
<tr>
<th>用户ID</th>
<th>用户名</th>
<th>邮箱</th>
<th>当前等级</th>
<th>等级有效期</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<?php foreach ($users as $user): ?>
<tr>
<td><?php echo $user->ID; ?></td>
<td><?php echo esc_html($user->user_login); ?></td>
<td><?php echo esc_html($user->user_email); ?></td>
<td>
<select id="level_<?php echo $user->ID; ?>">
<option value="0" <?php selected($user->user_level, 0); ?>>游客</option>
<option value="1" <?php selected($user->user_level, 1); ?>>免费用户</option>
<option value="2" <?php selected($user->user_level, 2); ?>>基础会员</option>
<option value="3" <?php selected($user->user_level, 3); ?>>高级会员</option>
</select>
</td>
<td>
<input type="date" id="expiry_<?php echo $user->ID; ?>"
value="<?php echo $user->level_expiry ? date('Y-m-d', strtotime($user->level_expiry)) : ''; ?>">
</td>
<td>
<button class="button button-primary update-level-btn"
data-user-id="<?php echo $user->ID; ?>">更新</button>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<!-- 分页导航 -->
<div class="tablenav bottom">
<div class="tablenav-pages">
<?php
echo paginate_links(array(
'base' => add_query_arg('paged', '%#%'),
'format' => '',
'prev_text' => '«',
'next_text' => '»',
'total' => $total_pages,
'current' => $current_page
));
?>
</div>
</div>
</div>
<script>
jQuery(document).ready(function($) {
$('.update-level-btn').click(function() {
var userId = $(this).data('user-id');
var newLevel = $('#level_' + userId).val();
var expiryDate = $('#expiry_' + userId).val();
$.post(ajaxurl, {
action: 'update_user_level',
user_id: userId,
user_level: newLevel,
level_expiry: expiryDate,
nonce: '<?php echo wp_create_nonce("update_user_level_nonce"); ?>'
}, function(response) {
if (response.success) {
alert('用户等级已更新');
} else {
alert('更新失败: ' + response.data);
}
});
});
});
</script>
<?php
}
2.3 用户等级API函数
创建核心的用户等级管理函数,这些函数将在整个插件中使用。
// 获取用户等级
function get_user_level($user_id = null) {
if (!$user_id) {
$user_id = get_current_user_id();
}
if (!$user_id) {
return 0; // 游客
}
global $wpdb;
$table_name = $wpdb->prefix . 'user_levels';
$result = $wpdb->get_row($wpdb->prepare(
"SELECT user_level, level_expiry FROM $table_name WHERE user_id = %d",
$user_id
));
// 检查等级是否过期
if ($result && $result->level_expiry) {
$expiry_time = strtotime($result->level_expiry);
if (time() > $expiry_time) {
// 等级已过期,降级为免费用户
update_user_level($user_id, 1, null);
return 1;
}
}
return $result ? $result->user_level : 1; // 默认等级为1(免费用户)
}
// 更新用户等级
function update_user_level($user_id, $level, $expiry_date = null) {
global $wpdb;
$table_name = $wpdb->prefix . 'user_levels';
// 验证用户是否存在
$user = get_user_by('ID', $user_id);
if (!$user) {
return new WP_Error('invalid_user', '用户不存在');
}
// 验证等级值
if (!in_array($level, [0, 1, 2, 3])) {
return new WP_Error('invalid_level', '无效的用户等级');
}
// 检查是否已有记录
$existing = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $table_name WHERE user_id = %d",
$user_id
));
if ($existing) {
// 更新现有记录
$wpdb->update(
$table_name,
array(
'user_level' => $level,
'level_expiry' => $expiry_date,
'updated_at' => current_time('mysql')
),
array('user_id' => $user_id)
);
} else {
// 插入新记录
$wpdb->insert(
$table_name,
array(
'user_id' => $user_id,
'user_level' => $level,
'level_expiry' => $expiry_date,
'created_at' => current_time('mysql'),
'updated_at' => current_time('mysql')
)
);
}
// 清除用户缓存
clean_user_cache($user_id);
// 触发等级变更钩子
do_action('user_level_updated', $user_id, $level, $expiry_date);
return true;
}
// AJAX处理用户等级更新
add_action('wp_ajax_update_user_level', 'handle_ajax_update_user_level');
function handle_ajax_update_user_level() {
// 验证nonce
if (!check_ajax_referer('update_user_level_nonce', 'nonce', false)) {
wp_die('安全验证失败', 403);
}
// 验证权限
if (!current_user_can('manage_options')) {
wp_die('权限不足', 403);
}
$user_id = intval($_POST['user_id']);
$user_level = intval($_POST['user_level']);
$level_expiry = sanitize_text_field($_POST['level_expiry']);
$result = update_user_level($user_id, $user_level, $level_expiry);
if (is_wp_error($result)) {
wp_send_json_error($result->get_error_message());
} else {
wp_send_json_success();
}
}
第三部分:实现内容访问控制功能
3.1 短代码实现内容保护
短代码是WordPress中最灵活的内容控制方式之一。我们将创建几个短代码,用于根据用户等级显示或隐藏内容。
// 等级保护短代码
function user_level_protected_shortcode($atts, $content = null) {
// 解析短代码属性
$atts = shortcode_atts(array(
'min_level' => 1,
'max_level' => 3,
'message' => '您没有权限查看此内容',
'show_to' => '' // 特定用户ID,用逗号分隔
), $atts, 'user_level_content');
$current_user_id = get_current_user_id();
$current_user_level = get_user_level($current_user_id);
// 检查特定用户权限
if (!empty($atts['show_to'])) {
$allowed_users = array_map('intval', explode(',', $atts['show_to']));
if (in_array($current_user_id, $allowed_users)) {
return do_shortcode($content);
}
}
// 检查等级权限
if ($current_user_level >= $atts['min_level'] && $current_user_level <= $atts['max_level']) {
return do_shortcode($content);
}
// 没有权限,显示提示信息
$message = '<div class="user-level-restricted-message">';
$message .= '<p>' . esc_html($atts['message']) . '</p>';
// 如果用户未登录,显示登录链接
if (!$current_user_id) {
$message .= '<p>请<a href="' . wp_login_url(get_permalink()) . '">登录</a>或';
$message .= '<a href="' . wp_registration_url() . '">注册</a></p>';
}
// 如果用户等级不够,显示升级提示
elseif ($current_user_level < $atts['min_level']) {
$message .= '<p>您需要升级到等级' . $atts['min_level'] . '才能查看此内容</p>';
$message .= '<a href="/membership" class="button">立即升级</a>';
}
$message .= '</div>';
return $message;
}
add_shortcode('user_level_content', 'user_level_protected_shortcode');
// 使用示例:
// [user_level_content min_level="2"]仅限基础会员及以上查看的内容[/user_level_content]
// [user_level_content min_level="3" message="这是VIP专属内容"]VIP内容[/user_level_content]
3.2 文章/页面级别的内容保护
除了短代码,我们还需要在文章/页面级别实现内容保护。这可以通过自定义元框和内容过滤器来实现。
// 添加文章/页面等级保护元框
function add_user_level_metabox() {
$post_types = get_post_types(array('public' => true));
foreach ($post_types as $post_type) {
add_meta_box(
'user_level_protection',
'用户等级访问控制',
'render_user_level_metabox',
$post_type,
'side',
'high'
);
}
}
add_action('add_meta_boxes', 'add_user_level_metabox');
// 渲染元框内容
function render_user_level_metabox($post) {
wp_nonce_field('save_user_level_protection', 'user_level_protection_nonce');
$min_level = get_post_meta($post->ID, '_user_level_min', true);
$max_level = get_post_meta($post->ID, '_user_level_max', true);
$custom_message = get_post_meta($post->ID, '_user_level_message', true);
?>
<p>
<label for="user_level_min">最低访问等级:</label>
<select name="user_level_min" id="user_level_min">
<option value="0" <?php selected($min_level, '0'); ?>>所有人(包括游客)</option>
<option value="1" <?php selected($min_level, '1'); ?>>免费用户及以上</option>
<option value="2" <?php selected($min_level, '2'); ?>>基础会员及以上</option>
<option value="3" <?php selected($min_level, '3'); ?>>高级会员及以上</option>
</select>
</p>
<p>
<label for="user_level_max">最高访问等级:</label>
<select name="user_level_max" id="user_level_max">
<option value="0" <?php selected($max_level, '0'); ?>>不限</option>
<option value="1" <?php selected($max_level, '1'); ?>>仅免费用户</option>
<option value="2" <?php selected($max_level, '2'); ?>>仅基础会员</option>
<option value="3" <?php selected($max_level, '3'); ?>>仅高级会员</option>
</select>
</p>
<p>
<label for="user_level_message">无权限提示信息:</label>
<textarea name="user_level_message" id="user_level_message" rows="3" style="width:100%;"><?php echo esc_textarea($custom_message); ?></textarea>
</p>
<p class="description">
设置此文章/页面的访问等级限制。如果用户等级不符合要求,将看到提示信息。
</p>
<?php
}
// 保存元框数据
function save_user_level_protection($post_id) {
// 检查nonce
if (!isset($_POST['user_level_protection_nonce']) ||
nono'], 'save_user_level_protection')) {
return;
}
// 检查自动保存
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// 检查用户权限
if (!current_user_can('edit_post', $post_id)) {
return;
}
// 保存数据
if (isset($_POST['user_level_min'])) {
update_post_meta($post_id, '_user_level_min', intval($_POST['user_level_min']));
}
if (isset($_POST['user_level_max'])) {
update_post_meta($post_id, '_user_level_max', intval($_POST['user_level_max']));
}
if (isset($_POST['user_level_message'])) {
update_post_meta($post_id, '_user_level_message', sanitize_textarea_field($_POST['user_level_message']));
}
}
add_action('save_post', 'save_user_level_protection');
// 内容访问控制过滤器
function filter_protected_content($content) {
global $post;
// 只在单篇文章/页面应用
if (!is_singular() || !isset($post->ID)) {
return $content;
}
// 获取当前用户等级
$current_user_id = get_current_user_id();
$current_user_level = get_user_level($current_user_id);
// 获取文章保护设置
$min_level = get_post_meta($post->ID, '_user_level_min', true);
$max_level = get_post_meta($post->ID, '_user_level_max', true);
$custom_message = get_post_meta($post->ID, '_user_level_message', true);
// 如果没有设置保护,直接返回内容
if (empty($min_level) && empty($max_level)) {
return $content;
}
// 设置默认值
$min_level = empty($min_level) ? 0 : intval($min_level);
$max_level = empty($max_level) ? 3 : intval($max_level);
// 检查用户权限
$has_access = true;
if ($current_user_level < $min_level) {
$has_access = false;
$reason = 'level_too_low';
}
if ($max_level > 0 && $current_user_level > $max_level) {
$has_access = false;
$reason = 'level_too_high';
}
// 如果有权限,返回完整内容
if ($has_access) {
return $content;
}
// 没有权限,返回提示信息
$message = '<div class="user-level-restricted-content">';
if (!empty($custom_message)) {
$message .= '<p>' . esc_html($custom_message) . '</p>';
} else {
$message .= '<h3>内容访问受限</h3>';
if ($reason === 'level_too_low') {
$level_names = ['游客', '免费用户', '基础会员', '高级会员'];
$message .= '<p>此内容需要' . $level_names[$min_level] . '及以上等级才能访问</p>';
$message .= '<p>您的当前等级:' . $level_names[$current_user_level] . '</p>';
} else {
$message .= '<p>此内容仅限特定等级用户访问</p>';
}
}
// 添加操作按钮
if (!$current_user_id) {
$message .= '<div class="restricted-actions">';
$message .= '<a href="' . wp_login_url(get_permalink()) . '" class="button button-primary">登录</a>';
$message .= '<a href="' . wp_registration_url() . '" class="button">注册</a>';
$message .= '</div>';
} elseif ($current_user_level < $min_level) {
$message .= '<div class="restricted-actions">';
$message .= '<a href="/membership" class="button button-primary">升级会员</a>';
$message .= '</div>';
}
$message .= '</div>';
return $message;
}
add_filter('the_content', 'filter_protected_content', 10);
### 3.3 分类和标签级别的访问控制
除了文章级别的控制,我们还可以实现分类和标签级别的访问控制。
// 为分类添加等级保护字段
function add_user_level_to_category($term) {
?>
<div class="form-field">
<label for="user_level_min">最低访问等级</label>
<select name="user_level_min" id="user_level_min">
<option value="0">所有人(包括游客)</option>
<option value="1">免费用户及以上</option>
<option value="2">基础会员及以上</option>
<option value="3">高级会员及以上</option>
</select>
<p>设置访问此分类的最低用户等级</p>
</div>
<?php
}
add_action('category_add_form_fields', 'add_user_level_to_category');
// 编辑分类时的字段
function edit_user_level_for_category($term) {
$min_level = get_term_meta($term->term_id, 'user_level_min', true);
?>
<tr class="form-field">
<th scope="row"><label for="user_level_min">最低访问等级</label></th>
<td>
<select name="user_level_min" id="user_level_min">
<option value="0" <?php selected($min_level, '0'); ?>>所有人(包括游客)</option>
<option value="1" <?php selected($min_level, '1'); ?>>免费用户及以上</option>
<option value="2" <?php selected($min_level, '2'); ?>>基础会员及以上</option>
<option value="3" <?php selected($min_level, '3'); ?>>高级会员及以上</option>
</select>
<p class="description">设置访问此分类的最低用户等级</p>
</td>
</tr>
<?php
}
add_action('category_edit_form_fields', 'edit_user_level_for_category');
// 保存分类等级设置
function save_category_user_level($term_id) {
if (isset($_POST['user_level_min'])) {
update_term_meta($term_id, 'user_level_min', intval($_POST['user_level_min']));
}
}
add_action('created_category', 'save_category_user_level');
add_action('edited_category', 'save_category_user_level');
// 分类页面访问控制
function filter_category_archive($query) {
if (!is_admin() && $query->is_main_query() && $query->is_category()) {
$current_user_level = get_user_level();
$category_id = $query->get_queried_object_id();
$category_min_level = get_term_meta($category_id, 'user_level_min', true);
if (!empty($category_min_level) && $current_user_level < intval($category_min_level)) {
// 用户等级不够,重定向或显示错误
if (!is_user_logged_in()) {
wp_redirect(wp_login_url(get_category_link($category_id)));
exit;
} else {
wp_die('您没有权限访问此分类', '访问受限', 403);
}
}
}
}
add_action('pre_get_posts', 'filter_category_archive');
## 第四部分:用户界面与体验优化
### 4.1 前端用户等级显示
让用户清楚了解自己的等级状态非常重要。我们将在用户资料页和前端显示用户等级信息。
// 在用户资料页显示等级信息
function show_user_level_in_profile($user) {
$user_level = get_user_level($user->ID);
$level_names = ['游客', '免费用户', '基础会员', '高级会员'];
$level_colors = ['#95a5a6', '#3498db', '#2ecc71', '#e74c3c'];
// 获取等级有效期
global $wpdb;
$table_name = $wpdb->prefix . 'user_levels';
$expiry = $wpdb->get_var($wpdb->prepare(
"SELECT level_expiry FROM $table_name WHERE user_id = %d",
$user->ID
));
?>
<h3>用户等级信息</h3>
<table class="form-table">
<tr>
<th><label>当前等级</label></th>
<td>
<div style="display: flex; align-items: center; gap: 10px;">
<span style="display: inline-block; width: 20px; height: 20px; border-radius: 50%; background-color: <?php echo $level_colors[$user_level]; ?>;"></span>
<strong style="color: <?php echo $level_colors[$user_level]; ?>;">
<?php echo $level_names[$user_level]; ?> (等级 <?php echo $user_level; ?>)
</strong>
</div>
</td>
</tr>
<?php if ($expiry): ?>
<tr>
<th><label>等级有效期</label></th>
<td><?php echo date('Y年m月d日', strtotime($expiry)); ?></td>
</tr>
<?php endif; ?>
<tr>
<th><label>等级权限</label></th>
<td>
<ul style="margin: 0;">
<?php
$permissions = [
0 => '只能浏览公开内容',
1 => '可以浏览基础内容,参与评论',
2 => '可以访问会员专属内容,下载资源',
3 => '可以访问所有内容,享受优先支持'
];
foreach ($permissions as $level => $permission) {
$checked = $user_level >= $level ? '✓' : '✗';
$color = $user_level >= $level ? '#2ecc71' : '#e74c3c';
echo '<li style="color: ' . $color . ';">' . $checked . ' ' . $permission . '</li>';
}
?>
</ul>
</td>
</tr>
</table>
<?php
}
add_action('show_user_profile', 'show_user_level_in_profile');
add_action('edit_user_profile', 'show_user_level_in_profile');
// 在前端显示用户等级徽章
function display_user_level_badge() {
if (!is_user_logged_in()) {
return;
}
$user_id = get_current_user_id();
$user_level = get_user_level($user_id);
$level_names = ['游客', '免费用户', '基础会员', '高级会员'];
$level_colors = ['#95a5a6', '#3498db', '#2ecc71', '#e74c3c'];
// 获取用户信息
$user = wp_get_current_user();
$display_name = $user->display_name;
ob_start();
?>
<div class="user-level-badge" style="
display: inline-flex;
align-items: center;
gap: 8px;
padding: 6px 12px;
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
border-radius: 20px;
border: 2px solid <?php echo $level_colors[$user_level]; ?>;
font-size: 14px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
">
<span style="
display: inline-block;
width: 12px;
height: 12px;
border-radius: 50%;
background-color: <?php echo $level_colors[$user_level]; ?>;
"></span>
<span style="font-weight: bold; color: #2c3e50;"><?php echo esc_html($display_name); ?></span>
<span style="
padding: 2px 8px;
background-color: <?php echo $level_colors[$user_level]; ?>;
color: white;
border-radius: 10px;
font-size: 12px;
font-weight: bold;
">
<?php echo $level_names[$user_level]; ?>
</span>
</div>
<?php
return ob_get_clean();
}
add_shortcode('user_level_badge', 'display_user_level_badge');
// 自动在导航栏添加用户等级信息
function add_user_level_to_nav($items, $args) {
if (!is_user_logged_in() || $args->theme_location != 'primary') {
return $items;
}
$badge = display_user_level_badge();
$items .= '<li class="menu-item user-level-menu-item">' . $badge . '</li>';
return $items;
}
add_filter('wp_nav_menu_items', 'add_user_level_to_nav', 10, 2);
### 4.2 等级升级提示和引导
当用户尝试访问受限内容时,提供清晰的升级路径非常重要。
// 创建升级提示小工具
class User_Level_Upgrade_Widget extends WP_Widget {
public function __construct() {
parent::__construct(
'user_level_upgrade_widget',
'用户等级升级提示',
array('description' => '根据用户当前等级显示升级提示')
);
}
public function widget($args, $instance) {
if (!is_user_logged_in()) {
return;
}
$current_user_level = get_user_level();
// 如果已经是最高等级,不显示
if ($current_user_level >= 3) {
return;
}
$next_level = $current_user_level + 1;
$level_names = ['免费用户', '基础会员', '高级会员', 'VIP'];
$level_prices = ['免费', '99元/年', '299元/年', '999元/年'];
$level_features = [
1 => ['基础内容访问', '参与评论', '社区互动'],
2 => ['会员专属内容', '资源下载', '优先支持'],
3 => ['所有内容访问', '专属客服', '活动邀请', '定制服务']
];
echo $args['before_widget'];
echo $args['before_title'] . '升级到' . $level_names[$next_level] . $args['after_title'];
?>
<div class="upgrade-widget-content">
<div class="current-level" style="
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 15px;
border-radius: 8px;
margin-bottom: 15px;
">
<h4 style="margin: 0 0 5px 0;">当前等级</h4>
<div style="font-size: 24px; font-weight: bold;"><?php echo $level_names[$current_user_level]; ?></div>
</div>
<div class="next-level" style="
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
color: white;
padding: 15px;
border-radius: 8px;
margin-bottom: 15px;
">
<h4 style="margin: 0 0 5px 0;">下一等级</h4>
<div style="font-size: 24px; font-weight: bold;"><?php echo $level_names[$next_level]; ?></div>
<div style="font-size: 18px; margin-top: 5px;"><?php echo $level_prices[$next_level]; ?></div>
</div>
<div class="features" style="margin-bottom: 15px;">
<h4 style="margin-bottom: 10px;">升级后将获得:</h4>
<ul style="margin: 0; padding-left: 20px;">
<?php foreach ($level_features[$next_level] as $feature): ?>
<li style="margin-bottom: 5px;">✓ <?php echo $feature; ?></li>
<?php endforeach; ?>
</ul>
</div>
<a href="/upgrade?level=<?php echo $next_level; ?>" class="button button-primary" style="
display: block;
text-align: center;
padding: 12px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
text-decoration: none;
border-radius: 6px;
font-weight: bold;
transition: transform 0.3s;
" onmouseover="this.style.transform='translateY(-2px)'" onmouseout="this.style.transform='translateY(0)'">
立即升级
</a>
</div>
<?php
echo $args['after_widget'];
}
}
// 注册小工具
function register_user_level_widget() {
register_widget('User_Level_Upgrade_Widget');
}
add_action('widgets_init', 'register_user_level_widget');
## 第五部分:高级功能与集成
### 5.1 与WooCommerce集成
如果网站使用WooCommerce,我们可以将用户等级与购买行为关联起来。
// WooCommerce购买后自动升级用户等级
function upgrade_user_level_on_purchase($order_id) {
$order = wc_get_order($order_id);
$user_id = $order->get_user_id();
if (!$user_id) {
return;
}
// 获取订单总金额
$order_total = $order->get_total();
// 根据订单金额确定等级
$new_level = 1; // 默认免费用户
if ($order_total >= 999) {
$new_level = 3; // 高级会员
$expiry_date = date('Y-m-d H:i:s', strtotime('+1 year'));
} elseif ($order_total >= 99) {
$new_level = 2; // 基础会员
$expiry_date = date('Y-m-d H:i:s', strtotime('+1 year'));
}
// 更新用户等级
if ($new_level >
