wake-up-neo.com

Filtern Sie verfügbare WooCommerce-Zahlungsgateways nach Rolle

Ich weiß, dass WooCommerce hier nicht gut aufgenommen wird, weil es nicht direkt mit WordPress zusammenhängt, aber da die Unterstützung in den WooCommerce-Foren einfach so schrecklich ist und die Leute hier bewiesen haben, dass sie fähig und kompetent sind, werde ich es versuchen.

Ein Kunde von uns möchte bestimmte Zahlungsgateways für bestimmte Benutzergruppen anzeigen/ausblenden. Hier ist die Situation:

  • Benutzergruppe A: Kunde
  • Benutzergruppe B: Firma

Nur B soll in der Lage sein, per Rechnung zu bezahlen, also nachdem sie die Ware erhalten haben.

Hier bin ich soweit:

add_filter( 'woocommerce_available_payment_gateways', 'payment_gateway_disable_private' );

 function payment_gateway_disable_private( $available_gateways ) {
   if ( isset( $available_gateways['authorize'] ) && $woocommerce->customer->get_role($role) <> 'Company' ) {
      unset( $available_gateways['authorize'] );
   } else if ( isset( $available_gateways['cheque'] ) && $woocommerce->customer->get_role($role) == 'Customer' ) {
      unset( $available_gateways['cheque'] );
}
   return $available_gateways;
}

"Scheck" ist der Name des Zahlungs-Gateways, das für die Rechnungszahlung verwendet wird.

Es funktioniert noch nicht, also was fehle ich? Jede Hilfe wird sehr geschätzt!

2
theHubi

Arrrrg eine WooCommerce-Frage ... schnell brennen ihn auf dem Spiel!

Es gibt ein paar Probleme mit Ihrer Rückruffunktion:

  • sie deklarieren global $woocommerce nicht, haben also keinen Zugriff auf die globale Variable $woocommerce.
  • und $woocommerce->customer enthält den Status der WC_Customer-Klasse, diese Klasse enthält jedoch keine get_role()-Methode. Außerdem definieren Sie in Ihrem Rückruf nirgendwo den Wert der $role-Variablen, sodass dies ohnehin nicht funktioniert, selbst wenn die Methode existiert.

Überprüfen Sie stattdessen die Benutzerrolle in dem Rollenarray, das für das Objekt WP_User zurückgegeben wurde:

add_filter( 'woocommerce_available_payment_gateways', 'payment_gateway_disable_private' );

 function payment_gateway_disable_private( $available_gateways ) {

    $user = wp_get_current_user();

    if ( isset( $available_gateways['authorize'] ) && in_array('company', $user->roles) ) {
        unset( $available_gateways['authorize'] );
    } else if ( isset( $available_gateways['cheque'] ) && in_array('customer', $user->roles)  ) {
        unset( $available_gateways['cheque'] );
    }

   return $available_gateways;

}

Hinweis: Wenn der Benutzer abgemeldet ist, hat er keine Rolle. Möglicherweise möchten Sie dies berücksichtigen und etwas anderes tun, z. B. den Benutzer vor dem Einkauf so umleiten, dass er sich zuerst anmeldet. Abhängig von Ihrem Anwendungsfall können Sie hierfür is_user_logged_in() verwenden.

3
userabuser