所以根本问题是发送头,specifically the timing.
网页有http头,http头位于内容之前。标题告诉浏览器它正在接收什么,必须先发送它们。
当PHP输出内容时,它需要告诉浏览器期望输出,因此在输出字符的那一刻,PHP就会发送HTTP头,告诉浏览器期望输出。
一旦发送,就发送。马出了马厩,猫出了包,它们是无法改变的。
所以当你的站点到达你的短代码时,它已经输出了一个html元素、一个标题和一个标题等等,现在发送重定向标题已经太迟了!
As a result we can conclude, that redirecting inside a shortcode, is not possible. Another solution is required
根本问题是您试图在一个短代码内执行操作。在短代码中显示输出效果很好,但不利于实际处理。
因此,让我们在表单中添加一个隐藏的输入,以便在表单提交时使用:
<input type="hidden" name="form_submitted" value="true" />
然后在
init
挂钩:
add_action( \'init\', function() {
if ( ! empty( $_POST[\'form_submitted\'] ) ) {
deliver_email();
}
}
最后,修复直接输出而不是返回HTML字符串的损坏的短代码:
function cf_shortcode() {
ob_start();
html_form_code();
return ob_get_clean();
}
其他注意事项:
为所有内容添加前缀,但选择一个比cf
您不需要包括PHPMailer文件,wp_mail
它的过滤器会很好exit
标题重定向后的语句使用wp_safe_redirect
而不是header
不要硬编码URL,有一些功能可以实现,例如。home_url()
etc