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

时间:2018-01-04 23:55:58

标签: php ajax wordpress output-buffering

我试图创建一个检索电子邮件模板并发送它的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,即使知道它不是&#34;一切都好!&#34;。
  2. 您可以分析email_template.php by clicking here。它基本上是一个负责任的电子邮件模板,它从$contents接收一些PHP变量。见第313行。
  3. 不幸的是,我收到了这个错误:

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

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

    提前致谢:)

2 个答案:

答案 0 :(得分:1)

很抱歉发布此答案,但我没有足够的积分发表评论。几个星期以来,我一直在关注这个问题,因为我对工作代码和非工作代码之间的重要区别非常好奇。我绝对不明白原始解决方案有什么问题。为了我的好奇心,您可以在调用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'];?>!

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

[send_gruby_ajax_test]

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

答案 1 :(得分:0)

将我的代码更改为:

<?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();
}
?>

像魅力一样工作:)

任何人都解释为什么以前的代码没有用?