2014-10-16 2 views
0

나는 wp_mail와 Ajax워드 프레스 아약스 성공 응답

이메일 작품을 사용하여 워드 프레스의 문의 양식을 만들려고 해요하지만 난 아약스 성공 응답에 문제가 있어요.

이메일을 보낸 후 사용자에게 이메일이 전송되었다는 메시지를 표시해야합니다.

자바 스크립트는 양식을 확인하고 성공 메시지를 표시합니다 :

$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 파일은 이메일을 보내 아약스 응답을 보낼 수 있습니다.

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 = '[email protected]'; 

     $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 (결과)는 다음을 제공합니다.

<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"] 
+0

이동이 -'헤더 ("콘텐츠 유형 : 응용 프로그램/JSON")

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

여기에 완벽한 예입니다;'의 상단에 귀하의 PHP 파일. 이미 AJAX 응답의 본문을 출력하기 시작한 후에 HTTP 헤더를 보내려고하기 때문에 오류가 발생합니다 ('echo 'sent email ;;). –

답변

0

응답 할 때 headers을 설정할 수 없습니다. echo 'email sent';

0

먼저 헤더를 보낼 때 echo 문을 먼저 삭제하십시오.

그런 다음, 사용자가 명시 적으로 JSON을 다시 기대하는 jQuery를 게시물을 알려줄 필요가 :

$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' => 1'));를 사용에 자바 스크립트를 변경 :

$.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(); 
} 
+0

Joe - New Nine, 나는 당신의 제안을 시도했다. 그러나 나는 아직 j에서 응답을 되찾지 못하고있다. 콘솔에서 'Uncaught SyntaxError : Unexpected token <'이 표시됩니다. – user51442

+0

방금 ​​전 당신에게 준 코드를 시도했지만 완벽하게 작동했습니다. 게시물을 다음과 같이 변경하고 무엇이 콘솔에 출력되는지 알려주십시오.'$ atj.post (MyAjax.ajaxurl, requestData, function (result) { console.log (result); })' –

+0

Joe - New 9 , 응답 지연에 대한 사과, 귀하의 제안 된 코드를 시도하고 콘솔에 null이 나타납니다. – user51442