私はカスタム管理ページからフォームを介してデータを送信するプラグインに取り組んでいます。これは私のフォームを簡略化したものです。
<form action="<?php echo plugin_dir_path(); ?>/process.php" method="post">
<input type="text" name="keyName">
<input type="submit" value="Update">
</form>
フォームはプラグインのための私のメインのphpファイルの中にあるので、それは私が上で呼んだplugin_dir_path()のようなすべてのWordPress機能へのアクセスを持っています。
しかし、ユーザーが「送信」ボタンをクリックし、$ _POST変数が「process.php」スクリプトに送信されると、そのプロセススクリプト内のすべてのWordPress機能にアクセスできなくなります。
WordPressの機能を外部スクリプトに追加する方法を調べたところ、次の質問がありました。 外部スクリプトでWordPressのコア機能を呼び出す方法を教えてください。
提供された答えは私が私の処理スクリプトの一番上に次のコード行を含めることです。
require_once("wp-load.php");
しかし、私がやると "wp-load.php"が現在のURLの末尾に追加され、404型エラーが発生します。私は "get_site_directory()"関数を使ってメインのWordPressインストールディレクトリを指定することはできません。これはWordPress関数だからです。
どうすればこれを機能させることができますか?自分のカスタム送信ボタンに対してフォームを送信するために使用すべきアクションフックはありますか?
プラグインファイルに直接投稿することは絶対に避けてください。これはほとんど常にセキュリティ上の欠陥であり、サイトの所有者がサイトを適切に強化することを妨げます(完璧な状況ではwp-content
内のPHPファイルへの要求はまったく必要ないはずです)
良い習慣は admin_post
actions ...を使うことです(admin_ajax
に似ています)。
だからあなたのフォームはこんな感じになるはずです。
<form action="<?php echo esc_attr('admin-post.php'); ?>" method="post">
<input type="hidden" name="action" value="my_action" />
<input type="text" name="keyName">
<input type="submit" value="Update">
</form>
そして、あなたのプラグインにあなたのアクションメソッドを追加します:
add_action( 'admin_post_my_action', 'prefix_admin_my_action' );
add_action( 'admin_post_nopriv_my_action', 'prefix_admin_add_foobar' );
function prefix_admin_my_action() {
// Handle request then generate response using echo or leaving PHP and using HTML
}
PS。そのフォームの中にも nonces を含めることは常に良い考えです。