You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求实现用户订阅指定Program并在下载页展示的技术方案

解决WordPress Program订阅系统的实现方案

看起来你需要的是一个用户-Program关联的订阅系统,核心是把当前登录用户和他们点击订阅的Program ID绑定起来,而不是直接查固定ID的内容。下面是完整的代码实现步骤,解决你提到的两个问题:


第一步:创建用户订阅关联表

首先我们需要一个表来存储用户和订阅Program的关联关系,因为WordPress默认没有这个表。你可以把这段代码放在主题的functions.php或者自定义插件里,它会自动检查并创建表:

global $wpdb;
$subscription_table = $wpdb->prefix . 'wpex_user_subscriptions';

// 检查表是否存在,不存在则创建
if($wpdb->get_var("SHOW TABLES LIKE '$subscription_table'") != $subscription_table) {
    $sql = "CREATE TABLE $subscription_table (
        id INT(11) NOT NULL AUTO_INCREMENT,
        user_id INT(11) NOT NULL,
        program_id INT(11) NOT NULL,
        subscribed_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id),
        UNIQUE KEY unique_subscription (user_id, program_id) -- 防止重复订阅
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
    
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}

第二步:修改subscribe.php的订阅页面代码

这里要做两个关键修改:给每个订阅按钮传递对应的Program ID,以及处理订阅请求时把用户和Program的关联记录存入数据库:

<?php
global $wpdb;
$table_name = $wpdb->prefix . "wpex_programma";
$subscription_table = $wpdb->prefix . "wpex_user_subscriptions";

// 获取所有Program列表
$retrieve_data = $wpdb->get_results("SELECT id, Anaam FROM $table_name;");

// 处理订阅请求
if(isset($_POST["submit"]) && is_user_logged_in()) {
    $user_id = get_current_user_id();
    $program_id = intval($_POST['program_id']); // 获取点击的Program ID
    
    // 检查是否已经订阅,避免重复插入
    $existing_sub = $wpdb->get_var($wpdb->prepare(
        "SELECT id FROM $subscription_table WHERE user_id = %d AND program_id = %d",
        $user_id, $program_id
    ));
    
    if(!$existing_sub) {
        // 插入订阅记录
        $wpdb->insert(
            $subscription_table,
            array(
                'user_id' => $user_id,
                'program_id' => $program_id
            ),
            array('%d', '%d')
        );
        echo '<div style="color:green;">订阅成功!</div>';
    } else {
        echo '<div style="color:red;">你已经订阅过这个Program了!</div>';
    }
}
?>

<?php if(!is_user_logged_in()): ?>
    <p>请先<a href="<?php echo wp_login_url(get_permalink()); ?>">登录</a>才能订阅Program!</p>
<?php else: ?>
    <form action="<?php echo get_permalink(); ?>" enctype="multipart/form-data" method="post">
        <table>
            <?php foreach ($retrieve_data as $program) { ?>
            <tr>
                <th>Programma:</th>
                <td style="vertical-align: middle;"><?php echo esc_html($program->Anaam);?></td>
                <td>
                    <!-- 隐藏字段传递当前Program的ID -->
                    <input type="hidden" name="program_id" value="<?php echo intval($program->id); ?>">
                    <input name="submit" type="submit" value="Abonneer" />
                </td>
            </tr>
            <?php } ?>
        </table>
    </form>
<?php endif; ?>

第三步:下载页面展示用户订阅的Program

在下载页的代码中,查询当前用户订阅的所有Program并展示:

<?php
global $wpdb;
$table_name = $wpdb->prefix . "wpex_programma";
$subscription_table = $wpdb->prefix . "wpex_user_subscriptions";

if(!is_user_logged_in()) {
    echo '<p>请先<a href="' . wp_login_url(get_permalink()) . '">登录</a>查看你的订阅内容!</p>';
    return;
}

$user_id = get_current_user_id();

// 查询用户订阅的所有Program
$subscribed_programs = $wpdb->get_results($wpdb->prepare(
    "SELECT p.id, p.Anaam FROM $table_name p
    JOIN $subscription_table s ON p.id = s.program_id
    WHERE s.user_id = %d",
    $user_id
));

if(empty($subscribed_programs)) {
    echo '<p>你还没有订阅任何Program!</p>';
} else {
    echo '<h3>你的订阅Program</h3>';
    echo '<ul>';
    foreach($subscribed_programs as $program) {
        echo '<li>' . esc_html($program->Anaam) . '</li>';
        // 这里可以添加对应Program的下载链接等内容
    }
    echo '</ul>';
}
?>

关键改进点说明

  • 解决筛选单个Program的问题:通过关联表,我们只查询当前用户订阅的Program,而不是所有内容
  • 动态生成查询语句:每个订阅按钮通过隐藏字段传递对应Program的ID,处理请求时用这个ID生成动态查询
  • 安全性优化:使用$wpdb->prepare()防止SQL注入,用esc_html()转义输出内容,检查用户登录状态
  • 防止重复订阅:通过关联表的唯一约束和查询检查,避免用户重复订阅同一个Program

内容的提问来源于stack exchange,提问作者user10384426

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:12:29