WordPress验证跳转表单开发:表单逻辑调用异常问题
问题修复:WordPress自定义表单验证逻辑不触发
你的核心问题是表单提交后验证逻辑未正确执行,同时错误提示的输出方式不符合WordPress页面渲染流程。以下是修正后的完整代码及关键说明:
<?php error_reporting(E_ALL); ini_set('display_errors', 1); /* Plugin Name: Custom Form Handler Description: Handles the custom form submission. */ // 启动会话用于存储错误信息 function custom_form_start_session() { if (!session_id()) { session_start(); } } add_action('init', 'custom_form_start_session'); function custom_form_handler() { // 只处理POST提交,且匹配表单专属提交标识 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['street_name_submit'])) { // 用页面slug判断更可靠,替换为你实际的Members Only页面slug if (is_page('members-only')) { $streetName = sanitize_text_field($_POST['street_name']); if ($streetName === "Broadway") { wp_redirect(site_url('/membersonly-success/')); exit(); } else { // 存储错误信息到会话 $_SESSION['form_error'] = "Invalid street name."; // 重定向回原页面,避免表单重复提交 wp_redirect(get_permalink()); exit(); } } } } // 改用init钩子处理提交,时机更稳定 add_action('init', 'custom_form_handler'); function display_form() { ob_start(); // 显示错误信息(存在则输出并清除) if (isset($_SESSION['form_error'])) { echo '<p style="color:red;">' . esc_html($_SESSION['form_error']) . '</p>'; unset($_SESSION['form_error']); } ?> <form method="POST"> Street Name <input type="text" name="street_name" required><br/> <!-- 自定义提交按钮name,避免与其他表单冲突 --> <input type="submit" name="street_name_submit" value="Go"> </form> <?php return ob_get_clean(); } function custom_form_shortcode() { return display_form(); } add_shortcode('custom_form', 'custom_form_shortcode');
关键修改说明:
- 钩子调整:将
template_redirect替换为init钩子,确保表单提交逻辑在页面渲染前稳定执行,解决原钩子时机导致的页面判断失效问题。 - 错误信息处理:放弃直接echo的方式,改用会话存储错误内容,在表单渲染时输出,避免破坏页面结构。
- 防重复提交:验证失败后重定向回原页面,避免用户刷新重复提交表单。
- 表单标识优化:给提交按钮设置专属name,防止与其他页面表单的提交按钮冲突。
- 页面判断优化:用页面slug代替标题判断,避免标题大小写、空格或翻译带来的匹配失败。
- 代码复用:短代码直接调用
display_form函数,消除重复的表单代码。
内容的提问来源于stack exchange,提问作者oldschoolnva
相关产品推荐
相关产品推荐

