WooCommerceでは、顧客が正常にチェックアウトした後、APIにリクエストを送信します。基本的には、クライアントがオンラインコースを販売しているWebサイトです(demy)。
顧客がチェックアウトするときに、APIリクエストを送信し、その特定のコースのユーザーを登録したいと思います。私はいくつかのWooCommerceフックを試しましたが、どれもうまくいきませんでした。
これは私が使用しているコードです:
add_action('woocommerce_checkout_order_processed', 'enroll_student', 10, 1);
function enroll_student($order_id)
{
echo $order_id;
echo "Hooked";
}
私はこのコードをアクティベートされたプラグイン内に書いており、簡単にするために現在は代金引換を使用しています。
誰かが私が間違っている場所を指摘できますか?チェックアウトすると、私が印刷しているというメッセージや$order_id
?
私は成功ページに連れて行って、私が印刷しているこれら二つのことを見せません。
Update 2Woocommerce 3+のみ(コードを1回だけ実行する制限を追加)
add_action('woocommerce_thankyou', 'enroll_student', 10, 1);
function enroll_student( $order_id ) {
if ( ! $order_id )
return;
// Allow code execution only once
if( ! get_post_meta( $order_id, '_thankyou_action_done', true ) ) {
// Get an instance of the WC_Order object
$order = wc_get_order( $order_id );
if($order->is_paid())
$paid = __('yes');
else
$paid = __('no');
// Loop through order items
foreach ( $order->get_items() as $item_id => $item ) {
// Get the product object
$product = $item->get_product();
// Get the product Id
$product_id = $product->get_id();
// Get the product name
$product_id = $item->get_name();
}
// Output some data
echo '<p>Order ID: '. $order_id . ' — Order Status: ' . $order->get_status() . ' — Order is paid: ' . $paid . '</p>';
// Flag the action as done (to avoid repetitions on reload for example)
$order->update_meta_data( '_thankyou_action_done', true );
$order->save();
}
}
コードは、アクティブな子テーマ(またはテーマ)のfunction.phpファイル、または任意のプラグインファイルに含まれます。
関連スレッド:
コードはテストされ、動作します。
Updated(注文アイテムからproduct Idを取得するにはコメント)
woocommerce_thankyou
フック。代わりに、注文受信ページにエコーコードを表示します。
add_action('woocommerce_thankyou', 'enroll_student', 10, 1);
function enroll_student( $order_id ) {
if ( ! $order_id )
return;
// Getting an instance of the order object
$order = wc_get_order( $order_id );
if($order->is_paid())
$paid = 'yes';
else
$paid = 'no';
// iterating through each order items (getting product ID and the product object)
// (work for simple and variable products)
foreach ( $order->get_items() as $item_id => $item ) {
if( $item['variation_id'] > 0 ){
$product_id = $item['variation_id']; // variable product
} else {
$product_id = $item['product_id']; // simple product
}
// Get the product object
$product = wc_get_product( $product_id );
}
// Ouptput some data
echo '<p>Order ID: '. $order_id . ' — Order Status: ' . $order->get_status() . ' — Order is paid: ' . $paid . '</p>';
}
コードは、アクティブな子テーマ(またはテーマ)のfunction.phpファイル、または任意のプラグインファイルに含まれます。
コードがテストされ、動作します。
その後、すべてのクラスを使用できます
WC_Abstract_Order
上のメソッド$order
オブジェクト。
注文の注文アイテムを取得するには
// Getting an instance of the order object
$order = new WC_Order( $order_id );
$items = $order->get_items();
//Loop through them, you can get all the relevant data:
foreach ( $items as $item ) {
$product_name = $item['name'];
$product_id = $item['product_id'];
$product_variation_id = $item['variation_id'];
}