【WordPress 入門】 Contact Form 7 をカスタマイズするためにアクション/フィルターフックを使いこなす
WordPress でお問い合わせフォームというと Contact Form 7 が有名ですが、ドキュメントが十分ではないこともあって、たくさん定義されているアクション/フィルターがあまり使われていないような印象があります。ここではいつか使えそうなアクション/フィルターを紹介します。
wpcf7_mail_components
お問い合わせがあったときにメールが wp_mail
関数で送信される前に呼び出されるフィルターです。includes/mail.php にあります。
/**
* フックする関数で受け取れる引数
*
* @param array $components
* @param WPCF7_ContactForm $wpcf7_contact_form
* @param WPCF7_Mail $wpcf7_mail
*/
$components = apply_filters( 'wpcf7_mail_components', $components, wpcf7_get_current_contact_form(), $this );
このフィルターで返す $components
には管理画面で設定した返信メールのタイトル、送信者、本文、送信先、追加ヘッダー、添付が入っています。管理画面で入力する返信メールの「メッセージ本文」では WordPress や PHP の関数を使用することはできませんが、このフィルターを使うと WordPress で使える関数で得られる情報などなんでも本文に追加することができます。例えば何かの会員制サイトでメールの有効性を確かめるために本登録用のURLを送りたいような場合は、
<?php
/**
* @param int $length
* @return string
*/
function str_random ($length = 16 ) {
$string = '';
while ( ( $len = strlen( $string ) ) < $length ) {
$size = $length - $len;
$bytes = random_bytes( $size );
$string .= substr( str_replace( ['/', '+', '='], '', base64_encode( $bytes ) ), 0, $size );
}
return $string;
}
/**
* @param array $components
* @param WPCF7_ContactForm $wpcf7_contact_form
* @param WPCF7_Mail $wpcf7_mail
*/
function wpcf7_mail_components_hook( array $components, WPCF7_ContactForm $wpcf7_contact_form, WPCF7_Mail $wpcf7_mail) {
$activation_url = home_url( '/activate/' . hash_hmac( 'sha256', str_random(40), true ) );
// DB に $activation_url を保存する処理をはさむ
$components['body'] = str_replace( '{{activation_url}}', $activation_url, $components['body'] );
return $components;
}
add_filter( 'wpcf7_mail_components', 'wpcf7_mail_components_hook', 10, 3 );
のようにしておき、管理画面のメッセージ本文で {{activation_url}} というのをどこかに書いておくと、フックした関数で定義した $activation_url
で置き換えることができます。