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() . " 天";