ウェブサイト用のカスタムプラグインを作成しています。
このプラグインの一部では、注文ごとに_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グローバル変数ですが、プラグインでは表示されません!
プラグインまたはこのようなものからこの変数にアクセスできないということです!
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行で機能します。
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' );
}
_
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
からのすべてのデータです