web-dev-qa-db-fra.com

woocommerce_order_status_completed non déclenché

Je souhaite écrire un plug-in personnalisé qui exécute une action une fois la commande woocommerce terminée, mais je ne parviens pas à faire fonctionner ce raccordement. Je peux voir cette question posée à plusieurs reprises.

Comme ici: https://wordpress.stackexchange.com/questions/134463/woocommerce-order-status-completed-action-hook-not-working

Ici: https://wordpress.org/support/topic/woocommerce_order_status_completed-is-not-working

Et ici: https://wordpress.org/support/topic/woocommerce_order_status_completed-action-hook-not-working

Mais je ne peux pas m'en empêcher avec les réponses que ces gars-là ont reçues.

J'ai essayé d'ajouter l'action de différentes manières:

add_action( 'woocommerce_order_status_completed', 'ikwoocommerceorderstatuscompleted_func');

add_action( 'woocommerce_order_status_completed', array($this,'ikwoocommerceorderstatuscompleted_func'), 10, 1);

add_action( 'woocommerce_order_status_completed', array(&$this,'ikwoocommerceorderstatuscompleted_func'), 10, 1);

Aussi essayé avec une classe:

class IKHooks {
    function __construct() {
        add_action( 'woocommerce_order_status_completed', array($this,'ikwoocommerceorderstatuscompleted_func'), 10, 1);
    }

    public function ikwoocommerceorderstatuscompleted_func( $order_id ) {

    }
}

J'ai même essayé de mettre l'action en dehors de la classe:

add_action( 'woocommerce_order_status_completed', array(IKHooks,'ikwoocommerceorderstatuscompleted_func'), 10, 1);

Aucun de ces exemples ne fonctionne. :(

7
user568021

Suivez les étapes pour vérifier avant que votre propre crochet ne s'appelle.

  1. Vérifiez, lorsque vous terminez la commande, si vous avez reçu un e-mail relatif à l'achèvement de la commande, fournissez par défaut des e-mails woocommerce dans les paramètres de votre tableau de bord administrateur.

  2. Hook est enregistré correctement dans le fichier plug-in ou le thème functions.php 

Vérifiez votre action de registre woocommerce_order_status_completed after est enregistré correctement En procédant de la sorte

add_action( 'woocommerce_order_status_completed', 'callback_function_name' );
global $wp_filter; // test is register action name with callback function
print_r($wp_filter); exit;

check in array votre nom de fonction est enregistré avec ce hook

[woocommerce_order_status_completed] => Array
    (
        [10] => Array
            (
                [wc_paying_customer] => Array
                    (
                        [function] => wc_paying_customer
                        [accepted_args] => 1
                    )

                [wc_downloadable_product_permissions] => Array
                    (
                        [function] => wc_downloadable_product_permissions
                        [accepted_args] => 1
                    )

                [callback_function_name] => Array
                    (
                        [function] => callback_function_name
                        [accepted_args] => 3
                    )

            )

    )

Lorsque vous trouvez une fonction de rappel dans un tableau, elle fonctionne alors que quelque chose ne se pose pas dans les autres plugins ou le fichier functions.php du thème. La chaîne de recherche dans le plugin entier ou dans le thème function.php a appelé remove_action ou remove_all_actions.

Vous pouvez également vérifier de cette façon

add_action( 'woocommerce_order_status_completed', 'callback_function_name', 1);

Changer la priorité de la fonction 10 en 1 signifie que votre fonction appellera bientôt toutes les autres fonctions de rappel enregistrées auprès de ce hook.

Désolé pour le mauvais anglais.

8
user5200704

Vous pouvez utiliser ce crochet 

add_action( 'woocommerce_order_status_changed', 'your_function', 99, 3 );

Et la fonction ressemblera à

function your_function( $order_id, $old_status, $new_status ){
    if( $new_status == "completed" ) {
        //your code here
    }
}

J'espère que cela vous sera utile.

4
hemnath mouli

J'ai fait face au problème similaire plus tôt et l'ai résolu comme suit: 

Après le code, mettez à jour le statut de la commande sous la forme completed

add_action( 'woocommerce_thankyou', 'your_wc_autocomplete_order' );

function your_wc_autocomplete_order( $order_id ) {

 if ( ! $order_id ) {
   return;
 }

 $order = wc_get_order( $order_id );

 $order->update_status( 'completed' );

}

Une fois que la commande est terminée, si vous voulez faire quelque chose, voyez le code suivant:

add_action('woocommerce_order_status_completed','payment_complete');

function payment_complete($order_id)
{
   //global $items;
   //$order = new WC_Order($order_id);
   // do something ...
}

Espérons que ça va marcher :)

1
StreetCoder

Essayez d'utiliser l'action hook woocommerce_order_status_changed. Il faut 3 paramètres. identifiant de commande , ancien statut et nouveau statut . Référence de code supplémentaire ICI

Cela peut ne pas être exactement adapté à vos besoins, mais semble être une alternative intéressante. J'espère que cela t'aides.

1
zipkundan

woocommerce_order_status_changed et woocommerce_order_status_completed fonctionnent réellement pour moi. Après avoir lutté pendant 2 jours, je me suis rendu compte que vous ne pouvez pas utiliser var_dump, var_export ou print_r ni quoi que ce soit dans le panneau d'administration, cela ne fonctionnera tout simplement pas.

Donc, si vous êtes un débutant comme moi et que vous pensez que ces actions ne fonctionnent pas, essayez simplement de déclencher une autre action, comme envoyer un courrier par exemple.

Ce code fonctionne:

function your_function( $order_id ){
   $order = new WC_Order( $order_id );
    $to_email = '[email protected]';
    $payment = $order->get_payment_method_title();
    $headers = 'From: Your Name <[email protected]>' . "\r\n";
    wp_mail($to_email, 'subject', $payment, $headers );
}

add_action( 'woocommerce_order_status_completed', 'your_function');
1
Macr1408

Je pense que vous pourriez être après ce gars. woocommerce_payment_complete

function mysite_woocommerce_payment_complete( $order_id ) {
    error_log( "Payment has been received for order $order_id", 0 );
}
add_action( 'woocommerce_payment_complete', 'mysite_woocommerce_payment_complete' );
0
Patrick