web-dev-qa-db-fra.com

Obtention des données de commande après un crochet de paiement réussi

Dans WooCommerce, je voudrais envoyer une demande à une API une fois que le client a vérifié avec succès. C'est essentiellement un site Web où le client vend des cours en ligne (comme demy).

Lorsque le client passe à la caisse, j'aimerais envoyer une demande d'API et inscrire l'utilisateur à ce cours particulier. J'ai essayé plusieurs hooks WooCommerce mais aucun n'a fonctionné pour moi.

Voici le code que j'utilise:

add_action('woocommerce_checkout_order_processed', 'enroll_student', 10, 1);

function enroll_student($order_id)
{
    echo $order_id;
    echo "Hooked";
}

J'écris ce code dans un plugin activé et pour plus de facilité j'utilise actuellement la méthode Cash on Delivery.

Quelqu'un peut-il me signaler où je vais mal parce que lorsque je passe la commande, je ne vois pas le message "accroché" que j'imprime ni le $order_id?

Je m'amène à la page de réussite et ne montre pas ces deux choses que j'imprime.

Mise à jour 2 Uniquement pour Woocommerce 3+ (restriction supplémentaire pour exécuter le code une seule fois)

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();
    }
}

Le code va dans le fichier function.php de votre thème enfant (ou thème) actif ou aussi dans n'importe quel fichier de plugin.

Fil associé:

Le code est testé et fonctionne.


Mise à jour (pour obtenir l'ID de produit à partir des articles des commandes comme demandé dans votre commentaire)

Peut-être pourriez-vous utiliser woocommerce_thankyou crochet à la place, qui affichera sur la page de commande votre code en écho, de cette façon:

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>';
}

Le code va dans le fichier function.php de votre thème enfant (ou thème) actif ou aussi dans n'importe quel fichier de plugin.

Le code est testé et fonctionne.

Ensuite, vous pouvez utiliser toutes les classes WC_Abstract_Order méthodes sur les $order objet.

24
LoicTheAztec

vous pouvez obtenir les articles d'une commande par

   // 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