Bezahlen Sie, ohne sich bei WooCommerce anmelden zu müssen

Lesezeit: 3 Minuten

Benutzeravatar von Mos
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

1434990cookie-checkBezahlen Sie, ohne sich bei WooCommerce anmelden zu müssen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy