文章目录[隐藏]
针对小批量客户的WordPress会员定制插件详解
引言:为什么小批量客户需要定制化会员插件
在当今数字化时代,即使是小批量客户也需要专业的会员管理系统来维护客户关系、提供专属内容和增强用户粘性。市面上的通用会员插件往往功能繁杂、价格昂贵,且包含大量小客户用不到的功能。针对这一痛点,开发一个轻量级、定制化的WordPress会员插件成为理想解决方案。
本文将详细介绍如何为小批量客户开发一个定制化WordPress会员插件,包含完整的代码实现和详细注释,帮助您快速构建适合特定需求的会员系统。
插件基础架构设计
1.1 插件文件结构
首先,我们创建插件的基本文件结构:
wp-content/plugins/custom-membership/
├── custom-membership.php # 主插件文件
├── includes/
│ ├── class-membership-core.php
│ ├── class-member-management.php
│ └── class-content-restriction.php
├── admin/
│ ├── css/
│ ├── js/
│ └── class-admin-panel.php
├── public/
│ ├── css/
│ └── js/
└── templates/ # 前端模板文件
1.2 主插件文件初始化
<?php
/**
* 插件名称: Custom Membership for Small Businesses
* 插件URI: https://example.com/custom-membership
* 描述: 针对小批量客户的轻量级会员管理系统
* 版本: 1.0.0
* 作者: Your Name
* 作者URI: https://example.com
* 许可证: GPL v2 or later
* 文本域: custom-membership
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 定义插件常量
define('CUSTOM_MEMBERSHIP_VERSION', '1.0.0');
define('CUSTOM_MEMBERSHIP_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('CUSTOM_MEMBERSHIP_PLUGIN_URL', plugin_dir_url(__FILE__));
// 初始化插件
function custom_membership_init() {
// 检查必要组件
if (!class_exists('WP_User')) {
wp_die('WordPress用户类不存在,插件无法运行。');
}
// 加载核心类
require_once CUSTOM_MEMBERSHIP_PLUGIN_DIR . 'includes/class-membership-core.php';
require_once CUSTOM_MEMBERSHIP_PLUGIN_DIR . 'includes/class-member-management.php';
require_once CUSTOM_MEMBERSHIP_PLUGIN_DIR . 'includes/class-content-restriction.php';
// 初始化核心类
$membership_core = new Membership_Core();
$membership_core->init();
// 如果是后台,加载管理类
if (is_admin()) {
require_once CUSTOM_MEMBERSHIP_PLUGIN_DIR . 'admin/class-admin-panel.php';
$admin_panel = new Membership_Admin_Panel();
$admin_panel->init();
}
}
add_action('plugins_loaded', 'custom_membership_init');
// 激活插件时的操作
function custom_membership_activate() {
// 创建必要的数据库表
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
$table_name = $wpdb->prefix . 'custom_membership_data';
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
user_id bigint(20) NOT NULL,
membership_level varchar(50) NOT NULL,
start_date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
end_date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
status varchar(20) DEFAULT 'active' NOT NULL,
PRIMARY KEY (id),
KEY user_id (user_id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
// 添加默认选项
add_option('custom_membership_default_level', 'basic');
add_option('custom_membership_trial_days', 7);
}
register_activation_hook(__FILE__, 'custom_membership_activate');
// 停用插件时的清理操作
function custom_membership_deactivate() {
// 清理临时数据,但保留会员数据
flush_rewrite_rules();
}
register_deactivation_hook(__FILE__, 'custom_membership_deactivate');
?>
会员核心功能实现
2.1 会员等级管理
<?php
/**
* 会员核心功能类
* 处理会员等级、权限和状态管理
*/
class Membership_Core {
private $membership_levels;
public function __construct() {
// 定义会员等级
$this->membership_levels = array(
'basic' => array(
'name' => '基础会员',
'price' => 0,
'features' => array('访问基础内容', '每月1次下载')
),
'premium' => array(
'name' => '高级会员',
'price' => 9.99,
'features' => array('访问全部内容', '无限下载', '专属支持')
),
'vip' => array(
'name' => 'VIP会员',
'price' => 24.99,
'features' => array('所有高级功能', '一对一支持', '提前访问新内容')
)
);
}
/**
* 初始化核心功能
*/
public function init() {
// 添加用户角色
$this->add_member_roles();
// 注册短代码
add_shortcode('membership_info', array($this, 'display_membership_info'));
// 添加动作钩子
add_action('user_register', array($this, 'assign_default_membership'));
}
/**
* 添加会员用户角色
*/
private function add_member_roles() {
// 添加会员角色
add_role('basic_member', '基础会员', array(
'read' => true,
'edit_posts' => false,
'delete_posts' => false
));
add_role('premium_member', '高级会员', array(
'read' => true,
'edit_posts' => true,
'delete_posts' => false,
'upload_files' => true
));
add_role('vip_member', 'VIP会员', array(
'read' => true,
'edit_posts' => true,
'delete_posts' => true,
'upload_files' => true,
'publish_posts' => true
));
}
/**
* 为用户分配默认会员等级
* @param int $user_id 用户ID
*/
public function assign_default_membership($user_id) {
$default_level = get_option('custom_membership_default_level', 'basic');
$this->set_user_membership($user_id, $default_level);
}
/**
* 设置用户会员等级
* @param int $user_id 用户ID
* @param string $level 会员等级
* @param int $duration 持续时间(天)
*/
public function set_user_membership($user_id, $level, $duration = 30) {
global $wpdb;
// 检查用户是否存在
if (!get_userdata($user_id)) {
return false;
}
// 检查会员等级是否有效
if (!array_key_exists($level, $this->membership_levels)) {
return false;
}
$table_name = $wpdb->prefix . 'custom_membership_data';
$start_date = current_time('mysql');
$end_date = date('Y-m-d H:i:s', strtotime("+$duration days"));
// 检查是否已有会员记录
$existing = $wpdb->get_var($wpdb->prepare(
"SELECT id FROM $table_name WHERE user_id = %d",
$user_id
));
if ($existing) {
// 更新现有记录
$wpdb->update(
$table_name,
array(
'membership_level' => $level,
'start_date' => $start_date,
'end_date' => $end_date,
'status' => 'active'
),
array('user_id' => $user_id)
);
} else {
// 插入新记录
$wpdb->insert(
$table_name,
array(
'user_id' => $user_id,
'membership_level' => $level,
'start_date' => $start_date,
'end_date' => $end_date,
'status' => 'active'
)
);
}
// 更新用户角色
$this->update_user_role($user_id, $level);
return true;
}
/**
* 更新用户角色
* @param int $user_id 用户ID
* @param string $level 会员等级
*/
private function update_user_role($user_id, $level) {
$user = get_userdata($user_id);
// 移除所有会员角色
$user->remove_role('basic_member');
$user->remove_role('premium_member');
$user->remove_role('vip_member');
// 添加新角色
switch ($level) {
case 'basic':
$user->add_role('basic_member');
break;
case 'premium':
$user->add_role('premium_member');
break;
case 'vip':
$user->add_role('vip_member');
break;
}
}
/**
* 显示会员信息的短代码
* @param array $atts 短代码属性
* @return string HTML内容
*/
public function display_membership_info($atts) {
// 获取当前用户
$current_user = wp_get_current_user();
if (!$current_user->ID) {
return '<p>请登录查看会员信息。</p>';
}
// 获取用户会员信息
$membership_data = $this->get_user_membership($current_user->ID);
if (!$membership_data) {
return '<p>您目前不是会员。</p>';
}
$level = $membership_data->membership_level;
$end_date = date('Y-m-d', strtotime($membership_data->end_date));
// 构建输出
$output = '<div class="membership-info">';
$output .= '<h3>您的会员信息</h3>';
$output .= '<p><strong>会员等级:</strong> ' . esc_html($this->membership_levels[$level]['name']) . '</p>';
$output .= '<p><strong>有效期至:</strong> ' . esc_html($end_date) . '</p>';
$output .= '<p><strong>会员特权:</strong></p><ul>';
foreach ($this->membership_levels[$level]['features'] as $feature) {
$output .= '<li>' . esc_html($feature) . '</li>';
}
$output .= '</ul></div>';
return $output;
}
/**
* 获取用户会员信息
* @param int $user_id 用户ID
* @return object|null 会员数据或null
*/
public function get_user_membership($user_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'custom_membership_data';
return $wpdb->get_row($wpdb->prepare(
"SELECT * FROM $table_name WHERE user_id = %d AND status = 'active'",
$user_id
));
}
}
?>
内容访问控制
3.1 内容限制类实现
<?php
/**
* 内容限制类
* 控制不同会员等级对内容的访问权限
*/
class Content_Restriction {
public function __construct() {
// 初始化内容限制
$this->init();
}
/**
* 初始化内容限制功能
*/
public function init() {
// 添加内容过滤钩子
add_filter('the_content', array($this, 'restrict_content'));
// 添加短代码
add_shortcode('members_only', array($this, 'members_only_shortcode'));
// 添加分类限制
add_action('pre_get_posts', array($this, 'restrict_category_access'));
}
/**
* 限制内容访问
* @param string $content 原始内容
* @return string 过滤后的内容
*/
public function restrict_content($content) {
global $post;
// 如果不是文章或页面,直接返回
if (!is_singular()) {
return $content;
}
// 获取文章设置的会员等级要求
$required_level = get_post_meta($post->ID, '_membership_required', true);
// 如果没有设置限制,直接返回
if (!$required_level || $required_level === 'none') {
return $content;
}
// 检查当前用户权限
if ($this->user_has_access($required_level)) {
return $content;
}
// 用户没有权限,显示限制信息
return $this->get_restricted_message($required_level);
}
/**
* 检查用户是否有访问权限
* @param string $required_level 需要的会员等级
* @return bool 是否有权限
*/
private function user_has_access($required_level) {
// 获取当前用户
$current_user = wp_get_current_user();
// 管理员有所有权限
if (current_user_can('manage_options')) {
return true;
}
// 未登录用户
if (!$current_user->ID) {
return false;
}
// 获取用户会员等级
$membership_core = new Membership_Core();
$user_membership = $membership_core->get_user_membership($current_user->ID);
if (!$user_membership) {
return false;
}
// 定义等级权重(数值越大,等级越高)
$level_weights = array(
'basic' => 1,
'premium' => 2,
'vip' => 3
);
// 检查用户等级是否满足要求
$user_weight = isset($level_weights[$user_membership->membership_level])
? $level_weights[$user_membership->membership_level]
: 0;
$required_weight = isset($level_weights[$required_level])
? $level_weights[$required_level]
: 0;
return $user_weight >= $required_weight;
}
/**
* 获取限制访问的提示信息
* @param string $required_level 需要的会员等级
* @return string 提示信息HTML
*/
private function get_restricted_message($required_level) {
$membership_levels = array(
'basic' => '基础会员',
'premium' => '高级会员',
'vip' => 'VIP会员'
);
$level_name = isset($membership_levels[$required_level])
? $membership_levels[$required_level]
: '特定会员';
$message = '<div class="membership-restricted">';
$message .= '<h3>内容受限</h3>';
$message .= '<p>此内容仅对' . esc_html($level_name) . '开放。</p>';
if (is_user_logged_in()) {
$message .= '<p>您当前的会员等级无法访问此内容。</p>';
$message .= '<p><a href="' . esc_url(wp_logout_url(get_permalink())) . '">切换账户</a> 或 ';
$message .= '<a href="' . esc_url(home_url('/membership-plans')) . '">升级会员</a></p>';
} else {
$message .= '<p>请<a href="' . esc_url(wp_login_url(get_permalink())) . '">登录</a>或';
$message .= '<a href="' . esc_url(wp_registration_url()) . '">注册</a>后查看。</p>';
}
$message .= '</div>';
return $message;
}
/**
* 仅会员可见的短代码
* @param array $atts 短代码属性
* @param string $content 短代码内容
* @return string 处理后的内容
*/
public function members_only_shortcode($atts, $content = null) {
// 解析属性
$atts = shortcode_atts(array(
'level' => 'basic'
), $atts, 'members_only');
// 检查用户权限
if ($this->user_has_access($atts['level'])) {
return do_shortcode($content);
}
return '';
}
/**
* 限制分类目录访问
* @param WP_Query $query WordPress查询对象
*/
public function restrict_category_access($query) {
// 只在主查询和前端执行
if (is_admin() || !$query->is_main_query()) {
return;
}
// 检查是否是分类查询
if (!$query->is_category()) {
return;
}
// 获取当前分类
$current_category = get_queried_object();
if (!$current_category) {
return;
}
// 获取分类的会员限制设置
$category_restriction = get_term_meta($current_category->term_id, '_membership_required', true);
// 如果没有限制,直接返回
if (!$category_restriction || $category_restriction === 'none') {
return;
}
// 检查用户权限
this->user_has_access($category_restriction)) {
// 用户没有权限,重定向或显示错误
if (is_user_logged_in()) {
wp_die('您没有权限访问此分类目录。请升级您的会员等级。', '访问受限', 403);
} else {
wp_redirect(wp_login_url(get_category_link($current_category->term_id)));
exit;
}
}
}
}
?>
## 后台管理界面
### 4.1 管理面板类
<?php
/**
- 会员插件管理面板
- 提供后台管理功能
*/
class Membership_Admin_Panel {
public function __construct() {
// 构造函数
}
/**
* 初始化管理功能
*/
public function init() {
// 添加管理菜单
add_action('admin_menu', array($this, 'add_admin_menu'));
// 添加文章/页面元框
add_action('add_meta_boxes', array($this, 'add_membership_meta_box'));
add_action('save_post', array($this, 'save_membership_meta'));
// 添加分类字段
add_action('category_add_form_fields', array($this, 'add_category_membership_field'));
add_action('category_edit_form_fields', array($this, 'edit_category_membership_field'));
add_action('edited_category', array($this, 'save_category_membership_field'));
add_action('create_category', array($this, 'save_category_membership_field'));
// 添加用户列表列
add_filter('manage_users_columns', array($this, 'add_membership_user_column'));
add_filter('manage_users_custom_column', array($this, 'display_membership_user_column'), 10, 3);
// 加载管理样式和脚本
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_assets'));
}
/**
* 添加管理菜单
*/
public function add_admin_menu() {
// 主菜单
add_menu_page(
'会员管理',
'会员管理',
'manage_options',
'custom-membership',
array($this, 'display_membership_dashboard'),
'dashicons-groups',
30
);
// 子菜单
add_submenu_page(
'custom-membership',
'会员列表',
'会员列表',
'manage_options',
'membership-list',
array($this, 'display_membership_list')
);
add_submenu_page(
'custom-membership',
'会员设置',
'设置',
'manage_options',
'membership-settings',
array($this, 'display_membership_settings')
);
add_submenu_page(
'custom-membership',
'会员统计',
'统计',
'manage_options',
'membership-stats',
array($this, 'display_membership_stats')
);
}
/**
* 显示会员仪表板
*/
public function display_membership_dashboard() {
?>
<div class="wrap">
<h1><?php echo esc_html(get_admin_page_title()); ?></h1>
<div class="membership-dashboard">
<div class="dashboard-stats">
<?php
global $wpdb;
$table_name = $wpdb->prefix . 'custom_membership_data';
// 获取统计数据
$total_members = $wpdb->get_var("SELECT COUNT(DISTINCT user_id) FROM $table_name WHERE status = 'active'");
$basic_members = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(DISTINCT user_id) FROM $table_name WHERE membership_level = %s AND status = 'active'",
'basic'
));
$premium_members = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(DISTINCT user_id) FROM $table_name WHERE membership_level = %s AND status = 'active'",
'premium'
));
$vip_members = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(DISTINCT user_id) FROM $table_name WHERE membership_level = %s AND status = 'active'",
'vip'
));
?>
<div class="stat-card">
<h3>总会员数</h3>
<p class="stat-number"><?php echo esc_html($total_members); ?></p>
</div>
<div class="stat-card">
<h3>基础会员</h3>
<p class="stat-number"><?php echo esc_html($basic_members); ?></p>
</div>
<div class="stat-card">
<h3>高级会员</h3>
<p class="stat-number"><?php echo esc_html($premium_members); ?></p>
</div>
<div class="stat-card">
<h3>VIP会员</h3>
<p class="stat-number"><?php echo esc_html($vip_members); ?></p>
</div>
</div>
<div class="dashboard-actions">
<h2>快速操作</h2>
<div class="action-buttons">
<a href="<?php echo admin_url('admin.php?page=membership-list'); ?>" class="button button-primary">
管理会员
</a>
<a href="<?php echo admin_url('admin.php?page=membership-settings'); ?>" class="button">
插件设置
</a>
<a href="<?php echo admin_url('users.php'); ?>" class="button">
查看所有用户
</a>
</div>
</div>
<div class="recent-activity">
<h2>最近活动</h2>
<?php
$recent_memberships = $wpdb->get_results(
"SELECT m.*, u.user_login, u.user_email
FROM $table_name m
LEFT JOIN {$wpdb->users} u ON m.user_id = u.ID
WHERE m.status = 'active'
ORDER BY m.start_date DESC
LIMIT 10"
);
if ($recent_memberships) {
echo '<table class="wp-list-table widefat fixed striped">';
echo '<thead><tr>
<th>用户名</th>
<th>邮箱</th>
<th>会员等级</th>
<th>开始日期</th>
<th>到期日期</th>
</tr></thead>';
echo '<tbody>';
foreach ($recent_memberships as $membership) {
$level_names = array(
'basic' => '基础会员',
'premium' => '高级会员',
'vip' => 'VIP会员'
);
$level_name = isset($level_names[$membership->membership_level])
? $level_names[$membership->membership_level]
: $membership->membership_level;
echo '<tr>';
echo '<td>' . esc_html($membership->user_login) . '</td>';
echo '<td>' . esc_html($membership->user_email) . '</td>';
echo '<td>' . esc_html($level_name) . '</td>';
echo '<td>' . esc_html(date('Y-m-d', strtotime($membership->start_date))) . '</td>';
echo '<td>' . esc_html(date('Y-m-d', strtotime($membership->end_date))) . '</td>';
echo '</tr>';
}
echo '</tbody></table>';
} else {
echo '<p>暂无会员数据。</p>';
}
?>
</div>
</div>
</div>
<style>
.membership-dashboard {
margin-top: 20px;
}
.dashboard-stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 20px;
margin-bottom: 30px;
}
.stat-card {
background: #fff;
border: 1px solid #ccd0d4;
border-radius: 4px;
padding: 20px;
text-align: center;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.stat-card h3 {
margin-top: 0;
color: #666;
}
.stat-number {
font-size: 2em;
font-weight: bold;
color: #2271b1;
margin: 10px 0;
}
.dashboard-actions {
background: #fff;
padding: 20px;
margin-bottom: 30px;
border: 1px solid #ccd0d4;
border-radius: 4px;
}
.action-buttons {
display: flex;
gap: 10px;
margin-top: 15px;
}
.recent-activity {
background: #fff;
padding: 20px;
border: 1px solid #ccd0d4;
border-radius: 4px;
}
</style>
<?php
}
/**
* 添加会员权限元框
*/
public function add_membership_meta_box() {
// 为文章和页面添加元框
$post_types = array('post', 'page');
foreach ($post_types as $post_type) {
add_meta_box(
'membership_restriction',
'会员访问限制',
array($this, 'render_membership_meta_box'),
$post_type,
'side',
'high'
);
}
}
/**
* 渲染会员权限元框
*/
public function render_membership_meta_box($post) {
// 添加安全字段
wp_nonce_field('membership_meta_box', 'membership_meta_box_nonce');
// 获取当前设置
$current_value = get_post_meta($post->ID, '_membership_required', true);
if (!$current_value) {
$current_value = 'none';
}
// 会员等级选项
$levels = array(
'none' => '无限制',
'basic' => '基础会员',
'premium' => '高级会员',
'vip' => 'VIP会员'
);
echo '<p>设置访问此内容所需的最低会员等级:</p>';
echo '<select name="membership_required" id="membership_required" style="width:100%;">';
foreach ($levels as $value => $label) {
printf(
'<option value="%s" %s>%s</option>',
esc_attr($value),
selected($current_value, $value, false),
esc_html($label)
);
}
echo '</select>';
echo '<p class="description">选择"无限制"则所有用户均可访问。</p>';
}
/**
* 保存会员权限元数据
*/
public function save_membership_meta($post_id) {
// 检查安全字段
if (!isset($_POST['membership_meta_box_nonce']) ||
!wp_verify_nonce($_POST['membership_meta_box_nonce'], 'membership_meta_box')) {
return;
}
// 检查自动保存
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// 检查用户权限
if (!current_user_can('edit_post', $post_id)) {
return;
}
// 保存数据
if (isset($_POST['membership_required'])) {
update_post_meta($post_id, '_membership_required', sanitize_text_field($_POST['membership_required']));
}
}
/**
* 加载管理资源
*/
public function enqueue_admin_assets($hook) {
// 只在插件页面加载
if (strpos($hook, 'custom-membership') === false) {
return;
}
wp_enqueue_style(
'custom-membership-admin',
CUSTOM_MEMBERSHIP_PLUGIN_URL . 'admin/css/admin-style.css',
array(),
CUSTOM_MEMBERSHIP_VERSION
);
wp_enqueue_script(
'custom-membership-admin',
CUSTOM_MEMBERSHIP_PLUGIN_URL . 'admin/js/admin-script.js',
array('jquery'),
CUSTOM_MEMBERSHIP_VERSION,
true
);
}
}
?>
## 前端用户界面优化
### 5.1 会员中心页面模板
<?php
/**
- 会员中心页面模板
- 提供用户友好的会员管理界面
*/
class Membership_Frontend {
public function __construct() {
$this->init();
}
/**
* 初始化前端功能
*/
public function init() {
// 注册短代码
add_shortcode('membership_center', array($this, 'membership_center_shortcode'));
add_shortcode('membership_plans', array($this, 'membership_plans_shortcode'));
// 添加前端样式
add_action('wp_enqueue_scripts', array($this, 'enqueue_frontend_assets'));
// 创建会员页面
add_action('init', array($this, 'create_membership_pages'));
}
/**
* 会员中心短代码
*/
public function membership_center_shortcode($atts) {
// 检查用户是否登录
if (!is_user_logged_in()) {
return $this->login_required_message();
}
$current_user = wp_get_current_user();
$membership_core = new Membership_Core();
$membership_data = $membership_core->get_user_membership($current_user->ID);
ob_start();
?>
<div class="membership-center">
<div class="membership-header">
<h2>会员中心</h2>
<p>欢迎回来,<?php echo esc_html($current_user->display_name); ?>!</p>
</div>
<div class="membership-content">
<div class="membership-info-card">
<h3>会员信息</h3>
<?php if ($membership_data): ?>
<?php
$level_names = array(
'basic' => '基础会员',
'premium' => '高级会员',
'vip' => 'VIP会员'
);
$level_name = isset($level_names[$membership_data->membership_level])
? $level_names[$membership_data->membership_level]
: $membership_data->membership_level;
?>
<div class="info-item">
<span class="label">会员等级:</span>
<span class="value"><?php echo esc_html($level_name); ?></span>
</div>
<div class="info-item">
<span class="label">有效期至:</span>
<span class="value"><?php echo esc_html(date('Y年m月d日', strtotime($membership_data->end_date))); ?></span>
</div>
<div class="info-item">
<span class="label">会员状态:</span>
<span class="value status-active"><?php echo esc_html($membership_data->status === 'active' ? '有效' : '已过期'); ?></span>
</div>
<?php else: ?>
<p>您目前不是会员。</p>
<a href="#membership-plans" class="button button-primary">立即加入</a>
<?php endif; ?>
</div>
<div class="membership-actions">
<h3>快速操作</h3>
<div class="action-grid">
<a href="<?php echo esc_url(wp_logout_url(home_url())); ?>" class="action-item">
<span class="dashicons dashicons-migrate"></span>
<span>退出登录</span>
</a>
<a href="<?php echo esc_url(get_edit_profile_url()); ?>" class="action-item">
<span class="dashicons dashicons-admin-users"></span>
<span>编辑资料</span>
</a>
<a href="<?php echo esc_url(home_url('/membership-plans')); ?>" class="action-item">
<span class="dashicons dashicons-awards"></span>
<span>升级会员</span>
</a>
<a href="<?php echo esc_url(home_url('/contact')); ?>" class="action-item">
<span class="dashicons dashicons-email"></span>
<span>联系支持</span>
</a>
</div>
</div>
<div class="membership-content-list">
<h3>专属内容</h3>
<?php
// 获取仅限会员的内容
$args = array(
'post_type' => 'post',
'posts_per_page' => 5,
'meta_query' => array(
array(
'key' => '_membership_required',
'value' => 'none',
'compare' => '!='
)
)
);
$members_only_posts = new WP_Query($args);
if ($members_only_posts->have_posts()):
?>
<ul class="exclusive-content">
<?php while ($members_only_posts->have_posts()): $members_only_posts->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<span class="post-date"><?php echo get_the_date(); ?></span>
</li>
<?php endwhile; ?>
</ul>
<?php
wp_reset_postdata();
else:
echo '<p>暂无专属内容。</p>';
endif;
?>
</div>
</div>
</div>
<?php
return ob_get_clean();
}
/**
* 会员计划短代码
*/
