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
    } );
});

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です