文章目录
-
- 在当今互联网环境中,个性化体验已成为网站成功的关键因素之一。根据Monetate的研究,93%的企业表示个性化策略显著提高了收入。对于WordPress网站而言,实现基于用户分层的差异化内容访问控制不仅能提升用户体验,还能有效提高转化率、用户粘性和内容价值。 传统的WordPress用户角色系统虽然提供了基本的权限管理,但在面对复杂的内容访问策略时显得力不从心。许多网站管理员需要根据用户等级、订阅状态、积分体系或购买历史等因素,为不同用户群体展示不同的内容。本教程将手把手指导您通过代码二次开发,实现一个功能完善的用户分层内容访问控制工具。
-
- WordPress内置了五种基本用户角色:订阅者、投稿者、作者、编辑和管理员。每个角色都有一组特定的"能力"(capabilities),这些能力决定了用户可以执行哪些操作。 // 查看WordPress默认能力 global $wp_roles; print_r($wp_roles->roles); 然而,这些默认角色和能力主要针对内容管理,而非内容访问控制。要实现基于用户分层的差异化访问,我们需要扩展这一系统。
- 在开始编码之前,我们需要设计合理的用户分层策略。常见的分层维度包括: 会员等级:免费用户、基础会员、高级会员、VIP 订阅状态:试用期用户、活跃订阅用户、过期用户 行为积分:根据互动行为积累的积分等级 购买历史:基于消费金额或频率的分层 用户标签:基于兴趣、职业等特征的手动标签 在本教程中,我们将以会员等级为核心,创建一个四级分层系统: 等级0:未注册游客 等级1:免费注册用户 等级2:基础会员 等级3:高级会员
-
- 首先,我们需要在用户数据表中添加等级字段。虽然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');
- 接下来,我们创建一个用户等级管理后台页面,让管理员可以轻松调整用户等级。 // 添加用户等级管理菜单 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 }
- 创建核心的用户等级管理函数,这些函数将在整个插件中使用。 // 获取用户等级 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(); } }
-
- 短代码是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]
- 除了短代码,我们还需要在文章/页面级别实现内容保护。这可以通过自定义元框和内容过滤器来实现。 // 添加文章/页面等级保护元框 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 >
在当今互联网环境中,个性化体验已成为网站成功的关键因素之一。根据Monetate的研究,93%的企业表示个性化策略显著提高了收入。对于WordPress网站而言,实现基于用户分层的差异化内容访问控制不仅能提升用户体验,还能有效提高转化率、用户粘性和内容价值。
传统的WordPress用户角色系统虽然提供了基本的权限管理,但在面对复杂的内容访问策略时显得力不从心。许多网站管理员需要根据用户等级、订阅状态、积分体系或购买历史等因素,为不同用户群体展示不同的内容。本教程将手把手指导您通过代码二次开发,实现一个功能完善的用户分层内容访问控制工具。
WordPress内置了五种基本用户角色:订阅者、投稿者、作者、编辑和管理员。每个角色都有一组特定的"能力"(capabilities),这些能力决定了用户可以执行哪些操作。
// 查看WordPress默认能力
global $wp_roles;
print_r($wp_roles->roles);
然而,这些默认角色和能力主要针对内容管理,而非内容访问控制。要实现基于用户分层的差异化访问,我们需要扩展这一系统。
在开始编码之前,我们需要设计合理的用户分层策略。常见的分层维度包括:
- 会员等级:免费用户、基础会员、高级会员、VIP
- 订阅状态:试用期用户、活跃订阅用户、过期用户
- 行为积分:根据互动行为积累的积分等级
- 购买历史:基于消费金额或频率的分层
- 用户标签:基于兴趣、职业等特征的手动标签
在本教程中,我们将以会员等级为核心,创建一个四级分层系统:
- 等级0:未注册游客
- 等级1:免费注册用户
- 等级2:基础会员
- 等级3:高级会员
首先,我们需要在用户数据表中添加等级字段。虽然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');
接下来,我们创建一个用户等级管理后台页面,让管理员可以轻松调整用户等级。
// 添加用户等级管理菜单
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
}
创建核心的用户等级管理函数,这些函数将在整个插件中使用。
// 获取用户等级
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();
}
}
短代码是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]
除了短代码,我们还需要在文章/页面级别实现内容保护。这可以通过自定义元框和内容过滤器来实现。
// 添加文章/页面等级保护元框
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 >


