読みもの

Web制作や保守に関する読みものを掲載しています。

【WordPress】カスタマイズしているContact Form 7を6.2以上に上げた際に、メールが送信できなくなった時に確認すること

  • 技術情報

ちょうどXにポストをしたこちらの件の詳細をまとめた投稿です。

先日、お問い合わせフォームから急にメールが送れなくなった!という相談があり対応を行いました。
ちょうどPHPの脆弱性対応騒動のあとで、あらゆるものを安全なバージョンへアップデートしていこう!という機運が高まっていた頃だったので、当該のサイトで使っていたContact Form 7のフォームを最新の6.2.4に上げたところでした。

調査を行ったところ、Contact Form 7 6.2以降で廃止されたクラスを使用していたことがわかったため、対応を行いました。原因と対処法を記事にまとめます。

症状と状況について

  • PHP 8.4.27
  • WordPress 7.1.4(最新版)
  • Contact Form 7 6.2.4(最新版)
    • ふりがなバリデーションをfunctions.php上で定義するかたちで使用していました

症状としては、ふりがなバリデーションの使用如何によらず、Contact Form 7でのすべてのメールの送信ができなくなっていました。エラー表示もなく、送信中のくるくるマークからいつまで経っても先に進まない、というものです。

一時的にContact Form 7のバージョンを6.1.7にダウングレードすると送信できるようになりました。

原因と対策

例えばなにかカスタマイズを行う際に、「Contact Form 7 ふりがなバリデーション」とかで検索して出てきた技術情報を紹介するブログ記事などを参考にカスタマイズを行うことが多いかと思います。今回実装していた際のコードもそうですが、例え参照元が新しくとも古くから使われてきたカスタマイズ向けのコードの場合、かなり前から使用が推奨されない関数やクラスが含まれたままコードだけが継承され続けいろいろなサイトで紹介されていることがあります。

今回はまさにそのパターンで、だいぶ前から非推奨になっており、Contact Form 7 6.2以上では削除になっていた以下のクラスがふりがなバリデーションのカスタマイズ用のコード内に含まれていたことが原因でした。

// Contact Form 7 6.2以降では使えないクラス
WPCF7_Shortcode()
WPCF7_ShortcodeManager()

つまり、これまで便利に使ってきた秘伝のタレ的なコードだからいけるでしょ!と思って、みんなで技術情報としてそれぞれのブログ内で紹介していたけど、実際はだいぶ前から非推奨のものだったのにみんなが使ってるから安全だと思って使っちゃってた、という、なんともインターネット…というお話だったようです。

今回はふりがなバリデーションを実装する際に使用していましたが、ふりがな以外のバリデーションのカスタマイズや、Contact Form 7を拡張するようなプラグインのうちはるか昔に更新が止まったものの中にこの記述が含まれている場合があります。
もしご自身で追加されたものであればWPCF7_FormTag()へ置き換えるなどの措置が必要です(参考:Contact Form 7 4.6:WPCF7_Shortcode は非推奨に)
プラグイン内に記載があるものの場合は、プラグインのフォーラム等から制作者へお問い合わせください。

おまけ:安全なふりがなバリデーションのコードについて

ふりがなバリデーションは英語圏からのスパム避けとして使われることも多いので、その意味で利用されている方もそれなりにいらっしゃると思います。参考までに今回修正したふりがなバリデーションのコードを置いておきます。
元コードにもよりますが、シンプルなひらがなのみのふりがなバリデーションのみであれば「your-kana」部分を適宜修正した上でこちらに差し替えてもらえれば、Contact Form 7の6.2系統でも動作するかと思います。

/**
 * Contact Form 7 6.2以降対応
 * 「your-kana」にひらがなのバリデーションを追加
 */
function custom_wpcf7_validate_kana( $result, $tag ) {

    // ふりがな以外の項目は処理しない
    if ( $tag->name !== 'your-kana' ) {
        return $result;
    }

    // 入力値の取得
    $value = isset( $_POST['your-kana'] )
        && is_string( $_POST['your-kana'] )
        ? trim( wp_unslash( $_POST['your-kana'] ) )
        : '';

    // 任意項目の場合、未入力は許可する
    // 必須項目の未入力チェックはCF7本体に任せる
    if ( $value === '' ) {
        return $result;
    }

    // 全角ひらがなと長音符のみ許可
    if ( ! preg_match( '/^[ぁ-んー]+$/u', $value ) ) {
        $result->invalidate(
            $tag,
            'ひらがなで入力してください。'
        );
    }

    return $result;
}

add_filter(
    'wpcf7_validate_text',
    'custom_wpcf7_validate_kana',
    11,
    2
);

add_filter(
    'wpcf7_validate_text*',
    'custom_wpcf7_validate_kana',
    11,
    2
);

終わりに

「一時的にContact Form 7のバージョンを6.1.7にダウングレードすると送信できるようになった」という記載を上記で行ってはいますが、これはあくまで一時的な対応です。セキュリティアップデートも出ていますので最新版のContact Form 7を利用するようにしましょう!(わたしも安全なコードに置き換えたところから全部最新版にバージョンアップしました✌)

以上、お困りの方の参考になれば幸いです。