请求实现用户订阅指定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
相关产品推荐
相关产品推荐

