WooCommerce 9.4: Supercharging the Product Collection block & more

WooCommerce 9.4 has been released on November 11, 2024.

ADVISORY NOTE: 9.4.0 is available on WordPress.org however, we have updated our stable tag to the 9.4.1 dot release.

This post highlights what’s new in this version of WooCommerce.

See our update guide.
Download directly from WordPress.org.

Other important information:

Latest Release:

👉 WooCommerce 9.4.1 (Stable)

About:

  • ✅ Backwards compatible
  • Commits: 320
  • Contributors: 80

Product collection block

This release will see a number of improvements in the Product collection block. The block will now only render when it contains products or when a “no results” block is explicitly present, ensuring a cleaner display for empty collections. This ensures a cleaner UI and a faster experience for users.

We’re also introducing new JS events as we move toward consolidating all product grid functionalities within the Product Collection block. This shift will enhance the experience by integrating features from existing product grids into the Product Collection block. To support this, new JS events have been added to replace actions previously emitted by other grid blocks. Check out our advisory on migrating to the new event structure or refer to our documentation for more details.


Product details block

Add: ‘Show tab title’ attribute to the Product Details blockPull Request #50884

By default, the Product Details block displays a non-customizable large title of the currently selected tab. In this release, we add a new Show tab title in content attribute to the Product Details block, so the user can customize if the title will be displayed or not.


More options for express checkout

[Feature] Express Checkout Improvements  #50791

We’ve improved the functionality of the express checkout in the Cart and checkout blocks, introducing customization options for express payment buttons (adjustable height and border radius), displaying an active express payment methods list upon clicking the Express Payment block, and fixing layout issues like button container breaks and improper rendering at certain widths. While style control is currently limited to a few payment extensions, we’re working on expanding support.

The editor now displays active payment methods in real-time, improving layout accuracy. Currently, these styling controls are supported by select payment extensions, and we encourage developers to update their payment integrations for full compatibility with these new features.


Searching inside of WooCommerce

In app search improvements feature branch #51413

Search in WooCommerce > Extensions page has been improved, now enabling you to explore the complete extensions catalog on WooCommerce.com from the comfort of your own dashboard.


Remote error logging

We are now ready to ship this feature which we originally announced in 9.3. Since then, we’ve made changes to make it easier for store owners to debug fatal errors. The feature is meant to improve the stability and reliability of WooCommerce stores by logging WooCommerce Core PHP and JavaScript fatal errors to a remote logging service when users opt-in to tracking. The feature will allow us to identify and fix issues more quickly, improving debugging capabilities and enhancing store owners’ support.


Brands Added with Feature Flag

The Brands feature is now available for testing. It is currently turned off for all customers, however please visit our detailed post on technical implementation and testing feedback for this release cycle.

Brands allows you to create and manage brands for stores and assign them to products, similar to Categories. With brand short-codeswidgets, and blocks, you can create dedicated brand pages, display brand details on product pages, and help shoppers navigate stores using brand-specific navigation menus. Additionally, you can now limit coupon use to specific brands.


API Updates

  • Add filter to overwrite response of wc_rest_should_load_namespace #50902
  • Add global_unique_id parameter to products REST API #51264

Other important information

🚨 Known issues: Translation loading changes in WordPress 6.7

WordPress 6.7 introduces changes to how translations are loaded, aligning with best practices for internationalization. These updates may trigger debug warnings for some plugins, including WooCommerce, particularly when other plugins load WooCommerce code early. While we’ve made adjustments in WooCommerce 9.4 to mitigate this, production sites are advised to set WP_DEBUG_DISPLAY to false to prevent notices from showing on the frontend. For more guidance, check out developer advisory.

Database updates

💿 wc_update_940_add_phone_to_order_address_fts_index → Makes phone numbers searchable via full text search for orders #51065

💿 wc_update_940_remove_help_panel_highlight_shown → Cleans up unused meta data related to the help panel spotlight feature (which is no longer used) #51249


Changelog

See all bug fixes and improvements
  • Fix – Product grid blocks: fix Image aspect ratio with WordPress 6.7 #52431
  • Fix – Product Image Gallery: Render placeholder in Editor in WordPress 6.7 #52432
  • Fix – Support situations in which (WooCommerce) translations are inadvertently loaded too early. #52199
  • Fix – Add a retry mechanism to the query to obtain the SKU lock for product creation through the API. #51735
  • Fix – Fix Error: Failed opening required '.../wp-content/plugins/woocommerce/src/StoreApi/Schemas/V1/AI/ProductsSchema.php fatal error #51912
  • Fix – Resolved fatal error when applying Brands-restricted coupon #51577
  • Fix – Fix CSS issue with Safari 18.0 on the product form page. #51734
  • Fix – Add a new notice to the plugins list for products used without subscriptions reminding them to purchase. #51060
  • Fix – Added missing wp-block- classes to order confirmation, store notices, and breadcrumb blocks. #51380
  • Fix – Added pre-API call permission checks for some API calls that were being called on non-admin accessible screens #51406
  • Fix – Add focus styles to the Checkout block select field. #51332
  • Fix – Adds a function_exists() check so that we don’t add a secondary fatal in remote logging if wp_get_current_user does not exist yet #51302
  • Fix – Adjust Mongolia postcode validation to be 5 digits or 5 digits followed by 4 digits. #50279
  • Fix – Bust WC object cache on direct post meta update to prevent stale cache read. #50215
  • Fix – Conditionally set new order email sent meta field #50858
  • Fix – Default saved payment method is now respected by block checkout. #50481
  • Fix – Deprecate single product block save #51153 #51153
  • Fix – Fix a styling bug where the guest order confirmation email input was too wide. #51277
  • Fix – Fix badge number fails to match the number of unfinished tasks #51063
  • Fix – Fix bottom margin of last patterns #50991
  • Fix – Fix duplicate spec evaluation in evaluate_specs() #51166
  • Fix – Fix error when adding the Product Gallery (Beta) block into a pattern #51189
  • Fix – Fix My Account block icon being too small when inserted via block hooks #51047
  • Fix – Fix Settings Save button when WP List Tables are present #51102
  • Fix – Fix site visibility badge style #50976
  • Fix – Fix the loading state for the In-App Marketplace search #51413
  • Fix – Fix the order-items view for coupons, so we show the actually-used coupon info, if it exists. #48262
  • Fix – Fix variation selector display issues on the front end #51023 #51023
  • Fix – Fix wc_admin_unsnooze_admin_notes events are being needlessly created #51254
  • Fix – Hide payment recommendations when no extensions are available #50949
  • Fix – Improve checkout page accessibility after removing heading level 1. #50925
  • Fix – Improve icon aligment in Essential Header and Minimal Header patterns #50952
  • Fix – Improve performance of tax report export generation and fix tax_code for removed rates. #51395
  • Fix – Make Admin\API\Reports\Customers\DataStore::anonymize_customer accept an order instance as a parameter to ensure compatibility with the woocommerce_privacy_remove_order_personal_data hook. #38201
  • Fix – Make Checkout block coupons filter consistent by always running. #50876
  • Fix – Only log PTK error if no action has been scheduled #51143
  • Fix – Prevent an error in the WC_Checkout class when WooCommerce has not been properly initialized yet #50692
  • Fix – Prevent search request in the Extensions > My Subscriptions page #51164
  • Fix – Product bulk edit: allow to restore original price and avoid fatal errors. #50836
  • Fix – Product bulk edit: fix increasing & decreasing sale price when there was no previous sale. #50842
  • Fix – Put site visibility badge behind the launch your store feature flag #51159
  • Fix – Removed the leftover user meta from the help panel spotlight #51249
  • Fix – Remove extra bottom padding in filters in the editor. #51012
  • Fix – Remove title attribute from images in product slider. #50886
  • Fix – Replace retired theme Nokul with Gizmo in the CYS experience #51113
  • Fix – Set customer email in reports if customer data is available #51367
  • Fix – Trap focus inside the product gallery modal. #50730
  • Fix – Update the logic that conditionally activates the compatibility layer in WooCommerce block templates so it detects blocks inside patterns #50595
  • Fix – Use the correct language in Cart/Checkout when the user language is different from the store. #51244
  • Fix – Use get_filtered_ids consistently in reports/taxes and reports/taxes/stats datastores #51219
  • Fix – wc_get_cart_url should only return current URL if on the cart page. This excludes the usage of WOOCOMMERCE_CART. #51384
  • Fix – Wrap parse_str under a check to resolve deprecation notice #51474
  • Fix – Removes several side effects in the code base that caused translations to be loaded too early #52055
See all features and additions
  • Add – BFCM promo card support (data to be served by WCCOM API) #51739
  • Add – Add core feature for site visibility badge #51664
  • Add – Added a Load More button to product lists on the Extensions page, to request additional search results from WooCommerce.com. #51413
  • Add – Add endpoint title to the document title. #50900
  • Add – Add global_unique_id parameter to products REST API #51264
  • Add – Add inspector controls to Product Search block #51247 #51247
  • Add – Add new feature for a product data views page. #50981
  • Add – Add react-powered main payments settings screen #50825
  • Add – Adds a filter for third party tax plugins to indicate that they have completed the tax task #51362
  • Add – Add search result counts to the in-app marketplace header tabs (Extensions area) #51413
  • Add – Adds unified styles for the express checkout block #50791
  • Add – Add use-wp-horizon feature flag to set calpyso_env to horizon #51421
  • Add – Add locale param when redirecting to the Jetpack auth page. #51392
  • Add – Available express payment methods are visible in the editor when selecting the express payment block #50791
  • Add – Improve the express checkout experience with several design tweak, uniform button styles and editor improvements #50791
  • Add – Introduced Product Brands. #50165
  • Add – Product Collection – Implement Inspector control to change selected product #50164
  • Add – Product Collection – Show product picker in Editor when collection requires a product but not available <details> A collection can define if it requires a product context. This can be done using usesReference argument i.e. tsx __experimentalRegisterProductCollection({ ..., usesReference: ['product'], ) When product context doesn’t exist in current template/page/post etc. then we show product picker in Editor. This way, merchant can manually provide a product context to the collection. #50164
  • Add – Product Collection: Added Editor UI for missing product reference #51114
  • Add – Product Elements send a JS event when user attempts to view a product #51156
  • Add – Provide screen readers with product sorting status message. #50573
  • Add – Synchronise the express payment controls between the Cart & Checkout blocks #50791
  • Add – Track data for font and color pairings including ‘Create your own’ option in CYS #51206
See all updates and tweaks
  • Update – Fix CYS error with latest Gutenberg nightly builds #52623
  • Update – Added experimental delayed order creation block. #50934
  • Update – Added Stripe tax in onboarding tax task #50989
  • Update – Change the way search results are displayed in the in-app marketplace #51413
  • Update – Clean up ‘Profile Wizard’ code #51190
  • Update – Clean up Purchase task #51274
  • Update – Comment: Fix comment typos across various files. #50047
  • Update – Consolidate Store API and Core account creation functions. #50913
  • Update – Deprecate unsupported Inbox note banner layout #51275
  • Update – Dynamically set plugin_name when redirecting to Jetpack Auth from core profiler #51278
  • Update – E2E tests – skipping 11 tests for the Pressable website #51123
  • Update – Ensure that active plugins shown in the System Status API endpoint actually exist #50974
  • Update – Expand the e2e suite we’re running on WPCOM. #51303
  • Update – Expand the e2e suite we’re running on WPCOM part #2. #51414
  • Update – Expand the e2e suite we’re running on WPCOM part #3. #51422
  • Update – Include API tests into test suites for Pressable and WPCOM. #51284
  • Update – Make In-App Marketplace header sticky to improve discoverability. #51187
  • Update – Move Pressable and WPCOM e2e runss to release-checks instead of daily-checks #51148
  • Update – Product cards in the in-app marketplace show currency and billing period data dynamically, based on data received from WooCommerce.com #51170
  • Update – Product Collection: Disable client-side nav if filter blocks are detected inside #51358
  • Update – Product Rating: hide reviews in the front end when disabled at store or product level. #50979
  • Update – Refactor WooCommercePayments task to use woo payment gateway from WC()->payment_gateways->payment_gateways() #50953
  • Update – Replace marketplace search component with SearchControl from @wordpress/components #51413
  • Update – Show payments recommendation when main settings element is found #50947
  • Update – Update /customize-store tests, so they are passing against Pressable env. #51004
  • Update – Update /merchant tests (first five files), so they are passing against Pressable env. #51014
  • Update – Update /merchant tests (second five files), so they are passing against Pressable env. #51016
  • Update – Update /merchant tests so they are passing against Pressable env. #51158
  • Update – Update /shopper tests (first part), so they are passing against Pressable env. #51068
  • Update – Update /shopper tests (second part), so they are passing against Pressable env. #51100
  • Update – Update admin-* folders, so e2e tests are passing against Pressable env. #50994
  • Update – Updated wording on the Cart/Checkout shipping sidebars #51072
  • Update – Update In-App Marketplace category selector #51413
  • Update – Update storybook file format in support with Storybook 7 story indexer. #51168
  • Update – Update the Action Scheduler package to version 3.8.2 #51353
  • Update – Update the rest of /merchant tests so they are passing against Pressable env. #51181
  • Update – Update webpack config to bundle in @wordpress/dataviews package. #51008
  • Update – Update activate-and-setup e2e tests, so they are passing against Pressable env. #50927
  • Update – Update add-variable-product e2e tests, so they are passing against Pressable env. #50942
  • Update – Update products/block-editor e2e tests, so they are passing against Pressable env. #50960
  • Tweak – Limit the amount of Feature Controller logic that will run before init, to improve compatibility with translation-related changes in WP 6.7. #52557
  • Tweak – Add default Facebook for WooCommerce plugin recommendation. #52405
  • Tweak – Fix PHPCS warnings in OrdersTableQuery.php and ProductQuery.php #51281
  • Tweak – Fix typo in inline doc in woocommerce client, includes, and lib folders. #50739
  • Tweak – Fix typos in plugins/woocommerce-blocks/docs #48562
  • Tweak – Fix version number in a template #51020
  • Tweak – Include group and product id properties in the marketplace_product_card_clicked Tracks event #51180
  • Tweak – Log deprecation warnings for Query class usage. #50969
  • Tweak – Minor fixes to product descriptions on the Extensions screen. #51228
  • Tweak – Move collections e2e tests from product collection file to its own file #50853
  • Tweak – Move register product collection tester e2e tests from product collection file to its own file #50852
  • Tweak – Move the inspector controls e2e tests from product collection file to its own file #50849
  • Tweak – On mobile, style order confirmation page details side by side #50722
  • Tweak – Reenable remote logging feature by default #51320
  • Tweak – Remove the usage of ReportSummarys isRequesting property as it has no effect. #50751
  • Tweak – Remove titles on Extensions and Themes tabs in the marketplace #51195
  • Tweak – Small visual tweaks to the express checkout area #50644
  • Tweak – Update coming soon extensibility documentation #51160
  • Tweak – Update footer design, add one more element to footer content and remove woo-marketplace copy at footer bottom. #51315
  • Tweak – Update PHP unit tests to remove specific team names for generic names. #51017
  • Tweak – Update product card content padding to 24px and add 0 margin bottom to product cards #51288
  • Tweak – Update reset password e2e to use or locator to check reset status #50823
  • Tweak – UX improvements to the express payment block in the editor #50791
  • Tweak – Validate and prepare GTIN in structured data #50926
See all developer updates
  • Dev – Add e2e tests to confirm that the store is in coming soon mode after completing the core profiler #50784
  • Dev – Added doc blocks to conditionally fired hooks to better explain nuanced behavior #51061
  • Dev – Add reporting of slow PHPUnit tests. #51253
  • Dev – Coding standatds: fix PSR-4 naming violation in tests (part 1). #51194
  • Dev – Coding standatds: fix PSR-4 naming violation in tests (part 2). #51198
  • Dev – Convert with-reviews to TS #50890 #50890
  • Dev – CYS – Move the “ai/products” endpoint to woocommerce admin API. #50396
  • Dev – CYS – Move the “private/patterns” endpoint to woocommerce admin API. #50400
  • Dev – E2E tests: fix flakiness in page publishing action #51196
  • Dev – Explicitly select the payment method on the customer payment page e2e test #51210
  • Dev – Fix eslint warnings #50869
  • Dev – Fix flaky remote logging PHP unit test #50950
  • Dev – Fix pnpm version to 9.1.3 to avoid dependency installation issues. #50828
  • Dev – Fix slow test for Reports #51279
  • Dev – fix small lint errors and fix lint rule to make doc contribution easier #50843
  • Dev – Made XState utils updateQueryParam generic so that it can be reused in other XState machines #51167
  • Dev – Make Block Reference a public doc #50906
  • Dev – Manage K6 version #51239
  • Dev – Mark several Customize Your Store PHP classes as internal #51069
  • Dev – On Sale Badge: Migrate to block.json #50908
  • Dev – Product Image: migrate to block.json #50903
  • Dev – Product Price: migrate to block.json #50905
  • Dev – Remove @wooocommerce Combobox component that is no longer used. #50975
  • Dev – Remove deprecated RemoteInboxNotification classes #51250
  • Dev – Track customize_your_store_assembler_hub_editor_loaded event to measure CYS loading time #51461
  • Dev – Update docs #51144
  • Dev – Updated webpack build script for wc admin so that the wp-admin-scripts are dynamically fetched from the fs instead of a hard list #51133
  • Dev – [Enhancement] Abstract rating block #50810 #50810
See all performance improvements and enhancements
  • Performance – Conditionally initialize block template compatibility classes #50785
  • Performance – Don’t update the script data transient for the same data #50962
  • Performance – Only load local pickup methods on cart/checkout pages #51174
  • Performance – Only run woocommerce_admin_shared_settings filter on admin requests #51161
  • Performance – Refactor Country Specs to use ‘in’ operator #51162
  • Performance – Remove relevancy ranking from FTS queries to improve performance. #51065
  • Enhancement – Add ‘Show tab title’ attribute to the Product Details block #50884
  • Enhancement – Add additional sizing units for product image block #50770
  • Enhancement – Add filter for response of wc_rest_should_load_namespace function to allow loading namespaces. #50902
  • Enhancement – Add filters for custom orderby query params for WC Analytics #49722
  • Enhancement – Add phone number to FTS index to improve order searchability. #51065
  • Enhancement – Enhance WooCommerce version checking for remote logging reliability #51009
  • Enhancement – Harden styles for interactive elements in Checkout block to prevent style leakage. #51375
  • Enhancement – Improve remote logging structure and content #51360
  • Enhancement – Improve the tabs focus style in the Product Details block with Minimal style variation #50880
  • Enhancement – Introduce error handling on the in-app my subscriptions page #51298
  • Enhancement – Move address card state management to data stores in Checkout block. #51386
  • Enhancement – Move focus into coupon input if there is an error #48738
  • Enhancement – Product Collection – Change cursor style of preview button to default #50612
  • Enhancement – Product Collection: Don’t render when empty unless the no results block is present. #50404
  • Enhancement – Product SKU block: add editable prefixes and suffixes. #51033
  • Enhancement – Reduce dependency of remote logging on WC_Tracks #51365
  • Enhancement – Reducing noise in remote logging #51357
  • Enhancement – Refine PHP Fatal Error Counting in MC Stat #51363

View the full changelog.

Get WooCommerce 9.4

👉 To upgrade: See our update guide or download the latest release from WordPress.org.

🐞 Found a Bug? Please submit a report it on GitHub.

Contributors

WooCommerce Core

WunderBart
piinthecloud
KokkieH
vishnugopal
senadir
mreishus
ilyasfoo
barryhughes
kalessil
Maikuolan
kmanijak
raicem
louwie17
alexflorisca
ianlin
Stojdza
slash1andy
tjcafferkey
thealexandrelara
psealock
crftwrk
coreymckrill
naman03malhotra
samnajian
albarin
mdperez86
bor0
spraveenitpro
brentmackinnon
samueljseay
mikejolley
nathanss
gigitux
dinhtungdu
veljkho
davefx
vladolaru
ObliviousHarmony
rjchow
octaedro
adimoldovan
Aljullu
jonathansadowski
georgejipa
raja651
imanish003
moon0326
kurzi2704
vedanshujain
JacklynBiggin
lanej0
narenin
opr
DAnn2012
alvarothomas
Konamiman
jorgeatorres
nigeljamesstevenson
roykho
chihsuan
jimjasson
tomalec
Manussakis
puntope

ActionScheduler

coreymckrill
crstauf
barryhughes
Konamiman
vedanshujain


Keep yourself in the loop!

This field is hidden when viewing the form
This field is hidden when viewing the form
This field is hidden when viewing the form


18 responses to “WooCommerce 9.4: Supercharging the Product Collection block & more”

  1. danielspain Avatar
    danielspain

    An intelligent move to keep wc 9.4 for testing but no stable stag in wordpress…meanwhile a fix is search for.
    Another BIG problem is that the notice will occur with current stable wc 9.3.3 AND wp 6.7…so the problem is coming one way of another…the filter fix in my case doesn’t work…and for all people with non-english sites that will not upgrade wc 9.3.3 until a proper fix is done -but will upgrade wordpress to 6.7 tomorrow (a lot!)- the problem will appear…i hope a fix is coming fast as 9.4.1 release…thanks!

  2. danielspain Avatar
    danielspain

    the fix via a code snippet plugin works in my case,not simply pasting it in functions.php
    another issue is that if you upgrade to wp 6.7 and still use wc 9.3.3 your wc translations will not work anymore besides the php notice problem!!

  3. Props for picking up the issues and not marking stable before 9.4.1 is ready. That’s a good sign that processing are at least working, but I’d hope it was picked up sooner that at the last minute like this.

    1. Brent MacKinnon Avatar
      Brent MacKinnon

      It’s in there! It’s in the changelog, you’ll find the line item linking to this PR that merged Brands functionality into core.

      For now, Brands is disabled by default, and you can enable it by following the instructions in the post you shared.

      As we said in the post, the feature will be enabled for all users starting with WooCommerce 9.6.

      1. Top! Works great!

  4. danielspain Avatar
    danielspain

    Apparently does’nt it fix the Translation loading changes in WordPress 6.7…just tried 9.4.1

    please take a look at:

    https://github.com/woocommerce/woocommerce/issues/52646

  5. Hi,

    What is the Payments (1) tab? Can’t see information regarding it?

    1. Brent MacKinnon Avatar
      Brent MacKinnon

      Hey Waq — please see my comment below. I’ll see if the team can follow up with any further details.

  6. After upgrading to 9.4.1, sites now have an admin “Payments” tab even if they’re not using WooPayments and there does not seem to be a way to get rid of it.

    1. Brent MacKinnon Avatar
      Brent MacKinnon

      Thanks Robert,

      I believe what you’re seeing is related to this PR: Show payments recommendation on settings payment main page #50947

      It appears that Ilyas noticed that it still shows when there’s no extensions, which he says the team will address in another follow-up.

      I’ll flag your comment with the team internally and they may have more information.

      1. So this is a known issue and yet it was still pushed? It’s incredibly annoying and happening on all sites on 9.4.1. Clients will be wondering WTH it’s for and why is there a notification bubble. Who thought this was okay?

  7. Hello, when will it be possible to get a product variation by global_unique_id through the rest api? Currently this is only possible for the parent product.

    1. Darren Ethier Avatar
      Darren Ethier

      Hi Emil! It looks like global_unique_id is a defined property for the product variations controller. Will you expand on what’s not working as expected for you here?

      1. Hi when using parent global_unique_id no problem with getting product, but when argument is child global_unique_id, I have no luck.
        I getting with this method:
        //parent product global_unique_id
        $data=[‘global_unique_id’=>1667280022];
        //get product data on remote website
        $product_on_remote=$raf_client->get(‘products’,$data);
        print_r($product_on_remote);
        Am I wrong somewhere?

  8. It understands when I make the call like this:
    //child product global_unique_id
    $data=[‘global_unique_id’=>16672811103];
    //get product data on remote website
    $product_on_remote=$raf_client->get(‘products/231/variations’,$data);
    print_r($product_on_remote);

    The problem is that the barcode scanner does not know the parent id, and I want to avoid repeated unnecessary calls by first calling the parent and subsequently the variation. Do you think of a direct, working method that would help a lot for the real work when woocommerce combines the functions of an online and offline store. Thanks.

    1. Lourens Schep Avatar
      Lourens Schep

      Hi Emil,
      Thank you for the clarification. It does look like this was missed when implementing it for the ‘products’ endpoint. I created a Github issue ( https://github.com/woocommerce/woocommerce/issues/52816 ) to also add the unique id query support for the “products//variations” endpoint.

      Edit
      As I was working on the above I realized that the ‘/products’ endpoint also returns variations if querying by ‘SKU’, so I will also add that support for ‘global_unique_id’.

      1. Good job, thanks. I tested it on the site by adding your code and now it works like a charm.

Leave a Reply

Your email address will not be published. Required fields are marked *