概要
WooCommerce をバージョン7.0に引き上げると、購入完了時に管理者に送られてくるメールの末尾に「外出先から注文できます。アプリを取得しましょう。」という文言が挿入されます。
「アプリを取得しましょう」をクリックするとスマホ用の WooCommerce アプリの紹介ページに遷移するので、おそらく宣伝のためのものだと思われます。
購入者宛のメールに表示されるわけではないですし、こちらの業務の妨げになるものでもないですが、鬱陶しいことには変わりないので表示しないようにしてみました。
環境
WordPress:6.0.3
WooCommerce:7.0.0
PHP:7.4
原因
今回上記の文言が追加された原因は、WooCommerce のプラグインファイル woocommerce/includes/emails/class-wc-email-new-order.php
に以下のコード(50行目)が追加されたことです。
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)
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
を見てみたいと思います。(説明に不要なコードは省略しています。)
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 {
...
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
クラスのコンストラクタには以下のようなアクションフックが定義されています。
do_action( 'woocommerce_email', $this );
つまりこのアクションフックに関数を追加すれば引数で WC_Emails
クラスのインスタンスを取得することができます。
したがって次のようなコードによって WC_Emails
クラスのインスタンスを取得することができます。
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
関数を削除する処理を書いていきます。
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
フックから削除しています。
全体としては以下のようなコードになります。
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');
自社アプリの宣伝のためだけあってか、一筋縄で削除できないのが辛いですね。