问题描述
在为用户 (前端) 的插件中寻找适当的表单提交处理时,我偶然发现了这篇文章 Handling POST Requests the WordPress Way,它鼓励使用 admin-post.php
来实现此目的。查看标题我们可以找到某种确认:
/**
* WordPress Generic Request (POST/GET) Handler
*
* Intended for form submission handling in themes and plugins.
*
* @package WordPress
* @subpackage Administration
*/
我的主要关注点是这种方法来自于 WP 代码的管理部分,并且它在 non-admin 任务中的使用使得一些歧义。
任何人 (特别是 WP 作者) 都可以确认这个方法的意图是真的整体的还是管理的?
最佳解决方案
admin-post.php
就像一个处理请求的穷人控制器。
在这种意义上说,您不需要在 init
等替代钩子上处理您的请求,并检查超级页面上是否存在特殊键,这是有用的,如:
function handle_request() {
if ( !empty($_POST['action']) && $_POST['action'] === 'xyz' ) {
//do business logic
}
}
add_action('init', 'handle_request');
而是使用 admin-post.php,可以指定一个回调函数,该函数将始终在提供与提供给操作的后缀匹配的操作值的任何请求上调用。
function handle_request() {
//do business logic here...
}
add_action( 'admin_post_handle_request', 'handle_request' );
add_action( 'admin_post_nopriv_handle_request', 'handle_request' );
在上面的例子中,我们可以放弃需要检查!empty($_POST['action']) && $_POST['action'] === 'xyz'
,因为在这一点上我们已经处理了这些处理。
这是指定 action 参数和值并将所述值发布到 admin-post.php
URL 的结果。
另外有什么好处的是 admin-post.php
可以处理 $_POST
和 $_GET
,所以检查请求是什么样的方法是非常重要的,除非你想要更复杂的处理。
底线:
它是安全的使用,这只是你的名字。
顺便说一句,你也应该记得 wp_redirect()
用户回到可接受的位置,因为 admin-post.php
将返回一个白色屏幕作为其响应。
次佳解决方案
在 admin-post.php
中使用 nopriv
处理 (对于非登录用户) 来说,这对于前端和后端表单处理来说都是可用的,与 admin-ajax.php
的使用非常相似,这一点看起来是相当清楚的。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。