如何实现WordPress插件中表单提交后隐藏
解决WordPress插件表单提交后无法隐藏的问题
你的代码之所以检测不到submitForm的POST参数,核心问题有两个:
- 表单提交目标是外部的
sendmail.php,提交后请求跳转到该文件,当前插件页面完全接收不到POST数据,isset($_POST['submitForm'])自然永远为false。 - 没有持久化存储用户已提交的状态,就算能拿到POST值,页面刷新后状态也会丢失。
下面是修正后的完整实现方案:
1. 注册表单提交处理钩子
在插件主类的构造函数或初始化方法中添加以下代码,用于接收表单提交请求:
add_action('admin_post_save_mister_chat_info', array($this, 'handle_form_submission')); add_action('admin_post_nopriv_save_mister_chat_info', array($this, 'handle_form_submission')); // 可选:处理未登录用户场景
2. 添加表单提交处理方法
实现接收、验证、存储用户提交数据的逻辑:
public function handle_form_submission() { // 安全验证:检查nonce防止CSRF攻击 if (!isset($_POST['mister_chat_nonce']) || !wp_verify_nonce($_POST['mister_chat_nonce'], 'mister_chat_form_action')) { wp_die('安全验证失败,请重试。'); } // 验证并清洗用户输入 $user_data = array( 'vnaam' => sanitize_text_field($_POST['vnaam']), 'anaam' => sanitize_text_field($_POST['anaam']), 'bnaam' => sanitize_text_field($_POST['bnaam']), 'email' => sanitize_email($_POST['email']), 'telef' => sanitize_text_field($_POST['telef']) ); // 保存用户数据到WordPress系统选项 update_option('mister_chat_user_info', $user_data); // 标记用户已完成表单提交 update_option('mister_chat_form_submitted', true); // 重定向回插件设置页面,避免刷新重复提交 wp_redirect(admin_url('admin.php?page=' . $this->plugin_name)); exit; }
3. 修改页面渲染方法
更新display_plugin_setup_page,通过系统选项判断用户是否已提交表单:
public function display_plugin_setup_page() { // 从系统选项中读取提交状态 $form_submitted = get_option('mister_chat_form_submitted', false); if ($form_submitted) { ?> <form action="options.php" method="post"> <?php settings_fields('mister_chat_options'); do_settings_sections($this->plugin_name); ?> <input name="submit" class="button button-primary" type="submit" value="<?php esc_attr_e('Save'); ?>" /> </form> <?php } else { ?> <form method="post" action="<?php echo admin_url('admin-post.php'); ?>"> <!-- 指定表单提交的处理动作 --> <input type="hidden" name="action" value="save_mister_chat_info"> <!-- 添加安全验证nonce --> <?php wp_nonce_field('mister_chat_form_action', 'mister_chat_nonce'); ?> <fieldset> <input placeholder="Voornaam" type="text" id="vnaam" name="vnaam" required> </fieldset> <fieldset> <input placeholder="Achternaam" type="text" id="anaam" name="anaam" required> </fieldset> <fieldset> <input placeholder="Bedrijfsnaam" type="text" id="bnaam" name="bnaam"> </fieldset> <fieldset> <input placeholder="E-mailadres" type="email" id="email" name="email" required> </fieldset> <fieldset> <input placeholder="Telefoonnummer" type="tel" id="telef" name="telef"> </fieldset> <fieldset> <input type="submit" name="submitForm" id="contact-submit" data-submit="...Verzenden" value="提交"> </fieldset> </form> <?php } }
关键修改说明
- 抛弃了指向外部文件的提交方式,改用WordPress官方的
admin-post.php统一处理表单请求,符合插件开发规范。 - 添加了nonce安全验证,避免恶意请求。
- 使用WordPress的
update_option和get_option持久化存储提交状态,确保页面刷新后依然能正确判断用户是否已提交。 - 提交完成后执行重定向,解决表单重复提交问题。
内容的提问来源于stack exchange,提问作者Bas
相关产品推荐
相关产品推荐

