多语言WordPress站点AJAX提交成功消息异常解决求助
解决多语言WordPress表单提交后成功消息返回的问题
我来帮你搞定这个问题——邮件能正常发送但控制台报错,核心原因是你的PHP代码里的输出破坏了JSON响应格式,导致AJAX无法正确解析返回结果。下面一步步给你修正:
问题诊断
你的代码里有几个关键问题:
- 多余的echo输出:PHP中多处
echo $checkbox;这类语句会把额外内容混入响应,而wp_send_json_success()需要返回纯JSON格式,混合输出会让AJAX解析失败,触发error回调。 - 脚本终止逻辑错误:
wp_send_json_success()函数本身已经内置了终止脚本的逻辑(相当于调用了wp_die()),所以后面的return $msg;和die();完全多余,甚至会干扰响应。 - 未初始化变量:
$message直接用.=拼接,会触发未定义变量的PHP警告,虽然不影响邮件发送,但属于代码隐患。
修正后的PHP代码
add_action('wp_ajax_nopriv_send_email', 'send_email'); add_action('wp_ajax_send_email', 'send_email'); function send_email() { // 初始化message变量 $message = '<html><body>'; // 获取表单数据(添加安全过滤,提升安全性) $checkbox = isset($_POST['myCheckboxes']) ? sanitize_text_field($_POST['myCheckboxes']) : ''; $checkbox_hy = isset($_POST['myCheckboxesHy']) ? sanitize_text_field($_POST['myCheckboxesHy']) : ''; $checkbox_modal_2 = isset($_POST['modalCheckboks2']) ? sanitize_text_field($_POST['modalCheckboks2']) : ''; $checkbox_subs = isset($_POST['subsCheckbox']) ? sanitize_text_field($_POST['subsCheckbox']) : ''; $checkbox_sp = isset($_POST['supportCheckbox']) ? sanitize_text_field($_POST['supportCheckbox']) : ''; $url = isset($_POST['url']) ? esc_url($_POST['url']) : ''; $name = isset($_POST['name']) ? sanitize_text_field($_POST['name']) : ''; $fullname = isset($_POST['fullname']) ? sanitize_text_field($_POST['fullname']) : ''; $spFullname = isset($_POST['spFullname']) ? sanitize_text_field($_POST['spFullname']) : ''; $hy_name = isset($_POST['hy_name']) ? sanitize_text_field($_POST['hy_name']) : ''; $from = 'contact@test.com'; $to = 'contact@test.com'; $email = isset($_POST['email']) ? sanitize_email($_POST['email']) : ''; $hy_email = isset($_POST['hy_email']) ? sanitize_email($_POST['hy_email']) : ''; $spEmail = isset($_POST['spEmail']) ? sanitize_email($_POST['spEmail']) : ''; $modalEmail = isset($_POST['modalEmail']) ? sanitize_email($_POST['modalEmail']) : ''; $subsEmail = isset($_POST['subsEmail']) ? sanitize_email($_POST['subsEmail']) : ''; $msg = isset($_POST['msg']) ? wp_kses_post($_POST['msg']) : ''; $hy_msg = isset($_POST['hy_msg']) ? wp_kses_post($_POST['hy_msg']) : ''; $modalMsg = isset($_POST['modalMsg']) ? wp_kses_post($_POST['modalMsg']) : ''; $spMsg = isset($_POST['spMsg']) ? wp_kses_post($_POST['spMsg']) : ''; $company = isset($_POST['company']) ? sanitize_text_field($_POST['company']) : ''; $spCompany = isset($_POST['spCompany']) ? sanitize_text_field($_POST['spCompany']) : ''; // 处理邮件主题 if ($hy_name) { $subject = '‘Any questions?’ form: ' . $hy_email; } elseif ($name) { $subject = 'Footer form: ' . $email; } elseif ($fullname) { $subject = 'Header form: ' . $modalEmail; } elseif ($subsEmail) { $subject = 'New blog subscription: ' . $subsEmail; } elseif ($spEmail) { $subject = 'Support form: ' . $spEmail; } else { $subject = 'Unknown form submission'; } // 拼接邮件内容 $message .= (!empty($name)) ? '<p><strong>User Name</strong> : ' . $name .' </p>' : ''; $message .= (!empty($email)) ? '<p><strong>User Email</strong> : '. $email .'</p>' : ''; $message .= (!empty($msg)) ? '<p><strong>User Message</strong> : '.$msg .'</p>' : ''; $message .= (!empty($checkbox)) ? '<p><strong>Checkboxs</strong> : '.$checkbox .'</p>' : ''; $message .= (!empty($hy_name)) ? '<p><strong>User Name</strong> : '.$hy_name .'</p>' : ''; $message .= (!empty($hy_email)) ? '<p><strong>User Email</strong> : '.$hy_email .'</p>' : ''; $message .= (!empty($hy_msg)) ? '<p><strong>User Message</strong> : '.$hy_msg .'</p>' : ''; $message .= (!empty($checkbox_hy)) ? '<p><strong>Checkbox</strong> : '.$checkbox_hy .'</p>' : ''; $message .= (!empty($fullname)) ? '<p><strong>Full Name</strong> : ' . $fullname .' </p>' : ''; $message .= (!empty($modalEmail)) ? '<p><strong>User Email</strong> : ' . $modalEmail .' </p>' : ''; $message .= (!empty($company)) ? '<p><strong>Company</strong> : ' . $company .' </p>' : ''; $message .= (!empty($modalMsg)) ? '<p><strong>User Message</strong> : ' . $modalMsg .' </p>' : ''; $message .= (!empty($checkbox_modal_2)) ? '<p><strong>Checkbox</strong> : '.$checkbox_modal_2 .'</p>' : ''; $message .= (!empty($subsEmail)) ? '<p><strong>User Email</strong> : '. $subsEmail .'</p>' : ''; $message .= (!empty($checkbox_subs)) ? '<p><strong>Checkbox</strong> : '.$checkbox_subs .'</p>' : ''; $message .= (!empty($spFullname)) ? '<p><strong>User Name</strong> : '.$spFullname .'</p>' : ''; $message .= (!empty($spEmail)) ? '<p><strong>User Email</strong> : '.$spEmail .'</p>' : ''; $message .= (!empty($spCompany)) ? '<p><strong>Company</strong> : ' . $spCompany .' </p>' : ''; $message .= (!empty($spMsg)) ? '<p><strong>User Message</strong> : '.$spMsg .'</p>' : ''; $message .= (!empty($checkbox_sp)) ? '<p><strong>Checkbox</strong> : '.$checkbox_sp .'</p>' : ''; $message .= (!empty($url)) ? '<p><strong>Url:</strong> : '.$url .'</p>' : ''; $message .= '</body></html>'; // 设置邮件头(补充From字段,避免被当成垃圾邮件) $headers = array( 'Content-Type: text/html; charset="utf-8"', 'From: ' . $from ); // 用WordPress内置函数发送邮件,兼容性更好 $send_mail = wp_mail($to, $subject, $message, $headers); // 处理响应:wp_send_json_success会自动终止脚本,不需要额外die if($send_mail) { // 多语言适配:如果用Polylang/WPML,确保获取对应语言的ACF字段 $success_message = get_field('success_message', 'option'); wp_send_json_success(array('message' => $success_message), 200); } else { wp_send_json_error(array('message' => 'Failed to send email'), 500); } }
修正后的AJAX代码(优化版)
jQuery('.submit').on('click', function(e) { e.preventDefault(); const $form = jQuery(this).closest('form'); // 序列化表单数据,包含未选中的复选框 let str = $form.serialize(); $form.find('input:checkbox:not(:checked)').each(function(){ str += "&" + this.name + '=false'; }); // 添加当前页面URL(编码处理避免特殊字符问题) str += "&url=" + encodeURIComponent(page_url); // 表单验证(优化:针对当前表单字段,避免多表单冲突) const $emailField = $form.find('[type="email"]'); const $msgField = $form.find('textarea'); const $nameField = $form.find('[name="name"], [name="hy_name"], [name="fullname"]').first(); function validateEmail(email) { const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return re.test(email); } function validateText($field) { if($field.val().trim() === '') { $field.addClass('error'); return false; } else { $field.removeClass('error'); return true; } } // 执行验证 const isEmailValid = validateEmail($emailField.val()); const isMsgValid = validateText($msgField); const isNameValid = validateText($nameField); if (!isEmailValid || !isMsgValid || !isNameValid) { $emailField.toggleClass('error', !isEmailValid); return false; } jQuery.ajax({ type: "post", url: ajaxactionurl, data: "action=send_email&" + str, dataType: 'json', beforeSend: function() { // 提交时禁用按钮,防止重复提交 jQuery(this).prop('disabled', true).text('Sending...'); }, success: function (response) { // 重置当前表单 $form[0].reset(); // 显示多语言成功消息 jQuery('.submit', $form).text(response.data.message); // 可选:添加成功提示框 // $form.append('<div class="success-alert">' + response.data.message + '</div>'); console.log(response.data.message); }, error: function (jqXHR, textStatus, errorThrown) { console.error('Email send error:', textStatus, errorThrown); jQuery('.submit', $form).prop('disabled', false).text('Submit'); // 显示错误提示 $form.append('<div class="error-alert">Failed to send message, please try again later.</div>'); } }); });
额外优化建议
- 数据安全:添加了
sanitize_text_field()、sanitize_email()等WordPress安全函数过滤用户输入,防止XSS和注入风险。 - 多语言适配:如果你的网站用了Polylang或WPML,确保ACF的
success_message字段是多语言字段,并且在获取时切换到当前语言上下文(比如Polylang可以用pll_switch_language(pll_current_language()))。 - 邮件可靠性:替换原生
mail()为WordPress的wp_mail(),后续可以搭配SMTP插件进一步提升邮件发送成功率。 - 用户体验:添加了提交按钮禁用状态、成功/错误提示,优化用户交互体验。
内容的提问来源于stack exchange,提问作者stepbystep
相关产品推荐
相关产品推荐

