Different Product Prices by Role in WooCommerce

ACF ACF Tutorials Blogs Code Snippets Coding Blog Tutorials Woocommerce WooCommerce Custom Code Woocommerce Hooks WooCommerce Tips Wordpress WordPress Code Snippets WordPress Development WordPress Functions WordPress How-To WordPress Snippets WordPress Theme Development WordPress Tips WordPress Tutorials WP Hooks

Different Product Prices by Role in WooCommerce Tutorial/Guide

Different Product Prices by Role in WooCommerce

  Want to offer different product pricing to business types like wholesalers or resellers? This guide shows how to set that up in WooCommerce using meta boxes and user roles.

Step 1: Add Custom User Roles

Create dedicated user roles using the following snippet or a plugin:

function define_custom_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', 'define_custom_roles' );

Step 2: Assign Roles to Customers

In the admin panel, assign roles like `wholesaler` to registered users as needed.

Step 3: Override Product Prices by Role

Use this filter to return a specific price if the logged-in user has a matching role:

function override_price_by_user_role( $price, $product ) {
    $user = wp_get_current_user();

    $roles = $user->roles;

    foreach ( [ 'wholesaler', 'reseller', 'business_customer' ] as $role ) {
        if ( in_array( $role, $roles ) ) {
            $role_price = get_post_meta( $product->get_id(), '_' . $role . '_price', true );
            if ( $role_price ) return $role_price;
        }
    }

    return $price;
}
add_filter( 'woocommerce_product_get_price', 'override_price_by_user_role', 10, 2 );

Step 4: Add Custom Pricing Meta Boxes

Enable admin pricing input for different roles:

function register_role_price_boxes() {
    $roles = ['wholesaler', 'reseller', 'business_customer'];
    foreach ( $roles as $role ) {
        add_meta_box( "{$role}_price_box", ucfirst($role) . ' Price', function($post) use ($role) {
            $val = get_post_meta( $post->ID, "_{$role}_price", true );
            echo '<label>Enter Price for ' . ucfirst($role) . ':</label> ';
            echo '<input type="number" step="0.01" name="' . $role . '_price" value="' . esc_attr($val) . '" />';
        }, 'product', 'normal' );
    }
}
add_action( 'add_meta_boxes', 'register_role_price_boxes' );

function save_role_prices( $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_role_prices' );

Once complete, your store will show different prices to different users based on their role — fully automated.

💡 Have a Coding Problem?

Search our archives or reach out to our team for solutions and expert advice.