WooCommerce Bulk Price Setup with ACF Repeater Fields
Want to offer different prices based on order quantity? Use ACF to define quantity-based pricing for WooCommerce products. You’ll also update the price dynamically when a user adds an item to their cart.
Step 1: Install ACF Plugin
Ensure Advanced Custom Fields (ACF) plugin is active on your WordPress site.
Step 2: Create Quantity-Based Price Fields
Navigate to Custom Fields > Add New. Add a Repeater with fields for `quantity` and `price`. Assign the group to WooCommerce products.
Step 3: Show Pricing Options on Product Page
Paste this code in your `functions.php` or plugin to display available prices:
function display_all_prices_on_product_page() {
global $post;
// Check if the current post is a product
if ( 'product' !== get_post_type( $post ) ) {
return;
}
// Get the ACF repeater field data
$quantity_and_prices = get_field( 'quantity_and_prices', $post->ID );
// Display the prices if available
if ( $quantity_and_prices ) {
echo '<h2>All Prices:</h2>';
echo '<ul>';
foreach ( $quantity_and_prices as $item ) {
$quantity = (int) $item['quantity'];
$price = (float) $item['price'];
echo '<li>' . esc_html( $quantity ) . ' - ' . wc_price( $price ) . '</li>';
}
echo '</ul>';
}
}
add_action( 'woocommerce_single_product_summary', 'display_all_prices_on_product_page', 25 );
Step 4: Update Price Dynamically in Cart
To calculate final price dynamically:
function update_price_by_qty( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
foreach ( $cart->get_cart() as $cart_item ) {
$product = $cart_item['data'];
$pricing = get_field( 'quantity_and_prices', $product->get_id() );
if ( $pricing ) {
$qty = (int) $cart_item['quantity'];
foreach ( $pricing as $entry ) {
if ( $qty === (int) $entry['quantity'] ) {
$product->set_price( (float) $entry['price'] );
break;
}
}
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'update_price_by_qty', 10 );
This solution empowers your WooCommerce store to adjust product pricing based on user-selected quantity dynamically.
