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.
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 –
Vous pouvez rediriger l'utilisateur à une page différente après la caisse, cela permettrait de résoudre votre problème? –
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. –