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

多语言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>');
        }
    });
});

额外优化建议

  1. 数据安全:添加了sanitize_text_field()、sanitize_email()等WordPress安全函数过滤用户输入,防止XSS和注入风险。
  2. 多语言适配:如果你的网站用了Polylang或WPML,确保ACF的success_message字段是多语言字段,并且在获取时切换到当前语言上下文(比如Polylang可以用pll_switch_language(pll_current_language()))。
  3. 邮件可靠性:替换原生mail()为WordPress的wp_mail(),后续可以搭配SMTP插件进一步提升邮件发送成功率。
  4. 用户体验:添加了提交按钮禁用状态、成功/错误提示,优化用户交互体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:08:51