WooCommerce Role-Based Pricing Setup with Meta Boxes
To personalize product pricing for wholesalers, resellers, or B2B buyers in WooCommerce, follow this detailed guide using custom user roles and meta boxes.
Step 1: Register Custom User Roles
Create new user roles using a plugin like “User Role Editor” or by placing this code inside your theme’s functions.php file:
function create_custom_user_roles() {
add_role( 'wholesaler', 'Wholesaler', array( 'read' => true ) );
add_role( 'reseller', 'Reseller', array( 'read' => true ) );
add_role( 'business_customer', 'Business Customer', array( 'read' => true ) );
}
add_action( 'init', 'create_custom_user_roles' );
Step 2: Assign the Roles to Users
From the WordPress user management screen, assign these roles accordingly for relevant customer types.
Step 3: Set Prices Per Role Using Product Meta
Add this function to apply custom prices to each role dynamically:
function apply_role_based_price( $price, $product ) {
$user = wp_get_current_user();
if ( in_array( 'wholesaler', $user->roles ) ) {
$price_data = get_post_meta( $product->get_id(), '_wholesaler_price', true );
if ( $price_data ) return $price_data;
} elseif ( in_array( 'reseller', $user->roles ) ) {
$price_data = get_post_meta( $product->get_id(), '_reseller_price', true );
if ( $price_data ) return $price_data;
} elseif ( in_array( 'business_customer', $user->roles ) ) {
$price_data = get_post_meta( $product->get_id(), '_business_customer_price', true );
if ( $price_data ) return $price_data;
}
return $price;
}
add_filter( 'woocommerce_product_get_price', 'apply_role_based_price', 10, 2 );
Step 4: Create Meta Boxes for Price Input
Use this code to show meta fields in the product editor:
function register_price_meta_boxes() {
add_meta_box( 'wholesaler_price', 'Wholesaler Price', 'show_wholesaler_price_box', 'product', 'normal' );
add_meta_box( 'reseller_price', 'Reseller Price', 'show_reseller_price_box', 'product', 'normal' );
add_meta_box( 'business_customer_price', 'Business Customer Price', 'show_business_price_box', 'product', 'normal' );
}
add_action( 'add_meta_boxes', 'register_price_meta_boxes' );
// Meta box display functions
function show_wholesaler_price_box( $post ) {
$price = get_post_meta( $post->ID, '_wholesaler_price', true );
echo '<label>Wholesaler Price:</label> <input type="number" step="0.01" name="wholesaler_price" value="' . esc_attr( $price ) . '" />';
}
function show_reseller_price_box( $post ) {
$price = get_post_meta( $post->ID, '_reseller_price', true );
echo '<label>Reseller Price:</label> <input type="number" step="0.01" name="reseller_price" value="' . esc_attr( $price ) . '" />';
}
function show_business_price_box( $post ) {
$price = get_post_meta( $post->ID, '_business_customer_price', true );
echo '<label>Business Customer Price:</label> <input type="number" step="0.01" name="business_customer_price" value="' . esc_attr( $price ) . '" />';
}
// Save meta values
function save_price_meta_boxes( $post_id ) {
foreach ( ['wholesaler_price', 'reseller_price', 'business_customer_price'] as $field ) {
if ( isset( $_POST[$field] ) ) {
update_post_meta( $post_id, '_' . $field, sanitize_text_field( $_POST[$field] ) );
}
}
}
add_action( 'save_post_product', 'save_price_meta_boxes' );
This lets you manage pricing directly from the backend, with logic automatically applied on the front end.
