文章限制访问

文章限制访问-李小白
文章限制访问
此内容为免费阅读,请登录后查看
0
限时特惠
8.8
技术支持
自动发货
网络收集
售后服务
【极速响应】15分钟紧急响应机制,7x24小时工程师待命
免费阅读

方法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
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容