WooCommerceのメールテンプレート編集 〜配達希望日時を取得〜

スタッフブログ

こんにちは、マークアップエンジニアの尾高です。

過去二回の記事でWooCommerceによって送信されるEメールの内容を変更した時のことを書いてきました。

今回はその時の続きとして、配達希望日時の指定が有る場合と、無い場合でEメールの内容を変更した時のことを書きます。

始めに

私はWordPressやPHPの知識がほとんど無かったので、ソースコードや公式のドキュメントを調べながら作業を進めていました。なので、その時調べて分かったことも含めて書いていきます。

配達希望日時について

配達希望日時の入力フォームはWooCommerceの日本対応プラグイン「Japanized For WooCommerce」によって支払画面に追加されるものなので、WooCommerce自体に元々用意されているフォームではありません。

そして「Japanized For WooCommerce」を有効にしていれば配達希望日時もEメールに出力してくれますが、今回それは使わずにテンプレートを作成します。「Japanized For WooCommerce」による配達希望日の出力を停止する方法はご紹介いたしませんので、あらかじめご了承ください。

取得する情報の確認

入力フォームがあるということは何らかの形でデータを保存しているはずと思ったので、HTMLを確認してその後プラグインのPHPファイルを調べます。

HTML

ブラウザに読み込まれた後のソースコードを見てみると、配達希望日の<select>要素のname属性にはwc4jp_delivery_dateという値が設定されています。

<select name="wc4jp_delivery_date" class="input-select" id="wc4jp_delivery_date">
    <option value="0">指定日なし</option>
    <option value="2020-03-31">2020年3月31日</option>
<!-- 省略 -->

PHP

そしてwc4jp_delivery_dateという値をソースコード内で検索するとclass-jp4wc-delivery.phpというファイルの124行目によって出力されています。

echo '<select name="wc4jp_delivery_date" class="input-select" id="wc4jp_delivery_date">';
echo '<option value="0">'.$setting['unspecified-date'].'</option>';

さらに同じclass-jp4wc-delivery.phpの178行目で、update_order_meta()関数内のupdate_post_meta()関数によって値が保存されています。

function update_order_meta( $order_id ) {

    // 省略

    if( isset($date) && $date != 0 ){
        if(get_option( 'wc4jp-date-format' )){
            $date = strtotime($date);
            $date = date(get_option( 'wc4jp-date-format' ),$date);
        }
        update_post_meta( $order_id, 'wc4jp-delivery-date', esc_attr(htmlspecialchars($date)));
    }

    // 省略
}

update_post_meta()はWordPress関数で、投稿ID、カスタムフィールドのキー名、更新後の値、の順に引数を受け取って値を保存します。WooCommerceの注文は一つの投稿として管理されているので、この場合は投稿IDと注文IDは同じような意味で捉えて問題ありません。

簡単に整理すると

  • 注文時に<select>要素のwc4jp_delivery_dateをキーとして、選択された配達希望日の値をサーバーへPOST。
  • ブラウザからPOSTされた値を注文ごとに紐付いたカスタムフィールドの値として保存。

という流れでフォームの値が保存されていました。

※POSTを簡単に説明すると、ブラウザからサーバーに情報を送る方法です。

以上のことから、保存されたカスタムフィールドの値をメールテンプレート内で取得し、その値によって条件分岐をしてEメールの内容を変更すれば今回の目的は達成できます。

メールテンプレートの編集

ここから本題ですが、例として前々回の記事でテーマディレクトリ内にコピーしたプレーンメールのcustomer-invoice.phpに記述しました。

カスタムフィールドの値の取得

まずはメールテンプレート内でカスタムフィールドの値を取得します。

// お客様が選択した希望日時の値を取得
$deliveryDate = get_post_meta(get_the_ID(), "wc4jp-delivery-date", true);
$deliveryTimeZone = get_post_meta(get_the_ID(), "wc4jp-delivery-time-zone", true);

get_post_meta()の第1引数はカスタムフィールドの値を取得したい投稿のIDです。

第2引数は取得したい値のキー名です。ここでは配達希望日時を取得したいので、先ほどのwc4jp_delivery_dateで希望日をwc4jp-delivery-time-zoneで希望時間帯を取得します。これはそれぞれ<select>要素のname属性に指定されていたものです。

第3引数は返り値の型の指定です。何も指定しなければfalseを指定したことになり、配列で値が返ってきます。trueを指定すると文字列として値が返ってきます。

取得した値をもとに条件分岐

if文でEメールの内容を条件分岐します。

if($deliveryDate === "" && $deliveryTimeZone === ""){
    // 日時ともに希望なしの場合
    $deliveryDateAndTime = "商品はご用意でき次第発送させていただきます。";
}else{
    // 日時どちらかでも希望がある場合
    $deliveryDateAndTime = "お届け予定日時は以下の通りです。\n\n"
    . "お届け予定日:" . ($deliveryDate ?: "指定日なし") . "\n"
    . "お届け時間帯:" . ($deliveryTimeZone ?: "時間指定なし");
}

\nは改行コードで、2回続けると1行空白を作れます。
?:は三項演算子の省略形です。例えば式1?:式2のような記述の場合、式1がtrueであれば式1を、そうでなければ式2を返すという意味です。ここでは希望があればその値を、なければ"希望なし"を出力するために使用しています。

以上で配達希望日時の有無によってEメールの内容を変えることができました。

最後に

3回に渡ってWooCommerceのEメールテンプレートを編集する方法をご紹介してきました。
私自身WooCommerceはもちろん、WordPressもPHPもほとんどさわったことが無かったのでとても良い経験になりました。おそらくもっと良い方法があるのだろうな、というところも多々あるので、もっと経験を積んで最適な方法を選択していけたらなと思います。