您想做的事情不能在短代码中完成。
wp_signon
需要为cookie设置一些HTTP头,但为时已晚。
当你的浏览器接收到一个网页时,它会收到一些标题,告诉它正在接收什么,以及它是否成功,它是404,有什么cookie等等。然后它有一个包含网页本身的主体,例如JSON字符串,或一堆HTML。
So once the headers are sent, and the body starts, no more headers can be sent.
这不是WordPress特有的东西,而是一种通用的HTTP/HTML东西。E、 g.如果您运行一个python应用程序,并向浏览器发送一个标题,告诉它HTTP 200,并且主体部分已经开始,那么python应用程序不能在末尾为cookie添加额外的标题。服务器必须响应一个有效的HTTP请求,该请求遵循浏览器要处理的预期格式,然后JS可能会在浏览器端做一些工作并发出额外的请求,这是不允许的。
因此,如果您使用短代码,输出已经开始,您得到了标题、页面标题和正文标记等。这是正文输出,它需要发送标题来完成这一操作,因此第一次任何类型的输出,即使是空白,PHP都会发送HTTP标题,指示HTML正在进行中。
如果你想打电话wp_signon
, 这必须发生before 出现任何输出。对于这一点,使用短代码为时已晚。
短代码旨在允许您嵌入需要PHP运行的东西,它们从来没有用于此类功能。当然要嵌入一个登录表单,但处理不能在短代码本身中完成,您需要挂接到早期的钩子中,如init
, 查看GET/POST详细信息,查看用户是否提交了表单,然后执行调用所需的所有处理wp_signon
在那一点上。