WooCommerce7.0で「外出先から注文できます。アプリを取得しましょう。」が表示される

## 概要
WooCommerce をバージョン7.0に引き上げると、購入完了時に管理者に送られてくるメールの末尾に「外出先から注文できます。アプリを取得しましょう。」という文言が挿入されます。

![スクリーンショット 2022-10-21 194014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261074/796083a6-c32e-64a7-dd29-ce84a7e3863a.png)


「アプリを取得しましょう」をクリックするとスマホ用の WooCommerce アプリの紹介ページに遷移するので、おそらく宣伝のためのものだと思われます。

購入者宛のメールに表示されるわけではないですし、こちらの業務の妨げになるものでもないですが、鬱陶しいことには変わりないので表示しないようにしてみました。

## 環境
WordPress：6.0.3
WooCommerce：7.0.0
PHP：7.4

## 原因
今回上記の文言が追加された原因は、WooCommerce のプラグインファイル ```woocommerce/includes/emails/class-wc-email-new-order.php``` に以下のコード（50行目）が追加されたことです。

``` class-wc-email-new-order.php
add_action( 'woocommerce_email_footer', array( $this, 'mobile_messaging' ), 9 ); // Run before the default email footer.
```
これに紐づけられている ```mobile_messaging``` 関数が上記の文言を表示しています。

プラグインファイルからこのコードを直接削除するのはあまりよろしくないので、テーマの ```functions.php``` から ```remove_action``` する方向で考えていきたいと思います。

## 結論
以下のコードをお使いのテーマの ```functions.php``` に追加してください。（コピペOK）

``` functions.php
function remove_email_app_link ($email_class) {
	remove_action('woocommerce_email_footer', array($email_class->emails['WC_Email_New_Order'], 'mobile_messaging'), 9);
}

add_action('woocommerce_email', 'remove_email_app_link');
```

## 解説
自分の勉強をかねて上記コードの解説を書いてみました。
したがって、上記のコードを見て何が行われているのかが分かる方は無視していただいて構いません。

コードの内容を理解するために、まずは ```woocommerce/includes/emails/class-wc-email-new-order.php``` を見てみたいと思います。（説明に不要なコードは省略しています。）
``` class-wc-email-new-order.php
if ( ! class_exists( 'WC_Email_New_Order' ) ) :

	/**
	 * New Order Email.
	 *
	 * An email sent to the admin when a new order is received/paid for.
	 *
	 * @class       WC_Email_New_Order
	 * @version     2.0.0
	 * @package     WooCommerce\Classes\Emails
	 * @extends     WC_Email
	 */
	class WC_Email_New_Order extends WC_Email {
        /**
		 * Constructor.
		 */
		public function __construct() {
            ...
            add_action( 'woocommerce_email_footer', array( $this, 'mobile_messaging' ), 9 ); // Run before the default email footer.
            ...
        }
        ...
        public function mobile_messaging( $email ) {
			if ( $email instanceof WC_Email_New_Order && null !== $this->object ) {
				$domain = wp_parse_url( home_url(), PHP_URL_HOST );
				wc_get_template(
					'emails/email-mobile-messaging.php',
					array(
						'order'   => $this->object,
						'blog_id' => class_exists( 'Jetpack_Options' ) ? Jetpack_Options::get_option( 'id' ) : null,
						'now'     => new DateTime(),
						'domain'  => is_string( $domain ) ? $domain : '',
					)
				);
			}
		}
    }
}

endif;

return new WC_Email_New_Order();
```
```mobile_messaging``` 関数が ```WC_Email_New_Order``` クラスのコンストラクタ内部で ```woocommerce_email_footer``` フックに追加されているのが分かります。
また、この関数は ```WC_Email_New_Order``` クラスのメソッドであるため、このクラスのインスタンス（```$this```）と共に配列形式で追加されているのが分かります。

メールから宣伝の文言を削除するためには ```mobile_messaging``` 関数をフックから削除する必要があります。
そのためには ```WC_Email_New_Order``` クラスのインスタンスを取得し、```remove_action``` で同じ様に使えばよいわけです。

次に ```woocommerce/includes/class-wc-emails.php``` を見てみましょう。

``` class-wc-emails.php
class WC_Emails {
   ...
    public function init() {
        $this->emails['WC_Email_New_Order'] = include __DIR__ . '/emails/class-wc-email-new-order.php';
        ...
    }
}

```
```init``` 関数内部で先ほどの ```class-wc-email-new-order.php``` を include しているのが分かります。
そしてこのファイルは最後の行で ```WC_Email_New_Order``` クラスのインスタンスを return しているため、```$this->emails['WC_Email_New_Order']``` にはそれが代入されます。
この ```$this``` は ```WC_Emails``` クラスのインスタンスです。
したがってこのインスタンスをテーマの ```functions.php``` から取得できれば、```WC_Email_New_Order``` クラスのインスタンスも取得することができます。

さて、ここで ```WC_Emails``` クラスのコンストラクタには以下のようなアクションフックが定義されています。
``` class-wc-emails.php
do_action( 'woocommerce_email', $this );
```
つまりこのアクションフックに関数を追加すれば引数で ```WC_Emails``` クラスのインスタンスを取得することができます。

したがって次のようなコードによって ```WC_Emails``` クラスのインスタンスを取得することができます。

``` functions.php
function remove_email_app_link ($email_class) {
	// $email_classがWC_Emailsクラスのインスタンス
}

add_action('woocommerce_email', 'remove_email_app_link');
```

そして ```remove_email_app_link``` 関数の内部に ```mobile_messaging``` 関数を削除する処理を書いていきます。

``` functions.php
remove_action('woocommerce_email_footer', array($email_class->emails['WC_Email_New_Order'], 'mobile_messaging'), 9);
```

```$email_class->emails['WC_Email_New_Order']``` で ```WC_Email_New_Order``` クラスのインスタンスを取得し、```mobile_messaging``` 関数を ```woocommerce_email_footer``` フックから削除しています。

全体としては以下のようなコードになります。

``` functions.php
function remove_email_app_link ($email_class) {
	remove_action('woocommerce_email_footer', array($email_class->emails['WC_Email_New_Order'], 'mobile_messaging'), 9);
}

add_action('woocommerce_email', 'remove_email_app_link');
```

自社アプリの宣伝のためだけあってか、一筋縄で削除できないのが辛いですね。

## 参考
[WooCommerceメールカスタマイズ(1)送信タイミングの変更｜とりいただし｜note](https://note.com/monbuu/n/na75f6710bc98)