web-dev-qa-db-ja.com

admin-post付きの$ _POSTフォームリクエスト

アクションadmin-post.phpを使用して、次のマークアップを使用してフォームを使用しようとしました

<form method='post' action='admin-post.php'>

私はアクションフックを使用しています Wordpressが提案している $ _POSTパラメータを進めるために/それはうまく機能します。しかし、実行後、空白のページが表示され、プラグインページにリダイレクトされませんでした。もちろん、リファラーを使ってカスタムリダイレクトを設定することもできますが、それは通常の動作ですか?

回避策は、action=""を使用して、通常のプラグインコードでリクエストを取得することです。

7
Rubberducker

もう少し遅れるかもしれませんが、問題を突き止めているときに私はこれにつまずいたので、将来の人々に見つけたものを提供すると思いました。

基本的な原則はactionという名前の隠し入力を持つことであり、その値はカスタムセット識別子です。例えば

<input name='action' type="hidden" value='custom_form_submit'>

この入力とadmin-post.phpを指すフォームのアクションを使ってアクションを設定できます。このアクションはadmin_post_custom_form_submitを使って設定します。

物事をより複雑にするために、wp_nonce_fieldを使うことができます。基本的にはランダムな$ _POST値を追加します。けっこうだ。

次に、アクションを次のように設定します。

add_action('admin_post_custom_form_submit','our_custom_form_function');

admin-post.phpに送信されたフォームがあり、custom_form_submitのアクション値があるとき、関数our_custom_form_functionが呼び出されます。 :D

function our_custom_form_function(){
    //print_r($_POST);
    //you can access $_POST, $GET and $_REQUEST values here. 
    wp_redirect(admin_url('admin.php?page=your_custom_page_where_form_is'));
   //apparently when finished, die(); is required. 
}

今、あなたはあなたが白いページを得ると言います。これは、フォームにリダイレクトする必要があるためです。私は単純なwp_redirect()を使いました

これが役に立ったことを願っています:)私はどうやってバリデーションをしてエラーを我々のリダイレクトフォームに返すことができるかを試してみるつもりです。私は最も簡単なアイデアは$_GET値を作りそれを私たちのページで見つけることだと思いますが、それは素晴らしいことではありませんか?

また、一度送信された$_POSTがクリアされたこともわかりました。 DXこれはおそらくリダイレ​​クトに関係しています。私はグーグルを持っていて、私が見つけることができるものを見るでしょう:d

これが役に立ったことを願います:)

_アップデート_

私はもう少し仕事をして、値を返すための唯一の本当の方法が$ _GET変数を使うことであることに気づきました。このようにして、投稿値を再入力することができます。 '@'などの特殊文字を確実に含めるためにurlencode()を使用することを忘れないでください。

私は自分が取り組んでいたものと一緒に複数のページを持っていたので、私は異なるページへの2つの異なるリダイレクトを行い、エラーなどを含めました。私のフォームの上にそれらをチェックしました。

もう一つの便利な機能。 http_build_request()は配列を 'url safe'配列に変えることができますので、あなたはそれらを$ _GETリクエストなどで送ることができます。

16
sourRaspberri

リダイレクトする前に、検証エラーを保存して一時的な値に値を投稿できます。これらの値は、URLのリダイレクト後も維持されます。

これがまさにエラーを返すときにWP coreがSettings APIに対して行う方法です。

そう:

- フォームデータの検証

set_transient()で一時的にポストデータをストアする

一時的なエラーを保存します。

- フォーム出力へのリダイレクト

一時的なエラーをチェックする

トランジェントからフォームフィールドに投稿値を-load

一時的なセッションの代わりにセッションまたはオプションAPIを使用できます。

今は、フロントエンドと管理者の両方でフォーム送信を処理するさまざまな方法を試しています。 admin_post_ {action}がリダイレクトを介してデータとエラーを永続化する必要があるため、それほど便利であるとは思いません。 initまたはadmin_initフックを使用してフォーム送信を確認するほうが簡単かもしれません。単にフォームを同じページにポストバックし、フォームが表示される前にフォーム送信を処理することもできます。

3
mos fetish