0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-10-25

概要

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

スクリーンショット 2022-10-21 194014.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'] にはそれが代入されます。
この $thisWC_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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?