問題描述

在為用户 (前端) 的插件中尋找適當的表單提交處理時,我偶然發現了這篇文章 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。