Contact Form 7で送信先メールがサイトのドメインと異なる場合に知らせてくれるようにするには?
WordPress でお問い合わせフォームを設置する際によく使われるプラグインといえば Contact Form 7 です。Contact Form 7 では設置したお問い合わせフォームから問い合わせがあった場合、管理画面側で設定したメール宛に問い合わせメールが送信されます。この送信先メールですが、本番環境でのセットアップの際に設定し忘れていたりなんてことがあったりすると、実際の問い合わせが制作会社のメール宛に送られてきたり…なんてことがあったりします。ここでは、「WordPress で設定されているドメインとメールアドレスのドメイン名が一致しない場合に、管理画面にエラーメッセージを表示する」ようにするコードを紹介します。
ここでは簡単のために、テーマの functions.php に書くことにします。まずはプラグイン自体の読み込みが終わっており、なおかつテーマの functions.php
に処理を書くことにするため、プラグインとテーマの読み込みが終わった後に発火する after_setup_theme
にフックさせるようにします。
add_action( 'after_setup_theme', function() {
} );
Contact Form 7 ではそれぞれのお問い合わせは wp_posts
テーブルに、その問い合わせフォームのタイトルや送信先メールアドレスは wp_postmeta
テーブルに保存されています。問い合わせ一式はプラグイン内の includes/contact-form.php
で定義されている WPCF7_ContactForm
クラスの find
メソッドで取得できますので、まずは Contact Form 7 で設定されている問い合わせをすべて取得します。
add_action( 'after_setup_theme', function() {
if ( ! is_admin() ) {
return;
}
$forms = WPCF7_ContactForm::find();
} );
管理画面にエラーメッセージを表示させるのが目的ですので、ここでは is_admin
関数を使って管理画面以外の場合には何もしないようにしています。
$forms
は配列になっていますので、foreach
でループさせて各お問い合わせごとの処理をしても良いのですが、find
メソッドではお問い合わせごとに WPCF7_ContactForm
クラスがインスタンス化され、そのインスタンスが配列として返されます。インスタンス化の最後では wpcf7_contact_form
アクションが呼ばれるため、ここでは wpcf7_contact_form
アクションにフックさせて、送信先メールのチェック等を行うことにします。
add_action( 'wpcf7_contact_form', function( WPCF7_ContactForm $form ) {
});
find
メソッドで WPCF7_ContactForm
クラスのインスタンスが生成されること、またインスタンス化の際に wpcf7_contact_form
アクションが呼ばれることは、includes/contact-form.php
内の find
メソッド、コンストラクタ __consturct
で確認できますので、ソースコードをお確かめください。
wpcf7_contact_form
アクションでは WPCF7_ContactForm
インスタンスがコールバック関数に渡されます。インスタンスの get_properties
メソッドを利用すると、問い合わせの送信先メールを取得することができます。
add_action( 'wpcf7_contact_form', function( $form ) {
$properties = $form->get_properties();
$recipient = $properties['mail']['recipient'] ?? '';
if ( ! $recipient ) {
return;
}
$domain = substr( $recipient, strpos( $recipient, '@' ) + 1 );
$is_in_same_domain = strpos( home_url(), $domain ) !== false;
if ( $is_in_same_domain ) {
return;
}
add_action( 'admin_notices', function() use ( $recipient ) {
?>
<div class="notice notice-error is-dismissible">
<p>Contact Form 7 で送信先に指定されているメールアドレスphp echo esc_html( $recipient ); ?>のドメインはサイトのドメインとは異なりますイトのドメインとは異なりますp>
</div>
<?php
} );
});
ここではまず送信先メールアドレスを取得し、それが空文字でないかをチェックしています。空文字でない、つまり設定されている場合はそのアドレスのドメインを求めます。そしてそのドメインが home_url
関数で返される URL に含まれているかどうかをチェックし、含まれていない場合に限り admin_notices
アクションを通してエラーメッセージを表示するようにしています。
以上をまとめると、以下のようなコードになります。
<?php
add_action( 'after_setup_theme', function() {
if ( ! is_admin() ) {
return;
}
$forms = WPCF7_ContactForm::find();
} );
add_action( 'wpcf7_contact_form', function( $form ) {
$properties = $form->get_properties();
$recipient = $properties['mail']['recipient'] ?? '';
if ( ! $recipient ) {
return;
}
$domain = substr( $recipient, strpos( $recipient, '@' ) + 1 );
$is_in_same_domain = strpos( home_url(), $domain ) !== false;
if ( $is_in_same_domain ) {
return;
}
add_action( 'admin_notices', function() use ( $recipient ) {
?>
<div class="notice notice-error is-dismissible">
<p>Contact Form 7 で送信先に指定されているメールアドレスphp echo esc_html( $recipient ); ?>のドメインはサイトのドメインとは異なりますイトのドメインとは異なりますp>
</div>
<?php
} );
});