{"id":354498,"date":"2026-08-24T09:17:18","date_gmt":"2026-08-24T09:17:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/quoteguard-hide-prices-request-a-quote-for-woocommerce\/"},"modified":"2026-09-14T11:20:11","modified_gmt":"2026-09-14T11:20:11","slug":"priceveil-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/ta.wordpress.org\/plugins\/priceveil-for-woocommerce\/","author":23527105,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.8","stable_tag":"1.0.8","tested":"7.1.2","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"PriceVeil \u2013 Hide Prices & Request a Quote for WooCommerce","header_author":"Eren Labs","header_description":"Leak-tested price hiding for WooCommerce: hides prices across the storefront, Store API, structured data and more, and lets customers request a quote instead of buying.","assets_banners_color":"c5bce1","last_updated":"2026-09-14 11:20:11","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/erenlabs.net\/plugins\/priceveil\/","header_author_uri":"https:\/\/erenlabs.net","rating":0,"author_block_rating":0,"active_installs":0,"downloads":376,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"erenlabs","date":"2026-08-29 00:06:54","revision":3671024},"1.0.3":{"tag":"1.0.3","author":"erenlabs","date":"2026-09-05 12:21:35","revision":3682419},"1.0.4":{"tag":"1.0.4","author":"erenlabs","date":"2026-09-05 22:38:23","revision":3682853},"1.0.5":{"tag":"1.0.5","author":"erenlabs","date":"2026-09-06 16:39:59","revision":3683687},"1.0.6":{"tag":"1.0.6","author":"erenlabs","date":"2026-09-07 01:04:37","revision":3684054},"1.0.7":{"tag":"1.0.7","author":"erenlabs","date":"2026-09-08 20:28:43","revision":3687279},"1.0.8":{"tag":"1.0.8","author":"erenlabs","date":"2026-09-14 11:20:11","revision":3695066}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3663001,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3663001,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3695066,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3695066,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3695069,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=priceveil-for-woocommerce\",\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"phpExtensionBundles\":[\"kitchen-sink\"],\"features\":{\"networking\":true},\"steps\":[{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"PriceVeil demo shop\",\"woocommerce_onboarding_profile\":{\"skipped\":true},\"woocommerce_task_list_hidden\":\"yes\",\"woocommerce_default_country\":\"GB\",\"woocommerce_currency\":\"GBP\",\"woocommerce_store_address\":\"12 Market Row\",\"woocommerce_store_city\":\"Leeds\",\"woocommerce_store_postcode\":\"LS1 6DT\"}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"woocommerce\"},\"options\":{\"activate\":true}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"priceveil-for-woocommerce\"},\"options\":{\"activate\":true}},{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire_once '\\\/wordpress\\\/wp-load.php';\\nif ( ! function_exists( 'wc_get_product' ) ) { return; }\\n\\\/\\\/ Measured in Playground: WooCommerce's activation redirect fired on the first\\n\\\/\\\/ admin load and replaced landingPage with wc-admin. Clear it, and the task\\n\\\/\\\/ list that would otherwise sit on top of every screen.\\ndelete_transient( '_wc_activation_redirect' );\\nupdate_option( 'woocommerce_task_list_hidden', 'yes' );\\nupdate_option( 'woocommerce_onboarding_profile', array( 'skipped' => true ) );\\n$rows = array(\\n  array( 'Cold Brew Coffee Beans 250g', 'CB-250', '5012345678900', 12.90, 7.10, 24 ),\\n  array( 'Espresso Roast 1kg',          'ER-1K',  '5012345678917', 28.00, 15.40, 9 ),\\n  array( 'Ceramic Pour-Over Dripper',   'DR-CER', '5012345678924', 19.50, 8.20, 15 ),\\n  array( 'Paper Filters (100)',         'PF-100', '5012345678931', 4.20,  1.60, 60 ),\\n  array( 'Insulated Travel Mug 350ml',  'MUG-35', '5012345678948', 16.00, 6.90, 18 ),\\n  array( 'Hand Grinder',                'GR-HND', '5012345678955', 42.00, 21.00, 5 ),\\n  array( 'Digital Scale 0.1g',          'SC-01',  '5012345678962', 24.90, 11.30, 11 ),\\n  array( 'Gooseneck Kettle 1L',         'KT-1L',  '5012345678979', 39.00, 19.80, 6 ),\\n  array( 'Cleaning Tablets (30)',       'CT-30',  '5012345678986', 9.90,  3.80, 33 ),\\n  array( 'Gift Box Set',                'GB-SET', '5012345678993', 55.00, 27.50, 4 ),\\n);\\nforeach ( $rows as $r ) {\\n  if ( wc_get_product_id_by_sku( $r[1] ) ) { continue; }\\n  $p = new WC_Product_Simple();\\n  $p->set_name( $r[0] ); $p->set_sku( $r[1] ); $p->set_regular_price( (string) $r[3] );\\n  $p->set_manage_stock( true ); $p->set_stock_quantity( $r[5] ); $p->set_status( 'publish' );\\n  $p->update_meta_data( '_barcode', $r[2] );\\n  $p->update_meta_data( '_wc_cog_cost', (string) $r[4] );\\n  $p->save();\\n}\\n\\n\"}]}"}},"all_blocks":{"priceveil\/request-form":{"name":"priceveil\/request-form","title":"PriceVeil Quote Form"}},"tagged_versions":["1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.0.7","1.0.8"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3695066,"resolution":"1","location":"assets","locale":"","width":1586,"height":992},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3695066,"resolution":"2","location":"assets","locale":"","width":1586,"height":992},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3695066,"resolution":"3","location":"assets","locale":"","width":1586,"height":992},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3695066,"resolution":"4","location":"assets","locale":"","width":1586,"height":992},"screenshot-5.jpg":{"filename":"screenshot-5.jpg","revision":3695066,"resolution":"5","location":"assets","locale":"","width":1586,"height":992},"screenshot-6.jpg":{"filename":"screenshot-6.jpg","revision":3695066,"resolution":"6","location":"assets","locale":"","width":1586,"height":992},"screenshot-7.jpg":{"filename":"screenshot-7.jpg","revision":3695066,"resolution":"7","location":"assets","locale":"","width":1586,"height":992}},"screenshots":{"1":"Add to cart becomes Request a quote: the price is gone from the product page and a quote button takes its place \u2014 hide the price, replace the button, switch on catalog mode, use your own button text.","2":"The quote request form opens in a modal on the product page \u2014 name, e-mail, quantity and message; Pro adds your own fields, such as phone, company and VAT number.","3":"Requests land inside WooCommerce as Quote Request orders in the normal orders screen \u2014 HPOS-compatible, no extra tables, never counted as revenue or in reports.","4":"The Requests console (Pro): every lead with its product, quantity, message and status \u2014 Quote sent, Accepted, Declined \u2014 in one place.","5":"Build and send the quote (Pro): price each line yourself, set how long the quote is valid, add a note to the customer, and send it in one click.","6":"The private quote page (Pro): the customer gets an e-mail with a link to their own quote page, where they accept or decline it \u2014 an accepted quote becomes a normal order.","7":"Hide prices for guests only: strangers see \"Login to see price\", signed-in customers see prices and check out normally."}},"plugin_section":[],"plugin_tags":[243070,64243,65997,13770,65073],"plugin_category":[],"plugin_contributors":[271033],"plugin_business_model":[],"class_list":["post-354498","plugin","type-plugin","status-publish","hentry","plugin_tags-b2b-ecommerce","plugin_tags-call-for-price","plugin_tags-catalog-mode","plugin_tags-request-a-quote","plugin_tags-wholesale-pricing","plugin_contributors-erenlabs","plugin_committers-erenlabs"],"banners":{"banner":"https:\/\/ps.w.org\/priceveil-for-woocommerce\/assets\/banner-772x250.jpg?rev=3695066","banner_2x":"https:\/\/ps.w.org\/priceveil-for-woocommerce\/assets\/banner-1544x500.jpg?rev=3695066","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/priceveil-for-woocommerce\/assets\/icon-128x128.png?rev=3663001","icon_2x":"https:\/\/ps.w.org\/priceveil-for-woocommerce\/assets\/icon-256x256.png?rev=3663001","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/priceveil-for-woocommerce\/assets\/screenshot-1.jpg?rev=3695066","caption":"Add to cart becomes Request a quote: the price is gone from the product page and a quote button takes its place \u2014 hide the price, replace the button, switch on catalog mode, use your own button text."},{"src":"https:\/\/ps.w.org\/priceveil-for-woocommerce\/assets\/screenshot-2.jpg?rev=3695066","caption":"The quote request form opens in a modal on the product page \u2014 name, e-mail, quantity and message; Pro adds your own fields, such as phone, company and VAT number."},{"src":"https:\/\/ps.w.org\/priceveil-for-woocommerce\/assets\/screenshot-3.jpg?rev=3695066","caption":"Requests land inside WooCommerce as Quote Request orders in the normal orders screen \u2014 HPOS-compatible, no extra tables, never counted as revenue or in reports."},{"src":"https:\/\/ps.w.org\/priceveil-for-woocommerce\/assets\/screenshot-4.jpg?rev=3695066","caption":"The Requests console (Pro): every lead with its product, quantity, message and status \u2014 Quote sent, Accepted, Declined \u2014 in one place."},{"src":"https:\/\/ps.w.org\/priceveil-for-woocommerce\/assets\/screenshot-5.jpg?rev=3695066","caption":"Build and send the quote (Pro): price each line yourself, set how long the quote is valid, add a note to the customer, and send it in one click."},{"src":"https:\/\/ps.w.org\/priceveil-for-woocommerce\/assets\/screenshot-6.jpg?rev=3695066","caption":"The private quote page (Pro): the customer gets an e-mail with a link to their own quote page, where they accept or decline it \u2014 an accepted quote becomes a normal order."},{"src":"https:\/\/ps.w.org\/priceveil-for-woocommerce\/assets\/screenshot-7.jpg?rev=3695066","caption":"Hide prices for guests only: strangers see \"Login to see price\", signed-in customers see prices and check out normally."}],"raw_content":"<!--section=description-->\n<p>PriceVeil turns a WooCommerce store into a price-free catalogue and puts a\n<strong>Request a quote<\/strong> button where the price used to be. It is built for B2B\necommerce, wholesale, made-to-order and dealer stores \u2014 the shops that publish a\ncatalogue but price every customer individually.<\/p>\n\n<p>https:\/\/www.youtube.com\/watch?v=ECj_PoPlaxI<\/p>\n\n<p>The five-minute tour: hiding every price, catalog mode, variable products, the\nquote request, and pricing a request into a paid order.<\/p>\n\n<p>It hides price information at <strong>every surface a price can leak<\/strong> \u2014 not only the\nvisible label, but the numeric fields in the Store API JSON that block themes\nship to every visitor, in SEO schema, in feeds and in GraphQL.<\/p>\n\n<p>The approach: <strong>find every surface that leaks a price, close it, and prove it\nstays closed.<\/strong><\/p>\n\n<h4>Wholesale pricing, handled by quote<\/h4>\n\n<p>Wholesale pricing is rarely one number. The trade customer, the distributor and\nthe walk-in each pay something different, and publishing any of it on a public\nproduct page is the thing most B2B ecommerce stores actually want to avoid.<\/p>\n\n<p>PriceVeil's answer is not a second price list. It removes the public number\nentirely \u2014 a call for price \/ price on request catalogue \u2014 and routes the\ncustomer into a quotation system you answer yourself: they ask, you price it,\nthey pay. Turn WooCommerce catalog mode on and the button goes with the price: hide add to\ncart everywhere, so nobody can buy at a number you never agreed to.<\/p>\n\n<p>If you would rather keep selling to the public and only hide prices from\nstrangers, switch to guests-only: a login to see price catalogue where signed-in\ncustomers still see prices and check out normally.<\/p>\n\n<p><a href=\"https:\/\/erenlabs.net\/priceveil-for-woocommerce\/docs\/\">Read the full documentation<\/a> \u2014 setup and\nsettings, what gets hidden and what you should check yourself, catalog mode, who sees\nprices, the quote request form and quote orders, and verifying every surface with WP-CLI.<\/p>\n\n<p>Feature comparison and pricing: <a href=\"https:\/\/erenlabs.net\/plugins\/priceveil\/\">erenlabs.net\/plugins\/priceveil<\/a><\/p>\n\n<h4>What it covers<\/h4>\n\n<p>PriceVeil hides prices on every one of these surfaces:<\/p>\n\n<ul>\n<li><strong>Storefront<\/strong>: single product, shop loop, related products, grouped products, variable price ranges and the inline variation JSON \u2014 numeric fields included, not just the label.<\/li>\n<li><strong>Store API (block themes)<\/strong>: product prices, <code>price_html<\/code>, the collection price-range aggregation and cart totals are blanked server-side, so client-rendered themes have nothing to show.<\/li>\n<li><strong>Structured data<\/strong>: WooCommerce core JSON-LD offers, plus Rank Math, Yoast SEO, All in One SEO and Schema &amp; Structured Data for WP product schema.<\/li>\n<li><strong>WooCommerce REST API<\/strong> (<code>wc\/v3<\/code>, <code>wc\/v2<\/code>): product and variation price fields, so a read-scoped API key handed to a third-party service reveals nothing.<\/li>\n<li><strong>GraphQL<\/strong> (WPGraphQL \/ WooGraphQL): product price fields blanked at field resolution.<\/li>\n<li><strong>Cart, mini-cart, checkout, emails<\/strong>: classic PHP-rendered price output and quote-order customer emails.<\/li>\n<li><strong>Catalog mode<\/strong>: hide prices and the add-to-cart button together \u2014 it disappears from classic <em>and<\/em> block templates, and the Store API rejects cart writes \u2014 the API cannot be used as a side door around the missing button.<\/li>\n<\/ul>\n\n<h4>Request a quote<\/h4>\n\n<p>Wherever you hide prices, a configurable button and form replace the price on product pages (also available as the <code>[priceveil_form]<\/code> shortcode). Requests arrive as <strong>Quote Request orders<\/strong> in your normal WooCommerce orders screen \u2014 HPOS-compatible, never counted as revenue, never in reports \u2014 and you get an email with one-click reply to the customer.<\/p>\n\n<p>The public form is protected by a nonce, a honeypot and a per-IP rate limit.<\/p>\n\n<h4>Speaks your customers' language<\/h4>\n\n<p>PriceVeil ships in <strong>8 languages<\/strong> \u2014 English, Turkish, Spanish, German, French, Italian, Brazilian Portuguese and Arabic (with right-to-left layout). It follows the site language automatically and falls back to English for anything else, and admins can switch the plugin's own language from a control in the header without changing the rest of wp-admin. (In PriceVeil Pro, the customer's quote page also detects each visitor's own language and offers a switcher on the quote itself.)<\/p>\n\n<h4>Honest coverage reporting<\/h4>\n\n<p>The settings screen shows exactly which surfaces hide prices automatically and which you should check once yourself (product feed plugins, custom themes calling <code>get_price()<\/code> directly, edge caches). With WP-CLI you can run <code>wp priceveil selftest<\/code> after every WooCommerce update \u2014 it re-verifies every server-reachable surface and fails loudly on any leak.<\/p>\n\n<h4>Choose your audience<\/h4>\n\n<p>Hide prices for everyone, or for guests only so logged-in customers can see prices and buy normally.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>priceveil-for-woocommerce<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install it through the WordPress Plugins screen.<\/li>\n<li>Activate the plugin. WooCommerce must be installed and active.<\/li>\n<li>Prices are hidden immediately. Fine-tune everything under <strong>WooCommerce \u2192 PriceVeil<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20priceveil%20set%20wholesale%20price%20tiers%20or%20per-customer%20price%20lists%3F\"><h3>Does PriceVeil set wholesale price tiers or per-customer price lists?<\/h3><\/dt>\n<dd><p>No, and it is worth being clear about it. PriceVeil does not publish a second\nset of numbers for trade customers. It handles wholesale pricing the other way\nround: the public price comes off the catalogue entirely, the customer requests\na quote, and you price that request individually before it becomes a payable\norder. If you need automatic tiered or role-based price lists, that is a\ndifferent kind of plugin \u2014 and the two can sit side by side.<\/p><\/dd>\n<dt id=\"is%20this%20a%20call%20for%20price%20%2F%20price%20on%20request%20plugin%3F\"><h3>Is this a call for price \/ price on request plugin?<\/h3><\/dt>\n<dd><p>Yes, that is exactly the pattern. The price is removed and a button you label\nyourself \u2014 \"Request a quote\", \"Call for price\", \"Price on request\", whatever\nsuits your trade \u2014 takes its place, with a form behind it. The difference from\nmost plugins of this kind is where the hiding happens: the number is gone from\nthe Store API, the JSON-LD schema, the REST API and GraphQL as well as the\nvisible label, so a block theme or a feed cannot quietly reveal it.<\/p><\/dd>\n<dt id=\"can%20i%20hide%20the%20add%20to%20cart%20button%20too%2C%20and%20show%20prices%20only%20to%20logged-in%20customers%3F\"><h3>Can I hide the add to cart button too, and show prices only to logged-in customers?<\/h3><\/dt>\n<dd><p>Both. WooCommerce catalog mode hides the price and the add to cart button together \u2014 hide\nadd to cart and it disappears from classic and block templates, and the Store API rejects cart\nwrites, so the API cannot be used as a side door around the missing button. And\nthe audience control lets you run a login to see price catalogue instead: guests\nsee no prices, signed-in customers see them and buy normally.<\/p><\/dd>\n<dt id=\"are%20the%20actual%20numbers%20removed%2C%20or%20just%20hidden%20with%20css%3F\"><h3>Are the actual numbers removed, or just hidden with CSS?<\/h3><\/dt>\n<dd><p>Removed server-side. The price fields are blanked before the HTML or JSON leaves your server, so cached pages, API responses and view-source contain no price at all.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20block%20themes%3F\"><h3>Does it work with block themes?<\/h3><\/dt>\n<dd><p>Yes. Block themes render prices from the Store API JSON, and PriceVeil blanks the numeric fields in those responses server-side.<\/p><\/dd>\n<dt id=\"can%20logged-in%20customers%20still%20see%20prices%3F\"><h3>Can logged-in customers still see prices?<\/h3><\/dt>\n<dd><p>Yes \u2014 set \"Hide prices for\" to <em>Guests only<\/em> and logged-in users get the normal store, including purchasing.<\/p><\/dd>\n<dt id=\"where%20do%20quote%20requests%20go%3F\"><h3>Where do quote requests go?<\/h3><\/dt>\n<dd><p>They are created as native WooCommerce orders with a special \"Quote Request\" status: visible in your orders list, excluded from revenue and reports, and announced by email. No extra tables, HPOS-compatible.<\/p><\/dd>\n<dt id=\"do%20quote%20orders%20affect%20my%20revenue%20reports%3F\"><h3>Do quote orders affect my revenue reports?<\/h3><\/dt>\n<dd><p>No. The Quote Request status is excluded from paid statuses and from WooCommerce reports.<\/p><\/dd>\n<dt id=\"what%20is%20not%20covered%20automatically%3F\"><h3>What is NOT covered automatically?<\/h3><\/dt>\n<dd><p>Product feed plugins (they export prices on purpose), custom theme code that calls <code>$product-&gt;get_price()<\/code> directly, and edge caches primed before activation. The settings screen lists these, and <code>wp priceveil selftest<\/code> verifies everything that is reachable server-side.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Fixed: the pricing table on the Upgrade screen laid out two columns instead of three, so the third plan sat alone on a second row and the highlighted \"Best value\" plan ended up in the corner rather than the middle. All three plans now sit on one row, equal height, and collapse to a single column on a narrow screen.<\/li>\n<li>Fixed: the three quote order statuses - Quote Request, Quote Sent, Quote Declined - showed in English on Arabic, German, Spanish, French, Italian and Portuguese stores, and one of them in Turkish, even though the translations existed. They are carried by every bundled language now.<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>New: the Upgrade screen carries a full Eren Labs Store Suite section - what each of the six plugins does, a sample screen, who it is for, its own price, the bundle arithmetic beside the purchase box, and five questions.<\/li>\n<li>New: an \"Upgrading takes a minute\" block - pick a licence, activate in WordPress, and what appears once Pro is on. Your settings, your hidden prices and every quote already taken carry over untouched.<\/li>\n<li>Translations: 178 strings that had no entry in the translation template now have one, in all seven bundled languages - the new section plus older customer-facing quote messages that had always shown in English.<\/li>\n<li>Hardened: values submitted from the settings form are now sanitized where they are read from the request.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>New: Eren Labs Store Suite \u2014 the upgrade screen now shows the six-plugin suite and its single-licence bundle.<\/li>\n<li>New: the plugin accepts a Store Suite bundle licence; one key activates every Eren Labs plugin installed on the site.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Compatibility: tested up to WooCommerce 11.1.<\/li>\n<li>Translations: the free package now bundles the Arabic, German, Spanish, French, Italian, Brazilian Portuguese and Turkish catalogs, so the admin screens follow your site language without waiting for translate.wordpress.org.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Fixed: Pro group pricing reached the WooCommerce order editor \u2014 a shop manager in a customer group was adding lines to a customer's order at their own discount; the order editor now prices at list, like the till.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Now installs on PHP 7.4 and 8.0 (was 8.1 or later); verified with PHPCompatibilityWP.<\/li>\n<li>Fixed: the Pro pricing table listed two outdated plans; it now shows all three at current prices.<\/li>\n<li>Fixed: Pro group pricing reached the till through the AJAX exception \u2014 the till gets list prices, the storefront keeps group prices.<\/li>\n<li>Fixed: catalog mode removes the add-to-cart form in block themes too, and a cart line loses its totals on every Store API route.<\/li>\n<li>Fixed: a quote was offered on products the shop sells normally; the quote list appears only where the price is hidden; My Account no longer quotes a price the customer would never pay.<\/li>\n<li>Fixed: the JSON-LD offer and the GraphQL and third-party SEO schema hiders follow the same per-product targeting as the price; the price filter no longer publishes the range it hides; a category rule covers what is filed under it; changing targeting purges caches.<\/li>\n<li>Fixed: a quote email WordPress refused is no longer recorded as sent; an answered quote cannot be re-sent; the email goes out in the language the quote opens in; the expiry picker uses the shop's day; the quote nonce outlives page caches.<\/li>\n<li>Fixed: an empty cart is not treated as a hidden cart; uninstall removes the per-user preference and completes on multisite.<\/li>\n<li>Improved: the Free vs Pro table meets WCAG AA contrast.<\/li>\n<li>Tested with WooCommerce 11 and WordPress 7.1.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Tested with WooCommerce 11.<\/li>\n<li>Pro: updated the bundled licensing framework to its latest release.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>The plugin is now called PriceVeil. The text domain, language files and internal identifiers were renamed to match; behaviour and settings are unchanged.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release: leak-tested price hiding across the storefront, Store API, structured data, the WooCommerce REST API and GraphQL; catalog mode; and a request-a-quote flow (nonce, honeypot and per-IP rate limit) that lands as native Quote Request orders excluded from revenue and reports.<\/li>\n<li>Available in 8 languages \u2014 English, Turkish, Spanish, German, French, Italian, Brazilian Portuguese and Arabic (right-to-left) \u2014 chosen automatically from the site\/visitor language, with a per-user language switcher in the admin header and a language switcher on the customer quote page.<\/li>\n<\/ul>\n\n<h4>0.10.2<\/h4>\n\n<ul>\n<li>Pro: the Requests console now spells out that sending a quote e-mails the customer \u2014 a note under the Send button shows the exact address the quote goes to, and the confirmation after sending states that it was e-mailed (with the accept\/decline link) to that address.<\/li>\n<\/ul>\n\n<h4>0.10.1<\/h4>\n\n<ul>\n<li>Pro: preparing a quote in the Requests console no longer reloads the page each time you add or remove a product \u2014 lines are added and removed in place and the live customer preview updates instantly.<\/li>\n<li>Pro: a product you add to a quote now defaults to an \"Optional\" add-on (the customer can choose to add it); switch it to Required or Alternative from the Type column if you prefer.<\/li>\n<\/ul>\n\n<h4>0.10.0<\/h4>\n\n<ul>\n<li>Pro: the multi-product quote list is now a polished slide-in \"quote drawer\". Adding a product slides it in from the side with the collected items \u2014 each with its thumbnail, a quantity stepper and a remove control \u2014 a live count, an empty state, and one clear \"Request a quote for these items\" action. A floating launcher reopens it anytime. It is a progressive enhancement of an in-flow list (usable without JavaScript), is keyboard-accessible (focus trap, Esc, scroll lock) and supports light and dark. Prices stay hidden throughout.<\/li>\n<\/ul>\n\n<h4>0.9.9<\/h4>\n\n<ul>\n<li>Fixed: submitting the \"Request a quote\" form from the product-page modal failed with a generic \"Error\". The form's request was being sent to the wrong URL (a hidden field named \"action\" was shadowing the form's action property in the browser), so no quote was created. Quote requests now submit correctly.<\/li>\n<\/ul>\n\n<h4>0.9.8<\/h4>\n\n<ul>\n<li>Fixed: on variable products in catalog (quote) mode the \"Add to cart\" button could still appear alongside the variations form \u2014 it is now fully removed, matching simple products, so only the quote flow remains.<\/li>\n<li>Pro: the multi-product quote list is now a live mini-cart. Adding or removing a product updates the list and its counter instantly without reloading the page, and the \"Add to quote list\" button shows a running count and a brief confirmation.<\/li>\n<\/ul>\n\n<p>For older releases, see changelog.txt.<\/p>","raw_excerpt":"Request a quote instead of a price: hide price everywhere, catalog mode, wholesale and B2B quotes, with no leak in blocks, REST or schema.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ta.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/354498","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ta.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ta.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ta.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=354498"}],"author":[{"embeddable":true,"href":"https:\/\/ta.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/erenlabs"}],"wp:attachment":[{"href":"https:\/\/ta.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=354498"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ta.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=354498"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ta.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=354498"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ta.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=354498"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ta.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=354498"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ta.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=354498"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}