{"id":255590,"date":"2025-10-22T09:59:27","date_gmt":"2025-10-22T09:59:27","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/wholesale-tiered-pricing-for-woocommerce\/"},"modified":"2026-04-14T17:22:21","modified_gmt":"2026-04-14T17:22:21","slug":"wholesale-tiered-pricing-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/id.wordpress.org\/plugins\/wholesale-tiered-pricing-for-woocommerce\/","author":22036533,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.2.4","stable_tag":"1.2.4","tested":"6.8.5","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"Wholesale & Tiered Pricing for WooCommerce","header_author":"WPulse","header_description":"Set role-based prices and quantity rules in WooCommerce. Show tiered pricing tables for wholesale, B2B, and bulk discounts.","assets_banners_color":"f7f6fb","last_updated":"2026-04-14 17:22:21","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/profiles.wordpress.org\/wpulse\/","rating":5,"author_block_rating":0,"active_installs":100,"downloads":1323,"num_ratings":4,"support_threads":2,"support_threads_resolved":2,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"wpulse","date":"2025-10-22 09:59:02"},"1.0.1":{"tag":"1.0.1","author":"wpulse","date":"2025-10-22 10:29:34"},"1.0.2":{"tag":"1.0.2","author":"wpulse","date":"2025-10-24 09:01:54"},"1.0.3":{"tag":"1.0.3","author":"wpulse","date":"2025-11-01 05:22:57"},"1.0.4":{"tag":"1.0.4","author":"wpulse","date":"2026-01-23 08:30:50"},"1.0.5":{"tag":"1.0.5","author":"wpulse","date":"2025-11-21 08:18:01"},"1.0.6":{"tag":"1.0.6","author":"wpulse","date":"2026-01-23 08:42:56"},"1.0.7":{"tag":"1.0.7","author":"wpulse","date":"2026-01-24 09:06:02"},"1.0.8":{"tag":"1.0.8","author":"wpulse","date":"2026-01-24 09:06:02"},"1.1.0":{"tag":"1.1.0","author":"wpulse","date":"2026-02-10 16:04:54"},"1.1.1":{"tag":"1.1.1","author":"wpulse","date":"2026-03-25 05:19:48"},"1.2.0":{"tag":"1.2.0","author":"wpulse","date":"2026-03-25 05:19:48"},"1.2.1":{"tag":"1.2.1","author":"wpulse","date":"2026-03-25 05:19:48"},"1.2.2":{"tag":"1.2.2","author":"wpulse","date":"2026-03-25 04:23:30"},"1.2.3":{"tag":"1.2.3","author":"wpulse","date":"2026-04-11 04:38:25"},"1.2.4":{"tag":"1.2.4","author":"wpulse","date":"2026-04-14 17:22:21"}},"upgrade_notice":{"1.2.4":"<p>Fixes quantity input incorrectly defaulting to the first tier&#039;s minimum quantity instead of 1.<\/p>","1.2.3":"<p>Adds a self-service Wholesale Registration Form (shortcode <code>[whtprole_registration_form]<\/code>) and an Applications admin page with one-click approve \/ reject, automatic role assignment, and email notifications for both the admin and the applicant.<\/p>","1.2.2":"<p>Adds Minimum Order Value (MOV) per pricing rule. Wholesale pricing is withheld until the cart subtotal meets the threshold. Product and cart pages show a clear &quot;Add $X more to unlock wholesale pricing&quot; notice.<\/p>","1.2.1":"<p>UI overhaul of the Wholesale Reports admin page and all frontend pricing templates (volume pricing card, pricing table, radio tier selector). Quantity field now pre-selects the first tier on page load.<\/p>","1.2.0":"<p>Adds Scheduled \/ Flash Pricing \u2014 set start and end dates on any pricing rule. Also fixes expired rules being applied to prices, tables, and cart validation, and fixes discount messages on variable products.<\/p>","1.1.1":"<p>Critical security and stability release. Fixes unauthenticated access to pricing rule AJAX handlers, a JSON corruption bug that silently broke all pricing rules on save, and a fatal error on variable product pages. Upgrade immediately.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":4},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3382489,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3382489,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3391888,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3391888,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.0.7","1.0.8","1.1.0","1.1.1","1.2.0","1.2.1","1.2.2","1.2.3","1.2.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3484162,"resolution":"1","location":"assets","locale":""},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3490518,"resolution":"10","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3484162,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3484162,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3484162,"resolution":"4","location":"assets","locale":""},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3382489,"resolution":"5","location":"assets","locale":""},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3382489,"resolution":"6","location":"assets","locale":""},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3382489,"resolution":"7","location":"assets","locale":""},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3382489,"resolution":"8","location":"assets","locale":""},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3382489,"resolution":"9","location":"assets","locale":""}},"screenshots":{"1":"Role-based and tiered pricing rules setup in the product editor.","2":"Tiered pricing table (Table template) displayed on the product page.","3":"Live savings calculator widget on the product page.","4":"Quantity restriction messages on the product page and in the cart.","5":"Template Options \u2014 choose template, position, columns, and color.","6":"Global pricing rules panel (multi-role selector with scheduled dates).","7":"Options table template for pricing display.","8":"Minimal table template for pricing display.","9":"Compact list template for pricing display.","10":"Wholesale Reports page inside WooCommerce.","11":"Wholesale Registration Form displayed on the frontend via shortcode.","12":"Wholesale Applications admin page with approve \/ reject workflow."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[10553,65683,139401,166977,65073],"plugin_category":[45],"plugin_contributors":[238982,227074,230051],"plugin_business_model":[],"class_list":["post-255590","plugin","type-plugin","status-publish","hentry","plugin_tags-b2b","plugin_tags-bulk-discount","plugin_tags-role-based-pricing","plugin_tags-tiered-pricing","plugin_tags-wholesale-pricing","plugin_category-ecommerce","plugin_contributors-chadni54","plugin_contributors-dasnitesh780","plugin_contributors-wpulse","plugin_committers-dasnitesh780","plugin_committers-wpulse","plugin_support_reps-dasnitesh780","plugin_support_reps-wpulse"],"banners":{"banner":"https:\/\/ps.w.org\/wholesale-tiered-pricing-for-woocommerce\/assets\/banner-772x250.png?rev=3391888","banner_2x":"https:\/\/ps.w.org\/wholesale-tiered-pricing-for-woocommerce\/assets\/banner-1544x500.png?rev=3391888","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/wholesale-tiered-pricing-for-woocommerce\/assets\/icon-128x128.png?rev=3382489","icon_2x":"https:\/\/ps.w.org\/wholesale-tiered-pricing-for-woocommerce\/assets\/icon-256x256.png?rev=3382489","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/wholesale-tiered-pricing-for-woocommerce\/assets\/screenshot-1.png?rev=3484162","caption":"Role-based and tiered pricing rules setup in the product editor."},{"src":"https:\/\/ps.w.org\/wholesale-tiered-pricing-for-woocommerce\/assets\/screenshot-2.png?rev=3484162","caption":"Tiered pricing table (Table template) displayed on the product page."},{"src":"https:\/\/ps.w.org\/wholesale-tiered-pricing-for-woocommerce\/assets\/screenshot-3.png?rev=3484162","caption":"Live savings calculator widget on the product page."},{"src":"https:\/\/ps.w.org\/wholesale-tiered-pricing-for-woocommerce\/assets\/screenshot-4.png?rev=3484162","caption":"Quantity restriction messages on the product page and in the cart."},{"src":"https:\/\/ps.w.org\/wholesale-tiered-pricing-for-woocommerce\/assets\/screenshot-5.png?rev=3382489","caption":"Template Options \u2014 choose template, position, columns, and color."},{"src":"https:\/\/ps.w.org\/wholesale-tiered-pricing-for-woocommerce\/assets\/screenshot-6.png?rev=3382489","caption":"Global pricing rules panel (multi-role selector with scheduled dates)."},{"src":"https:\/\/ps.w.org\/wholesale-tiered-pricing-for-woocommerce\/assets\/screenshot-7.png?rev=3382489","caption":"Options table template for pricing display."},{"src":"https:\/\/ps.w.org\/wholesale-tiered-pricing-for-woocommerce\/assets\/screenshot-8.png?rev=3382489","caption":"Minimal table template for pricing display."},{"src":"https:\/\/ps.w.org\/wholesale-tiered-pricing-for-woocommerce\/assets\/screenshot-9.png?rev=3382489","caption":"Compact list template for pricing display."},{"src":"https:\/\/ps.w.org\/wholesale-tiered-pricing-for-woocommerce\/assets\/screenshot-10.png?rev=3490518","caption":"Wholesale Reports page inside WooCommerce."}],"raw_content":"<!--section=description-->\n<p><strong>Wholesale &amp; Tiered Pricing for WooCommerce<\/strong> is the most flexible <strong>wholesale pricing plugin<\/strong> for WooCommerce stores. Designed for <strong>B2B shops, wholesale distributors, and bulk sellers<\/strong>, it lets you define custom prices, tiered volume discounts, and quantity purchase rules for any user role \u2014 including custom roles created by membership or access-control plugins.<\/p>\n\n<p>Show eye-catching <strong>tiered pricing tables<\/strong> on your product pages, let customers see exactly how much they save as they buy more, and automate bulk discount logic without writing a single line of code.<\/p>\n\n<p>\ud83c\udfa5 <strong>Watch the Plugin Overview Video:<\/strong><\/p>\n\n<p>[youtube https:\/\/www.youtube.com\/watch?v=Id6WGI4wKkY]<\/p>\n\n<p>\ud83d\udc49 <em>See how to set up wholesale pricing rules in under a minute!<\/em><\/p>\n\n\n\n<p>Whether you run a <strong>wholesale WooCommerce store<\/strong>, sell to <strong>B2B customers<\/strong>, or simply want to reward bulk buyers with <strong>volume discounts<\/strong>, this plugin covers every scenario:<\/p>\n\n<ul>\n<li>Charge different prices per user role (wholesale, retailer, VIP, distributor, etc.)<\/li>\n<li>Offer quantity-based tiered discounts (buy 5 save 10%, buy 10 save 20%)<\/li>\n<li>Set minimum, maximum, and step purchase quantities per role<\/li>\n<li>Display professional pricing tables directly on the product page<\/li>\n<li>Schedule flash sales and time-limited pricing rules with start and end dates<\/li>\n<li>Show a live savings calculator so customers see their discount in real time<\/li>\n<\/ul>\n\n\n\n<h3>Key Features<\/h3>\n\n<h4>Role-Based Wholesale Pricing<\/h4>\n\n<ul>\n<li>Assign <strong>different product prices per user role<\/strong> \u2014 wholesale, retailer, B2B customer, VIP, vendor, or any custom role.<\/li>\n<li>Full backward compatibility with both single-role and multi-role rule formats.<\/li>\n<li><strong>Global pricing rules<\/strong> act as a wildcard and apply to all logged-in users or guest users.<\/li>\n<li>Works with any custom role created by plugins like WooCommerce Memberships, Ultimate Member, or User Role Editor.<\/li>\n<\/ul>\n\n<h4>Tiered \/ Volume Discount Pricing<\/h4>\n\n<ul>\n<li>Create <strong>quantity-based pricing tiers<\/strong>: the more a customer buys, the lower the price per unit.<\/li>\n<li>Set tiers as a <strong>fixed discount<\/strong> (e.g., $5 off per item) or a <strong>percentage discount<\/strong> (e.g., 15% off).<\/li>\n<li>Apply tiers to all variations or target a specific variation of a variable product.<\/li>\n<li>Multiple tier levels per rule \u2014 unlimited pricing bands.<\/li>\n<\/ul>\n\n<h4>Scheduled &amp; Flash Pricing<\/h4>\n\n<ul>\n<li>Set an <strong>Active From<\/strong> and <strong>Active Until<\/strong> date on any pricing rule.<\/li>\n<li>Rules outside their date window are automatically excluded from pricing, tables, cart validation, and discount messages \u2014 no manual toggling needed.<\/li>\n<li>Perfect for <strong>flash sales<\/strong>, seasonal wholesale pricing, and time-limited B2B promotions.<\/li>\n<\/ul>\n\n<h4>Quantity Rules per Role<\/h4>\n\n<ul>\n<li><strong>Minimum quantity<\/strong> \u2014 require wholesale buyers to purchase at least N units.<\/li>\n<li><strong>Maximum quantity<\/strong> \u2014 limit retail customers to a maximum order size.<\/li>\n<li><strong>Step\/increment quantity<\/strong> \u2014 force orders in multiples of 2, 5, 10, etc.<\/li>\n<li>Quantity enforcement applies on the product page, in the cart, and at checkout.<\/li>\n<\/ul>\n\n<h4>Beautiful Pricing Table Templates<\/h4>\n\n<ul>\n<li>Six ready-made table layouts: <strong>Table<\/strong>, <strong>Options<\/strong>, <strong>Minimal Table<\/strong>, <strong>Compact List<\/strong>, <strong>Plain Text<\/strong>, <strong>Horizontal<\/strong>.<\/li>\n<li>Choose the default template globally and override it per product.<\/li>\n<li>Control which columns appear: Quantity, Price, Discount.<\/li>\n<li>Set a custom table title and active-tier highlight color.<\/li>\n<li>Responsive layout option for mobile shoppers.<\/li>\n<li>Choose where the table appears: above\/below add-to-cart, before\/after product meta, or after product summary.<\/li>\n<\/ul>\n\n<h4>Live Savings Calculator<\/h4>\n\n<ul>\n<li>Displays a <strong>real-time savings widget<\/strong> on the product page.<\/li>\n<li>Updates automatically as the customer changes the quantity input.<\/li>\n<li>Shows regular price, discounted price, total savings amount, and discount percentage.<\/li>\n<li>Can be enabled or disabled from Template Options settings.<\/li>\n<\/ul>\n\n<h4>Discount Badges in Cart, Checkout &amp; Orders<\/h4>\n\n<ul>\n<li>Applied wholesale tier is shown beside each line item in the <strong>cart<\/strong>, <strong>checkout<\/strong>, <strong>customer order details<\/strong>, and <strong>admin order screen<\/strong>.<\/li>\n<li>Customers see exactly which discount tier was applied and how much they saved.<\/li>\n<\/ul>\n\n<h4>Variable Product Support<\/h4>\n\n<ul>\n<li>Full support for <strong>WooCommerce variable products<\/strong> \u2014 rules and tiers can target all variations or a specific variation.<\/li>\n<li>Pricing tables update dynamically when the customer switches between variations.<\/li>\n<\/ul>\n\n<h4>Performance &amp; Security<\/h4>\n\n<ul>\n<li>Transient caching on the wholesale reports page (5-minute TTL).<\/li>\n<li>Pre-warmed post meta cache to eliminate N+1 database queries.<\/li>\n<li>Capped product and category queries (limit: 200) to prevent timeouts on large stores.<\/li>\n<li>All AJAX handlers protected with nonce verification and capability checks.<\/li>\n<li>Admin-only handlers are never registered as publicly accessible.<\/li>\n<\/ul>\n\n<h4>Wholesale Registration Form<\/h4>\n\n<ul>\n<li>Add the shortcode <code>[whtprole_registration_form]<\/code> to any page to let customers <strong>apply for wholesale access<\/strong>.<\/li>\n<li>Collects company name, business type, VAT\/tax number, phone, and a free-text message.<\/li>\n<li>Guest applicants get a WooCommerce customer account created automatically \u2014 no extra step required.<\/li>\n<li>Logged-in users who already submitted see their <strong>application status<\/strong> (pending \/ approved \/ rejected) instead of the form.<\/li>\n<li>Admin receives an <strong>email notification<\/strong> for every new application.<\/li>\n<li>Approved and rejected applicants are notified by email with WooCommerce-branded messages.<\/li>\n<li>Manage all applications from <strong>Wholesale \u2192 Applications<\/strong> in the WordPress admin.<\/li>\n<li>One-click Approve (assigns the configured role) or Reject (with optional reason).<\/li>\n<li>Configurable: choose which WordPress role is assigned on approval, set the notification email, and optionally require users to be logged in before applying.<\/li>\n<\/ul>\n\n<h4>Wholesale Reports<\/h4>\n\n<ul>\n<li>Dedicated <strong>Wholesale Reports<\/strong> page inside WooCommerce showing revenue, order counts, and top wholesale buyers.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>, or install directly from <strong>WordPress \u2192 Plugins \u2192 Add New<\/strong>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Navigate to <strong>WooCommerce \u2192 Tiered Pricing \u2192 Template Options<\/strong> to configure global display settings.<\/li>\n<li>Navigate to <strong>WooCommerce \u2192 Tiered Pricing \u2192 Pricing Rules<\/strong> to set global role-based pricing rules.<\/li>\n<li>Edit any product and open the <strong>Tiered Pricing<\/strong> tab in the product data panel to set per-product rules.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"can%20i%20set%20different%20prices%20for%20wholesale%20customers%20vs%20retail%20customers%3F\"><h3>Can I set different prices for wholesale customers vs retail customers?<\/h3><\/dt>\n<dd><p>Yes. Create separate pricing rules \u2014 one for your wholesale role (e.g., \"Wholesale Customer\") and one for standard customers. Each role sees only its own price.<\/p><\/dd>\n<dt id=\"does%20it%20support%20woocommerce%20variable%20products%3F\"><h3>Does it support WooCommerce variable products?<\/h3><\/dt>\n<dd><p>Yes, fully. You can apply pricing rules to all variations or to a specific variation. The pricing table on the product page updates in real time when the customer selects a variation.<\/p><\/dd>\n<dt id=\"can%20i%20offer%20volume%20discounts%20that%20increase%20with%20quantity%3F\"><h3>Can I offer volume discounts that increase with quantity?<\/h3><\/dt>\n<dd><p>Yes. Each rule supports unlimited pricing tiers. You can define as many quantity breakpoints as you need, using either a fixed dollar discount or a percentage discount per tier.<\/p><\/dd>\n<dt id=\"can%20i%20set%20minimum%20or%20maximum%20order%20quantities%20per%20role%3F\"><h3>Can I set minimum or maximum order quantities per role?<\/h3><\/dt>\n<dd><p>Yes. Each rule has optional Minimum Quantity, Maximum Quantity, and Step Quantity fields. These are enforced on the product page, in the cart, and at checkout.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20custom%20user%20roles%20from%20membership%20plugins%3F\"><h3>Does it work with custom user roles from membership plugins?<\/h3><\/dt>\n<dd><p>Yes. Any role registered in WordPress \u2014 including those created by WooCommerce Memberships, Paid Memberships Pro, Ultimate Member, or User Role Editor \u2014 is automatically available in the role selector.<\/p><\/dd>\n<dt id=\"can%20i%20schedule%20pricing%20rules%20to%20run%20during%20a%20specific%20date%20range%3F\"><h3>Can I schedule pricing rules to run during a specific date range?<\/h3><\/dt>\n<dd><p>Yes. Every pricing rule has optional \"Active From\" and \"Active Until\" date fields. Rules outside their scheduled window are automatically skipped \u2014 no manual toggling needed. Use this for flash sales, seasonal wholesale rates, or limited-time B2B promotions.<\/p><\/dd>\n<dt id=\"can%20guest%20%28non-logged-in%29%20users%20see%20wholesale%20prices%3F\"><h3>Can guest (non-logged-in) users see wholesale prices?<\/h3><\/dt>\n<dd><p>Yes. Create a Global rule and enable the \"Make it for guest user also\" option. Guest users will see those prices and discounts without needing to log in.<\/p><\/dd>\n<dt id=\"can%20i%20show%20the%20pricing%20table%20on%20some%20products%20but%20hide%20it%20on%20others%3F\"><h3>Can I show the pricing table on some products but hide it on others?<\/h3><\/dt>\n<dd><p>Yes. There is a \"Show Pricing Table\" toggle on every product's Tiered Pricing panel. You can also control the default behavior globally from the Template Options settings.<\/p><\/dd>\n<dt id=\"will%20this%20plugin%20slow%20down%20my%20store%3F\"><h3>Will this plugin slow down my store?<\/h3><\/dt>\n<dd><p>No. The plugin uses transient caching for reports, pre-warms meta cache to eliminate N+1 queries, and uses bounded database queries to avoid timeouts on large catalogs.<\/p><\/dd>\n<dt id=\"does%20it%20support%20multiple%20languages%3F\"><h3>Does it support multiple languages?<\/h3><\/dt>\n<dd><p>Yes, all frontend strings are fully translatable. The plugin ships with a .pot file and is compatible with WPML, Polylang, and Loco Translate.<\/p><\/dd>\n<dt id=\"will%20this%20work%20with%20my%20theme%3F\"><h3>Will this work with my theme?<\/h3><\/dt>\n<dd><p>Yes. The pricing table templates use minimal HTML\/CSS and inherit your theme's base styles. You can also override templates in your child theme.<\/p><\/dd>\n<dt id=\"can%20customers%20apply%20for%20wholesale%20access%20themselves%3F\"><h3>Can customers apply for wholesale access themselves?<\/h3><\/dt>\n<dd><p>Yes. Add the shortcode <code>[whtprole_registration_form]<\/code> to any page. Customers fill in their company details and submit an application. You review it under <strong>Wholesale \u2192 Applications<\/strong> and approve or reject it with one click. Approved applicants are automatically assigned the wholesale role you configure and are notified by email.<\/p><\/dd>\n<dt id=\"can%20i%20choose%20which%20role%20is%20assigned%20when%20i%20approve%20an%20application%3F\"><h3>Can I choose which role is assigned when I approve an application?<\/h3><\/dt>\n<dd><p>Yes. Go to <strong>Wholesale \u2192 Applications \u2192 Registration Settings<\/strong> and pick any WordPress role from the dropdown. The default is the first role whose slug contains \"wholesale\", or \"Customer\" if none is found.<\/p><\/dd>\n<dt id=\"do%20applicants%20need%20an%20account%20before%20they%20can%20apply%3F\"><h3>Do applicants need an account before they can apply?<\/h3><\/dt>\n<dd><p>No (by default). If a guest submits the form, a WooCommerce customer account is created for them automatically and the standard \"New Account\" email is sent. You can require login first by enabling the option in Registration Settings.<\/p><\/dd>\n<dt id=\"where%20can%20i%20get%20support%3F\"><h3>Where can I get support?<\/h3><\/dt>\n<dd><p>Please open a support thread in the WordPress.org plugin support forum. We typically respond within 1\u20132 business days.<\/p>\n\n<\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.4 \u2013 2026-04-14<\/h4>\n\n<ul>\n<li>Fixed quantity input defaulting to the first tier's minimum quantity on page load \u2014 it now correctly defaults to 1 regardless of pricing tier configuration.<\/li>\n<\/ul>\n\n<h4>1.2.3 \u2013 2026-04-11<\/h4>\n\n<ul>\n<li>Added Wholesale Registration Form \u2014 customers can now apply for wholesale access directly on the frontend using the <code>[whtprole_registration_form]<\/code> shortcode.<\/li>\n<li>Added Wholesale \u2192 Applications admin page: lists all pending, approved, and rejected applications with status filter tabs, an inline details panel, and one-click Approve \/ Reject actions.<\/li>\n<li>Approve action automatically assigns the configured WordPress role to the applicant and sends an approval email.<\/li>\n<li>Reject action stores an optional reason and sends a rejection email to the applicant.<\/li>\n<li>Admin receives an email notification for every new application submitted.<\/li>\n<li>Guest applicants get a WooCommerce customer account created automatically (configurable: can require login instead).<\/li>\n<li>Logged-in users who already submitted an application see their current status (pending \/ approved \/ rejected) instead of the form.<\/li>\n<li>Added Registration Settings panel (Wholesale \u2192 Applications): configure the approval role, admin notification email, login requirement, and form heading.<\/li>\n<li>All AJAX handlers are nonce-verified; admin-only actions require the <code>manage_woocommerce<\/code> capability and are never registered as publicly accessible.<\/li>\n<\/ul>\n\n<h4>1.2.2 \u2013 2026-03-25<\/h4>\n\n<ul>\n<li>Added Minimum Order Value (MOV) per pricing rule \u2014 set a minimum cart subtotal that must be reached before a role's pricing rule activates (e.g. \"wholesale price only if order is at least $200\").<\/li>\n<\/ul>\n\n<h4>1.2.1 \u2013 2026-03-15<\/h4>\n\n<ul>\n<li>Redesigned Wholesale Reports admin page: summary cards now show a coloured icon badge (blue \/ purple \/ green \/ orange) for each metric; section headings include contextual SVG icons (cart, trend, box, gear).<\/li>\n<li>Reports filter bar restructured: date labels stacked above inputs, calendar icon overlaid on each date field, preset buttons (7d \/ 30d \/ 90d) highlight the active selection with a dark fill, Apply and Edit buttons use a high-contrast dark style.<\/li>\n<li>Report tables now use uppercase column headers and subtle row-hover styling instead of the WP striped class.<\/li>\n<li>Revamped Volume Pricing card (minimal template): replaced old premium wrapper markup with <code>wtp-volume-card<\/code> \/ <code>wtp-tier-row<\/code> structure; savings shown as a plain \"Save N% \/ $X off\" label; removed \"Best\" featured-tier badge and progress bar.<\/li>\n<li>Pricing table: column headers changed to muted uppercase on a transparent background, removing the coloured primary-colour header fill; <code>.quantity-badge<\/code>, <code>.price-unit<\/code>, and <code>.savings-info<\/code> cell classes introduced for cleaner markup; table border changed from box-shadow to a solid border with rounded corners.<\/li>\n<li>Radio tier selector: active tier now uses an inset box-shadow instead of background fill; colour palette updated to neutral tones; responsive breakpoint tightened from 768 px to 480 px.<\/li>\n<li>Added Dashicons lightbulb icon before the \"See Your Savings\" savings-calculator heading.<\/li>\n<li>Quantity field now defaults to the first tier's minimum quantity on page load (when greater than 1), so the eligible tier price is immediately visible without the customer adjusting quantity manually.<\/li>\n<\/ul>\n\n<h4>1.2.0 \u2013 2026-03-12<\/h4>\n\n<ul>\n<li>Added Scheduled \/ Flash Pricing \u2014 pricing rules now support <code>Active From<\/code> and <code>Active Until<\/code> date fields; rules outside their scheduled window are automatically excluded everywhere (product page, cart, checkout, quantity validation, discount messages).<\/li>\n<li>Added date pickers to the product editor (PHP) and the global pricing rules form (Vue) for per-rule scheduling.<\/li>\n<li>Fixed date fields not being saved when clicking \"Save Changes\" in the global pricing rules admin \u2014 <code>date_from<\/code>\/<code>date_to<\/code> were silently stripped by the AJAX sanitize function.<\/li>\n<li>Fixed expired or future-dated rules still applying prices, showing pricing tables, enforcing quantity limits, and displaying discount badges \u2014 all rule lookups now route through the central date filter in <code>WHTPRole_Pricing_Helper::get_rules_for_product()<\/code>.<\/li>\n<li>Fixed cart and order discount messages using the variation ID instead of the parent product ID, causing rules to not be found for variable products.<\/li>\n<\/ul>\n\n<h4>1.1.1 \u2013 2026-03-08<\/h4>\n\n<ul>\n<li>Fixed critical data corruption bug where JSON settings were mangled on save, silently breaking all pricing rules on every product page.<\/li>\n<li>Fixed admin-only AJAX handlers that were incorrectly registered as publicly accessible, exposing pricing rule reads and writes to unauthenticated users.<\/li>\n<li>Fixed pricing table not appearing for users matched by global rules due to role format mismatch between old single-role and new multi-role rule formats.<\/li>\n<li>Fixed variable product pricing table throwing a fatal <code>foreach<\/code> error when rules were stored as a JSON string instead of a decoded array.<\/li>\n<li>Fixed early-return bug in cart validation and price HTML filter that loaded global rules but then discarded them and returned without applying them.<\/li>\n<li>Fixed missing <code>return<\/code> after security error in savings calculation handler, allowing code execution to continue after an auth failure.<\/li>\n<li>Added nonce verification and capability check to product data save handler.<\/li>\n<li>Added <code>Show savings calculator<\/code> toggle in Template Options settings \u2014 admins can now enable or disable the savings calculator widget per store.<\/li>\n<li>Improved performance: added transient caching to the wholesale reports page (5-minute TTL) and pre-warm post meta cache to eliminate N+1 queries.<\/li>\n<li>Replaced unbounded <code>wc_get_products(limit: -1)<\/code> and <code>get_terms<\/code> calls in global settings with capped queries (limit: 200) to prevent timeouts on large stores.<\/li>\n<li>Moved activation hook registration to plugin load time (outside <code>plugins_loaded<\/code>) for correct WordPress lifecycle behavior.<\/li>\n<li>Renamed global <code>get_wp_user_roles<\/code> function to prefixed <code>whtprole_get_wp_user_roles<\/code> to avoid namespace collision with other plugins.<\/li>\n<li>Removed dead code: unused <code>find_applicable_tier()<\/code> and <code>getPrice()<\/code> methods, stray second class instantiation that caused all hooks to register twice, and commented-out <code>admin_head<\/code> block.<\/li>\n<\/ul>\n\n<h4>1.1.0 \u2013 2026-02-10<\/h4>\n\n<ul>\n<li>Added Wholesale Reports page with revenue and order analytics.<\/li>\n<li>Enhanced user experience with real-time price recalculation based on variation selection.<\/li>\n<\/ul>\n\n<h4>1.0.8 \u2013 2026-01-24<\/h4>\n\n<ul>\n<li>Enhanced variable product support across all pricing table templates.<\/li>\n<li>Added dynamic variation filtering \u2014 pricing tables now show only tiers applicable to the selected variation.<\/li>\n<li>Added automatic price updates when customers select different variations on variable products.<\/li>\n<\/ul>\n\n<h4>1.0.7 \u2013 2026-01-23<\/h4>\n\n<ul>\n<li>Added support for assigning tiered pricing rules to multiple user roles using a normalized roles array.<\/li>\n<li>Introduced a Global pricing option that applies to all user roles as a wildcard.<\/li>\n<li>Added an \"Apply to Guest Users\" option for Global rules to control pricing for non-logged-in users.<\/li>\n<li>Improved admin UI with a multi-select role selector for better flexibility and usability.<\/li>\n<\/ul>\n\n<h4>1.0.6 \u2013 2025-01-23<\/h4>\n\n<ul>\n<li>Added Dynamic Savings Calculator \u2014 real-time savings display that updates as customers change quantity, showing total savings and discount percentage.<\/li>\n<li>Improved pricing calculation logic with better edge case handling.<\/li>\n<li>Fixed pricing calculation issues when max_qty constraints are set.<\/li>\n<\/ul>\n\n<h4>1.0.5 \u2013 2025-11-10<\/h4>\n\n<ul>\n<li>Added pricing rule support for guest (non-logged-in) users.<\/li>\n<li>Added option to show or hide the pricing table per product.<\/li>\n<\/ul>\n\n<h4>1.0.4 \u2013 2025-11-07<\/h4>\n\n<ul>\n<li>Added multilingual support for all frontend strings.<\/li>\n<li>Minor bug fixes.<\/li>\n<\/ul>\n\n<h4>1.0.3 \u2013 2025-11-01<\/h4>\n\n<ul>\n<li>Admin order details now display the applied tier pricing rule beside each product line item.<\/li>\n<li>Discount notice now shows in the cart, checkout, and order details pages (frontend).<\/li>\n<li>Discount calculation now uses the actual selling price instead of the regular price for more accurate savings.<\/li>\n<\/ul>\n\n<h4>1.0.2 \u2013 2025-10-22<\/h4>\n\n<ul>\n<li>Fixed undefined <code>price_type<\/code> key on cart and checkout page.<\/li>\n<li>Fixed single product tiered pricing settings not saving properly.<\/li>\n<li>Fixed pricing table not displaying on product page until general settings are saved.<\/li>\n<\/ul>\n\n<h4>1.0.1 \u2013 2025-10-22<\/h4>\n\n<ul>\n<li>Bug fixes and minor improvements.<\/li>\n<\/ul>\n\n<h4>1.0.0 \u2013 2025-10-22<\/h4>\n\n<ul>\n<li>Initial release with role-based pricing, tiered volume discounts, quantity rules, and customizable pricing tables.<\/li>\n<\/ul>","raw_excerpt":"Set role-based wholesale prices, volume discounts, and quantity rules in WooCommerce. Display beautiful tiered pricing tables for B2B, wholesale, and  &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/255590","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=255590"}],"author":[{"embeddable":true,"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/wpulse"}],"wp:attachment":[{"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=255590"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=255590"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=255590"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=255590"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=255590"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=255590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}