首页 / 应用软件 / 手把手教程,为WordPress实现基于用户分层的差异化内容访问控制工具

手把手教程,为WordPress实现基于用户分层的差异化内容访问控制工具

手把手教程:为WordPress实现基于用户分层的差异化内容访问控制工具

引言:为什么WordPress需要用户分层内容控制?

在当今互联网环境中,个性化体验已成为网站成功的关键因素之一。根据Monetate的研究,93%的企业表示个性化策略显著提高了收入。对于WordPress网站而言,实现基于用户分层的差异化内容访问控制不仅能提升用户体验,还能有效提高转化率、用户粘性和内容价值。

传统的WordPress用户角色系统虽然提供了基本的权限管理,但在面对复杂的内容访问策略时显得力不从心。许多网站管理员需要根据用户等级、订阅状态、积分体系或购买历史等因素,为不同用户群体展示不同的内容。本教程将手把手指导您通过代码二次开发,实现一个功能完善的用户分层内容访问控制工具。

第一部分:理解WordPress用户系统与权限架构

1.1 WordPress默认用户角色与能力

WordPress内置了五种基本用户角色:订阅者、投稿者、作者、编辑和管理员。每个角色都有一组特定的"能力"(capabilities),这些能力决定了用户可以执行哪些操作。

// 查看WordPress默认能力
global $wp_roles;
print_r($wp_roles->roles);

然而,这些默认角色和能力主要针对内容管理,而非内容访问控制。要实现基于用户分层的差异化访问,我们需要扩展这一系统。

1.2 用户分层策略设计

在开始编码之前,我们需要设计合理的用户分层策略。常见的分层维度包括:

  1. 会员等级:免费用户、基础会员、高级会员、VIP
  2. 订阅状态:试用期用户、活跃订阅用户、过期用户
  3. 行为积分:根据互动行为积累的积分等级
  4. 购买历史:基于消费金额或频率的分层
  5. 用户标签:基于兴趣、职业等特征的手动标签

在本教程中,我们将以会员等级为核心,创建一个四级分层系统:

  • 等级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' => '&laquo;',
                    'next_text' => '&raquo;',
                    '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 >
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5377.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

工作时间:周一至周五,9:00-17:30,节假日休息
返回顶部