方法1
直接把下面代码丢进主题文件下面的functions.php里面
add_action('add_meta_boxes', function() {
add_meta_box('zp_vip_access_meta', '访问权限控制', 'zp_vip_access_meta_box', 'post', 'side');
});
function zp_vip_access_meta_box($post) {
$vip_roles = get_post_meta($post->ID, '_zp_vip_roles', true);
$vip_level = get_post_meta($post->ID, '_zp_vip_level', true);
$vip_name_1 = get_post_meta($post->ID, '_zp_vip_name_1', true);
$vip_name_2 = get_post_meta($post->ID, '_zp_vip_name_2', true);
$is_auth_required = get_post_meta($post->ID, '_zp_is_auth_required', true);
if (!is_array($vip_roles)) $vip_roles = [];
echo '<p><label><input type="checkbox" name="zp_vip_roles[]" value="member"' . (in_array('member', $vip_roles) ? ' checked' : '') . '> 初级会员</label></p>';
echo '<p><label><input type="checkbox" name="zp_vip_roles[]" value="vip"' . (in_array('vip', $vip_roles) ? ' checked' : '') . '> 高级会员</label></p>';
echo '<p><label>最低等级:<input type="number" name="zp_vip_level" value="' . esc_attr($vip_level) . '" style="width:60px;"></label></p>';
echo '<hr>';
echo '<p><label>初级会员名称:<input type="text" name="zp_vip_name_1" value="' . esc_attr($vip_name_1) . '" /></label></p>';
echo '<p><label>高级会员名称:<input type="text" name="zp_vip_name_2" value="' . esc_attr($vip_name_2) . '" /></label></p>';
echo '<p><label><input type="checkbox" name="zp_is_auth_required"' . ($is_auth_required ? ' checked' : '') . '> 是否要求认证用户</label></p>';
}
add_action('save_post', function($post_id) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (isset($_POST['zp_vip_roles'])) {
update_post_meta($post_id, '_zp_vip_roles', (array) $_POST['zp_vip_roles']);
} else {
delete_post_meta($post_id, '_zp_vip_roles');
}
if (isset($_POST['zp_vip_level'])) {
update_post_meta($post_id, '_zp_vip_level', intval($_POST['zp_vip_level']));
} else {
delete_post_meta($post_id, '_zp_vip_level');
}
if (isset($_POST['zp_vip_name_1'])) {
update_post_meta($post_id, '_zp_vip_name_1', sanitize_text_field($_POST['zp_vip_name_1']));
}
if (isset($_POST['zp_vip_name_2'])) {
update_post_meta($post_id, '_zp_vip_name_2', sanitize_text_field($_POST['zp_vip_name_2']));
}
if (isset($_POST['zp_is_auth_required'])) {
update_post_meta($post_id, '_zp_is_auth_required', 1);
} else {
update_post_meta($post_id, '_zp_is_auth_required', 0);
}
});
// 内容替换逻辑(只要满足任意一个条件即可)
add_filter('the_content', function($content) {
if (!is_singular('post')) return $content;
global $post, $current_user;
wp_get_current_user();
$roles = get_post_meta($post->ID, '_zp_vip_roles', true);
$level_limit = intval(get_post_meta($post->ID, '_zp_vip_level', true));
$is_auth_required = get_post_meta($post->ID, '_zp_is_auth_required', true);
if (!is_array($roles)) $roles = [];
$user_vip = get_user_meta($current_user->ID, 'vip_level', true);
$user_level = intval(get_user_meta($current_user->ID, 'level', true));
$user_auth = intval(get_user_meta($current_user->ID, 'auth', true));
$has_access = false;
if ((in_array('member', $roles) && $user_vip >= 1) ||
(in_array('vip', $roles) && $user_vip >= 2) ||
($level_limit > 0 && $user_level >= $level_limit) ||
($is_auth_required && $user_auth === 1)) {
$has_access = true;
}
if ($has_access) {
return $content;
} else {
return zp_show_restriction_box($roles, $level_limit, $is_auth_required, $post);
}
});
function zp_show_restriction_box($roles, $level, $is_auth_required, $post) {
$vip_level_name_1 = get_post_meta($post->ID, '_zp_vip_name_1', true);
$vip_level_name_2 = get_post_meta($post->ID, '_zp_vip_name_2', true);
if (!$vip_level_name_1) $vip_level_name_1 = '初级会员';
if (!$vip_level_name_2) $vip_level_name_2 = '高级会员';
$requirements = [];
if (in_array('member', $roles)) $requirements[] = $vip_level_name_1;
if (in_array('vip', $roles)) $requirements[] = $vip_level_name_2;
if ($level > 0) $requirements[] = "等级 ≥ {$level}";
if ($is_auth_required) $requirements[] = "认证用户";
if (empty($requirements)) return '';
$require_str = implode('、', $requirements);
return <<<HTML
<div class="zp-access-denied" style="background:#fff7f0;border:1px solid #f9c88c;padding:16px;border-radius:10px;margin:20px 0;font-size:15px;color:#333;display:flex;align-items:center;gap:10px;">
<span style="font-size:20px; color:#ff6a00;">🔒</span>
<div>该资源需要:<strong>{$require_str}</strong> 才可访问。</div>
</div>
HTML;
}
第二种方式
自己新建一个插件,名字随便,然后把下面代码丢进去,开启插件就行
<?php
/*
Plugin Name: Zib VIP Access Control
Description: 子比主题下控制文章访问权限,支持初级会员、高级会员、等级限制,自定义权限名称。
Version: 1.2
Author: 李小白
*/
// 添加后台元框
add_action('add_meta_boxes', function() {
add_meta_box('zp_vip_access_meta', '访问权限控制', 'zp_vip_access_meta_box', 'post', 'side');
});
function zp_vip_access_meta_box($post) {
$vip_roles = get_post_meta($post->ID, '_zp_vip_roles', true);
$vip_level = get_post_meta($post->ID, '_zp_vip_level', true);
$vip_name_1 = get_post_meta($post->ID, '_zp_vip_name_1', true);
$vip_name_2 = get_post_meta($post->ID, '_zp_vip_name_2', true);
$is_auth_required = get_post_meta($post->ID, '_zp_is_auth_required', true);
if (!is_array($vip_roles)) $vip_roles = [];
echo '<p><label><input type="checkbox" name="zp_vip_roles[]" value="member"' . (in_array('member', $vip_roles) ? ' checked' : '') . '> 初级会员</label></p>';
echo '<p><label><input type="checkbox" name="zp_vip_roles[]" value="vip"' . (in_array('vip', $vip_roles) ? ' checked' : '') . '> 高级会员</label></p>';
echo '<p><label>最低等级:<input type="number" name="zp_vip_level" value="' . esc_attr($vip_level) . '" style="width:60px;"></label></p>';
echo '<hr>';
echo '<p><label>初级会员名称:<input type="text" name="zp_vip_name_1" value="' . esc_attr($vip_name_1) . '" /></label></p>';
echo '<p><label>高级会员名称:<input type="text" name="zp_vip_name_2" value="' . esc_attr($vip_name_2) . '" /></label></p>';
echo '<p><label><input type="checkbox" name="zp_is_auth_required"' . ($is_auth_required ? ' checked' : '') . '> 是否要求认证用户</label></p>';
}
add_action('save_post', function($post_id) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (isset($_POST['zp_vip_roles'])) {
update_post_meta($post_id, '_zp_vip_roles', (array) $_POST['zp_vip_roles']);
} else {
delete_post_meta($post_id, '_zp_vip_roles');
}
if (isset($_POST['zp_vip_level'])) {
update_post_meta($post_id, '_zp_vip_level', intval($_POST['zp_vip_level']));
} else {
delete_post_meta($post_id, '_zp_vip_level');
}
if (isset($_POST['zp_vip_name_1'])) {
update_post_meta($post_id, '_zp_vip_name_1', sanitize_text_field($_POST['zp_vip_name_1']));
}
if (isset($_POST['zp_vip_name_2'])) {
update_post_meta($post_id, '_zp_vip_name_2', sanitize_text_field($_POST['zp_vip_name_2']));
}
if (isset($_POST['zp_is_auth_required'])) {
update_post_meta($post_id, '_zp_is_auth_required', 1);
} else {
update_post_meta($post_id, '_zp_is_auth_required', 0);
}
});
add_filter('the_content', function($content) {
if (!is_singular('post')) return $content;
global $post, $current_user;
wp_get_current_user();
$roles = get_post_meta($post->ID, '_zp_vip_roles', true);
$level_limit = intval(get_post_meta($post->ID, '_zp_vip_level', true));
$is_auth_required = get_post_meta($post->ID, '_zp_is_auth_required', true);
if (!is_array($roles)) $roles = [];
$user_vip = get_user_meta($current_user->ID, 'vip_level', true);
$user_level = intval(get_user_meta($current_user->ID, 'level', true));
$user_auth = intval(get_user_meta($current_user->ID, 'auth', true));
$has_access = false;
if ((in_array('member', $roles) && $user_vip >= 1) ||
(in_array('vip', $roles) && $user_vip >= 2) ||
($level_limit > 0 && $user_level >= $level_limit) ||
($is_auth_required && $user_auth === 1)) {
$has_access = true;
}
if ($has_access) {
return $content;
} else {
return zp_show_restriction_box($roles, $level_limit, $is_auth_required, $post);
}
});
function zp_show_restriction_box($roles, $level, $is_auth_required, $post) {
$vip_level_name_1 = get_post_meta($post->ID, '_zp_vip_name_1', true);
$vip_level_name_2 = get_post_meta($post->ID, '_zp_vip_name_2', true);
if (!$vip_level_name_1) $vip_level_name_1 = '初级会员';
if (!$vip_level_name_2) $vip_level_name_2 = '高级会员';
$requirements = [];
if (in_array('member', $roles)) $requirements[] = $vip_level_name_1;
if (in_array('vip', $roles)) $requirements[] = $vip_level_name_2;
if ($level > 0) $requirements[] = "等级 ≥ {$level}";
if ($is_auth_required) $requirements[] = "认证用户";
if (empty($requirements)) return '';
$require_str = implode('、', $requirements);
return <<<HTML
<div class="zp-access-denied" style="
background: linear-gradient(145deg, #fffcf8 0%, #fff8f0 100%);
border: 1px solid rgba(255, 165, 0, 0.15);
border-radius: 12px;
padding: 20px;
margin: 24px 0;
box-shadow: 0 6px 24px -4px rgba(255, 140, 0, 0.08);
display: flex;
align-items: center;
gap: 14px;
position: relative;
overflow: hidden;
">
<!-- 极简光效 -->
<div style="
position: absolute;
top: -20px;
right: -20px;
width: 60px;
height: 60px;
background: rgba(255, 165, 0, 0.05);
border-radius: 50%;
"></div>
<!-- 专业级图标 -->
<svg style="
flex-shrink: 0;
width: 24px;
height: 24px;
color: #ff8000;
filter: drop-shadow(0 2px 4px rgba(255, 140, 0, 0.2));
" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
<path stroke-linecap="round" stroke-linejoin="round" d="M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z"/>
</svg>
<div style="
font: 15px/1.5 -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
color: #333;
">
<div style="
font-weight: 500;
margin-bottom: 4px;
letter-spacing: -0.01em;
">
专属内容访问权限
</div>
<div style="
color: #666;
font-size: 14px;
">
需要满足以下条件:
<span style="
color: #ff6a00;
font-weight: 500;
margin-left: 6px;
word-break: break-word;
">{$require_str}</span>
</div>
</div>
</div>
HTML;
}
仅供学习和研究使用,请在下载后24小时内删除
© 版权声明
THE END















暂无评论内容