web-dev-qa-db-ja.com

Admin-post.phpの本当の意図は何ですか?

ユーザのためのプラグインの中で適切なフォーム送信処理を探している間(フロントエンド)、この目的のためにadmin-post.phpを使うことを奨励するこの記事 Handling POST Requests WordPress Way に出会いました。ヘッダを調べると、ある種の確認があります。

 /**
 * WordPress Generic Request (POST/GET) Handler
 *
 * Intended for form submission handling in themes and plugins.
 *
 * @package WordPress
 * @subpackage Administration
 */

私の主な関心事は、このメソッドがWPコードのadmin部分から来ていることと、非adminタスクでそれを使用することには多少のあいまいさがあることです。

誰か(特にWP作者)は、このアプローチの意図が本当に全体論的であること、あるいは私が思うように管理者だけであることを確認できますか?

7

admin-post.phpは、リクエストを処理するための貧弱なmansコントローラのようなものです。

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'をチェックする必要性を無視することができます。この時点で、処理は私たちのために行われているからです。

これは、アクションパラメータと値を指定し、その値をadmin-post.php URLに投稿した結果です。

さらに、admin-post.php$_POST$_GETの両方を処理するので、もっと複雑な処理をしたいのでなければ、要求がどの種類のメソッドであるかを確認する必要はありません。

一番下の行

使用しても安全です、それはあなたを見捨てているのは単なる名前です。

ちなみにadmin-post.phpを要求しても応答として白い画面しか表示されないため、wp_redirect()を使用可能な場所に戻すことを忘れないでください。

10
userabuser

admin-post.phpnopriv処理(非ログインユーザー用)の使用から、これはフロントエンドとバックエンドの両方のフォーム処理に実際に使用可能であり、admin-ajax.phpの使用方法と非常によく似ていることがかなり明確に思えます。

2
majick