アクションadmin-post.php
を使用して、次のマークアップを使用してフォームを使用しようとしました
<form method='post' action='admin-post.php'>
私はアクションフックを使用しています Wordpressが提案している $ _POSTパラメータを進めるために/それはうまく機能します。しかし、実行後、空白のページが表示され、プラグインページにリダイレクトされませんでした。もちろん、リファラーを使ってカスタムリダイレクトを設定することもできますが、それは通常の動作ですか?
回避策は、action=""
を使用して、通常のプラグインコードでリクエストを取得することです。
もう少し遅れるかもしれませんが、問題を突き止めているときに私はこれにつまずいたので、将来の人々に見つけたものを提供すると思いました。
基本的な原則は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リクエストなどで送ることができます。
リダイレクトする前に、検証エラーを保存して一時的な値に値を投稿できます。これらの値は、URLのリダイレクト後も維持されます。
これがまさにエラーを返すときにWP coreがSettings APIに対して行う方法です。
そう:
- フォームデータの検証
set_transient()で一時的にポストデータをストアする
一時的なエラーを保存します。
- フォーム出力へのリダイレクト
一時的なエラーをチェックする
トランジェントからフォームフィールドに投稿値を-load
一時的なセッションの代わりにセッションまたはオプションAPIを使用できます。
今は、フロントエンドと管理者の両方でフォーム送信を処理するさまざまな方法を試しています。 admin_post_ {action}がリダイレクトを介してデータとエラーを永続化する必要があるため、それほど便利であるとは思いません。 initまたはadmin_initフックを使用してフォーム送信を確認するほうが簡単かもしれません。単にフォームを同じページにポストバックし、フォームが表示される前にフォーム送信を処理することもできます。