WooCommerce – Bestellungen nach PayPal Zahlung automatisch abschließen
Gehörst du auch zu denjenigen, die digitale Produkte in Ihrem WooCommerce Shop verkaufen, also Produkte, die nach dem Kauf und der erfolgten Bezahlung direkt herunter geladen werden können?
Dann hast du vielleicht oder deine Kunden auch das Problem, dass nach erfolgter Zahlung mit PayPal die Bestellung nicht automatisch abgeschlossen wird und der Käufer somit keine sofortige Möglichkeit bekommt, sein gekauftes Produkte herunter zu laden.
Ich jedenfalls hatte häufiger diese Schwierigkeit in meinen WooCommerce Shops bzw. in den WooCommerce Shops meiner Kunden. Daher habe ich nach einer Lösung gesucht, dies auf einfachem Wege selbst zu steuern. Diese Lösung, die mir seither sehr gute Dienste leistet, möchte ich euch nicht vorenthalten.
Hier also ein paar Codezeilen, die eure Bestellungen nach gewünschter Zahlungsart direkt als completed kennzeichnet. Die Zeilen kommen in die functions.php eures Themes. Bitte denkt daran, wenn nicht schon geschehen, ein Child-Theme einzurichten. Ansonsten lauft ihr Gefahr, dass eure Änderungen mit dem nächsten Update überschrieben werden. Wie immer erfolgt weiter unten eine kurze Erläuterung:
/** * bezahlte Bestellungen automatisch abschliessen */ add_action( 'woocommerce_thankyou', 'auto_complete_paid_order', 10, 1 ); function auto_complete_paid_order( $order_id ) { if ( ! $order_id ) { return; } global $woocommerce; $order = new WC_Order( $order_id ); // kein Status Update fuer folgende Zahlungsarten if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cod' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cheque' ) ) { return; } // "completed" fuer alle anderen Zahlungsarten else { $order->update_status( 'completed' ); } }
Um an der richtigen Stelle einzugreifen, nutze ich den Action-Hook woocommerce_thankyou. Die Bestellung ist eingegangen, die Bezahlung mittels PayPal ist erfolgt. Gibt es keine Bestellnummer ($order_id), ist irgendwas schief gelaufen und die Funktion wird nicht weiter verarbeitet (Zeilen 6-8).
Prüfung, welche Zahlungsart als erledigt gekennzeichnet werden soll
Jetzt kommt der entscheidende Schritt. Es wird die Zahlungsweise des Kunden geprüft und die Zahlungsarten abgefragt, die NICHT zu einem sofortigen Bestellabschluss führen sollen (Zeilen 13-16). Ist die Zahlweise des Kunden nicht darunter, geht es weiter in der Funktion und die WooCommerce Bestellung wird als completed gekennzeichnet (Zeile 19).
Ergänzend möchte ich noch hinzufügen, welche Zahlungarten ich ausgeschlossen habe:
- Überweisung (bacs)
- Zahlung per Scheck (cheque)
- Nachnahme (cod)
Ich hoffe, die paar Zeilen helfen dem ein oder anderen und sparen Mühe und Zeit, die Bestellungen händisch "anfassen" zu müssen.
Großartig, funktioniert immer noch. Vielen Dank!
Hallo Ralf,
schon etwas her, aber deinen Code findet man immer noch – habe ihn heute entdeckt.
Ein – nehme ich an – schnell zu behebendes Problem:
Habe ein child theme erstellt und dann in die functions.php Datei dann einfach deinen Code untendran gehängt.
Jetzt taucht der bei mir auf jeder Website ganz oben auf – jede einzelne Codezeile – ich nehme an, ich muss den Code weiter oben einbetten? irgendwelche Sonderzeichen oder dergleichen?
Hallo zusammen, suche genau so einen Code der Automatisiert die bestelleung auf Abgeschlossen stellt. Nur bekomme ich leider diese Fehler Meldung….. kann da einer helfen.
FEHLER: Fatal error: Cannot redeclare auto_complete_paid_order() (previously declared in /www/htdocs/w01a2c6c/EigeneTheme/wp-content/themes/deli/functions.php:39) in /www/htdocs/w01a2c6c/broetchenboten.de/wp-content/themes/storefront/functions.php on line 23
Danke im vorraus
Hallo, der Code funktioniert soweit. Nun habe ich einen Shop, in dem sowohl virtuelle als auch „reale“ Artikel verkauft werden. Wenn nun alles auf fertig gesetzt wird, verliert man ein wenig den Überblick. Cool wäre eine Unterscheidung zwischen „virtuellem Artikel“ und „realem“ Artikel. Gäbe es da eine Möglichkeit, dies in den Code einzubauen?
Gruß Volker
Hi Ralf,
ich greife deinen tollen Hinweis noch einmal auf. Statt allein mit PayPal funktioniert dein Snippet auch mit Klarna. Das einzige, was Probleme verursacht: Bei einer Bestellung geht keine E-Mail an den Bestellservice Admin raus, so kann nur im Backend von Woocommerce die Bestellung eingesehen und „erkannt“ werden.
Weißt du hier, woran das liegen könnte und hast du Rat? Danke dir
Hallo, ich habe Ihren Code eingefügt.
Wenn im Bezahlprozess kurz vorm Bezahlen der Vorgang seitens des Kunden abgebrochen wird, wird das Produkt dennoch freigegeben.
DASS DARF SO NICHT SEIN.
Zudem erscheint der Fehlercode:
Warning: call_user_func_array() expects parameter 1 to be a valid callback, class ‚WC_GZD_Gateway_Direct_Debit‘ does not have a method ’set_mandate_seqType_to_RCUR_for_user‘ in /customers/4/8/c/DOMAIN.de/httpd.www/wp-includes/class-wp-hook.php on line 298
Sorry, dass ich erst jetzt reagiere. Bin noch im Umzugsstress. Natürlich darf das so nicht sein. Diese Problem tauchte schon ein mal auf. Kann ich mir nur durch eine inkorrekte Implementierung des Codes erklären. Die Code wird nur ausgeführt, wenn die Thank You Seite aufgerufen wird. Und ich denke, dass diese nur aufgerufen wird, wenn die Bestellung erfolgreich durchgeführt wurde, oder?
Beste Grüße
Ralf
Danke Ralf für den Code. Hat mir viel Zeit und Nerven gespart. Soweit ich das jetzt getestet habe, funktioniert das klasse. Danke dir!
Herzliche Grüße aus Karlsruhe, Winni
Hallo Winni,
freut mich, dass ich dir helfen konnte. Ich nutze den Code ebenfalls seit geraumer Zeit und habe keine Probleme.
Grüße
Ralf
Hallo zusammen!
Hatte das gleiche Problem. In den Einstellungen von WooCommerce Germanized war ein Haken bei
„Stornierungen verhindern – Stornierung von Bestellungen durch den Kunden verhindern.“
gesetzt (in den Einstellungen „Allgemein“, 6. Zeile).
Das war also der Haken, jetzt funktioniert alles. Danke euch allen, vor allem an Ralf für den Code!
Hallo Ralf,
zunächst war alles super und ich habe mich sehr über diesen Code gefeut. Allerdings schließe ich mich jetzt leider Karsten an. Auch bei mir ist es so, dass wenn der Zahlungsvorgang von PayPal abgebrochen wurde, der Kunde die E-Mail inklusive Download-Link trotzdem erhält, obwohl er nicht gezahlt hat. Ich habe WooCommerce Germanized installiert. Könnte es eventuell auch daran liegen?
Viele Grüße
Sandra
Hallo Sandra,
kann ich mir ohne weitere Infos nicht erklären. Denn der Code wird nur aufgerufen, wenn die Danke-Seite, also die Bestellbestätigungs-Seite von WooCommerce angezeigt wird. Und das ist dann das Signal, dass die Bestellung erfolgreich abgeschlossen wurde. Ansonsten wird diese Seite nicht angezeigt.
Es kann natürlich sein, dass hier ein anderes Plugin die Steuerung übernimmt. Da müsstest du mal z. B. Germanized abschalten und prüfen, ob der Fehler weiterhin auftritt.
Melde dich bitte unbedingt noch mal, auch wenn hier ein Plugin dazwischen funkt. Ist ja auch für die anderen interessant 😉
Grüße
Ralf
Hallo Ralf,
vielen Dank für deine Rückmeldung. Ich habe WooCommerce Germanized mal deaktviert und siehe da, dieses Plugin war die Ursache für die fehlerhafte Verarbeitung beim Zahlungsabbruch von PayPal. Leider benötigen wir aber zwingend dieses Plugin. Aktuell können wir deswegen leider nur manuell, bezahlte Bestellungen auf den Status „fertiggestellt“ markieren. Das ist ziemlich blöd. Ich bin mir nicht mal sicher ob das Problem jetzt erst nach dem Update des Plugins aufgetreten ist. Wir hatten rund 83 Bestellungen auf „in Bearbeitung“. Irgendwer hätte sich doch gemeldet, wenn er die Datei nach Zahlungseingang nicht downloaden hätte können. Deshalb gehe ich davon aus, dass in unserem Fall das Update die Ursache sein könnte.
Leider fehlen mir die Programmierkenntnisse, deinen Code so umzuschreiben, dass er auch mit WooCommerce Germanized funktioniert. 🙁
Hast du eine Idee?
Viele Grüße
Sandra
Hi Sandra,
frage doch mal beim Entwickler von WC Germanized an, ob es eine Alternative zu dem in meinem Code Schnipsel verwendeten Hook „woocommerce_thankyou“ gibt. Bin mir fast sicher, dass Germanized hier eigene Hooks eingebunden hat. Alternativ könnte man ggf. die Priorität verändern. Dies könnte aber zu Schwierigkeiten an anderer Stelle führen.
Grüße
Ralf
Hallo Ralf,
jetzt funktioniert bei uns alles, wie gewünscht! 🙂
Schau mal hier, dann brauche ich nicht so viel tippen: https://wordpress.org/support/topic/bestellstatus-automatisch-fertigstellen-nach-paypal-zahlung/
Hallo Sandra,
freut mich, dass du weiter gekommen bist 🙂
Auch wenn die Begründung so nicht ganz richtig ist. Der Code prüft zwar die erfolgreiche Zahlung nicht, aber da ist ja noch WooCommerce….
Grüße
Ralf
Ich habe den Code Kopiert und einfach ganz unten in die Theme functions kopiert dann hat die Website nicht mehr funktioniert Weiß jemand woran das liegen kann?
Gruß Daniel
Hallo Daniel,
hängt unter anderem davon ab, wie deine functions.php aussieht. Es kann sein, dass du über den Code noch
selbe Problem bei mir… -.-
Stand ebenfalls vor diesem Problem, Bestellungen wurden nicht abgeschlossen und wurden weiter „in Bearbeitung“ geführt. Ist jetzt abgehackt, danke für diesen Beitrag.
Hallo David,
freut mich, dass dir der Beitrag geholfen hat.
Grüße
Ralf
Hi, der Tipp ist interessant, aber hat eine Lücke: Wenn ich mich in Paypal einlogge und den Vorgang dann abbreche, wird die Email mit dem Downloadlink trotzdem rausgesendet 🙁
Ich habe im Moment auch das Problem, dass die erfolgte Zahlung von paypal nicht an WooCommerce übertragen wird. Ich muss es immer manuell machen und verstehe nicht, woran es liegen kann.
Dachte, dein Ansatz wäre eine Lösung, aber das ist nicht gut so. Wenn einer selbst aus versehen den Vorgang abbricht, freut er sich über kostenlose Ware
Hallo Karsten,
kann ich so nicht bestätigen. Wenn ich mich bei PayPal einlogge und dann die Bestellung abbreche, wird diese als storniert gekennzeichnet. Wenn dies nicht so wäre, liegt erst einmal ein Problem bei WooCommerce vor. Denn WooCommerce schickt die Mail mit dem DL-Link nur für erledigte Bestellungen raus und das wäre falsch aus WooCommerce Sicht. Der Code wird nur ausgeführt, wenn die „Thank you“ Seite angezeigt wird. Und diese erscheint nur, wenn eine Bestellung aus WooCommerce Sicht erfolgreich war. Oder verstehe ich da was falsch?
Grüße Ralf
Hallo Ralf,
erst vielen Dank für deine Hilfe, die du hier anbietest.
Ich muss sie jetzt leider auch in Anspruch nehmen. Ich arbeite das erste Mal mit WP und Woocommerce, also bitte Nachsicht, falls ich nicht gleich was verstehe.
Ich habe nun diesen Code Schnipsel in meine functions.php vom theme eingetragen. Wenn ich dann über die Sandbox meinen Testkauf tätige, werde ich dann automatisch zurück zum Händler (in dem Fall ich ja selber) geleitet und lande auf meiner Bestätigungsseite vom Shop. Auf ihr ist alles aufgelistet u.a. auch der Download Link.
Tätige ich aber eine 2. Testkauf, wird der Downloadlink plötzlich nicht mehr mitgesendet.
Bin nun langsam mit meinem Latein am Ende. 🙂
Und bevor das nicht klappt, brauche ich auch nicht weiter den Shop aufzubauen, denn im Moment habe ich nur einen wirklichen Artikel drin.
Bin für jede Hilfe dankbar.
lg Evelyn
Hi Evelyn,
was heißt denn genau, der DL-Link wird nicht mitgesendet? Auf welcher Seite landest du denn nach dem 2. Testkauf?
Grüße
Ralf