WooCommerce Extended Coupon Features のクーポン自動適用条件を拡張する

WooCommerce Extended Coupon Features のクーポン自動適用条件を拡張する

『仮面ライダーエグゼイド トリロジー アナザー・エンディング』 全3作を劇場で鑑賞してきた kagata です。テレビシリーズの初めのころはどうなんだろうと心配していたものですが、終わってみれば伏線の改修がたいへん見事で、満足度の高い作品でした。

さて、今回は WordPress の EC プラグイン WooCommerce をカスタマイズするお話です。といってもアドオンをインストールして設定して終わり、ではなく、アドオンをさらに拡張するコードを書いてみます。

WooCommerce Extended Coupon Features について

今回のカスタマイズでは、WooCommerce のアドオン WooCommerce Extended Coupon Features を使用します。

WooCommerce Extended Coupon Features — WordPress プラグイン

WooCommerce には、商品と一緒にカートに入れることで割引を発生させる「クーポン」機能が備わっています。この「クーポン」の機能を拡張するのが WooCommerce Extended Coupon Features です。

このプラグインの中心となる機能は、クーポンの「自動適用」です。WooCommerce の標準機能では、クーポンはユーザーがカート画面などでクーポンコードを入力して初めて機能します。しかしこのアドオンを入れると、「特定の商品をカートに入れたとき」や「特定のロールに属するユーザーがカートに商品を入れたとき」など、指定した条件で所望のクーポンを自動的に適用することができます。

詳しい機能や使い方は、次の記事が参考になります。

WooCommerceのクーポン機能を拡張するプラグイン『WooCommerce Extended Coupon Features』 | WooCommerce日本語解説サイト - WPショップラボ

今回の本題は、この WooCommerce Extended Coupon Features がサポートしていない特殊な条件でクーポンを自動適用するカスタマイズです。

お題:ある固定ページを閲覧したことのあるユーザーに、あるクーポンを自動適用する

たとえば、スラッグ foo-bar という固定ページがあったとします。この固定ページを一度閲覧すると、以降そのユーザーが買い物をするときにはクーポン coupon-foo-bar が自動適用されるようにしてみましょう。

「そのユーザーがあるページを見たことがあるか」を判別してクーポンを自動適用する機能は、WooCommerce Extended Coupon Features には備わっていません。このロジックは独自に書いてやる必要があります。

解1:投稿メタデータを編集する

まず考えられるのは、WooCommerce Extended Coupon Features で設定できる "Allowed Customers" すなわち「クーポン使用許可ユーザー」を動的に設定するという手です。

クーポン使用許可ユーザーは、通常は WooCommerce のクーポン編集画面から設定します。しかしその実態は、投稿タイプ shop_coupon にひもづくメタデータ _wjecf_customer_ids にカンマ区切りで保持されているユーザー ID です。ここまでわかれば、あとは WordPress に用意されている関数でクーポン使用許可ユーザーを自在に変更できます。

/**
 * 固定ページ foo-bar を閲覧すると、
 * そのユーザーがクーポン coupon-foo-bar を使用できるユーザーに追加される
 */
add_action('wp', function () {
    if (is_user_logged_in() && is_page('foo-bar')) {
        // コード coupon-foo-bar のクーポン ID を取得する(WooCommerce の関数)
        $coupon_id = wc_get_coupon_id_by_code('coupon-foo-bar');

        // クーポン coupon-foo-bar の使用を許可されているユーザー ID の配列を取得する
        $allowed_customer_ids = explode(',', get_post_meta($coupon_id, '_wjecf_customer_ids', true));

        // クーポン coupon-foo-bar を使用できるユーザーとしてカレントユーザーを追加する
        $allowed_customer_ids[] = get_current_user_id();
        update_post_meta($coupon_id, '_wjecf_customer_ids', implode(',', $allowed_customer_ids));
    }
});

なお、「クーポン使用許可ユーザー」の設定が空の状態では、どのユーザーでもクーポンが使用できます。そのため、まだ誰も固定ページ foo-bar を閲覧していない段階では、どのユーザーにもクーポン coupon-foo-bar が自動適用されてしまいます。これを避けるには、サイト管理者など適当なユーザーをあらかじめ「クーポン使用許可ユーザー」に追加しておくとよいでしょう。

解2:プラグインのフックを使う

いちばんてっとり早いのはおそらく解1ですが、別解も考えられます。WooCommerce Extended Coupon Features には、カスタマイズに便利なアクションフックやフィルターフックがいくつか実装されています。今度はこちらを使ってみましょう。

まずは下準備として、固定ページ foo-bar を閲覧したユーザーにフラグを立てることにします。このページを閲覧したユーザーは、メタデータ can-use-coupon-foo-bartrue になります。

/**
 * 固定ページ foo-bar を閲覧すると、
 * そのユーザーにフラグ can-use-coupon-foo-bar が立つ
 */
add_action('wp', function () {
    if (is_user_logged_in() && is_page('foo-bar')) {
        // ログイン済みユーザーが固定ページ foo-bar を閲覧したら、メタデータ can-use-coupon-foo-bar を持たせる
        update_user_meta(get_current_user_id(), 'can-use-coupon-foo-bar', true);
    }
});

次に、メタデータ can-use-coupon-foo-bartrue のユーザーがカートに商品を入れたとき、クーポン coupon-foo-bar の自動適用が有効になるようにします。ここで、クーポン自動適用の有効・無効を制御するフィルターフック wjecf_coupon_can_be_applied を使っています。これで、クーポン coupon-foo-bar の自動適用が有効化されており、かつカレントユーザーにフラグが立っていれば、クーポンが自動適用されます。

/**
 * カレントユーザーにフラグ can-use-coupon-foo-bar が立っていれば、
 * クーポン coupon-foo-bar を自動適用する
 */
add_filter('wjecf_coupon_can_be_applied', function ($can_be_applied, WC_Coupon $coupon) {
    if (!$coupon->get_code() === 'coupon-foo-bar') {
        // コード coupon-foo-bar 以外のクーポンでは何もしない
        return $can_be_applied;
    }

    if (!is_user_logged_in()) {
        // ユーザーがログインしていなければ何もしない
        return $can_be_applied;
    }

    // 自動適用が有効、かつカレントユーザーがメタデータ can-use-coupon-foo-bar を持っていれば自動適用する
    return $can_be_applied && !empty(wp_get_current_user()->get('can-use-coupon-foo-bar'));
}, 10, 2);

なお、この方法ではクーポンが自動適用されないようにはできるものの、クーポンコードを知っているユーザーなら手動でクーポンを適用できます。クーポンの使用を厳密に制限したいなら、解1のような方法がよいでしょう。

一方、「ユーザーが固定ページを閲覧した」という事実と「クーポンの利用を許可されている」という事実を分けて管理できるという点では、解2にも利点があります。のちのちの仕様変更により柔軟に対応するには、この方法をとるのがよい場合もあるでしょう。

さらにフォーマルな拡張

WooCommerce Extended Coupon Features には、自分自身が有効化されると同時に拡張機能を有効化するための API が用意されています。あまり見かけないしくみで、おもしろいですね。

Development - Soft79.nl documentation

この API を使うと、WooCommerce Extended Coupon Features 本体が有効化されている前提で拡張機能を記述できます。ここまで見てきたとおり、この API を使わなくても拡張機能を記述することはできます。しかし、たとえば本体に定義されている関数を拡張機能から呼び出したいとき、本体が有効化されていないとそこでエラーになってしまいます。規模の大きな拡張を安全に記述したいときには、便利に使えそうです。

まとめ

WooCommerce のクーポンに自動適用機能を追加するアドオン WooCommerce Extended Coupon Features をさらに拡張するサンプルコードをご紹介しました。メタデータを編集したり、フックに処理を追加したりすることで、アドオンがサポートしない機能を実現することができます。

また、プラグインの選定にあたっては、アクションフックやフィルターフックが豊富に用意されているかを見ることが重要です。一見ほしい機能をサポートしてくれていないように見えても、ちょっとコードを書き足すだけでうまく解決できることもあります。プラグインのコードをのぞいてみると、思わぬ発見があるかもしれません。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ