WooCommerce内で注文が完了した後に呼び出す必要がある関数を作成しています。これには、 'woocommerce_order_status_completed'フックを使用しています。注文に特定の商品カテゴリに属する商品があるかどうかを確認したいです。この場合、ユーザーはWordpress内のグループに追加されます。グループロジックを処理するために、私は別のプラグインのAPIを利用しています。このメソッドには* group_id *と* user_id *が必要です。私が見逃している唯一のことは* user_id *を取得することです。
WooCommerce Orderからユーザー(詳細:ID)を取得する方法を教えてください。
コード:
function isa_set_isa_member_group_after_order_completed($order_id) {
$order = new WC_Order( $order_id );
$items = $order->get_items();
foreach($items as $item) {
$product = $order->get_product_from_item($item);
$has_membership_product = has_term('Lidmaatschap','product_cat',$product->post);
if($has_membership_product) {
break;
}
}
$group = Groups_Group::read_by_name('ISA Leden');
if(!group) {
return; // TODO: Add error message + email?
}
$user_id = 0 // TODO: Get user id from order.
$user_group = array(
"user_id" => $user_id,
"group_id" => $group->group_id
);
$result = Groups_User_Group::create($user_group);
if(!result) {
return; // TODO: Add error message + email?
}
}
技術的な詳細:
ワードプレスのバージョン:3.8
WooCommerceのバージョン:2.1
WC_Order
クラスの__get()
メソッドから、user_id
プロパティが、問題のオーダーの_customer_user
post metaから取得されているか、格納されていることがわかります。
/**
* __get function.
*
* @access public
* @param mixed $key
* @return mixed
*/
public function __get( $key ) {
// Get values or default if not set
if ( 'completed_date' == $key ) {
$value = ( $value = get_post_meta( $this->id, '_completed_date', true ) ) ? $value : $this->modified_date;
} elseif ( 'user_id' == $key ) {
$value = ( $value = get_post_meta( $this->id, '_customer_user', true ) ) ? absint( $value ) : '';
} else {
$value = get_post_meta( $this->id, '_' . $key, true );
}
return $value;
}
だからあなたのコードではあなたはそのようにユーザーIDをつかむことができます:
$order = new WC_Order( $order_id );
$user_id = $order->user_id;
私はあなたがゲストのチェックアウトを許可するつもりはないと思いますが、あなたはユーザーIDがない場合に備えてある種のフォールバックを望むかもしれません。
WooCommerce 3.0用アップデート
上記のすべてを無視してください。コメントで指摘されているように、この情報を得るための直接的な方法があります。実際、ほとんどすべての「マジックメソッド」は削除されており、オブジェクトプロパティに直接アクセスするとPHP警告がスローされます。
$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $order->get_user_id();