web-dev-qa-db-ja.com

WooCommerce:woocommerce_order_item_meta_endを使用して確認メールにアイテムのメタデータを表示する方法

私たちの店はソフトウェアを販売しており、購入したそれぞれにソフトウェアバウチャーコードを追加しています。購入が完了したら(woocommerce_payment_completeフック)クーポンコードを生成し、それを wc_add_order_item_meta メソッドで購入した各アイテムに追加します。

要約コード:

add_filter('woocommerce_payment_complete', 'add_voucher_code');

function add_voucher_code( $order_id ) {

    $order = new WC_Order( $order_id );
    $items = $order->get_items();

    foreach ($items as $item)   {

        for ($i = 1; $i <= $item['qty']; $i++)  {
            $voucher_code = 'API request based on order information to get voucher code';
            wc_add_order_item_meta($item->get_id(), 'Voucher Code', $voucher_code);
        }
    }     
}

なんらかの理由で、アイテムのカスタムメタが注文確認ページに表示されますが、確認メールには表示されません。 (問題1額を平手打ち)したがって、woocommerce_order_item_meta_endフックして、確認メールに追加します。 ( wc_get_order_item_meta

要約コード:

add_action('woocommerce_order_item_meta_end', 'email_confirmation_display_order_items', 10, 4);

function email_confirmation_display_order_items($item_id, $item, $order, $plain_text) {

    echo '<div>Voucher Code: '. wc_get_order_item_meta( $item_id, 'Voucher Code') .'</div>';
}

問題2は、追加されたコードスニペットが注文確認ページ(現在は2回表示されます)と注文確認メールの両方に表示されることです。 (また額を平手打ち)

現在の問題2の解決策
現在、提案されているifステートメントを追加することで解決しました here 。そのようです:

// Only on emails notifications
if( ! (is_admin() || is_wc_endpoint_url() )) {
    echo '<div>Voucher Code: '. wc_get_order_item_meta( $item_id, 'Voucher Code') .'</div>';
}

これは応急処置の修正のように感じられ、洞察/提案は大歓迎です。ありがとう!

2
Ryan

これはあまり効果がないので、現在の解決策としてband-aid修正を適用します。

問題1の解決策
追加されたアイテムのメタデータは注文確認ページに表示され、確認メールには表示されません。これを解決するには、woocommerce_order_item_meta_endフックを使用してアイテムメタを追加します。

問題2の解決策
woocommerce_order_item_meta_endを介して確認メールにアイテムのメタデータを追加すると、確認ページにも追加されます(目に見えて複製されます)。 @LoicTheAztec here によって提案されたifステートメントを追加することで、これを解決しました。

add_action('woocommerce_order_item_meta_end', 'email_confirmation_display_order_items', 10, 4);

function email_confirmation_display_order_items($item_id, $item, $order, $plain_text) {

    // Only on emails notifications
    if( ! (is_admin() || is_wc_endpoint_url() )) {
        echo '<div>Voucher Code: '. wc_get_order_item_meta( $item_id, 'Voucher Code') .'</div>';
    }
}

リソース
メール確認フックのビジュアルガイド
wc_get_order_item_meta docs
Woocommerce電子メール通知から不要な注文アイテムのメタデータを除外します

0
Ryan