我试图创建一个检索电子邮件模板并发送它的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();
}
?>
email_template.php
by 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/
。
我在这里和其他来源搜索过,但没有找到合适的答案。我错过了什么吗?这甚至可能吗?
提前致谢:)
答案 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();
}
?>
像魅力一样工作:)
任何人都解释为什么以前的代码没有用?