WordPress Plugin WooCommerce mit Benutzerrolle von User Profile Plugin Ultimate Member anpassen
User-Role abhängig Produkttexte, Preise und Bilder anzeigen oder verbergen
Auf einer WordPress-Webseite sollen Produkte für den Webseitenbesucher ohne Anmeldung nur ohne Preis sichtbar sein. Es gibt zwei Produktschienen “Deckel aus Metall” und “Deckel aus Kunststoff” und drei Kundengruppen (“Metall”, “Kunststoff” und “Beide”). Nach erfolgreicher Anmeldung bekommt der Kunde je nach Kundengruppe nur die entsprechende Produktschiene mit weiteren Produktinformationen, Preisen und Detailbildern angezeigt.
Umgesetzt habe ich das mit folgendem WordPress Theme und Plugins:
- Theme Astra Pro
- WooCommerce im Katalog-Modus
- Ultimate Member für Registrierung, Zuordnung der User-Rollen und Kunden-Anmeldung
- WP All Import Pro für Import der mit PHP-Programm aufbereiteten CSV-Daten
- WP All Import – WooCommerce Add-On Pro für WooCommerce-Import
- BT-Woo-Ultimate – Plugin mit Custom Functions, Filter- und Action-Hooks
Direkt zu Downloads und Links
- WooCommerce Produktkatalog und Produkt-Anzeige anpassen
- Download Plugin mit Custom Functions, Filter- und Action-Hooks zu WooCommerce und Ultimate Member
- WooCommerce Billing-Fields bei Registrierung mit Ultimate Member übernehmen
- Produktinformation mit Ultimate Member benutzerabhängig anzeigen
- Hilfreiche Links
1. WooCommerce Produktkatalog und Produkt-Anzeige anpassen
In den Einstellungen für den Produktkatalog und für das einzelne Produkt wird die Preisanzeige disabled. Die Produktdaten werden für den Import mit WPAllImport mit einem PHP-Programm entsprechend als CSV-Tabelle aufbereitet.
Statt Preis wird ein Shortcode eingebunden: [bt-get-product-price-info sku=”123456″].
Preis anzeigen
Mit dem Shortcode werden die Daten auf der WordPress-Seite entsprechend aufbereitet. Für nicht angemeldete Webseiten-Besucher wird statt Preis ein Button “Preis anzeigen” eingeblendet. Wenn ein Kunde mit Hilfe des Plugins Ultimate Member registriert und angemeldet ist, werden je nach User-Rolle Produkte aus nur einer Produktschiene oder alle Produkte mit Preis und Detailbildern angezeigt.
Benutzerrollen mit Ultimate Member
Bei dem Plugin Ultimate Member für die Benutzerverwaltung werden drei Benutzerrollen angelegt: Beide, Metall und Kunststoff. Nach Registrierung eines neuen Kunden wird er der entsprechenden Rolle zugeordnet.
2. BT-Woo-Ultimate – Plugin mit Custom Functions, Filter- und Action-Hooks
Die Selektion der Produkte und die Produktbeschreibung ist abhängig von der Ultimate Member Benutzerrolle, Preisanzeige und Anpassung der Detailbilder wird mit WooCommerce-Filter- und Action-Hooks umgesetzt.
<?php /* Plugin Name: BT Woo Ultimate Description: WooCommerce Anpassungen mit Ultimate Member Author: Benedicta Thölke Version: 1.0.0 Author URI: https://bt-webdesign.de/ */ /** * get User-Role */ $bt_NotLoggedIn = 'NotLoggedIn'; $bt_UserRole_Beide = 'Beide'; $bt_UserRole_Other = 'Other'; $bt_UserRole_Metall = 'Metall'; $bt_UserRole_Kunststoff = 'Kunststoff'; function getUserRole(){ global $bt_NotLoggedIn, $bt_UserRole_Beide, $bt_UserRole_Other, $bt_UserRole_Metall, $bt_UserRole_Kunststoff; if ( !is_user_logged_in() ) return $bt_NotLoggedIn; $user_meta = get_userdata(get_current_user_id()); $user_roles = $user_meta->roles; if ( isset($user_roles) && is_array($user_roles) && in_array('um_beide', $user_roles, true ) ) return $bt_UserRole_Beide; if ( isset($user_roles) && is_array($user_roles) && in_array('um_kunststoff', $user_roles, true) ) return $bt_UserRole_Kunststoff; if ( isset($user_roles) && is_array($user_roles) && in_array('um_metall', $user_roles, true) ) return $bt_UserRole_Metall; return $bt_UserRole_Other; } /** * Wenn niemand angemeldet ist, keine Thumbnails anzeigen * Wenn User angemeldet, Thumbnails je nach Rolle anzeigen */ function bt_select_thumbnails($html, $attachment_id ) { global $bt_NotLoggedIn, $bt_UserRole_Beide, $bt_UserRole_Metall, $bt_UserRole_Kunststoff; global $post, $product; $bt_user_role = getUserRole(); bt_write_log('getThumnails='.$bt_user_role); if ( $bt_NotLoggedIn == $bt_user_role ){ $featured_image = get_post_thumbnail_id( $post->ID ); if ( $attachment_id != $featured_image ) $html = ''; } else{ $image_attributes = wp_get_attachment_image_src( $attachment_id ); if ( $bt_UserRole_Metall == $bt_user_role ){ $pos = strpos ( $image_attributes[0], '_P' ); if ($pos !== false) $html = ''; } else if ( $bt_UserRole_Kunststoff == $bt_user_role ){ $pos = strpos ( $image_attributes[0], '_A' ); if ($pos !== false) $html = ''; } } return $html; } add_filter('woocommerce_single_product_image_thumbnail_html', 'bt_select_thumbnails', 10, 2); /** * Produkt-Query auf Katalogseite anpassen */ function bt_woo_product_cat_query( $q ){ global $bt_UserRole_Beide, $bt_UserRole_Metall, $bt_UserRole_Kunststoff; $bt_user_role = getUserRole(); if ( $bt_user_role == $bt_UserRole_Metall ) { $q->set('product_tag', array('Metall', 'Beide')); return; } if ( $bt_user_role == $bt_UserRole_Kunststoff ) { $q->set('product_tag', array('Kunststoff', 'Beide')); return; } } add_action( 'woocommerce_product_query', 'bt_woo_product_cat_query' ); /** * Produkt-Query für Widget "Kürzlich angesehene Produkte" anpassen */ function bt_recently_viewed_products_widget_query_args( $args ) { global $bt_UserRole_Beide, $bt_UserRole_Metall, $bt_UserRole_Kunststoff; $bt_user_role = getUserRole(); $terms = array(); if ( $bt_user_role == $bt_UserRole_Beide ) { $terms[] = 'Metall'; $terms[] = 'Kunststoff'; } if ( $bt_user_role == $bt_UserRole_Metall ) $terms[] = 'Metall'; if ( $bt_user_role == $bt_UserRole_Kunststoff ) $terms[] = 'Kunststoff'; if ( $bt_user_role == $bt_UserRole_Metall || $bt_user_role == $bt_UserRole_Kunststoff || $bt_user_role == $bt_UserRole_Beide ){ $terms[] = 'Beide'; $args['tax_query'][] = array( 'taxonomy' => 'product_tag', 'field' => 'name', 'terms' => $terms, 'operator' => 'IN', ); } return $args; } add_filter( 'woocommerce_recently_viewed_products_widget_query_args', 'bt_recently_viewed_products_widget_query_args', 10, 1 ); /** * Preis überall ausblenden, wenn nicht angemeldet oder Artikel - User passt nicht zum Artikel */ function bt_hide_price( $price, $instance ){ global $bt_UserRole_Beide, $bt_UserRole_Metall, $bt_UserRole_Kunststoff; global $product; $bt_user_role = getUserRole(); if ( $bt_user_role == $bt_UserRole_Beide ) return $price; else if ( !isset($product) ) return ''; else if ( $bt_user_role == $bt_UserRole_Metall || $bt_user_role == $bt_UserRole_Kunststoff ){ $post_tags = get_the_terms( $product->get_id(), 'product_tag' ); if ( !empty( $post_tags ) && !is_wp_error( $post_tags ) ){ if ( $post_tags[0]->name == 'Beide' ) return $price; if ( $bt_user_role == $bt_UserRole_Metall && $post_tags[0]->name == 'Metall' ) return $price; if ( $bt_user_role == $bt_UserRole_Kunststoff && $post_tags[0]->name == 'Kunststoff' ) return $price; } else return ''; } else return ''; } add_filter( 'woocommerce_get_price_html', 'bt_hide_price', 10, 2 ); add_filter( 'wc_price', 'bt_hide_price', 10, 2); /** * get Product Preisinfo plus Button "Produkt anfragen" * User muss angemeldet sein, User-Rolle: Metall, Kunststoff oder Beide **/ function bt_priceInfo(){ global $product; $price_info = ' <p class="price"><span class="woocommerce-Price-amount amount">'.$product->get_regular_price().'<span class="woocommerce-Price-currencySymbol">€</span></span> <span class="bt_small">zzgl. USt</span></p> <form class="cart" action="'.$product->get_slug().'" method="post" enctype="multipart/form-data"> <button type="submit" name="add-to-cart" value="'.$product->get_id().'" class="single_add_to_cart_button button alt">'.'Produkt anfragen'.'</button> </form>'; return $price_info; } /** * Preis auf Produktseite anzeigen, wenn User mt Rolle Beide, Metall oder Kunststoff angemeldet ist und passender Aritkel selektiert ist * Button "Preis anzeigen" und Link zur Anmeldung, wenn nicht angemeldet */ function bt_get_product_price_info(){ global $bt_UserRole_Beide, $bt_UserRole_Metall, $bt_UserRole_Kunststoff; global $product; $bt_user_role = getUserRole(); if ( $bt_user_role == $bt_UserRole_Beide ) return bt_priceInfo(); else if ( $bt_user_role == $bt_UserRole_Metall || $bt_user_role == $bt_UserRole_Kunststoff ){ $post_tags = get_the_terms( $product->get_id(), 'product_tag' ); if ( !empty( $post_tags ) && ! is_wp_error( $post_tags ) ){ if ( $post_tags[0]->name == 'Beide' ) return bt_priceInfo(); if ( $bt_user_role == $bt_UserRole_Metall && $post_tags[0]->name == 'Metall' ) return bt_priceInfo(); if ( $bt_user_role == $bt_UserRole_Kunststoff && $post_tags[0]->name == 'Kunststoff' ) return bt_priceInfo(); } } return '<a href="/anmelden/" class="single_add_to_cart_button button alt bt_preis_anzeigen">'.'Preis anzeigen'.'</a>'; } add_shortcode( 'bt-get-product-price-info', 'bt_get_product_price_info' ); /** * Plugin: WooCommerce + Ultimate Member * nach Registrierung mit Ultimate Member Daten für WooCommerce-Billing-Address speichern */ function bt_save_woo_billing( $user_id, $submitted ) { $bt_country = array('Deutschland' => 'DE', 'Belgien' => 'BE', 'Dänemark' => 'DK', 'Frankreich' => 'FR', 'Italien' => 'IT', 'Liechtenstein' => 'LI', 'Luxemburg' => 'LU', 'Niederlande' => 'NL', 'Österreich' => 'AT', 'Schweiz' => 'CH'); $bt_usermeta = get_user_meta( $user_id ); if ( isset($bt_usermeta['first_name'][0]) ) update_user_meta( $user_id, 'billing_first_name', $bt_usermeta['first_name'][0] ); if ( isset($bt_usermeta['last_name'][0]) ) update_user_meta( $user_id, 'billing_last_name', $bt_usermeta['last_name'][0] ); if ( isset($bt_usermeta['country'][0]) && isset($bt_country[$bt_usermeta['country'][0]]) ) update_user_meta( $user_id, 'billing_country', $bt_country[$bt_usermeta['country'][0]]); if ( isset($bt_usermeta['phone_number'][0]) ) update_user_meta( $user_id, 'billing_phone', $bt_usermeta['phone_number'][0]); if ( isset($bt_usermeta['user_email'][0]) ) update_user_meta( $user_id, 'billing_email', $bt_usermeta['user_email'][0]); } add_action( 'um_after_save_registration_details', 'bt_save_woo_billing', 10, 2 );
Download Plugin mit WooCommerce-Filter- und Action-Hooks in Kombination mit Ultimate Member:
3. WooCommerce Billing-Fields bei Registrierung mit Ultimate Member übernehmen
Ultimate Member Action Hook um_after_save_registration_details
Bei der Registrierung sind Firma, Adresse etc. Pflichtfelder. Damit der Kunde diese Angaben nicht noch einmal im Checkout-Prozess für WooCommerce machen muss, kopiere ich die Felder nach erfolgreicher Registrierung mit einem Ultimate Member Action Hook (um_after_save_registration_details) für die Rechnungsadresse in die entsprechenden WooCommerce-Felder:
- add_action( 'um_after_save_registration_details', 'bt_save_woo_billing', 10, 2 );
Meta-Keys zu den WooCommerce Billing-Fields in der WordPress SQL-Tabelle usermeta:
- billing_company
- billing_first_name
- billing_last_name
- billing_address_1
- billing_address_2
- billing_postcode
- billing_city
- billing_country
- billing_state
- billing_email
- billing_phone
Ultimate Member Registrierungsformular mit WooCommerce Billing Meta-Keys
Einige Felder benötige ich nur bei WooCoommerce, deshalb sind im Registrierungsformular bei Ultimate Member direkt die WooCommerce Billing Meta-Keys angegeben.
Nach Registrierung mit Ultimate Member Daten für WooCommerce-Billing-Address speichern
Daten, die ich beim User und bei der WooCommerce Rechnungsadresse benötige, speichere ich nach erfolgreicher Registrierung mit der WordPress Funktion update_user_meta in der WordPress SQL-Tabelle Usermeta mit den für WooCommerce nötigen Meta-Keys (billing_xxx):
/** * Plugin: WooCommerce + Ultimate Member * Ultimate Member Action-Hook: um_after_save_registration_details * nach Registrierung mit Ultimate Member Daten für WooCommerce-Billing-Address speichern */ function bt_save_woo_billing( $user_id, $submitted ) { $bt_country = array('Deutschland' => 'DE', 'Belgien' => 'BE', 'Dänemark' => 'DK', 'Frankreich' => 'FR', 'Italien' => 'IT', 'Liechtenstein' => 'LI', 'Luxemburg' => 'LU', 'Niederlande' => 'NL', 'Österreich' => 'AT', 'Schweiz' => 'CH'); $bt_usermeta = get_user_meta( $user_id ); if ( isset($bt_usermeta['first_name'][0]) ) update_user_meta( $user_id, 'billing_first_name', $bt_usermeta['first_name'][0] ); if ( isset($bt_usermeta['last_name'][0]) ) update_user_meta( $user_id, 'billing_last_name', $bt_usermeta['last_name'][0] ); if ( isset($bt_usermeta['country'][0]) && isset($bt_country[$bt_usermeta['country'][0]]) ) update_user_meta( $user_id, 'billing_country', $bt_country[$bt_usermeta['country'][0]]); if ( isset($bt_usermeta['phone_number'][0]) ) update_user_meta( $user_id, 'billing_phone', $bt_usermeta['phone_number'][0]); if ( isset($bt_usermeta['user_email'][0]) ) update_user_meta( $user_id, 'billing_email', $bt_usermeta['user_email'][0]); } add_action( 'um_after_save_registration_details', 'bt_save_woo_billing', 10, 2 );
4. Produktinformation benutzerabhängig anzeigen
Mit dem Plugin Ultimate Member kann mit verschiedenen Shortcodes zum Beispiel die Produktbeschreibung angepasst werden.
Text mit dem Shortcode [um_loggedout] wird nur für nicht angemeldete Webseitenbesucher angezeigt.
Mit [um_show_content roles=”um_beide”] kann eine bzw. mehrere Benutzerrollen angegeben werden:
<h3>Verwendung von Artikel 123456</h3> [um_loggedout]<p>Produktbeschreibung für Webseitenbesucher ohne Anmeldung</p>[/um_loggedout] [um_show_content roles="um_beide"]<p>Produktbeschreibung für Webseitenbesucher mit Anmeldung und Kundengruppe "Beide" </p>[/um_show_content] [um_show_content roles="um_kunststoff,um_metall"]<p>Produktbeschreibung für Webseitenbesucher mit Anmeldung und Kundengruppe "Kunststoff" oder "Metall" </p>[/um_show_content] <p>Allgemeine Informationen für alle Webseitenbesucher</p>
5. Hilfreiche Links zu WordPress Plugin WooCommerce und Ultimate Member:
- https://www.businessbloomer.com/ the best ever!
- https://www.welaunch.io/de/wissensdatenbank/topics/woocommerce/quick-view/quick-view-filter-hooks/
- https://woocommerce.github.io/code-reference/hooks/hooks.html
- https://docs.woocommerce.com/document/introduction-to-hooks-actions-and-filters/
- https://aceplugins.com/hiding-product-prices-based-on-user-role-in-woocommerce/
- https://stackoverflow.com/questions/51963326/how-to-filter-all-products-in-the-woocommerce-webshop-with-a-specific-tag-in-the
- https://docs.ultimatemember.com/