it-swarm.com.de

woocommerce_order_status_completed wurde nicht ausgelöst

Ich möchte ein benutzerdefiniertes Plugin schreiben, das nach Abschluss der Woocommerce-Bestellung einige Aktionen ausführt, aber ich kann diesen Hook nicht zum Laufen bringen. Ich kann diese Frage oft gestellt sehen.

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

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

Und hier: https://wordpress.org/support/topic/woocommerce_order_status_completed-action-hook-not-working

Aber ich kann mir bei Antworten, die diese Jungs erhalten haben, nicht helfen.

Ich habe versucht, die Aktion auf verschiedene Arten hinzuzufügen:

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

Auch mit einer Klasse versucht:

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

    public function ikwoocommerceorderstatuscompleted_func( $order_id ) {

    }
}

Ich habe sogar versucht, die Action außerhalb der Klasse zu platzieren:

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

Keines dieser Beispiele funktioniert. :(

7
user568021

Folgen Sie den Schritten, um zu überprüfen, bevor Sie den eigenen Hook aufgerufen haben.

  1. Überprüfen Sie, ob Ihre Bestellung abgeschlossen ist. Sie erhalten eine E-Mail über die Bestellungs-E-Mail, die standardmäßig in Ihrem Admin-Dashboard die Woocommerce-E-Mails enthält.

  2. Hook wird ordnungsgemäß in der Plugin-Datei oder im Theme functions.php registriert 

Überprüfen Sie, ob Ihre Registrierungsaktion woocommerce_order_status_completed after ordnungsgemäß registriert ist. Folgend diesem Weg

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 Ihr Funktionsname wird mit diesem Hook registriert

[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
                    )

            )

    )

Wenn Sie in der Array-Rückruffunktion finden, funktioniert es, wenn in anderen Plugins- oder Theme-Functions.php-Dateien keine Probleme auftreten. Suchstring im gesamten Plugin oder Thema function.php mit remove_action oder remove_all_actions wird aufgerufen.

Sie können auch auf diese Weise überprüfen

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

Funktionspriorität von 10 auf 1 ändern bedeutet, dass Ihre Funktion bald aufgerufen wird und alle anderen Callback-Funktionen mit diesem Hook angemeldet sind.

Entschuldigung für schlechtes Englisch.

8
user5200704

Sie können diesen Haken verwenden 

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

Und die Funktion wird aussehen

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

Hoffe das wird hilfreich sein.

4
hemnath mouli

Ich war früher mit dem ähnlichen Problem konfrontiert und löste es als: 

Nach dem Code aktualisieren Sie den Auftragsstatus als 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' );

}

Wenn Sie die Bestellung abgeschlossen haben, lesen Sie den folgenden Code:

add_action('woocommerce_order_status_completed','payment_complete');

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

Hoffentlich klappt es :)

1
StreetCoder

Versuchen Sie es mit dem Aktionshaken woocommerce_order_status_changed. Es dauert 3 Parameter. Auftrags-ID , alter Status und neuer Status . Weitere Code-Referenz HIER

Dies ist möglicherweise nicht genau für Ihre Anforderungen geeignet, scheint jedoch eine Alternative zu sein. Hoffe das hilft.

1
zipkundan

woocommerce_order_status_changed und woocommerce_order_status_completed funktionieren tatsächlich für mich. Nachdem ich mich zwei Tage lang schwer getan hatte, wurde mir klar, dass man var_dump oder var_export oder print_r oder was auch immer im Admin-Panel sein kann, es funktioniert einfach nicht.

Wenn Sie also ein Neuling wie ich sind und der Meinung waren, dass diese Aktionen nicht funktionieren, lösen Sie einfach eine andere Aktion aus, beispielsweise das Versenden einer E-Mail.

Dieser Code funktioniert:

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

Ich denke, du könntest hinter diesem Kerl her sein. 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