首页 / 教程文章 / 针对小批量客户的WordPress会员定制插件详解

针对小批量客户的WordPress会员定制插件详解

针对小批量客户的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();
}

/**
 * 会员计划短代码
 */
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5754.html

EXCHANGES®作者

EXCHANGES® 技术支持:漳州柔性供应链服务有限公司
上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

工作时间:周一至周五,9:00-17:30,节假日休息
返回顶部