Ajax 检索电子邮件模板并发送的函数

Ajax function that retrieve an e-mail template and send it

我正在尝试创建一个 ajax 函数来检索电子邮件模板并发送它。到目前为止,这是我的代码:

<?php
add_action('wp_ajax_nopriv_test_function', 'test_function');
add_action('wp_ajax_test_function', 'test_function');
function test_function() {

        $content = Array(
            "name"=>$_POST['name'],
            "email"=>$_POST['email'],
        );

        ob_start();
        include("../emails/email_template.php");
        $message = ob_get_contents();
        ob_end_clean();

        $headers[] = 'Content-Type: text/html; charset=UTF-8';

        wp_mail($_POST['email'], "[E-mail subject] This is a test", $message, $headers);

    $result['feedback'] = "All OK!";
  }

    wp_send_json($result);
    die();
}
?>
  1. ajax 调用有效。我得到 response.feedback 正确,即使知道它不是 "All OK!".
  2. 可以分析email_template.phpby clicking here。它基本上是一个响应式电子邮件模板,从 $contents 接收一些 PHP 变量。参见第 313 行。

不幸的是,我收到了这个错误:

PHP Fatal error: Unknown: Cannot use output buffering in output buffering display handlers in Unknown on line 0, referer: http://example.com/.

我在这里和其他来源进行了搜索,但没有找到合适的答案。我错过了什么吗?这可能吗?

提前致谢:)

将我的代码更改为:

<?php
add_action('wp_ajax_nopriv_test_function', 'test_function');
add_action('wp_ajax_test_function', 'test_function');
function test_function() {

      ob_start();

        $content = Array(
            "nome"=>$_POST['nome_registro'],
            "email"=>$_POST['email_registro'],
        );?>

    <?php include(ABS_PATH_DEFINED_ELSEWHERE."my-plugin/inc/emails/email_template.php"); ?>

    <?php

    $message = ob_get_contents();
    ob_end_clean();

    $headers[] = 'Content-Type: text/html; charset=UTF-8';

    wp_mail($_POST['email'], "[E-mail subject] This is a test", $message, $headers);

    $result['feedback'] = "All OK!";
  }

  wp_send_json($result);
  die();
}
?>

工作起来很有魅力:)

谁能解释为什么之前的代码不起作用?

很抱歉 post 将此作为答案,但我没有足够的分数来 post 发表评论。几周来我一直在关注这个问题,因为我对工作代码和非工作代码之间的关键区别非常好奇。我绝对不明白原始解决方案有什么问题。出于好奇,您能否在调用 ob_start()

之前添加以下代码
error_log( 'before ob_start(): ' . print_r( debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ), true ) );

只有在输出缓冲回调中调用 ob_start() 时才会出现您遇到的错误。我真的不明白这在你给定的代码中是如何发生的,但也许回溯会显示一些东西。

我知道几周过去了,也许您已经对这个问题失去了兴趣,但希望您和我一样,仍然想了解原因。我已经多次查看这段代码,看不出任何问题,真的很想了解哪里出了问题。

提前感谢您的考虑。

更新: 我使用以下插件测试了您的代码:

<?php
/*
Plugin Name: Gruby's Problem
*/

add_action('wp_ajax_nopriv_test_function', 'test_function');
add_action('wp_ajax_test_function', 'test_function');
function test_function() {

        $content = Array(
            "name"=>$_POST['name'],
            "email"=>$_POST['email'],
        );

        ob_start();
        include("email_template.php");
        $message = ob_get_contents();
        ob_end_clean();

        $headers[] = 'Content-Type: text/html; charset=UTF-8';

        wp_mail($_POST['email'], "[E-mail subject] This is a test", $message, $headers);

    $result['feedback'] = "All OK!";

    wp_send_json($result);
    die();
}

add_shortcode( 'send_gruby_ajax_test', function() {
?>
<button id="gruby_send_ajax_test">Send Gruby Ajax Test</button>
<script>
    jQuery( 'button#gruby_send_ajax_test' ).click( function() {
        jQuery.post( '<?php echo admin_url( 'admin-ajax.php' ); ?>', { action: 'test_function', name: 'Magenta', email: 'xxx@xxx.com' }, function( r ) {
            console.log( r );
        } );
    } );
</script>
<?php
} );
?>

我必须解决 2 个问题 - 删除行后的无关“}”

$result['feedback'] = "All OK!";

并在 email_template.php

中更改了第 313 行
Your order has shipped, <?php echo $content['nome'];?>!

Your order has shipped, <?php echo $content['name'];?>!

经过这些更改后,代码按预期工作。所以你的原始代码在我的环境中确实有效。我仍然很好奇你是如何让你的代码失败的。你能不能 运行 我的插件,看看它是否会导致与以前相同的错误。要测试插件,您需要创建一个包含 post 内容的页面:

[send_gruby_ajax_test]

这将显示一个按钮,单击该按钮将发送 'test_function' 的 AJAX 请求。