logo

Création d’un rôle et des prix & promos spécifiques « Client professionnel » dans Woocommerce WordPress [function + PHP]

Ici, le code vous permet de donner un accès aux prix « professionnels » et prix « promotion pour professionnel » pour des articles mis en vente pour des clients classiques et des clients professionnels. Ce « hack » vous épargne l’installation et la mise à jour de deux plugins.

Dans fonctions.php (création du rôle « professionnel »)

// création d'un rôle Pro
function custom_role(){
$customer_roles = get_role( 'customer' )->capabilities;
$new_role = 'client_pro';
$display_name = 'Client professionnel';
add_role( $new_role, $display_name, $customer_roles ); 
}
add_action( 'init', 'custom_role', 10);

 

Dans fonctions.php (création des deux champs « custom field » pour les prix – prix professionnels et promotions professionnels )

// ajout de l'option prix et promo pour les clients professionnels

add_action( 'woocommerce_product_options_general_product_data', 'woocommerce_product_custom_fields' );

function woocommerce_product_custom_fields () {
global $woocommerce, $post;
echo '<div class=" product_custom_field ">';

woocommerce_wp_text_input(
array(
'id' => '_custom_customer_price_field',
'label' => __('Prix professionnels ('. get_woocommerce_currency_symbol() .')', 'woocommerce'),
'type' => 'number',
'custom_attributes' => array(
'step' => 'any',
'min' => 0,
)
)
);

woocommerce_wp_text_input(
array(
'id' => '_custom_customer_sale_field',
'label' => __('Prix pro promo ('. get_woocommerce_currency_symbol() .')', 'woocommerce'),
'type' => 'number',
'custom_attributes' => array(
'step' => 'any',
'min' => 0,
)
)
);

echo '</div>';
}
add_action( 'woocommerce_process_product_meta', 'woocommerce_product_custom_fields_save' );

function woocommerce_product_custom_fields_save($post_id){

$woocommerce_custom_customer_price_field = $_POST['_custom_customer_price_field'];
if (!empty($woocommerce_custom_customer_price_field)){
update_post_meta($post_id, '_custom_customer_price_field', esc_attr($woocommerce_custom_customer_price_field));
}else{
delete_post_meta( $post_id, '_custom_customer_price_field', esc_attr($woocommerce_custom_customer_price_field));
}

$woocommerce_custom_customer_sale_field = $_POST['_custom_customer_sale_field'];
if (!empty($woocommerce_custom_customer_sale_field)){
update_post_meta($post_id, '_custom_customer_sale_field', esc_attr($woocommerce_custom_customer_sale_field));
}else{
delete_post_meta( $post_id, '_custom_customer_sale_field', esc_attr($woocommerce_custom_customer_sale_field));
}
}

 

Dans fonctions.php (gestion de l’affichage des prix )

//gestion de l'affichage des prix
add_filter( 'woocommerce_product_variation_get_price', 'regular_pro_price', 10, 2 );
add_filter( 'woocommerce_product_get_regular_price', 'regular_pro_price', 10, 2 );
add_filter( 'woocommerce_product_get_price', 'pro_price', 10, 2 );
add_filter( 'woocommerce_product_get_sale_price', 'pro_sale_price', 10, 2 );

function regular_pro_price( $price, $product ) {

global $post;

$user = wp_get_current_user();
if ( in_array( 'client_pro', (array) $user->roles ) ) {
$sale_price = get_post_meta( $post->ID, '_custom_customer_price_field', true );
if(!empty($sale_price)){
$price = $sale_price;
}
}
return $price;
}

function pro_price( $price, $product ) {
global $post;
$user = wp_get_current_user();
if ( in_array( 'client_pro', (array) $user->roles ) ) {
$sale_price = get_post_meta( $post->ID, '_custom_customer_sale_field', true );
if(!empty($sale_price)){
$price = $sale_price;
}else{
$sale_price = get_post_meta( $post->ID, '_custom_customer_price_field', true );
if(!empty($sale_price)){
$price = $sale_price;
}
}
}
return $price;
}

function pro_sale_price( $price, $product ) {
global $post;
$user = wp_get_current_user();
if ( in_array( 'client_pro', (array) $user->roles ) ) {
$sale_price = get_post_meta( $post->ID, '_custom_customer_sale_field', true );
if(!empty($sale_price)){
$price = $sale_price;
}else{
$pro_price = get_post_meta( $post->ID, '_custom_customer_price_field', true );
if(!empty($pro_price)){
$price = '';
}
}
}
return $price;
}