WooCommerce meets Ultimate Member

Wordpress: Produktinformationen nur bei entsprechender Anmeldung und Benutzergruppe anzeigen

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

  1. WooCommerce Produktkatalog und Produkt-Anzeige anpassen
  2. Download Plugin mit Custom Functions, Filter- und Action-Hooks zu WooCommerce und Ultimate Member
  3. WooCommerce Billing-Fields bei Registrierung mit Ultimate Member übernehmen
  4. Produktinformation mit Ultimate Member benutzerabhängig anzeigen
  5. 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″].

WooCommerce Produkt ohne Anmeldung mit Ultimate Member mit Button "Preis anzeigen"

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.

WooCommerce Produkt mit Preis nach Anmeldung mit Ultimate Member

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

WooCommerce Billing-Fields bei Ultimate Member Registrierung ü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.

Ultimate Member Registrierungsformular mit WooCommerce Billing Meta-Keys

 

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>

 

Kontakt
05254 / 67673
info@bt-webdesign.de
Kontaktformular