2017-10-11 28 views
0

Je joins une fonction au crochet woocommerce_checkout_order_processed:fonction d'exécution de crochet woocommerce_checkout_order_processed deux fois

//check if woocommerce is acive 
if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) { 
    add_action('woocommerce_checkout_order_processed', 'wc_on_place_order'); 
} 

La fonction wc_on_place_order doit être exécutée après que l'utilisateur clique sur le bouton Place. Cependant, il est si étrange que la fonction soit exécutée deux fois.

Ma wc_on_place_order fonction appelle un api externe écrit en C#:

function wc_on_place_order($order_id) { 
    global $wpdb; 

    // get order object and order details 
    $order = new WC_Order($order_id); 

    // get product details 
    $items = $order->get_items(); 
    //return $items; 

    $products = array(); 
    foreach ($items as $item) { 
     array_push($products, 
      array('userid' => $order->user_id, 'descr' => $item['name'], 'amt' => (float)$item['line_total']) 
     ); 
    } 

    //passing $products to external api using `curl_exec` 
    . . . . 

    //on successful call, the page should be showing an `alert`, however, it does not 
    // the handle response  
    if (strpos($response,'ERROR') !== false) { 
      print_r($response); 
    } else { 
     echo "<script type='text/javascript'>alert($response)</script>"; 
    } 
} 

Après le débogage sur C# api, j'ai remarqué que le service est appelé deux fois, donc, la caisse est en cours d'enregistrement deux fois à l'api base de données.

Y at-il quelque chose de mal avec la fonction wc_on_place_order ou est woocommerce_checkout_order_processed appelé deux fois en cliquant sur l'ORDRE PLACE?

Fait intéressant, ajoutant return $items après $items = $order->get_items() en quelque sorte, le C# api a été appelée une seule fois:

// get product details 
$items = $order->get_items(); 
return $items; //this line 

Pourquoi est-ce ainsi?

Une autre question que je voudrais poser, est woocommerce_checkout_order_processed le bon crochet que je devrais utiliser? J'ai cherché sur le web pour le bon crochet à utiliser et il semble que woocommerce_checkout_order_processed est utilisé dans la plupart des messages. Je ne peux pas utiliser le hook woocommerce_thankyou car il appelle également l'API si j'actualise la page.

Toute idée sera vraiment appréciée.

Répondre

1

J'utilise toujours le crochet woocommerce_payment_complete Il se déclenchera comme son nom l'indique après que la commande ait été payée.

function order_payment_complete($order_id){ 
    $order = wc_get_order($order_id); 
    /* Insert your code */ 
} 

add_action('woocommerce_payment_complete', 'order_payment_complete'); 
+0

Cela fonctionne mais il est difficile de trouver un meilleur crochet. semble que je ne peux pas arrêter woocommerce de rediriger vers la page "merci" de ce crochet –

+0

Vous pouvez rediriger l'utilisateur à une page différente après la caisse, cela permettrait de résoudre votre problème? –

+0

Je voudrais rester à la page actuelle. Voir, j'appelle une API externe pour vérifier si l'utilisateur actuel a un solde sur ce point final et puis, si l'utilisateur n'a pas d'équilibre, je voudrais montrer un message d'erreur ou quelque chose. –