web-dev-qa-db-ja.com

チェックアウトフックが成功した後の注文データの取得

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オブジェクト。

24
LoicTheAztec

注文の注文アイテムを取得するには

   // 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'];
    }
2
mujuonly