2017-01-05 49 views
0

我一直在努力获取数据,以便在我正在处理的网站上的大型工作查询表单上发送。WordPress Ajax和PHP电子邮件问题 - 电子邮件中没有数据

快速用户案例:

作为网站所有者我想有用户通过复选框提交的数据和一些输入一些个人信息。当点击提交按钮时,我想通过Ajax发送数据,并提交给使用AJAX功能的WordPress。这些数据需要通过电子邮件发回给我。

我在哪里

我已经AJAX提交和电子邮件传送发生。我被难倒的原因是我的表单/ ajax请求中没有数据。

HTML

<form id="inquire" class="form" name="inquireForm"> 
... a crap ton of checkboxes and a few inputs for name,email etc... 
</form> 

的JavaScript

了以下功能是通过jQuery验证库解雇。有一个submitHandler方法在其中调用follow。

function submitForm() { 
    /* Keep form from submitting normally*/ 
    event.preventDefault(); 

    /* Clear success div*/ 
    $('.success_box').addClass('hidden').removeClass('error').html(''); 

    var cleanData = $('#inquire').serialize(); 
    var form = cleanData; 

    $.ajax({ 
     url: myInquiry.ajaxurl, 
     type: "POST", 
     data: { 
      action: "send_inquiry", 
      form: form, 
      nonce: myInquiry.nonce 
     }, 
     dataType: 'JSON', 
     success: function(data, textStatus, jqXHR) { 
      console.log(' The sever responded: ', data , textStatus , jqXHR); 
      if (textStatus == "success") { 
       $('.success_box').removeClass('hidden').html('<p>Success! Your message has been sent. We will reach you to you in less than 24 hours.</p>'); 
       fadeModal();    
      } else { 
       $('.success_box').removeClass('hidden').addClass('error').html('<p>Error! Your message has not been sent.</p>'); 
      } 
     }, 
    }); 
} 

的functions.php

// enqueue ajax scripts 
wp_enqueue_script('ajax_script', get_template_directory_uri(). '/assets/js/dist/inquire.js', array('jquery'), null, true); 
wp_localize_script('ajax_script', 'myInquiry', 
    array( 
     'ajaxurl' => admin_url('admin-ajax.php'), 
     'nonce' => wp_create_nonce("send_inquiry_nonce"), 
    ) 
); 

// add in WP actions with unique names that match 
add_action('wp_ajax_send_inquiry', 'send_inquiry_process'); 
add_action('wp_ajax_nopriv_send_inquiry', 'send_inquiry_process'); 

// Try to send email 
function send_inquiry_process() { 
    $user_email = isset($_POST['email']) ? $_POST['email'] : ''; 
    $headers = "From: " . " $user_email" . "\r\n"; 
    $headers .= "Reply-to: ". $user_email . "\r\n"; 
    $headers .= "MIME-Version: 1.0". "\r\n"; 
    $headers .= "Content-Type: text/html; charset=UTF-8" . "\r\n"; 

    $to = "[email protected]"; 
    $subject = "New Inquiry!"; 
    $message = "It works"; 
    mail($to, $subject, $message, $headers); 
} 

结果

这样做的结果到目前为止是一个坚实的Ajax发帖,我收到一封电子邮件,但$user_email PHP变量例如返回undefined。这表示我试图返回的所有数据都是零。

我的登台服务器位于Digital Ocean上。它似乎在PHP的邮件方法的作品,但我不是100%确定,如果它的服务器问题或在这一点上。

很高兴富人

我希望返回的数据可以被格式化为HTML。我只需要编写一个表并包含邮件消息的变量。在此之前,我需要它的工作!我现在有UTF-8的字符集,所以我假设所有的都是好的。

ALSO

我知道有巨大的安全漏洞全都在这。我将重点关注这一点,但它需要再次努力。

你可以提供的任何洞察力将使我的一天!我非常强调。谢谢!

+0

我没有看到你访问'form'的$ _POST'键,你的Ajax中的'data'是php中的'$ _POST',所以'$ _POST ['action']'是'data.action' 。 'data.email'不存在。也许'data.form.email'确实是'$ _POST ['form'] ['email']' - 有意义吗? – ArtisticPhoenix

回答

0

正如我把意见在阿贾克斯你的数据被发送这样

data: { 
    action: "send_inquiry", 
    form: form, 
    nonce: myInquiry.nonce 
}, 

在PHP(如果我看到它的权利),它会是这样

$_POST = [ 
    'action' => "send_inquiry", 
    'form' => [...], 
    'nonce' => '..' /// what ever this is myInquiry.nonce 
]; 

所以后来试图访问$_POST['email']不会工作,您需要

$_POST['from']['email']; 

取而代之。可以肯定的是,你可以用var_dump打印帖子数组,但是通过AJAX来做这件事有点困难。但是data是你“发布”到后端,而不是form

除非WordPress在场景后面做了一些Mojo,TBH我没有通过WordPress做很多AJAX,所以我可能完全脱离基础。

+0

感谢您的反馈。这个只有现在才有意义,它会返回一个随机的字符作为“x"@email.com,这很奇怪。 – justalever

0

解决

的问题是与我在分析数据的方式。您不能在$.ajax方法上拨打action:

所以这种开关:

function submitForm() { 

/* Keep form from submitting normally*/ 
event.preventDefault(); 

/* Clear success div*/ 
$('.success_box').addClass('hidden').removeClass('error').html(''); 

var cleanData = $('#inquire').serialize(); 
var form = cleanData; 


$.ajax({ 
    url: myInquiry.ajaxurl, 
    type: "POST", 
    data: { 
     action: "send_inquiry", 
     form: form, 
     nonce: myInquiry.nonce 
    }, 
    dataType: 'JSON', 
    success: function(data, textStatus, jqXHR) { 

     console.log(' The sever responded: ', data , textStatus , jqXHR); 

     if (textStatus == "success") { 
     $('.success_box').removeClass('hidden').html('<p>Success! Your message has been sent. We will reach you to you in less than 24 hours.</p>'); 
     fadeModal();    
    } else { 
     $('.success_box').removeClass('hidden').addClass('error').html('<p>Error! Your message has not been sent.</p>'); 
    } 
    }, 
}); 

要这样:

function submitForm() { 

/* Keep form from submitting normally*/ 
event.preventDefault(); 

/* Clear success div*/ 
$('.success_box').addClass('hidden').removeClass('error').html(''); 

var cleanData = $('#inquire').serialize(); 
var data = cleanData; 


$.ajax({ 
    url: myInquiry.ajaxurl, 
    type: "POST", 
    data: data + '&action=send_inquiry', 
    dataType: 'JSON', 
    success: function(data, textStatus, jqXHR) { 
    console.log(' The sever responded: ', data , textStatus , jqXHR); 
     if (textStatus == "success") { 
     $('.success_box').removeClass('hidden').html('<p>Success! Your message has been sent. We will reach you to you in less than 24 hours.</p>'); 
     fadeModal();    
    } else { 
      $('.success_box').removeClass('hidden').addClass('error').html('<p>Error! Your message has not been sent.</p>'); 
    } 
    }, 
}); 

的伎俩。我更新了data变量公然为data(为了优先考虑)和在data:内的ajax调用我返回data + &action=send_query。这使得POST更新成为我需要将数据发送到PHP电子邮件脚本的内容。

如果不清楚,请随时联系!