So kannst du in WooCommerce Bezahloptionen nach Benutzerrollen definieren.

Marc Wag­ner

Novem­ber 11, 2020

2 min read|

Nicht immer möch­te man, das alle Besu­cher auch alle Bezahl­me­tho­den ver­wen­den kön­nen. Gera­de wenn es Neu­kun­den sind, ist man gewohnt etwas vor­sich­ti­ger. Stan­dard­mä­ßig las­sen sich jedoch nur alle Zah­lungs­me­tho­den glo­bal akti­vie­ren oder deak­ti­vie­ren.

Dabei kann man das bequem mit weni­gen Zei­len Code indi­vi­du­ell anpas­sen.

Der fertige Code #

Wir star­ten wie gewohnt mit dem kom­plet­ten Code, den du ein­fach in die functions.php ein­tra­gen kannst.

<?php
function setPaymentOptionsByUserRole( $availablePaymentGateways ) {
    if ( is_user_logged_in() ) {

        $allowedPaymentGateways = array();
        $user = wp_get_current_user();

        if ( array_intersect( array('merchant'), $user->roles )) {
            $allowedPaymentGateways = array(
                'bacs',
                'direct-debit',
                'ppec_paypal',
                'paypal_plus',
            );
        }

        if(!empty($allowedPaymentGateways)) {
            foreach ( $availablePaymentGateways as $slug => $gateway ) {
                if ( ! in_array( $slug, $allowedPaymentGateways ) ) {
                    unset( $availablePaymentGateways[ $slug ] );
                }
            }
        }
    }else{
        /*
         * We can use the else loop to change the payment gateways for 
         * guests.
         */
        $allowedPaymentGateways = array(
            'bacs',
            'direct-debit',
            'ppec_paypal',
            'paypal_plus',
        );

        if(!empty($allowedPaymentGateways)) {
            foreach ( $availablePaymentGateways as $slug => $gateway ) {
                if ( ! in_array( $slug, $allowedPaymentGateways ) ) {
                    unset( $availablePaymentGateways[ $slug ] );
                }
            }
        }
    }

    return $availablePaymentGateways;
}

add_filter('woocommerce_available_payment_gateways', 'setPaymentOptionsByUserRole', 90, 1);

Das gan­ze lässt sich end­los erwei­tern. In unse­rem Bei­spiel haben wir die Bezahl­me­tho­den für alle Benut­zer mit der Benut­zer­rol­le “mer­chant” auf Pay­Pal, Über­wei­sung, Last­schrift und Kre­dit­kar­te beschränkt.

if ( array_intersect( array('merchant'), $user->roles )) {
	$allowedPaymentGateways = array(
		'bacs',
		'direct-debit',
		'ppec_paypal',
		'paypal_plus',
	);
}

Alle ande­ren Bezahl­me­tho­den wer­den anschlie­ßend ent­fernt.

if(!empty($allowedPaymentGateways)) {
	foreach ( $availablePaymentGateways as $slug => $gateway ) {
		if ( ! in_array( $slug, $allowedPaymentGateways ) ) {
			unset( $availablePaymentGateways[ $slug ] );
		}
	}
}

So kannst du weitere Rollen einschränken #

Du kannst wei­te­re Rol­len hin­zu­fü­gen, indem du den fol­gen­den Block kopierst und direkt dar­un­ter ein­fügst.

if ( array_intersect( array('<user_role>'), $user->roles )) {
	$allowedPaymentGateways = array();
}

Erset­ze ‘<user_role>’ durch die gewünsch­te Benut­zer­rol­le.

Word­Press Benut­zer­rol­leSlug
Edi­toredi­tor
Aut­horaut­hor
Admi­nis­tra­toradmi­nis­tra­tor
Con­tri­bu­torcon­tri­bu­tor
Sub­scri­bersub­scri­ber
Word­Press Benut­zer­rol­len

Das war es auch schon. Mit weni­gen Zei­len Code lässt sich der Bezahl­pro­zess bequem anpas­sen. Ich hof­fe, der Arti­kel war hilf­reich für dich. Falls du Fra­gen hast, freu­en wir uns natür­lich, die­se für dich zu beant­wor­ten.

88e86fcb816eff22bc917094df2862d8dd5c0e978b333e6dd5f36f808990c261 96

Arti­kel von:

Marc Wag­ner

Hal­lo, Marc hier. Ich bin der Grün­der von Forge12 Inter­ac­ti­ve und bereits seit über 20 Jah­ren lei­den­schaft­lich dabei Web­sei­ten, Online­shops, Anwen­dun­gen und SaaS-Lösun­gen für Unter­neh­men zu ent­wi­ckeln. Vor der Grün­dung habe ich bereits in Bör­sen notier­ten Unter­neh­men gear­bei­tet und mir aller­lei Wis­sen ange­eig­net. Die­ses Wis­sen möch­te ich nun an mei­ne Kun­den wei­ter­ge­ben.

Hast du eine Fra­ge? Hin­ter­lass bit­te einen Kom­men­tar
  1. blank
    Chris­toph Juli 4, 2022 at 09:07 — Rep­ly

    Hal­lo,

    dan­ke für den sehr hilf­rei­chen Code. Ist es mög­lich, dass man die­sen auch auf nicht ein­ge­logg­te user also gast Ein­käu­fer anwen­det?

    bes­te Grü­ße

    • ac6edb55c1fefa891790daaeb15a79a3b9d22ed399292e234411aa67ac6fb9f6 54
      Marc Wag­ner Juli 4, 2022 at 09:30 — Rep­ly

      Hal­lo Chris­toph,

      vie­len Dank für dei­nen Kom­men­tar. Ich habe den fer­ti­gen Code ange­passt, um indi­vi­du­el­le Bezahl­me­tho­den für Gäs­te (nicht ein­ge­logg­te Benut­zer) ein­zu­schrän­ken.

      Vie­le Grü­ße
      Marc

      • blank
        Chris­toph Juli 4, 2022 at 10:40 — Rep­ly

        Hi,

        wow, vie­len dank für die rasche Ant­wort und di eAn­pas­sung. Das hilft mir sehr!

        Gibt es auch eine Mög­lich­keit die Opti­on umzu­keh­ren, dass nur gewis­se Optio­nen aus­ge­blen­det wer­den anstatt die gan­ze lis­te anzu­füh­ren, wel­che pay­ment opti­ons erlaubt sind?

        Also qua­si, Bezah­lung auf Rech­nung für User Role XX oder Gäs­te aus­blen­den?

        Dan­ke dir!

        • ac6edb55c1fefa891790daaeb15a79a3b9d22ed399292e234411aa67ac6fb9f6 54
          Marc Wag­ner Juli 4, 2022 at 13:12 — Rep­ly

          Es müss­te schon rei­chen, wenn du aus !in_array ein­fach in_array machst. Dadurch soll­te er nur die ent­fer­nen, die in $allo­wed­Pay­ment­Gate­ways hin­ter­legt wur­den.

  2. blank
    Tobi­as Okto­ber 13, 2022 at 16:48 — Rep­ly

    Hal­lo,

    dan­ke für den Code, ich glau­be das ist genau das was ich gesucht habe.

    Ich suche etwas, wo man nur eine Zah­lungs­me­tho­de (auf Rech­nung) für eine Benut­zer­grup­pe frei­schal­tet (nor­mal ist die­se Zah­lungs­art nicht akti­viert).

    Aber gibt es sowas auch als Plug­in, dass es über­sicht­li­cher ist?
    Woher weiß ich denn wie die Zah­lungs­me­tho­den hei­ßen oder die zusätz­li­chen Benut­zer­rol­len?
    Muss ich da in der Daten­bank nach­se­hen wie die benannt sind?

    Grü­ße und Dan­ke
    Tobi­as

    • ac6edb55c1fefa891790daaeb15a79a3b9d22ed399292e234411aa67ac6fb9f6 54
      Marc Wag­ner Okto­ber 15, 2022 at 13:22 — Rep­ly

      Hal­lo Tobi­as,
      da die Zah­lungs­me­tho­den sich von Shop zu Shop unter­schei­den, wür­de ich mir ein­fach alle kurz aus­ge­ben las­sen, in dem ich den Code am Anfang der Funk­ti­on ein­fü­ge:

      if(current_user_can('manage_options')){
      var_dump($availablePaymentGateways);
      }

      Durch die if-Abfra­­ge selbst du sicher, dass die Aus­ga­be nur für Benut­zer sicht­bar ist, die auch Rech­te haben, Optio­nen im Backend zu ver­än­dern. Dadurch kön­nen dei­ne Besu­cher wei­ter­hin Ein­kau­fen wäh­rend du die Bezahl­me­tho­den anpasst.

      Vie­le Grü­ße
      Marc

  3. blank
    Mar­tin Okto­ber 22, 2022 at 10:02 — Rep­ly

    Hal­lo Marc,

    Kann man damit auch ein­stel­len, dass Gäs­te nur bis zum Bei­spiel 99€ auf Rech­nung zah­len kön­nen und dar­über hin­aus nur Bestands­kun­den?

    Vie­le Grü­ße

    Mar­tin

    • ac6edb55c1fefa891790daaeb15a79a3b9d22ed399292e234411aa67ac6fb9f6 54
      Marc Wag­ner Okto­ber 24, 2022 at 12:22 — Rep­ly

      Hal­lo Mar­tin,

      lei­der nicht.

      VG
      Marc