前回は、既存のメールテンプレートを利用して送信する方法をやってみました。

今回は、独自のメールテンプレートを作成して送信してみます。既存のメールテンプレートを複製して作成していきます。

スポンサーリンク

はじめに

今回やりたいこと

独自のメールテンプレートを作成して送信する方法

制作環境 / テスト環境

  • WooCommerce 2017/12/2時点の最新です。

手順

1. ベースとなる既存メールテンプレートの選択

一から作成するのは面倒そうなので、ベースとなるメールテンプレートを選びます。

メールテンプレートは、「Woocommerceプラグインフォルダ > Templates > emails」フォルダ内にあります。

2. 既存メールテンプレートを複製&自身のテーマ内に移動

1で選択した既存メールテンプレートを複製して、自身のテーマ内に移動します。

移動先:「自身のテーマ内 > woocommerce > emails」

移動したら、ファイル名を変更しておきます。

3. functions.phpにコードを追加

自身のテーマ内のfunctions.phpにコードを追加していきます。

今回は、下記の条件にします。

ステータス → 自作ステータス「wc-my-status」

ベースの既存メールテンプレート → 処理中のテンプレート「emails/customer-on-hold-order.php」

今回カスタマイズする独自メールテンプレート → 「emails/customer-my-status.php」

変更前(前回使用した)コード

今回は、前回記載した「変更後のコード」のコードから変更したいと思います。

function my_order_status_changed( $order_id, $old_status, $new_status ) {

    $mailer = WC()->mailer();
    $order = new WC_Order( $order_id );

    // 自作ステータスに変更された場合のみ送信する
    if( $new_status === 'my-status' ) {
        // 使用メールテンプレート
        $template = 'emails/customer-processing-order.php';

        // メールの件名
        $subject = sprintf( __( 'Order %s received' ), $order_id );
        // メール本文の見出し
        $content_heading = $subject.' 見出し';
        // メール本文の中身
        $content = wc_get_template_html(
            $template,
            array(
                'order'         => $order,
                'email_heading' => $content_heading,
                'sent_to_admin' => true,
                'plain_text'    => false,
                'email'         => $mailer
            )
        );

        // メール送信
        wc_mail( $recipient, $subject, $content );
    }
}
add_action( 'woocommerce_order_status_changed', 'my_order_status_changed', 10, 3 );

変更後のコード

function my_order_status_changed( $order_id, $old_status, $new_status ) {

    $mailer = WC()->mailer();
    $order = new WC_Order( $order_id );

    // 自作ステータスに変更された場合のみ送信する
    if( $new_status === 'my-status' ) {
        // 使用メールテンプレート → 自身のメールテンプレートのファイル名に変更
        $template = 'emails/customer-my-status.php';

        // メールの件名
        $subject = sprintf( __( 'Order %s received' ), $order_id );
        // メール本文の見出し
        $content_heading = $subject.' 見出し';
        // メール本文の中身
        $content = wc_get_template_html(
            $template,
            array(
                'order'         => $order,
                'email_heading' => $content_heading,
                'sent_to_admin' => true,
                'plain_text'    => false,
                'email'         => $mailer
            )
        );

        // メール送信
        wc_mail( $recipient, $subject, $content );
    }
}
add_action( 'woocommerce_order_status_changed', 'my_order_status_changed', 10, 3 );

今回変更したのは、使用メールテンプレートのファイル名の部分のみです。

参照

4. 独自メールテンプレートのカスタマイズ

あとは、複製して自身のテーマ内に移動してきた独自メールテンプレート「自身のテーマ内 > woocommerce > emails > customer-my-status.php」の内容を好きなように変更していくだけです。

今回は、試しに26行目あたりの「'woocommerce_email_header'」の下に、テキストを追加してみました。

<?php // customer-my-status.php 内(customer-on-hold-order.phpを複製)

do_action( 'woocommerce_email_header', $email_heading, $email ); ?>

<h2>独自テンプレート テスト</h2>

<p><?php _e( "Your order is on-hold until we confirm payment has been received. Your order details are shown below for your reference:", 'woocommerce' ); ?></p>

独自メールテンプレート「自身のテーマ内 > woocommerce > emails > customer-my-status.php」に試しに追加した内容が反映されて送信できました!

あとはいろいろ好きに変えていけばよさそうです。

おまけ

メール本文の中身のところで使用している「wc_get_template_html()」の第二引数の配列ですが、ここでは、メールテンプレートへ渡す値を入れます。

// メール本文の中身
$content = wc_get_template_html(
    $template,
    array(
        'order'         => $order,
        'email_heading' => $content_heading,
        'sent_to_admin' => true,
        'plain_text'    => false,
        'email'         => $mailer
    )
);

試しに、下記のように独自の値を入れてみます。

// メール本文の中身
$content = wc_get_template_html(
    $template,
    array(
        'order'         => $order,
        'email_heading' => $content_heading,
        'sent_to_admin' => true,
        'plain_text'    => false,
        'email'         => $mailer,
        'my_data'  => 'テストデータです。'// 自作データ
    )
);

「my_data」として、テキストを追加してみました。

独自メールテンプレート「自身のテーマ内 > woocommerce > emails > customer-my-status.php」を、上で追加した「my_data」を表示するように変更します。

<?php // customer-my-status.php 内(customer-on-hold-order.phpを複製)

do_action( 'woocommerce_email_header', $email_heading, $email ); ?>

<h2>独自テンプレート テスト</h2>
<h3><?php echo $my_data; ?></h3>

<p><?php _e( "Your order is on-hold until we confirm payment has been received. Your order details are shown below for your reference:", 'woocommerce' ); ?></p>

「wc_get_template_html()」で追加した値が反映されて送信できました!

完成コード

自身のテーマ内functions.php

function my_order_status_changed( $order_id, $old_status, $new_status ) {

    $mailer = WC()->mailer();
    $order = new WC_Order( $order_id );

    // 自作ステータスに変更された場合のみ送信する
    if( $new_status === 'my-status' ) {
        // 使用メールテンプレート → 自身のメールテンプレートのファイル名に変更
        $template = 'emails/customer-my-status.php';

        // メールの件名
        $subject = sprintf( __( 'Order %s received' ), $order_id );
        // メール本文の見出し
        $content_heading = $subject.' 見出し';
        // メール本文の中身
        $content = wc_get_template_html(
            $template,
            array(
                'order'         => $order,
                'email_heading' => $content_heading,
                'sent_to_admin' => true,
                'plain_text'    => false,
                'email'         => $mailer,
                'my_data'  => 'テストデータです。'// 自作データ
            )
        );

        // メール送信
        wc_mail( $recipient, $subject, $content );
    }
}
add_action( 'woocommerce_order_status_changed', 'my_order_status_changed', 10, 3 );

自身のメールテンプレート:テーマ内 > woocommerce > emails > customer-my-status.php

26行目あたり

<?php // customer-my-status.php 内(customer-on-hold-order.phpを複製)

do_action( 'woocommerce_email_header', $email_heading, $email ); ?>

<h2>独自テンプレート テスト</h2>
<h3><?php echo $my_data; ?></h3>

<p><?php _e( "Your order is on-hold until we confirm payment has been received. Your order details are shown below for your reference:", 'woocommerce' ); ?></p>

まとめ

今回は、既存のメールテンプレートを複製して独自メールテンプレートを作成して送信することができました。

任意のタイミングで送信したかったので、とりあえず目的は達成できましたが、そのうちもう少し直していきたいと思います。

参考にさせていただきました


スポンサーリンク