php - 在 Wordpress 中使用 Ajax 发送邮件

标签 php jquery ajax wordpress

我正在尝试使用 Ajax 通过我创建的 Web 表单发送电子邮件,但我迷路了。我不知道 Ajax 在 Wordpress 中是如何工作的。

我首先创建了一个 Action

add_action( 'wp_ajax_siteWideMessage', 'wpse_sendmail' );

应该检索数据并发送邮件的函数是:

function wpse_sendmail()
{
    $for = like_escape($_POST['forwhat']);
    $email = like_escape($_POST['email']);
    $headers = 'From: '.$email ."\r\n".'Reply-To: '.$email;
    $message = like_escape($_POST['message_message']);
    $respond = like_escape($_POST['message_email']);

    wp_mail( "support@ontrgt.net", "(OTN) Support: ".$support, $message, $headers); 
}

最后js是这样的:

$("#contact-send").click(function(){
    var forwhat = $("#contact-for").val();
    var name = $("#contact-name").val();
    var email = $("#contact-email").val();

    $.post( "<?php echo esc_js( site_url() ) ?>", { siteWideMessage:"null", forwhat: forwhat, name: name, email:email }, function(){
            console.log("success");
    });
});

我不太确定我在这里遗漏了什么。谁能帮我理解 Wordpress 的 Ajax 流程?


更新

到目前为止,我将我的代码更新为:

PHP

add_action( 'wp_ajax_siteWideMessage', 'wpse_sendmail' );
add_action( 'wp_ajax_nopriv_siteWideMessage', 'wpse_sendmail' );

function wpse_sendmail()
{
    $for = $_POST['forwhat'];
    $email = $_POST['email'];
    $headers = 'From: '.$email ."\r\n".'Reply-To: '.$email;
    $message = $_POST['message_message'];
    $respond = $_POST['message_email'];

    /*if(wp_mail( "support@ontrgt.net", "(OTN) Support: ".$for, $message, $headers))
    {
        echo "WOOHOO";
    }*/

    if($for)
    {
        //Just to see if there is any response.
        echo "Whoohoo";
    }

    die();
}

Js

$("#contact-send").click(function(){
    var forwhat = $("#contact-for").val();
    var name = $("#contact-name").val();
    var email = $("#contact-email").val();

    var data = { action:'siteWideMessage', forwhat:forwhat, name:name, email:email };
    $.post('<?php echo admin_url("admin-ajax.php"); ?>', data, function(response) {
        alert(response);
    });
});

Wordpress 仍然没有响应我的 AJAX 命令。我正在使用 inspect 元素,但我没有看到任何数据被传递。

最佳答案

首先您需要添加两个操作,一个用于未登录用户明确要求使其工作,例如像这样的操作(基本上在您的 functions.php 文件中):

add_action( 'wp_ajax_siteWideMessage', 'wpse_sendmail' );
add_action( 'wp_ajax_nopriv_siteWideMessage', 'wpse_sendmail' );

然后,您需要向 admin-ajax.php 发出请求,因此在 jQuery 函数中,您可以使用如下内容:

$("#contact-send").click(function(e){

    e.preventDefault(); // if the clicked element is a link

    //...

    var data = { 'action':'siteWideMessage', 'more':'values' };

    $.post('<?php echo admin_url('admin-ajax.php'); ?>', data, function(response) {
        console.log(response);
    });

});

确保将 exit/die 放在服务器端 handler 的末尾,例如:

function wpse_sendmail()
{
    // Process the post data...
    
    if(wp_mail(...)) {
        echo 'success';
    }
    else {
        echo 'failed';
    }

    die();
}

在您的success 回调中,response 变量将获得从服务器端发送的响应,即success/failed。有更好的方法可以做到这一点(使用 wp_localize_script 等)。阅读this detailed article .此外,如果您想返回一个 json 响应,那么您可以使用 $.json('url', data, func)

如果您感到困惑,那么让我告诉您,您应该向 admin-ajax.php 发出请求并随请求传递 action,在这种情况下它是 siteWideMessage,因此 WordPress 将调用使用 add_action Hook 注册的 handler,在您的情况下它是 wpse_sendmail.Eid Mubarak :-)

关于php - 在 Wordpress 中使用 Ajax 发送邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26188865/

相关文章:

php - 实时创建新闻提要

php - 在一行中提取 PHP 爆炸的正确部分

PHP strtotime 请求 "PM"返回 "AM"?

javascript - 如何仅在特定页面显示 JQuery Dialog 关闭按钮

jquery - 如何查看CMD+点击

javascript - 用于根据其 html 内容禁用链接的 jQuery

javascript - 带有 fork 回调的 AJAX 请求

php - 为什么我的 SQL 查询返回一个数组?

php - 使用 PHP MySQL 打印包含图像的水平表格

jquery - 使用 ASP.NET Core 和 JQuery 启用防伪 token