【问题标题】:Wordpress ajax success responseWordpress ajax 成功响应
【发布时间】:2014-10-16 19:59:01
【问题描述】:

我正在尝试使用 wp_mail 和 Ajax 在 Wordpress 中创建联系表单

电子邮件有效,但 Ajax 成功响应出现问题。

电子邮件发送后,我需要向用户显示电子邮件已发送的消息。

验证表单并显示成功消息的 Javascript:

    $atj(function(){
      $atj('#training-submit').click(function(e) {
        e.preventDefault();
        e.stopPropagation();
        if(verfiyFields()) {
            alert('here');
            requestData = {
              'action' : 'myajax-submit',
              'firstName' : $atj("#name").val(), 
              'email' : $atj("#email").val(), 
          }
          $atj.post(MyAjax.ajaxurl, requestData).done(function(result){        
            result = jQuery.parseJSON( result );
            console.log(result);
            if(result == 'success'){
              $atj('.training-form [type=text]').val('');
              $atj('.training-form-message').append('<p class="training-form-complete-message">Thank you for the  email</p>');
            }
          });
        }
      });
    })



    //Verfiy 
    function verfiyTrainingFields() {
      var flag = true;

      var name =        $atj('#name');
      var email =       $atj('#email');

      if(name.val().indexOf(' ') === -1 ){
        name.parent().prepend('<p class="form-error">Please enter name, first space last</p>');
        errorMessage($atj('.form-error'));
        flag = false;
      }
      if(!IsEmail(email.val())){
        email.parent().prepend('<p class="form-error">Please enter valid email address</p>');
        errorMessage($atj('.form-error'));
        flag = false;
      }
      return flag;
    }

functions.php 文件用于发送电子邮件和发送 ajax 响应。

    function myajax_submit() {

        $name = sanitize_text_field($_POST['firstName']);
        $email = sanitize_text_field($_POST['email']);

        $headers[] = 'From: ' . $name . ' <' . $email . '>' . "\r\n";
        $headers[] = 'Content-type: text/html' . "\r\n"; //Enables HTML ContentType. Remove it for Plain Text Messages

        $to = 'me@mysite.co.uk';

        $message = 'Name: ' . $name . "\r\n" . 'email: ' . $email;

        add_filter( 'wp_mail_content_type', 'set_html_content_type' );
        wp_mail( $to, 'Email Test', $message );
        remove_filter( 'wp_mail_content_type', 'set_html_content_type' ); 

        echo 'email sent';

        // generate the response
        $response = json_encode( array( 'success') );

        // response output
        header( "Content-Type: application/json" );
        echo $response;

        exit;
    }

电子邮件已发送,“电子邮件已发送”回显触发,但 js 中的 if(result == 'success'){ 不起作用。

js文件中的console.log(result)给出如下内容。

<br />
<b>Warning</b>:  call_user_func_array() expects parameter 1 to be a valid callback, function 'set_html_content_type' not found or invalid function name in <b>/Users/user.name/Desktop/MAMP-DocRoot/appname/src/php/wp-includes/plugin.php</b> on line <b>192</b><br />
email sent<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /Users/user.name/Desktop/MAMP-DocRoot/appname/src/php/wp-includes/plugin.php:192) in <b>/Users/user.name/Desktop/MAMP-DocRoot/appname/src/php/wp-content/themes/sitename/functions.php</b> on line <b>66</b><br />
["success"] 

【问题讨论】:

  • 将这个 — header( "Content-Type: application/json" ); 移动到 PHP 文件的顶部。您收到错误消息是因为您在开始输出 AJAX 响应 (echo 'email sent';) 的正文后尝试发送 HTTP 标头。

标签: javascript jquery ajax wordpress


【解决方案1】:

您不能在响应中的 echo' 之后设置 headers。除掉 echo 'email sent';

【讨论】:

    【解决方案2】:

    首先,删除echo 语句,因为它过早发送标头。

    然后,您需要明确告诉 jQuery post 期望返回 json:

    $atj.post(MyAjax.ajaxurl, requestData).done(function(result){
        result = jQuery.parseJSON( result );
        console.log(result);
        if(result == 'success'){
            $atj('.training-form [type=text]').val('');
            $atj('.training-form-message').append('<p class="training-form-complete-message">Thank you for the  email</p>');
        }
    }, 'json' );
    

    最后,您的 json 编码响应不会给您预期的response == success。相反,请使用 json_encode( array( 'success' =&gt; 1' ) ); 并将您的 javascript 更改为:

    if( 1 == result.success ) ){
    }
    

    这是一个完整的例子:

    $.post( url, data, function( response ){
        if( 1 == response.success ){
          // Success - do something
        } else {
          // Failure
        }
    }, 'json' );
    
    <?php
    function myAjaxFunction(){
        $result = array(
            'success' => 0 // Assume failure first
        );
        if( $_POST[ 'whatever' ] == 'what i want' ){
            $result[ 'success' ] = 1;
        }
        print json_encode( $result );
        exit();
    }
    

    【讨论】:

    • 乔 - 新九,我尝试了你的建议,但我仍然没有在 js 中得到回复。在控制台中,我收到错误“Uncaught SyntaxError: Unexpected token
    • 我刚刚尝试了我给你的代码,它运行良好。将您的帖子更改为以下内容,让我知道控制台中的打印内容:$atj.post( MyAjax.ajaxurl, requestData, function( result ){ console.log( result ); })
    • 乔 - 新九,抱歉延迟响应,我尝试了你建议的代码,但我在控制台中得到了 null。
    • 在 jQuery post 函数中,如果你去掉 if 语句,只将结果打印到控制台会发生什么。你应该拿回一个对象。如果没有,您可以发布更多代码吗?这个非常基本的示例有效,因此代码中的其他地方肯定存在问题,我很乐意帮助您找到它:)
    猜你喜欢
    • 1970-01-01
    • 2012-05-02
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 2016-11-09
    • 1970-01-01
    • 2015-05-07
    相关资源
    最近更新 更多