web-dev-qa-db-ja.com

Woocommerceの注文にメタを追加する

ウェブサイト用のカスタムプラグインを作成しています。

このプラグインの一部では、注文ごとに_wp_postmeta_に追加のメタを保存する必要があります。

これをプラグインのクラスに追加しました:

_`add_action ('woocommerce_before_checkout_process', array( &$this, 'add_item_meta', 10, 2) );`
_

そして、これはadd_item_meta()関数です:

_    function add_item_meta( $item_id, $values ) {
            wc_add_order_item_meta($item_id, '_has_event', 'yes' );
        }
_

この機能は完全ではありませんが、このコードでは何も起こりません。別のフックを使用する必要があると思いますが、適切なフックが見つかりません。

誰もこれについて何か知っていますか?

_$item_id_にも別の問題があります:これはwoocommerceグローバル変数ですが、プラグインでは表示されません!

プラグインまたはこのようなものからこの変数にアクセスできないということです!

18
Mo Saeedi

2018年の方法:

構築Guido WP代わりに使用できる回答 _woocommerce_checkout_create_order_ より軽量で効果的なバージョンコードのアクションフックWC 3+ CRUDメソッド

_add_action('woocommerce_checkout_create_order', 'before_checkout_create_order', 20, 2);
function before_checkout_create_order( $order, $data ) {
    $order->update_meta_data( '_custom_meta_key', 'value' );
}
_

コードは、アクティブな子テーマ(またはアクティブなテーマ)のfunction.phpファイルに入ります。

WooCommerce 3+でテストおよび動作(only).


いくつかの説明:

_woocommerce_checkout_create_order_ アクションフックは、注文データを保存する前の1ステップです。 _WC_Checkout_ create_order()メソッドの extract で以下を参照してください(両方のフックを使用):

_/**
 * Action hook to adjust order before save.
 * @since 3.0.0
 */
do_action( 'woocommerce_checkout_create_order', $order, $data );

// Save the order.
$order_id = $order->save();

do_action( 'woocommerce_checkout_update_order_meta', $order_id, $data );

return $order_id;
_

代わりに_woocommerce_checkout_create_order_を使用する理由/

  • フックされた関数の引数として既に _$order_ を取得しているので、$order = wc_get_order( $order_id );を使用する必要がないためです。
  • これはとにかく直後に行われるので、$order->save();を使用する必要はありません(ソースコードを参照)
  • また、_woocommerce_checkout_create_order_はWooCommerceバージョン3でリリースされており、それもメイドです。

したがって、これは関数内のコードの1行で機能します。

26
LoicTheAztec

Mo Saeediの回答に基づいて、このスニペットは、WooCommerce 3.0で導入された 新しいCRUDアプローチ により近いと思います。

add_action('woocommerce_checkout_update_order_meta',function( $order_id, $posted ) {
    $order = wc_get_order( $order_id );
    $order->update_meta_data( 'my_custom_meta_key', 'my data' );
    $order->save();
} , 10, 2);

WordPressフォーラムのこのスレッドも参照してください。

答えは次のとおりです。add_actionに_woocommerce_checkout_update_order_meta_を使用する必要があります。また、update_post_meta()を使用して追加のメタを注文に追加する必要があります

_    function add_item_meta( $order_id ) {
            //global $woocommerce;
            update_post_meta( $order_id, '_has_event', 'yes' );
        } 
_
4
Mo Saeedi

2016年の方法:

add_action('woocommerce_checkout_update_order_meta',function( $order_id, $posted ) {  
    update_post_meta( $order_id, 'my_custom_meta_key', 'my data' );  
} , 10, 2);
  • $order_idは注文のIDで、カスタムの投稿タイプとして保存されます
  • $posted$_POSTからのすべてのデータです
3
Sorin C