WordPress の Contact Form 7 プラグインは通常のフォーム送信ではなく、Ajax(REST API) の機能で入力内容を送信しており、画面をリロードさせることなく送信処理が行われます。
通常のフォーム送信でも良いようなものですが、サーバーとの通信量を劇的に減らすことができるため、Ajax による送信にはメリットがあります。
送信時にユーザー情報を取得できない
しかし、Contact Form 7 の Ajax による送信では、送信時にログインユーザーを取得することができません。
ログインしているユーザーによって送信時の処理を変化させたい場合などに不都合が生じます。
WordPress の REST API 公式ドキュメントには以下のように記述されています。
For developers making manual Ajax requests, the nonce will need to be passed with each request. The API uses nonces with the action set to
REST API Handbook : https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/#cookie-authenticationwp_rest
. These can then be passed to the API via the_wpnonce
data parameter (either POST data or in the query for GET requests), or via theX-WP-Nonce
header. If no nonce is provided the API will set the current user to 0, turning the request into an unauthenticated request, even if you’re logged into WordPress.
DeepL の力を借りて日本語に翻訳すると、以下のようになります。
API では、アクションを wp_rest に設定した nonce を使用します。これらは、_wpnonce データパラメータ (POST データまたは GET リクエストのクエリ内) または X-WP-Nonce ヘッダを介して API に渡すことができます。nonce が提供されない場合、API は現在のユーザーを 0 に設定し、WordPress にログインしていても認証されていないリクエストになります。
https://www.deepl.com/
つまり、REST API でログイン情報を取得するためには nonce を送信する必要があります。
nonce が何か、という説明は公式ドキュメントを参照いただきたいのですが、もともとは WordPress 操作が悪意あるものかどうかをチェックし、弾くためのものです。
これをサーバーに送信することで、操作しているユーザーを WordPress に認識させることができます。
具体的な方法
テーマの functions.php か、独自のプラグインなどに以下の記述を追加してください。
function my_wpcf7_form_hidden_fields($hidden_fields){ if(is_user_logged_in()){ $hidden_fields['_wpnonce'] = wp_create_nonce( 'wp_rest' ); } return $hidden_fields; } add_filter('wpcf7_form_hidden_fields', 'my_wpcf7_form_hidden_fields');
フォームの中に nonce のフィールドを追加することで、Contact Form 7 の Ajax 処理でサーバーに nonce を送信させることができます。
wpcf7_form_hidden_fields
フィルターフックは、フォーム中の隠しフィールドを追加するためのフックです。
追加しかできません。
Contact Form 7 の処理に必要な隠しフィールドに対して操作が行われないようにするためと思われます。
is_user_logged_in
の分岐でログインしている場合にのみ nonce を出力するようにしています。
非ログイン状態で出力された nonce がログインしてからも使われて、ログインユーザーを取得できない状態になるのを避けるためです。
ログインしてからしか表示できないフォームであればこの分岐は必要ないかもしれません。
追記:以下の方法で nonce を有効にすることもできます。
add_filter( 'wpcf7_verify_nonce', '__return_true' );
参考:https://contactform7.com/ja/2017/08/18/contact-form-7-49/
通常のフォーム送信での方法
上記にも書きましたが、通常のフォーム送信であればユーザー情報を取得することができます。
Contact Form 7 では、公式な通常のフォーム送信にする方法があります。
wp-config.php に以下の記述を追加します。
define ('WPCF7_LOAD_JS', false);
php ファイルの変更することに不安を感じる方は、こちらのやり方の方が無難かもしれません。
参考)https://contactform7.com/ja/loading-javascript-and-stylesheet-only-when-it-is-necessary/