Überprüfen Sie die WooCommerce-Benutzerrolle und das Zahlungsgateway und wenn sie übereinstimmen, wenden Sie eine Gebühr an
Lesezeit: 3 Minuten
Ich habe Probleme damit, eine Gebühr für eine Reihe von Benutzerrollen zu erheben, wenn ein bestimmtes Zahlungsgateway ausgewählt wird.
Der Code, den ich geschrieben habe, funktioniert gut, wenn ich die Benutzerrolle nicht überprüfe, aber sobald ich das versuche und tue, funktioniert es nicht.
Ich habe die Benutzerrolle entfernt (kommentiert). if Anweisung im Code und ich bitte um Hilfe, damit es funktioniert.
Ich muss überprüfen, ob die Benutzerrolle mit meiner übereinstimmt array und wenn ja, überprüfen Sie das Zahlungsgateway. Wenn das Zahlungsgateway ebenfalls übereinstimmt, wenden Sie die Gebühr an.
Das ist mein Code:
add_action( 'woocommerce_cart_calculate_fees', 'custom_fee', 20, 1 );
function custom_fee ($cart){
if (is_admin() && !defined('DOING_AJAX')) return;
if (!is_user_logged_in()) return;
if (!is_checkout() && !is_wc_endpoint_url()) return;
$customer_role = wp_get_current_user();
$roles_to_check = array( 'vendor', 'external' );
$payment_method = WC()->session->get('chosen_payment_method');
// if (!in_array($roles_to_check, $customer_role->roles)) return;
if ('bacs' == $payment_method){
$payment_fee = $cart->subtotal * 0.05;
$cart->add_fee( 'Payment Fee', $payment_fee, true );
}
}
7uc1f3r
Sie könnten die folgende Erklärung mit im Code hinzugefügten Kommentaren verwenden
Bedingungen, die in diesem Code erfüllt sein müssen, sind:
nur für bestimmte Benutzerrollen
Überprüfung der Zahlungsmethode
function custom_fee( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( ! ( is_checkout() && ! is_wc_endpoint_url() ) )
return; // Only checkout page
if ( ! is_user_logged_in())
return;
// Get current WP_User Object
$user = wp_get_current_user();
// User roles
$roles = ( array ) $user->roles;
// Roles to check
$roles_to_check = array( 'vendor', 'external', 'administrator' );
// Compare
$compare = array_diff( $roles, $roles_to_check );
// Result is empty
if ( empty ( $compare ) ) {
// Payment method
$payment_method = WC()->session->get('chosen_payment_method');
// Condition equal to
if ( $payment_method == 'bacs' ) {
// Calculate
$payment_fee = $cart->subtotal * 0.05;
// Add fee
$cart->add_fee( 'Payment Fee', $payment_fee, true );
}
}
}
add_action( 'woocommerce_cart_calculate_fees', 'custom_fee', 10, 1 );
BEARBEITEN
Um meine Antwort zu vervollständigen, siehe die Antwort von @LoicTheAztec
Wie bekommt man das beim “check,-out/order-pay” zum Laufen?
– Wanderlust-Beratung
13. Oktober 2020 um 21:26 Uhr
Die Antwort von @ 7uc1f3r ist gut, aber etwas wichtiges fehlt es.
In der WooCommerce-Kaufabwicklung werden bei der Auswahl einer Zahlungsmethode die Bezahlsummen nicht aktualisiert. Es ist also etwas Zusätzliches erforderlich, um den Abschnitt “Bestellüberprüfung” an der Kasse zu aktualisieren: