博客 / WordPress 教程

WordPress 会员系统架构方案:ACF插件自定义实现

WordPress 自定义会员系统(VIP 会员 + 有效期) 的完整实现方案,包括:

  • 自定义角色:vip
  • 给用户添加 VIP 有效期字段
  • 判断 VIP 是否过期
  • 自动在到期后移除 VIP 权限(可选)
  • 前端模板 / 函数调用方式

方案可用 ACF原生 WP 用户字段

一、创建 VIP 自定义角色(在 functions.php)

// 创建 VIP 用户角色
function add_vip_role() {
    add_role(
        'vip',
        'VIP 会员',
        array(
            'read' => true,
        )
    );
}
add_action('init', 'add_vip_role');

运行一次即可,之后角色就会永久保存。

二、为用户添加“VIP 有效期”字段

你可以用 ACF(最简单):
创建 User Field Group → 添加字段:

  • 字段名:vip_expiration
  • 字段类型:Date Picker(日期选择)

ACF 会自动存为用户 meta:vip_expiration

如果不用 ACF,也可以直接保存:

update_user_meta($user_id, 'vip_expiration', '2025-12-31');

三、判断会员是否 VIP 且是否过期

封装一个函数,全站通用:

function is_user_vip($user_id = null) {
    if (!$user_id) {
        $user_id = get_current_user_id();
    }

    if (!$user_id) {
        return false;
    }

    $user = get_userdata($user_id);

    // 没有 VIP 角色
    if (!in_array('vip', $user->roles)) {
        return false;
    }

    // 获取有效期
    $expiration_date = get_user_meta($user_id, 'vip_expiration', true);

    if (!$expiration_date) {
        return false;
    }

    $today = date('Y-m-d');

    // 判断过期
    if ($expiration_date < $today) {
        return false;
    }

    return true;
}

使用:

if (is_user_vip()) {
    echo "您是 VIP,有效期内!";
} else {
    echo "不是 VIP 或已过期";
}

四、VIP 到期自动取消角色(可选)

每天自动检测(WordPress Cron):

function vip_expiration_check() {
    $users = get_users(array(
        'role' => 'vip'
    ));

    $today = date('Y-m-d');

    foreach ($users as $user) {
        $exp = get_user_meta($user->ID, 'vip_expiration', true);

        if ($exp && $exp < $today) {
            // 删除 VIP 角色
            $user->remove_role('vip');
        }
    }
}
add_action('vip_daily_cron', 'vip_expiration_check');

// 创建每日 cron 事件(首次加载主题时执行一次)
function vip_cron_schedule() {
    if (!wp_next_scheduled('vip_daily_cron')) {
        wp_schedule_event(time(), 'daily', 'vip_daily_cron');
    }
}
add_action('wp', 'vip_cron_schedule');

五、管理员后台修改 VIP 时间

如果你用 ACF,后台用户编辑页直接有“VIP 有效期”。

如果不用 ACF,也可添加后台字段:

function add_vip_expiration_field($user){
    ?>
    <h3>VIP 会员设置</h3>
    <table class="form-table">
        <tr>
            <th><label for="vip_expiration">VIP 有效期</label></th>
            <td>
                <input type="date" name="vip_expiration" value="<?php echo esc_attr(get_user_meta($user->ID, 'vip_expiration', true)); ?>">
            </td>
        </tr>
    </table>
    <?php
}
add_action('show_user_profile', 'add_vip_expiration_field');
add_action('edit_user_profile', 'add_vip_expiration_field');

function save_vip_expiration_field($user_id){
    update_user_meta($user_id, 'vip_expiration', $_POST['vip_expiration']);
}
add_action('personal_options_update', 'save_vip_expiration_field');
add_action('edit_user_profile_update', 'save_vip_expiration_field');

六、前端显示 VIP 剩余天数(可选)

function vip_days_left($user_id = null) {
    if (!$user_id) $user_id = get_current_user_id();

    $exp = get_user_meta($user_id, 'vip_expiration', true);
    if (!$exp) return 0;

    $days = (strtotime($exp) - strtotime(date('Y-m-d'))) / 86400;

    return max(0, $days);
}

echo "剩余天数:" . vip_days_left() . " 天";

评论留言

您的邮箱地址不会被公开。 必填项已用 * 标注