背景
wordpress開発においてContact Form7を用いてフォームを作成する際、メールに(yyyy年mm月dd日 hh:mm)という形式で送信日時を表示する必要がありました。
しかし、日時のデフォルト表記は決まっており、そのままでは理想通りの成形(yyyy年mm月dd日 hh:mm)ができない状態でした。
同じような成形を行なっているナレッジが少なかったことから、備忘録という形で記事にさせていただきます。
実現したいこと
管理者用メール、フォール送信者用メールの2つのメールに(yyyy年mm月dd日 hh:mm)形式の日時を表示させること。
結論
以下のコードをfunctions.phpに記載し、WordPress管理画面で[custom-date]を用いることで、フォーム送信の日時を自分好みに成形して表示させることができます。
// フォーム入力時の日時を整形してメールに表示
add_action('wpcf7_before_send_mail', 'add_custom_cf7_date_before_mail');
function add_custom_cf7_date_before_mail($wpcf7_data)
{
date_default_timezone_set('Asia/Tokyo');
$current_date = date('Y年n月j日 G:i');
// メールのプロパティを取得し [custom-date] を置換
$mails = ['mail' => $wpcf7_data->prop('mail'), 'mail_2' => $wpcf7_data->prop('mail_2')];
foreach ($mails as $key => &$mail) {
if (!empty($mail)) {
$mail['body'] = str_replace('[custom-date]', $current_date, $mail['body']);
}
}
$wpcf7_data->set_properties($mails);
return $wpcf7_data;
}
コード部分の説明
関数宣言部分
add_action('wpcf7_before_send_mail', 'add_custom_cf7_date_before_mail');
function add_custom_cf7_date_before_mail($wpcf7_data)
wpcf7_before_send_mailは、Contact Form 7 がメールを送信する前に呼ばれるフックであり、add_custom_cf7_date_before_mailという関数をこのフックに登録しています。
※メール送信する前に呼ばれる=メール送信時の日時取得が可能
また、$wpcf7_dataは送信フォーム全体のデータ(フォームの内容やメール設定など)が入ったオブジェクトであり、これを引数として受け取ることでフォームに設定されたメールの本文を取得できるようになります。
現在時刻の取得部分
// タイムゾーンを東京に合わせる
date_default_timezone_set('Asia/Tokyo');
// function実行時刻(フォーム送信時刻)を取得し、「'Y年n月j日 G:i'」という形式に成形
$current_date = date('Y年n月j日 G:i');
PHPのdate()関数を使うことで、現在の日時(時刻を含む)を取得し、好きなフォーマットで表示することが可能になります。
メール設定の取得部分
// メールのプロパティを取得し [custom-date] を置換
$mails = ['mail' => $wpcf7_data->prop('mail'), 'mail_2' => $wpcf7_data->prop('mail_2')];
Contact Form 7 には2つのメール送信設定があり、
・mail → 管理者宛のメール
・mail_2 → ユーザー(フォーム送信者)宛のメール
と設定されています。
ここではそれぞれのメール設定を配列として取得しています。
custom-dateの置換部分
foreach ($mails as $key => &$mail) {
if (!empty($mail)) {
// メール本文($mail['body'])に含まれている [custom-date] という文字列を、変数 $current_date の値に置き換える。
$mail['body'] = str_replace('[custom-date]', $current_date, $mail['body']);
}
}
foreachを用いてメールごとに(管理者宛のメール、フォーム送信者宛のメール)、メール本文に含まれている[custom-date] という文字列を、変数 $current_date の値に置き換えています。
Wordpress側の説明
管理画面のサイドバーより、「お問い合わせ」>「コンタクトフォーム」> タイトルを選択 >「メール」のメッセージ本文に、[custom-date]を入力します。
以上の流れで、(yyyy年mm月dd日 hh:mm)形式の日時を表示することができました!