web-dev-qa-db-ja.com

フォーム処理スクリプトからWordPressの機能を呼び出す方法

私はカスタム管理ページからフォームを介してデータを送信するプラグインに取り組んでいます。これは私のフォームを簡略化したものです。

<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関数だからです。

どうすればこれを機能させることができますか?自分のカスタム送信ボタンに対してフォームを送信するために使用すべきアクションフックはありますか?

2
YAHsaves

プラグインファイルに直接投稿することは絶対に避けてください。これはほとんど常にセキュリティ上の欠陥であり、サイトの所有者がサイトを適切に強化することを妨げます(完璧な状況では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 を含めることは常に良い考えです。

5