Bezahlen Sie, ohne sich bei WooCommerce anmelden zu müssen
Lesezeit: 3 Minuten
Mos
Für einen WooCommerce-Webshop versenden wir viele Zahlungslinks per E-Mail. Bevor Kunden auf die Zahlungsseite gelangen, müssen sie sich zuerst anmelden. Wir möchten, dass der Kunde die Zahlung ohne Anmeldung abschließen kann, da er sein Passwort aufgrund unterschiedlicher Unternehmensabteilungen oft nicht kennt.
Ich habe diesen Code gefunden, aber damit kann der Administrator nur bezahlen, ohne sich anzumelden:
function your_custom_function_name($allcaps, $caps, $args)
{
if (isset($caps[0])) {
switch ($caps[0]) {
case 'pay_for_order':
$user_id = $args[1];
$order_id = isset($args[2]) ? $args[2] : null;
// When no order ID, we assume it's a new order
// and thus, customer can pay for it
if (!$order_id) {
$allcaps['pay_for_order'] = true;
break;
}
$user = get_userdata($user_id);
if (in_array('administrator', (array)$user->roles)) {
$allcaps['pay_for_order'] = true;
}
$order = wc_get_order($order_id);
if ($order && ($user_id == $order->get_user_id() || !$order - > get_user_id())) {
$allcaps['pay_for_order'] = true;
}
break;
}
}
return $allcaps;
}
add_filter('user_has_cap', 'your_custom_function_name', 10, 3);
Danke, aber Gast-Checkout ist bereits aktiviert. Das Problem ist, dass es sich nicht um einen Gast-Checkout handelt, sondern Bestellungen den Kunden zugewiesen werden, sodass ich mich darum kümmern muss, dass sie nicht das Anmeldeformular erhalten, sondern sofort zur Kasse gehen.
– Mo
21. März 2018 um 10:43 Uhr
Wenn dieser Code wie gewünscht für den Administrator funktioniert, müssen Sie einfach diese Zeile if ( in_array( ‘administrator’, (array) $user->roles ) ) stattdessen in Ihre Kundenrolle ändern
– Kashalo
21. März 2018 um 10:49 Uhr
Danke vielmals. Müsste ich nicht den Administrator in einer Art Gastrolle ändern?
– Mo
21. März 2018 um 11:06 Uhr
Hier funktioniert die Funktion mit allen Benutzern. Testen Sie sie einfach:
function your_custom_function_name( $allcaps, $caps, $args ) {
if ( isset( $caps[0] ) ) {
switch ( $caps[0] ) {
case 'pay_for_order' :
$order_id = isset( $args[2] ) ? $args[2] : null;
$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $user->ID;
// When no order ID, we assume it's a new order
// and thus, customer can pay for it
if ( ! $order_id ) {
$allcaps['pay_for_order'] = true;
break;
}
$order = wc_get_order( $order_id );
if ( $order && ( $user_id == $order->get_user_id() || ! $order->get_user_id() ) ) {
$allcaps['pay_for_order'] = true;
}
break;
}
}
return $allcaps;
}
add_filter( 'user_has_cap', 'your_custom_function_name', 10, 3 );
Danke vielmals! Schätze es wirklich!
– Mo
21. März 2018 um 13:52 Uhr
Ich habe eine andere Lösung für dieses Problem entwickelt, die es jedem ermöglicht, der über die von WooCommerce generierte Zahlungs-URL (die den Bestellschlüssel enthält) verfügt, die Zahlung für diese Bestellung abzuschließen. (Also behalten wir einen Teil der Sicherheit / des Schutzes bei, anstatt einfach jedem zu erlauben, für alles zu bezahlen und jede Bestellung zu sehen.)
function allow_payment_without_login( $allcaps, $caps, $args ) {
// Check we are looking at the WooCommerce Pay For Order Page
if ( !isset( $caps[0] ) || $caps[0] != 'pay_for_order' )
return $allcaps;
// Check that a Key is provided
if ( !isset( $_GET['key'] ) )
return $allcaps;
// Find the Related Order
$order = wc_get_order( $args[2] );
if( !$order )
return $allcaps; # Invalid Order
// Get the Order Key from the WooCommerce Order
$order_key = $order->get_order_key();
// Get the Order Key from the URL Query String
$order_key_check = $_GET['key'];
// Set the Permission to TRUE if the Order Keys Match
$allcaps['pay_for_order'] = ( $order_key == $order_key_check );
return $allcaps;
}
add_filter( 'user_has_cap', 'allow_payment_without_login', 10, 3 );
Mit dieser Funktion kann ein Benutzer, der eine URL mit einer Bestellnummer und dem zugehörigen Bestellschlüssel besucht, die Zahlung abschließen, aber wenn der Bestellschlüssel nicht gültig oder nicht vorhanden ist, schlägt die Zahlung fehl.
Beispiele:
your.domain/checkout/order-pay/987/?pay_for_order=true&key=wc_order_5c4155dd4462c PASSIEREN wenn „wc_order_5c4155dd4462c“ der Bestellschlüssel für Bestellung Nr. 987 ist
your.domain/checkout/order-pay/987/?pay_for_order=true SCHEITERN als Kein Schlüsselparameter vorhanden
your.domain/checkout/order-pay/987/ SCHEITERN als Kein Schlüsselparameter vorhanden
14349900cookie-checkBezahlen Sie, ohne sich bei WooCommerce anmelden zu müssenyes
Danke, aber Gast-Checkout ist bereits aktiviert. Das Problem ist, dass es sich nicht um einen Gast-Checkout handelt, sondern Bestellungen den Kunden zugewiesen werden, sodass ich mich darum kümmern muss, dass sie nicht das Anmeldeformular erhalten, sondern sofort zur Kasse gehen.
– Mo
21. März 2018 um 10:43 Uhr
Wenn dieser Code wie gewünscht für den Administrator funktioniert, müssen Sie einfach diese Zeile if ( in_array( ‘administrator’, (array) $user->roles ) ) stattdessen in Ihre Kundenrolle ändern
– Kashalo
21. März 2018 um 10:49 Uhr
Danke vielmals. Müsste ich nicht den Administrator in einer Art Gastrolle ändern?
– Mo
21. März 2018 um 11:06 Uhr