php AJAX Error:Unexpected token < in JSON at position 0 on WordPress Contact Form 7 submit

iih3973s  于 2023-06-20  发布在  PHP
关注(0)|答案(3)|浏览(138)

我有一个奇怪的问题时,张贴联系表格。
加载图标将继续加载,并且表单不会提交。
电子邮件被发送,我的before_send_mail函数也起作用。奇怪的是,当我取消注解before_send_mail函数时,它没有显示任何错误。所以可能是我的代码。
但是,frontpage没有改变状态,并且一直显示加载图标。
错误消息为:

<div class="ajax-error">Unexpected token &lt; in JSON at position 0</div>

你们能帮帮我吗下面你会发现before_send函数。

add_action( 'wpcf7_before_send_mail', 'form_to_crm' );
function form_to_crm( $cf7 ) {
    $wpcf7 = WPCF7_ContactForm::get_current();

    /* Uw naam   => first_name    */ $first_name            = $_POST["your-name"];
    /* Bedrijf   => company_name  */ $company               = $_POST["bedrijf"];
    /* Email     => email         */ $email                 = $_POST["email"];
    /* Adres     => address       */ $address               = $_POST["adres"];
    /* Nummer*   => number        */ $number                = $_POST["huisnummer"];
    /* Postcode  => postcode      */ $postcode              = $_POST["postcode"];
    /* Woonplts* => city          */ $city                  = $_POST["woonplaats"];
    /* Tel       => telephone     */ $telephone             = $_POST["telefoonnummer"]; 

    if(!empty( $first_name )){          $post_items['first_name']           =  $first_name; }
    if(!empty( $company )){             $post_items['company_name']         =  $company; }
    if(!empty( $email )){               $post_items['email']                =  $email; }
    if(!empty( $address )){             $post_items['address']              =  $address; }
    if(!empty( $number )){              $post_items['number']               =  $number; }
    if(!empty( $postcode )){            $post_items['postcode']             =  $postcode; }
    if(!empty( $city )){                $post_items['city']                 =  $city; }
    if(!empty( $telephone )){           $post_items['telephone']            =  $telephone; }

    if(!empty($postcode) && !empty($number))
    {
        $ch             = curl_init();

        if ( curl_error($ch) != "" ) 
        {
            return;
        }

        $post_string    = json_encode($post_items);

        $con_url        = 'valid api url';

        curl_setopt($ch, CURLOPT_URL, $con_url);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            "Content-Type: application/json",
            "Authorization: Token XXX (censored)"
        ));
        curl_setopt( $ch, CURLOPT_POSTFIELDS, $post_string);
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );

        $output = curl_exec($ch);

        file_put_contents("curlerror.txt", $output);
        curl_close($ch);
    }
    return $output;
}
rfbsl7qr

rfbsl7qr1#

在浏览器控制台中, AJAX 调用未被列为错误。但是,调用中出现错误。谢谢@JAAulde给我指出来。

kzmpq1sx

kzmpq1sx2#

@森塔的回答帮我找到了出错的原因。事实证明,CF 7的 AJAX 调用所接收的响应不仅仅是来自CF 7的JSON响应,而是另一个插件正在向其中添加内容,导致AJAX失败,因为它期望的是JSON格式,现在是可怕的无效(本来只有1行JSON的内容变成了300多行其他内容)。
我不喜欢编辑插件,但我这样做是为了帮助解决这个问题,并允许CF 7与其他人一起玩得很好,现在看起来像这样:
contact-form-7/includes/js/scripts.js或者,如果您正在使用Contact Form 7的jQuery验证插件,则需要jquery-validation-for-contact-form-7/js/jquery.jvcf7_validation.js

$.ajax({
    type: 'POST',
    url: wpcf7.apiSettings.root + wpcf7.apiSettings.namespace +
        '/contact-forms/' + wpcf7.getId($form) + '/feedback',
    data: formData,
    dataType: 'text',//Changed from 'json' to 'text'
    processData: false,
    contentType: false
    }).done(function(data, status, xhr) {
        var f = data.indexOf('{'); //First opening curly-brace
        var l = data.lastIndexOf('{'); //Last opening curly-brace
        if (f !== l && data.indexOf("{") !== 0 && l !== 0) {
            //If the first and last indices are not the same, and neither the first nor the last are equal to 0,
            //then get the data that starts from the last index
            data = data.substring(l);
        } else if (f === l && f !== 0) {
            //If the first and last indices are the same, but are not the first character,
            //then get the data that starts from the first index
            data = data.substring(f);
        }
        $('.ajax-loader', $form).removeClass('is-active');
        try {
            //Try parsing the data as JSON now and submitting it
            data = JSON.parse(data);
            ajaxSuccess(data, status, xhr, $form);
        } catch (err) {
            //Do the same error stuff as the fail() call if it still fails
            var $e = $('<div class="ajax-error"</div>').text(err);
            $form.after($e);
        }
    }).fail(function(xhr, status, error) {
        $('.ajax-loader', $form).removeClass('is-active');
        var $e = $('<div class="ajax-error"></div>').text(error.message);
        $form.after($e);
});

我不宽恕编辑其他开发人员的插件,这可能不适用于每个有这个问题的人。这只是一个临时的修复,直到我们找到一个不同的插件,将发挥良好的CF 7。

编辑:

今天,我又犯了这个错误。事实证明,在wp-config.php设置中将WP_DEBUG设置为false也可以解决这个错误,因为 AJAX 响应中的内容是一堆调试日志。如果您正在调试它,这会很有帮助,但除此之外,我建议您在生产环境中不要使用它。

63lcw9qa

63lcw9qa3#

在我的情况下,我不得不重新配置/重新安装“隐藏我的WP”插件,一切都很好。

相关问题