一套功能强大、完全开源的wordpress会员系统插件代码

创建一个完整的 WordPress 会员系统插件是一个复杂的任务,涉及多个文件和功能。以下是一个简单的会员系统插件的基本结构和代码示例。这个插件将允许用户注册、登录、管理个人资料,并根据用户角色限制内容。

1. 创建插件文件夹和主文件
首先,在 wp-content/plugins/ 目录下创建一个新的文件夹,例如 membership-system。然后在该文件夹中创建一个主 PHP 文件,例如 membership-system.php。

<?php
/*
Plugin Name: Membership System
Description: A simple membership system for WordPress.
Version: 1.0
Author: Your Name
*/

// 防止直接访问
if (!defined('ABSPATH')) {
    exit;
}

// 包含其他文件
require_once plugin_dir_path(__FILE__) . 'includes/register.php';
require_once plugin_dir_path(__FILE__) . 'includes/login.php';
require_once plugin_dir_path(__FILE__ . 'includes/profile.php');
require_once plugin_dir_path(__FILE__) . 'includes/shortcodes.php';
require_once plugin_dir_path(__FILE__) . 'includes/restrict-content.php';

// 激活插件时创建必要的数据库表
register_activation_hook(__FILE__, 'membership_system_activate');

function membership_system_activate() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'membership_info';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        user_id mediumint(9) NOT NULL,
        membership_level varchar(255) 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,
        PRIMARY KEY (id)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}

2. 创建注册功能
在 includes/register.php 文件中添加用户注册功能。

<?php
function membership_system_register_form() {
    ?>
    <form method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
        <p>
            <label for="username">Username</label>
            <input type="text" name="username" required>
        </p>
        <p>
            <label for="email">Email</label>
            <input type="email" name="email" required>
        </p>
        <p>
            <label for="password">Password</label>
            <input type="password" name="password" required>
        </p>
        <p>
            <input type="submit" name="submit" value="Register">
        </p>
    </form>
    <?php
}

function membership_system_register_user() {
    if (isset($_POST['submit'])) {
        $username = sanitize_user($_POST['username']);
        $email = sanitize_email($_POST['email']);
        $password = esc_attr($_POST['password']);

        $user_id = wp_create_user($username, $password, $email);

        if (!is_wp_error($user_id)) {
            echo "Registration successful!";
        } else {
            echo $user_id->get_error_message();
        }
    }
}

add_shortcode('register_form', 'membership_system_register_shortcode');

function membership_system_register_shortcode() {
    ob_start();
    membership_system_register_form();
    membership_system_register_user();
    return ob_get_clean();
}

3. 创建登录功能
在 includes/login.php 文件中添加用户登录功能。

<?php
function membership_system_login_form() {
    ?>
    <form method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
        <p>
            <label for="username">Username</label>
            <input type="text" name="username" required>
        </p>
        <p>
            <label for="password">Password</label>
            <input type="password" name="password" required>
        </p>
        <p>
            <input type="submit" name="login" value="Login">
        </p>
    </form>
    <?php
}

function membership_system_login_user() {
    if (isset($_POST['login'])) {
        $username = sanitize_user($_POST['username']);
        $password = esc_attr($_POST['password']);

        $creds = array(
            'user_login'    => $username,
            'user_password' => $password,
            'remember'      => true
        );

        $user = wp_signon($creds, false);

        if (!is_wp_error($user)) {
            wp_redirect(home_url());
            exit;
        } else {
            echo $user->get_error_message();
        }
    }
}

add_shortcode('login_form', 'membership_system_login_shortcode');

function membership_system_login_shortcode() {
    ob_start();
    membership_system_login_form();
    membership_system_login_user();
    return ob_get_clean();
}

4. 创建用户个人资料管理功能
在 includes/profile.php 文件中添加用户个人资料管理功能。

<?php
function membership_system_profile_form() {
    if (!is_user_logged_in()) {
        return 'You must be logged in to edit your profile.';
    }

    $user = wp_get_current_user();
    ?>
    <form method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
        <p>
            <label for="email">Email</label>
            <input type="email" name="email" value="<?php echo esc_attr($user->user_email); ?>" required>
        </p>
        <p>
            <label for="password">New Password</label>
            <input type="password" name="password">
        </p>
        <p>
            <input type="submit" name="update_profile" value="Update Profile">
        </p>
    </form>
    <?php
}

function membership_system_update_profile() {
    if (isset($_POST['update_profile'])) {
        $user = wp_get_current_user();
        $email = sanitize_email($_POST['email']);
        $password = esc_attr($_POST['password']);

        $userdata = array(
            'ID' => $user->ID,
            'user_email' => $email
        );

        if (!empty($password)) {
            $userdata['user_pass'] = $password;
        }

        $user_id = wp_update_user($userdata);

        if (!is_wp_error($user_id)) {
            echo "Profile updated successfully!";
        } else {
            echo $user_id->get_error_message();
        }
    }
}

add_shortcode('profile_form', 'membership_system_profile_shortcode');

function membership_system_profile_shortcode() {
    ob_start();
    membership_system_profile_form();
    membership_system_update_profile();
    return ob_get_clean();
}

5. 创建内容限制功能
在 includes/restrict-content.php 文件中添加内容限制功能。

<?php
function membership_system_restrict_content($content) {
    if (is_single() && !is_user_logged_in()) {
        return 'You must be logged in to view this content.';
    }
    return $content;
}

add_filter('the_content', 'membership_system_restrict_content');

6. 创建短码功能
在 includes/shortcodes.php 文件中添加短码功能。

<?php
function membership_system_shortcodes_init() {
    add_shortcode('register_form', 'membership_system_register_shortcode');
    add_shortcode('login_form', 'membership_system_login_shortcode');
    add_shortcode('profile_form', 'membership_system_profile_shortcode');
}

add_action('init', 'membership_system_shortcodes_init');

7. 插件激活和卸载
在 membership-system.php 文件中添加插件激活和卸载时的操作。

// 卸载插件时删除数据库表
register_uninstall_hook(__FILE__, 'membership_system_uninstall');

function membership_system_uninstall() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'membership_info';
    $wpdb->query("DROP TABLE IF EXISTS $table_name");
}

8. 插件样式和脚本
如果需要,可以在插件文件夹中创建一个 css 文件夹,并在其中添加样式文件 style.css。然后在主文件中注册和加载样式。

function membership_system_enqueue_styles() {
    wp_enqueue_style('membership-system-style', plugin_dir_url(__FILE__) . 'css/style.css');
}

add_action('wp_enqueue_scripts', 'membership_system_enqueue_styles');

9. 插件国际化
如果需要支持多语言,可以在插件文件夹中创建一个 languages 文件夹,并在主文件中加载文本域。

function membership_system_load_textdomain() {
    load_plugin_textdomain('membership-system', false, dirname(plugin_basename(__FILE__)) . '/languages/');
}

add_action('plugins_loaded', 'membership_system_load_textdomain');

10. 插件安全性
确保所有用户输入都经过适当的清理和验证,以防止安全漏洞。

总结
以上代码是一个简单的 WordPress 会员系统插件的基本框架。你可以根据需要扩展和修改这个插件,例如添加更多的用户角色、会员等级、支付集成等功能。这个插件只是一个起点,实际应用中可能需要更多的功能和更复杂的逻辑。

请给以上代码添加用户投稿功能
为了在现有的 WordPress 会员系统插件中添加用户投稿功能,我们需要扩展插件的功能,允许已登录的用户提交文章。以下是实现用户投稿功能的详细步骤和代码。

1. 创建用户投稿表单
在 includes/ 文件夹中创建一个新文件 submit-post.php,用于处理用户投稿表单和逻辑。

<?php
function membership_system_submit_post_form() {
    if (!is_user_logged_in()) {
        return 'You must be logged in to submit a post.';
    }

    if (isset($_POST['submit_post'])) {
        $title = sanitize_text_field($_POST['post_title']);
        $content = wp_kses_post($_POST['post_content']);
        $author_id = get_current_user_id();

        // 创建新文章
        $new_post = array(
            'post_title'    => $title,
            'post_content'  => $content,
            'post_status'   => 'pending', // 设置为待审核状态
            'post_author'   => $author_id,
            'post_type'     => 'post'
        );

        $post_id = wp_insert_post($new_post);

        if ($post_id) {
            echo '<p>Your post has been submitted and is pending review.</p>';
        } else {
            echo '<p>There was an error submitting your post. Please try again.</p>';
        }
    }

    // 显示投稿表单
    ?>
    <form method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
        <p>
            <label for="post_title">Post Title</label>
            <input type="text" name="post_title" required>
        </p>
        <p>
            <label for="post_content">Post Content</label>
            <textarea name="post_content" rows="10" required></textarea>
        </p>
        <p>
            <input type="submit" name="submit_post" value="Submit Post">
        </p>
    </form>
    <?php
}

add_shortcode('submit_post_form', 'membership_system_submit_post_shortcode');

function membership_system_submit_post_shortcode() {
    ob_start();
    membership_system_submit_post_form();
    return ob_get_clean();
}

2. 在主文件中加载投稿功能
在 membership-system.php 主文件中,加载新的投稿功能文件。

// 包含投稿功能文件
require_once plugin_dir_path(__FILE__) . 'includes/submit-post.php';

3. 添加短码支持
在 includes/shortcodes.php 文件中,添加投稿表单的短码支持。

function membership_system_shortcodes_init() {
    add_shortcode('register_form', 'membership_system_register_shortcode');
    add_shortcode('login_form', 'membership_system_login_shortcode');
    add_shortcode('profile_form', 'membership_system_profile_shortcode');
    add_shortcode('submit_post_form', 'membership_system_submit_post_shortcode'); // 新增投稿短码
}

add_action('init', 'membership_system_shortcodes_init');

4. 允许用户管理自己的文章
为了让用户能够查看和管理自己提交的文章,可以在用户个人资料页面中添加一个“我的文章”部分。

在 includes/profile.php 文件中,添加以下代码:

function membership_system_my_posts() {
    if (!is_user_logged_in()) {
        return 'You must be logged in to view your posts.';
    }

    $user_id = get_current_user_id();
    $args = array(
        'author'         => $user_id,
        'post_type'      => 'post',
        'post_status'    => array('publish', 'pending', 'draft'),
        'posts_per_page' => -1
    );

    $posts = get_posts($args);

    if ($posts) {
        echo '<h3>My Posts</h3>';
        echo '<ul>';
        foreach ($posts as $post) {
            echo '<li>';
            echo '<a href="' . get_edit_post_link($post->ID) . '">' . esc_html($post->post_title) . '</a>';
            echo ' (' . esc_html($post->post_status) . ')';
            echo '</li>';
        }
        echo '</ul>';
    } else {
        echo '<p>You have not submitted any posts yet.</p>';
    }
}

// 将“我的文章”部分添加到个人资料页面
function membership_system_profile_form() {
    if (!is_user_logged_in()) {
        return 'You must be logged in to edit your profile.';
    }

    $user = wp_get_current_user();
    ?>
    <form method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
        <p>
            <label for="email">Email</label>
            <input type="email" name="email" value="<?php echo esc_attr($user->user_email); ?>" required>
        </p>
        <p>
            <label for="password">New Password</label>
            <input type="password" name="password">
        </p>
        <p>
            <input type="submit" name="update_profile" value="Update Profile">
        </p>
    </form>
    <?php

    // 显示“我的文章”部分
    membership_system_my_posts();
}

5. 添加投稿页面模板(可选)
如果你希望用户可以在特定页面上提交文章,可以创建一个自定义页面模板。

在主题文件夹中创建一个新文件,例如 page-submit-post.php,并添加以下代码:

<?php
/*
Template Name: Submit Post
*/

get_header();

echo do_shortcode('[submit_post_form]'); // 显示投稿表单

get_footer();

然后,在 WordPress 后台创建一个新页面,并选择“Submit Post”作为页面模板。

6. 安全性增强
确保所有用户输入都经过适当的清理和验证,以防止安全漏洞。例如:

使用 sanitize_text_field() 清理标题。

使用 wp_kses_post() 清理文章内容。

使用 current_user_can() 检查用户权限。

7. 测试功能
登录 WordPress 后台,确保插件已激活。

创建一个新页面,并使用 [submit_post_form] 短码显示投稿表单。

以普通用户身份登录,尝试提交文章。

检查文章是否以“待审核”状态保存,并确保用户可以查看和管理自己的文章。

总结
通过以上步骤,我们成功地在会员系统插件中添加了用户投稿功能。用户现在可以登录、提交文章、查看和管理自己的文章。你可以根据需要进一步扩展功能,例如:

添加文章分类和标签选择。

允许用户上传特色图片。

集成支付功能以支持付费投稿。

添加电子邮件通知功能,通知管理员有新文章待审核。

这个功能为用户提供了一个完整的投稿体验,同时确保了网站的安全性。

请给以上代码添加用户充值后才能阅读文章的功能
为了实现用户充值后才能阅读文章的功能,我们需要扩展会员系统插件,添加以下功能:

充值系统:允许用户充值并记录余额。

付费阅读:设置文章为付费内容,用户需要支付一定金额才能阅读。

余额检查:在用户访问付费内容时检查其余额,并扣除相应金额。

以下是实现这些功能的详细步骤和代码。

1. 创建充值功能
在 includes/ 文件夹中创建一个新文件 recharge.php,用于处理用户充值功能。

<?php
function membership_system_recharge_form() {
    if (!is_user_logged_in()) {
        return 'You must be logged in to recharge your balance.';
    }

    if (isset($_POST['recharge_amount'])) {
        $amount = floatval($_POST['recharge_amount']);
        $user_id = get_current_user_id();

        if ($amount > 0) {
            $current_balance = floatval(get_user_meta($user_id, 'user_balance', true));
            $new_balance = $current_balance + $amount;
            update_user_meta($user_id, 'user_balance', $new_balance);

            echo '<p>Recharge successful! Your new balance is: ' . esc_html($new_balance) . '</p>';
        } else {
            echo '<p>Invalid recharge amount.</p>';
        }
    }

    // 显示充值表单
    ?>
    <form method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
        <p>
            <label for="recharge_amount">Recharge Amount</label>
            <input type="number" name="recharge_amount" step="0.01" min="0" required>
        </p>
        <p>
            <input type="submit" name="submit_recharge" value="Recharge">
        </p>
    </form>
    <?php
}

add_shortcode('recharge_form', 'membership_system_recharge_shortcode');

function membership_system_recharge_shortcode() {
    ob_start();
    membership_system_recharge_form();
    return ob_get_clean();
}

2. 在主文件中加载充值功能
在 membership-system.php 主文件中,加载充值功能文件。

// 包含充值功能文件
require_once plugin_dir_path(__FILE__) . 'includes/recharge.php';

3. 添加付费阅读功能
在 includes/restrict-content.php 文件中,扩展内容限制功能以支持付费阅读。

<?php
function membership_system_restrict_content($content) {
    if (is_single() && !is_user_logged_in()) {
        return 'You must be logged in to view this content.';
    }

    // 检查是否为付费文章
    $post_id = get_the_ID();
    $is_paid_content = get_post_meta($post_id, 'is_paid_content', true);
    $price = floatval(get_post_meta($post_id, 'content_price', true));

    if ($is_paid_content && $price > 0) {
        $user_id = get_current_user_id();
        $user_balance = floatval(get_user_meta($user_id, 'user_balance', true));

        // 检查用户是否已支付
        $has_paid = get_post_meta($post_id, 'user_paid_' . $user_id, true);

        if (!$has_paid) {
            if ($user_balance >= $price) {
                // 扣除余额并标记为已支付
                $new_balance = $user_balance - $price;
                update_user_meta($user_id, 'user_balance', $new_balance);
                update_post_meta($post_id, 'user_paid_' . $user_id, true);

                return $content; // 显示文章内容
            } else {
                return 'You do not have enough balance to view this content. <a href="' . home_url('/recharge') . '">Recharge now</a>.';
            }
        }
    }

    return $content;
}

add_filter('the_content', 'membership_system_restrict_content');

4. 在文章编辑页面添加付费选项
在 includes/ 文件夹中创建一个新文件 meta-boxes.php,用于在文章编辑页面添加付费选项。

<?php
function membership_system_add_meta_boxes() {
    add_meta_box(
        'paid_content_meta_box',
        'Paid Content Settings',
        'membership_system_paid_content_meta_box_callback',
        'post',
        'side',
        'high'
    );
}

add_action('add_meta_boxes', 'membership_system_add_meta_boxes');

function membership_system_paid_content_meta_box_callback($post) {
    wp_nonce_field('membership_system_paid_content_nonce', 'paid_content_nonce');

    $is_paid_content = get_post_meta($post->ID, 'is_paid_content', true);
    $content_price = get_post_meta($post->ID, 'content_price', true);

    ?>
    <p>
        <label for="is_paid_content">
            <input type="checkbox" name="is_paid_content" id="is_paid_content" value="1" <?php checked($is_paid_content, '1'); ?>>
            Enable Paid Content
        </label>
    </p>
    <p>
        <label for="content_price">Price:</label>
        <input type="number" name="content_price" id="content_price" value="<?php echo esc_attr($content_price); ?>" step="0.01" min="0">
    </p>
    <?php
}

function membership_system_save_meta_box_data($post_id) {
    if (!isset($_POST['paid_content_nonce']) || !wp_verify_nonce($_POST['paid_content_nonce'], 'membership_system_paid_content_nonce')) {
        return;
    }

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }

    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    $is_paid_content = isset($_POST['is_paid_content']) ? '1' : '0';
    $content_price = floatval($_POST['content_price']);

    update_post_meta($post_id, 'is_paid_content', $is_paid_content);
    update_post_meta($post_id, 'content_price', $content_price);
}

add_action('save_post', 'membership_system_save_meta_box_data');

5. 在主文件中加载元框功能
在 membership-system.php 主文件中,加载元框功能文件。

// 包含元框功能文件
require_once plugin_dir_path(__FILE__) . 'includes/meta-boxes.php';

6. 测试功能
登录 WordPress 后台,确保插件已激活。

编辑一篇文章,启用付费内容并设置价格。

以普通用户身份登录,尝试访问付费文章。

检查用户余额是否被扣除,以及文章内容是否正确显示。

7. 扩展功能(可选)
支付网关集成:集成 PayPal、Stripe 等支付网关,允许用户在线充值。

会员等级:根据会员等级设置不同的内容价格。

优惠券系统:允许用户使用优惠券抵扣部分费用。

总结
通过以上步骤,我们成功地在会员系统插件中添加了用户充值后才能阅读文章的功能。用户现在可以充值余额、访问付费内容,并在余额不足时收到提示。这个功能为内容创作者提供了一种变现方式,同时提升了用户体验。

请给以上代码添加以下扩展功能:1、支付网关集成:集成 PayPal、Stripe 等支付网关,允许用户在线充值。

2、会员等级:根据会员等级设置不同的内容价格。

3、优惠券系统:允许用户使用优惠券抵扣部分费用。
为了实现支付网关集成、会员等级和优惠券系统,我们需要对现有的会员系统插件进行扩展。以下是详细的实现步骤和代码。

1. 支付网关集成(以 PayPal 为例)
1.1 创建支付网关功能
在 includes/ 文件夹中创建一个新文件 payment-gateways.php,用于处理支付网关集成。

<?php
function membership_system_paypal_recharge_form() {
    if (!is_user_logged_in()) {
        return 'You must be logged in to recharge your balance.';
    }

    if (isset($_POST['recharge_amount'])) {
        $amount = floatval($_POST['recharge_amount']);
        if ($amount > 0) {
            // PayPal 支付表单
            ?>
            <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
                <input type="hidden" name="cmd" value="_xclick">
                <input type="hidden" name="business" value="[email protected]"> <!-- 替换为你的 PayPal 邮箱 -->
                <input type="hidden" name="currency_code" value="USD">
                <input type="hidden" name="item_name" value="Account Recharge">
                <input type="hidden" name="amount" value="<?php echo esc_attr($amount); ?>">
                <input type="hidden" name="return" value="<?php echo home_url('/recharge-success'); ?>">
                <input type="hidden" name="cancel_return" value="<?php echo home_url('/recharge-cancel'); ?>">
                <input type="hidden" name="notify_url" value="<?php echo home_url('/ipn-listener'); ?>">
                <input type="submit" name="submit" value="Pay with PayPal">
            </form>
            <?php
        } else {
            echo '<p>Invalid recharge amount.</p>';
        }
    } else {
        // 显示充值表单
        ?>
        <form method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
            <p>
                <label for="recharge_amount">Recharge Amount</label>
                <input type="number" name="recharge_amount" step="0.01" min="0" required>
            </p>
            <p>
                <input type="submit" name="submit_recharge" value="Recharge">
            </p>
        </form>
        <?php
    }
}

add_shortcode('paypal_recharge_form', 'membership_system_paypal_recharge_shortcode');

function membership_system_paypal_recharge_shortcode() {
    ob_start();
    membership_system_paypal_recharge_form();
    return ob_get_clean();
}

// PayPal IPN 监听器(处理支付结果)
function membership_system_paypal_ipn_listener() {
    if (isset($_POST['payment_status']) && $_POST['payment_status'] == 'Completed') {
        $user_id = intval($_POST['custom']);
        $amount = floatval($_POST['mc_gross']);

        $current_balance = floatval(get_user_meta($user_id, 'user_balance', true));
        $new_balance = $current_balance + $amount;
        update_user_meta($user_id, 'user_balance', $new_balance);
    }
}

add_action('init', 'membership_system_paypal_ipn_listener');

1.2 在主文件中加载支付网关功能
在 membership-system.php 主文件中,加载支付网关功能文件。

// 包含支付网关功能文件
require_once plugin_dir_path(__FILE__) . 'includes/payment-gateways.php';

2. 会员等级功能
2.1 创建会员等级功能
在 includes/ 文件夹中创建一个新文件 membership-levels.php,用于处理会员等级。

<?php
function membership_system_add_membership_levels() {
    // 添加会员等级
    add_role('basic_member', 'Basic Member', array('read' => true));
    add_role('premium_member', 'Premium Member', array('read' => true));
}

register_activation_hook(__FILE__, 'membership_system_add_membership_levels');

function membership_system_set_content_price_by_level($price, $post_id) {
    $user = wp_get_current_user();
    if (in_array('premium_member', $user->roles)) {
        return $price * 0.8; // 高级会员享受 8 折优惠
    }
    return $price;
}

add_filter('membership_system_content_price', 'membership_system_set_content_price_by_level', 10, 2);

2.2 在主文件中加载会员等级功能
在 membership-system.php 主文件中,加载会员等级功能文件。

// 包含会员等级功能文件
require_once plugin_dir_path(__FILE__) . 'includes/membership-levels.php';

3. 优惠券系统
3.1 创建优惠券功能
在 includes/ 文件夹中创建一个新文件 coupons.php,用于处理优惠券功能。

<?php
function membership_system_apply_coupon($price, $post_id) {
    if (isset($_POST['coupon_code'])) {
        $coupon_code = sanitize_text_field($_POST['coupon_code']);
        $coupon = get_page_by_title($coupon_code, OBJECT, 'coupon');

        if ($coupon) {
            $discount = floatval(get_post_meta($coupon->ID, 'discount', true));
            return $price * (1 - $discount / 100);
        }
    }
    return $price;
}

add_filter('membership_system_content_price', 'membership_system_apply_coupon', 20, 2);

function membership_system_coupon_form() {
    ?>
    <form method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
        <p>
            <label for="coupon_code">Coupon Code</label>
            <input type="text" name="coupon_code">
        </p>
        <p>
            <input type="submit" name="apply_coupon" value="Apply Coupon">
        </p>
    </form>
    <?php
}

add_shortcode('coupon_form', 'membership_system_coupon_shortcode');

function membership_system_coupon_shortcode() {
    ob_start();
    membership_system_coupon_form();
    return ob_get_clean();
}

3.2 在主文件中加载优惠券功能
在 membership-system.php 主文件中,加载优惠券功能文件。

// 包含优惠券功能文件
require_once plugin_dir_path(__FILE__) . 'includes/coupons.php';

4. 更新付费阅读功能
在 includes/restrict-content.php 文件中,更新付费阅读功能以支持会员等级和优惠券。

<?php
function membership_system_restrict_content($content) {
    if (is_single() && !is_user_logged_in()) {
        return 'You must be logged in to view this content.';
    }

    // 检查是否为付费文章
    $post_id = get_the_ID();
    $is_paid_content = get_post_meta($post_id, 'is_paid_content', true);
    $price = floatval(get_post_meta($post_id, 'content_price', true));

    if ($is_paid_content && $price > 0) {
        // 应用会员等级折扣
        $price = apply_filters('membership_system_content_price', $price, $post_id);

        $user_id = get_current_user_id();
        $user_balance = floatval(get_user_meta($user_id, 'user_balance', true));

        // 检查用户是否已支付
        $has_paid = get_post_meta($post_id, 'user_paid_' . $user_id, true);

        if (!$has_paid) {
            if ($user_balance >= $price) {
                // 扣除余额并标记为已支付
                $new_balance = $user_balance - $price;
                update_user_meta($user_id, 'user_balance', $new_balance);
                update_post_meta($post_id, 'user_paid_' . $user_id, true);

                return $content; // 显示文章内容
            } else {
                return 'You do not have enough balance to view this content. <a href="' . home_url('/recharge') . '">Recharge now</a>.';
            }
        }
    }

    return $content;
}

add_filter('the_content', 'membership_system_restrict_content');

5. 测试功能
登录 WordPress 后台,确保插件已激活。

创建优惠券并设置折扣。

编辑一篇文章,启用付费内容并设置价格。

以普通用户身份登录,尝试访问付费文章并使用优惠券。

检查用户余额是否被扣除,以及文章内容是否正确显示。

总结
通过以上步骤,我们成功地在会员系统插件中添加了支付网关集成、会员等级和优惠券系统。用户现在可以使用 PayPal 充值、享受会员折扣、使用优惠券抵扣费用,并访问付费内容。这些功能为内容创作者提供了更多的变现方式,同时提升了用户体验。