Commit fc6822d036f for woocommerce
commit fc6822d036f63b5a280bd98dc6e0abb96273c159
Author: Luigi Teschio <gigitux@gmail.com>
Date: Tue Oct 13 18:58:13 2026 +0200
Restore translated metadata for product, Cart, and Checkout blocks (#69700)
* fix blocks translations
* remove unit test
* update agent.md
* improve types
* simplify variation logic
* improve ts-expect-error comment
diff --git a/AGENTS.md b/AGENTS.md
index 90b1dc2247d..0aa6068bd1d 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -277,6 +277,16 @@ Do not add `default` values to block attributes in `block.json`.
Consult the [Gutenberg Block Metadata reference](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-metadata/) as the source of truth for `block.json` field types. Several fields (`style`, `editorStyle`, `script`, `viewScript`) accept `string | string[]`, so code that reads them must handle both shapes — don't assume a string.
+### Block Metadata Translations
+
+**Preserve server-translated metadata when registering blocks.** Pass the complete `block.json` metadata object as the first argument to `registerBlockType( metadata, settings )`, including through registration helpers.
+
+### Block Variation Translations
+
+When registering a block variation with `registerBlockVariation()` or a helper such as `registerElementVariation()`, translate its title, description, and keywords with `@wordpress/i18n` functions using literal strings and the `woocommerce` text domain, for example `__( 'Display the title of a product.', 'woocommerce' )`.
+
+Do not import these user-facing strings from `block.json`, pass JSON properties or variables to translation functions, or read another block's registered metadata to obtain them.
+
## Interactivity API Stores
Most WooCommerce Interactivity API stores are **private by design**. Exception: the `woocommerce/product-filters` store is public for Product Filters inner-block extensibility.
diff --git a/plugins/woocommerce/changelog/fix-block-metadata-translations b/plugins/woocommerce/changelog/fix-block-metadata-translations
new file mode 100644
index 00000000000..e4a596aee3b
--- /dev/null
+++ b/plugins/woocommerce/changelog/fix-block-metadata-translations
@@ -0,0 +1,4 @@
+Significance: patch
+Type: fix
+
+Restore translated names for product, Cart, Checkout blocks and related product patterns in the editor.
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-accepted-payment-methods-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-accepted-payment-methods-block/index.tsx
index 96c2f2e6c5b..7de16410ace 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-accepted-payment-methods-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-accepted-payment-methods-block/index.tsx
@@ -10,9 +10,7 @@ import { Icon, payment } from '@wordpress/icons';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/cart-accepted-payment-methods-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-cross-sells-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-cross-sells-block/index.tsx
index 1a351b8116f..e212a12a8cf 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-cross-sells-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-cross-sells-block/index.tsx
@@ -34,10 +34,8 @@ export const createCrossSellsProductCollection = () => {
);
};
-// @ts-expect-error - blockName can be either string or object
-registerBlockType( 'woocommerce/cart-cross-sells-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+// @ts-expect-error - registerBlockType isn't well typed for metadata as the first argument
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-cross-sells-products/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-cross-sells-products/index.tsx
index 22930e0665f..8398fb0639a 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-cross-sells-products/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-cross-sells-products/index.tsx
@@ -11,9 +11,7 @@ import { Edit, Save } from './edit';
import './style.scss';
import metadata from './block.json';
-registerBlockType( 'woocommerce/cart-cross-sells-products-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-express-payment-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-express-payment-block/index.tsx
index 168b74a4203..feb2fccb080 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-express-payment-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-express-payment-block/index.tsx
@@ -11,9 +11,7 @@ import { Edit, Save } from './edit';
import expressIcon from '../../../cart-checkout-shared/icon';
import metadata from './block.json';
-registerBlockType( 'woocommerce/cart-express-payment-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-items-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-items-block/index.tsx
index 7af4751fa23..60630fb161a 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-items-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-items-block/index.tsx
@@ -10,9 +10,7 @@ import { registerBlockType } from '@wordpress/blocks';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/cart-items-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-line-items-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-line-items-block/index.tsx
index 88d93d5383e..60630fb161a 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-line-items-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-line-items-block/index.tsx
@@ -10,9 +10,7 @@ import { registerBlockType } from '@wordpress/blocks';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/cart-line-items-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-block/index.tsx
index 13f29b22905..ee2310f894e 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-block/index.tsx
@@ -12,9 +12,7 @@ import { Edit, Save } from './edit';
import deprecated from './deprecated';
import metadata from './block.json';
-registerBlockType( 'woocommerce/cart-order-summary-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-coupon-form/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-coupon-form/index.tsx
index 3f0ad196e2f..f81289a9b5b 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-coupon-form/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-coupon-form/index.tsx
@@ -14,9 +14,7 @@ import metadata from './block.json';
*/
import { Edit, Save } from './edit';
-registerBlockType( 'woocommerce/cart-order-summary-coupon-form-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-discount/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-discount/index.tsx
index 48ed2aaee94..a605dc326d2 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-discount/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-discount/index.tsx
@@ -11,9 +11,7 @@ import { registerBlockType } from '@wordpress/blocks';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/cart-order-summary-discount-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-fee/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-fee/index.tsx
index 9be439ea90e..a605dc326d2 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-fee/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-fee/index.tsx
@@ -11,9 +11,7 @@ import { registerBlockType } from '@wordpress/blocks';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/cart-order-summary-fee-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-heading/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-heading/index.tsx
index 8acaa637b20..a605dc326d2 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-heading/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-heading/index.tsx
@@ -11,9 +11,7 @@ import { registerBlockType } from '@wordpress/blocks';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/cart-order-summary-heading-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-shipping/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-shipping/index.tsx
index f309f07b985..a605dc326d2 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-shipping/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-shipping/index.tsx
@@ -11,9 +11,7 @@ import { registerBlockType } from '@wordpress/blocks';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/cart-order-summary-shipping-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-subtotal/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-subtotal/index.tsx
index 007570a3dff..a605dc326d2 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-subtotal/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-subtotal/index.tsx
@@ -11,9 +11,7 @@ import { registerBlockType } from '@wordpress/blocks';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/cart-order-summary-subtotal-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-taxes/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-taxes/index.tsx
index ba12925d857..8248f38325b 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-taxes/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-taxes/index.tsx
@@ -12,9 +12,7 @@ import { Edit, Save } from './edit';
import attributes from './attributes';
import metadata from './block.json';
-registerBlockType( 'woocommerce/cart-order-summary-taxes-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-totals/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-totals/index.tsx
index 9ff0c432315..0b8686262d7 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-totals/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-order-summary-totals/index.tsx
@@ -12,9 +12,7 @@ import { Edit, Save } from './edit';
import './style.scss';
import metadata from './block.json';
-registerBlockType( 'woocommerce/cart-order-summary-totals-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-totals-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-totals-block/index.tsx
index 31fcc9dae9c..8398fb0639a 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-totals-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/cart-totals-block/index.tsx
@@ -11,9 +11,7 @@ import { Edit, Save } from './edit';
import './style.scss';
import metadata from './block.json';
-registerBlockType( 'woocommerce/cart-totals-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/empty-cart-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/empty-cart-block/index.tsx
index 89f331facb4..5970d543ff8 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/empty-cart-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/empty-cart-block/index.tsx
@@ -12,9 +12,7 @@ import { Edit, Save } from './edit';
import './style.scss';
import metadata from './block.json';
-registerBlockType( 'woocommerce/empty-cart-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/filled-cart-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/filled-cart-block/index.tsx
index ea9e446f636..143bde56f56 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/filled-cart-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/filled-cart-block/index.tsx
@@ -11,9 +11,7 @@ import { registerBlockType } from '@wordpress/blocks';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/filled-cart-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/proceed-to-checkout-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/proceed-to-checkout-block/index.tsx
index 46589224b17..7095999610f 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/proceed-to-checkout-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/cart/inner-blocks/proceed-to-checkout-block/index.tsx
@@ -12,9 +12,7 @@ import { Edit, Save } from './edit';
import './style.scss';
import metadata from './block.json';
-registerBlockType( 'woocommerce/proceed-to-checkout-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-actions-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-actions-block/index.tsx
index 30bea937bc8..dad9560cccd 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-actions-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-actions-block/index.tsx
@@ -14,9 +14,7 @@ import { Edit, Save } from './edit';
import metadata from './block.json';
import './style.scss';
-const blockConfig: BlockConfiguration = {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+const blockConfig: Partial< BlockConfiguration > = {
example: {
attributes: {
showPrice: true,
@@ -37,4 +35,4 @@ const blockConfig: BlockConfiguration = {
edit: Edit,
};
-registerBlockType( 'woocommerce/checkout-actions-block', blockConfig );
+registerBlockType( metadata, blockConfig );
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-additional-information-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-additional-information-block/index.tsx
index 5032a455f79..2292c20be7c 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-additional-information-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-additional-information-block/index.tsx
@@ -11,9 +11,7 @@ import { Edit, Save } from './edit';
import attributes from './attributes';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-additional-information-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
attributes,
icon: {
src: (
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-billing-address-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-billing-address-block/index.tsx
index 5edc7b3f6ba..09a44136579 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-billing-address-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-billing-address-block/index.tsx
@@ -10,9 +10,7 @@ import { Edit, Save } from './edit';
import attributes from './attributes';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-billing-address-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-contact-information-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-contact-information-block/index.tsx
index ab053a73a3b..96e4fc07e01 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-contact-information-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-contact-information-block/index.tsx
@@ -11,9 +11,7 @@ import { Edit, Save } from './edit';
import attributes from './attributes';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-contact-information-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-express-payment-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-express-payment-block/index.tsx
index 518fbb31016..2577baa84b1 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-express-payment-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-express-payment-block/index.tsx
@@ -11,9 +11,7 @@ import expressIcon from '../../../cart-checkout-shared/icon';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-express-payment-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-fields-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-fields-block/index.tsx
index 1ac9e80d91d..8398fb0639a 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-fields-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-fields-block/index.tsx
@@ -11,9 +11,7 @@ import { Edit, Save } from './edit';
import './style.scss';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-fields-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-note-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-note-block/index.tsx
index 99928d12453..6fc28ee4b4d 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-note-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-note-block/index.tsx
@@ -11,9 +11,7 @@ import { Edit, Save } from './edit';
import metadata from './block.json';
// Register the block
-registerBlockType( 'woocommerce/checkout-order-note-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-block/index.tsx
index c9bb540918d..dd09b156106 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-block/index.tsx
@@ -14,9 +14,7 @@ import deprecated from './deprecated';
import './style.scss';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-order-summary-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-cart-items/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-cart-items/index.tsx
index 5043cfdb93e..b7df95ea815 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-cart-items/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-cart-items/index.tsx
@@ -11,9 +11,7 @@ import { registerBlockType } from '@wordpress/blocks';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-order-summary-cart-items-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-coupon-form/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-coupon-form/index.tsx
index 02830b47b10..28e8d5c6013 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-coupon-form/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-coupon-form/index.tsx
@@ -10,9 +10,7 @@ import { registerBlockType } from '@wordpress/blocks';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-order-summary-coupon-form-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-discount/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-discount/index.tsx
index 8f8d5c4ac28..a605dc326d2 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-discount/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-discount/index.tsx
@@ -11,9 +11,7 @@ import { registerBlockType } from '@wordpress/blocks';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-order-summary-discount-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-fee/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-fee/index.tsx
index 34a74405f69..a605dc326d2 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-fee/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-fee/index.tsx
@@ -11,9 +11,7 @@ import { registerBlockType } from '@wordpress/blocks';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-order-summary-fee-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-shipping/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-shipping/index.tsx
index cc5f1536fdf..a605dc326d2 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-shipping/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-shipping/index.tsx
@@ -11,9 +11,7 @@ import { registerBlockType } from '@wordpress/blocks';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-order-summary-shipping-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-subtotal/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-subtotal/index.tsx
index 2b3e2304306..a605dc326d2 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-subtotal/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-subtotal/index.tsx
@@ -11,9 +11,7 @@ import { registerBlockType } from '@wordpress/blocks';
import { Edit, Save } from './edit';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-order-summary-subtotal-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-taxes/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-taxes/index.tsx
index cbe89d6ff9c..8248f38325b 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-taxes/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-taxes/index.tsx
@@ -12,9 +12,7 @@ import { Edit, Save } from './edit';
import attributes from './attributes';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-order-summary-taxes-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-totals/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-totals/index.tsx
index 615dc358a13..40ee5d7ac70 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-totals/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-order-summary-totals/index.tsx
@@ -12,9 +12,7 @@ import { Edit, Save } from './edit';
import metadata from './block.json';
import './style.scss';
-registerBlockType( 'woocommerce/checkout-order-summary-totals-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-payment-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-payment-block/index.tsx
index 067214bab04..a932fbedcd1 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-payment-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-payment-block/index.tsx
@@ -11,9 +11,7 @@ import { Edit, Save } from './edit';
import attributes from './attributes';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-payment-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-pickup-options-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-pickup-options-block/index.tsx
index 575ec94b37b..24f4330c21e 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-pickup-options-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-pickup-options-block/index.tsx
@@ -12,9 +12,7 @@ import attributes from './attributes';
import metadata from './block.json';
import './style.scss';
-registerBlockType( 'woocommerce/checkout-pickup-options-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-address-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-address-block/index.tsx
index d56f37484df..0a1db50304a 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-address-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-address-block/index.tsx
@@ -11,9 +11,7 @@ import { Edit, Save } from './edit';
import attributes from './attributes';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-shipping-address-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-method-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-method-block/index.tsx
index 93c8d1e2110..cdc4138238c 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-method-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-method-block/index.tsx
@@ -12,9 +12,7 @@ import attributes from './attributes';
import metadata from './block.json';
import './style.scss';
-registerBlockType( 'woocommerce/checkout-shipping-method-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-methods-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-methods-block/index.tsx
index ca617486df0..cdc4138238c 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-methods-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-shipping-methods-block/index.tsx
@@ -12,9 +12,7 @@ import attributes from './attributes';
import metadata from './block.json';
import './style.scss';
-registerBlockType( 'woocommerce/checkout-shipping-methods-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-terms-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-terms-block/index.tsx
index d7053d1d3bf..ddc69b417a6 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-terms-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-terms-block/index.tsx
@@ -11,9 +11,7 @@ import { Edit, Save } from './edit';
import metadata from './block.json';
import './style.scss';
-registerBlockType( 'woocommerce/checkout-terms-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-totals-block/index.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-totals-block/index.tsx
index 395b04e394c..8398fb0639a 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-totals-block/index.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/checkout/inner-blocks/checkout-totals-block/index.tsx
@@ -11,9 +11,7 @@ import { Edit, Save } from './edit';
import './style.scss';
import metadata from './block.json';
-registerBlockType( 'woocommerce/checkout-totals-block', {
- apiVersion: metadata.apiVersion,
- title: metadata.title,
+registerBlockType( metadata, {
icon: {
src: (
<Icon
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/product-collection/variations/elements/product-title.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/product-collection/variations/elements/product-title.tsx
index ef3fa76b93b..12306b8f2dc 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/product-collection/variations/elements/product-title.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/product-collection/variations/elements/product-title.tsx
@@ -3,10 +3,7 @@
*/
import { Icon } from '@wordpress/components';
import { heading } from '@wordpress/icons';
-import {
- title,
- description,
-} from '@woocommerce/product-elements/title/block.json';
+import { __ } from '@wordpress/i18n';
/**
* Internal dependencies
@@ -19,9 +16,12 @@ export const VARIATION_NAME = `${ blockJson.name }/product-title`;
const registerProductTitle = () => {
registerElementVariation( CORE_NAME, {
- blockDescription: description,
+ blockDescription: __(
+ 'Display the title of a product.',
+ 'woocommerce'
+ ),
blockIcon: <Icon icon={ heading } />,
- blockTitle: title,
+ blockTitle: __( 'Product Title', 'woocommerce' ),
variationName: VARIATION_NAME,
scope: [ 'block', 'inserter' ],
} );
diff --git a/plugins/woocommerce/client/blocks/assets/js/blocks/product-query/variations/elements/product-title.tsx b/plugins/woocommerce/client/blocks/assets/js/blocks/product-query/variations/elements/product-title.tsx
index 235bfbcae40..fc688de144d 100644
--- a/plugins/woocommerce/client/blocks/assets/js/blocks/product-query/variations/elements/product-title.tsx
+++ b/plugins/woocommerce/client/blocks/assets/js/blocks/product-query/variations/elements/product-title.tsx
@@ -2,10 +2,7 @@
* External dependencies
*/
import { Icon } from '@wordpress/components';
-import {
- title,
- description,
-} from '@woocommerce/product-elements/title/block.json';
+import { __ } from '@wordpress/i18n';
import { heading } from '@wordpress/icons';
/**
@@ -17,9 +14,9 @@ export const CORE_NAME = 'core/post-title';
export const VARIATION_NAME = 'woocommerce/product-query/product-title';
registerElementVariation( CORE_NAME, {
- blockDescription: description,
+ blockDescription: __( 'Display the title of a product.', 'woocommerce' ),
blockIcon: <Icon icon={ heading } />,
- blockTitle: title,
+ blockTitle: __( 'Product Title', 'woocommerce' ),
variationName: VARIATION_NAME,
scope: [ 'block' ],
} );
diff --git a/plugins/woocommerce/client/blocks/assets/js/utils/register-product-block-type.ts b/plugins/woocommerce/client/blocks/assets/js/utils/register-product-block-type.ts
index 7e03da672f3..33cb26d8bc4 100644
--- a/plugins/woocommerce/client/blocks/assets/js/utils/register-product-block-type.ts
+++ b/plugins/woocommerce/client/blocks/assets/js/utils/register-product-block-type.ts
@@ -4,6 +4,7 @@
import {
BlockAttributes,
BlockVariation,
+ getBlockVariations,
registerBlockType,
registerBlockVariation,
unregisterBlockType,
@@ -12,6 +13,7 @@ import {
} from '@wordpress/blocks';
import { subscribe, select } from '@wordpress/data';
import { CORE_EDITOR_STORE } from '@woocommerce/utils';
+
import { isEmpty } from '@woocommerce/types';
/**
@@ -38,25 +40,12 @@ type ProductBlockSettings = {
* @property {ProductBlockSettings} productBlockSettings - Product block settings
*/
type ProductBlockConfig< T extends BlockAttributes > = ProductBlockSettings & {
- blockName: string;
- settings: Partial< BlockConfiguration< T > >;
+ metadata: BlockConfiguration< T > & {
+ name: string;
+ variations?: BlockVariation< BlockAttributes >[] | undefined;
+ };
};
-/**
- * Configuration object for registering a product block type.
- *
- * @typedef {Object} ProductBlockRegistrationConfig
- * @template T Extends BlockAttributes to define the block's attribute types
- * @property {Partial<BlockConfiguration>} settings - Block settings configuration
- * @property {boolean} [isVariationBlock] - Whether this block is a variation
- * @property {string} [variationName] - The name of the variation if applicable
- * @property {boolean} isAvailableOnPostEditor - Whether the block should be available in post editor
- */
-type ProductBlockRegistrationConfig< T extends BlockAttributes > = Partial<
- BlockConfiguration< T >
-> &
- ProductBlockSettings;
-
/**
* Manages block registration and unregistration for WooCommerce product blocks in different contexts.
* Implements the Singleton pattern to ensure consistent block management across the application.
@@ -128,7 +117,8 @@ export class BlockRegistrationManager {
// Register only blocks available in post editor
this.blocks.forEach( ( config ) => {
if ( config.isAvailableOnPostEditor ) {
- const key = config.variationName || config.blockName;
+ const key =
+ config.variationName || config.metadata.name;
if ( ! this.hasAttemptedRegistration( key ) ) {
this.registerBlock( config );
}
@@ -216,20 +206,20 @@ export class BlockRegistrationManager {
private unregisterBlock< T extends BlockAttributes >(
config: ProductBlockConfig< T >
): void {
- const { blockName, isVariationBlock, variationName } = config;
+ const { metadata, isVariationBlock, variationName } = config;
try {
if ( isVariationBlock && variationName ) {
- unregisterBlockVariation( blockName, variationName );
+ unregisterBlockVariation( metadata.name, variationName );
this.attemptedRegisteredBlocks.delete( variationName );
} else {
- unregisterBlockType( blockName );
- this.attemptedRegisteredBlocks.delete( blockName );
+ unregisterBlockType( metadata.name );
+ this.attemptedRegisteredBlocks.delete( metadata.name );
}
} catch ( error ) {
// eslint-disable-next-line no-console
console.debug(
- `Failed to unregister block ${ blockName }:`,
+ `Failed to unregister block ${ metadata.name }:`,
error
);
}
@@ -247,8 +237,7 @@ export class BlockRegistrationManager {
config: ProductBlockConfig< T >
): void {
const {
- blockName,
- settings,
+ metadata,
isVariationBlock,
variationName,
isAvailableOnPostEditor,
@@ -256,7 +245,7 @@ export class BlockRegistrationManager {
try {
// Check if block is already registered
- const key = variationName || blockName;
+ const key = variationName || metadata.name;
if ( this.hasAttemptedRegistration( key ) ) {
return;
}
@@ -269,31 +258,53 @@ export class BlockRegistrationManager {
}
if ( isVariationBlock ) {
- registerBlockVariation(
- blockName,
- settings as BlockVariation< BlockAttributes >
- );
+ registerBlockVariation( metadata.name, {
+ ...metadata,
+ name: variationName || metadata.name,
+ } as BlockVariation< BlockAttributes > );
} else {
- const ancestor = isEmpty( settings?.ancestor )
+ const ancestor = isEmpty( metadata?.ancestor )
? [ 'woocommerce/single-product' ]
- : settings?.ancestor;
+ : metadata?.ancestor;
// Only remove ancestor if we're in site editor AND in single-product template
const shouldRemoveAncestor =
editSiteStore &&
this.currentTemplateId?.includes( 'single-product' );
- // @ts-expect-error - blockName can be either string or object
- registerBlockType( blockName, {
+ const {
+ title,
+ description,
+ keywords,
+ styles,
+ variations,
+ ...settings
+ } = metadata;
+
+ const registeredBlock = registerBlockType( metadata, {
...settings,
ancestor: shouldRemoveAncestor ? undefined : ancestor,
} );
+
+ this.blocks.set( key, {
+ ...config,
+ metadata: {
+ ...metadata,
+ title: registeredBlock?.title ?? metadata.title,
+ description:
+ registeredBlock?.description ??
+ metadata.description,
+ },
+ } );
}
this.attemptedRegisteredBlocks.add( key );
} catch ( error ) {
// eslint-disable-next-line no-console
- console.error( `Failed to register block ${ blockName }:`, error );
+ console.error(
+ `Failed to register block ${ metadata.name }:`,
+ error
+ );
}
}
@@ -307,11 +318,20 @@ export class BlockRegistrationManager {
public registerBlockConfig< T extends BlockAttributes >(
config: ProductBlockConfig< T >
): void {
- const key = config.variationName || config.blockName;
+ const key = config.variationName || config.metadata.name;
this.blocks.set( key, config as ProductBlockConfig< BlockAttributes > );
this.registerBlock( config );
}
}
+/**
+ * Checks that block metadata includes a non-empty name.
+ *
+ * @param metadata - Block metadata to validate.
+ */
+const hasBlockName = < T extends BlockAttributes >(
+ metadata: BlockConfiguration< T >
+): metadata is BlockConfiguration< T > & { name: string } =>
+ typeof metadata?.name === 'string';
/**
* Registers a block type specifically for WooCommerce product templates and optionally makes it available
@@ -335,8 +355,8 @@ export class BlockRegistrationManager {
* the block available in regular post editing contexts as well where ancestor constraints are enforced.
*
* @template T Extends BlockAttributes to define the block's attribute types
- * @param {string | Partial<BlockConfiguration<T>>} blockNameOrMetadata - Either a string block name or block metadata object
- * @param {ProductBlockRegistrationConfig<BlockConfiguration<T>>} [settings] - Optional settings for block registration
+ * @param {BlockConfiguration<T>} metadata - Block metadata and runtime settings
+ * @param {ProductBlockRegistrationConfig<BlockConfiguration<T>>} [settings] - Optional settings for block registration
* @return {void}
*
* @example
@@ -353,15 +373,10 @@ export class BlockRegistrationManager {
* ```
*/
export const registerProductBlockType = < T extends BlockAttributes >(
- blockNameOrMetadata: string | Partial< BlockConfiguration< T > >,
- settings?: ProductBlockRegistrationConfig< BlockConfiguration< T > >
+ metadata: BlockConfiguration< T >,
+ settings?: ProductBlockSettings
): void => {
- const blockName =
- typeof blockNameOrMetadata === 'string'
- ? blockNameOrMetadata
- : blockNameOrMetadata.name;
-
- if ( ! blockName ) {
+ if ( ! hasBlockName( metadata ) ) {
// eslint-disable-next-line no-console
console.error(
'registerProductBlockType: Block name is required for registration'
@@ -369,31 +384,11 @@ export const registerProductBlockType = < T extends BlockAttributes >(
return;
}
- // If blockNameOrMetadata is an object, use all its properties except 'name' as settings
- const metaDataWithoutName =
- typeof blockNameOrMetadata === 'string'
- ? {}
- : ( ( { name, ...metadata } ) => metadata )( blockNameOrMetadata );
-
- // Extract settings without custom properties
- const {
- isVariationBlock,
- variationName,
- isAvailableOnPostEditor,
- ...settingsWithoutCustomProperties
- } = {
- ...metaDataWithoutName,
- ...( settings || {} ),
- };
-
const internalConfig: ProductBlockConfig< T > = {
- blockName,
- settings: {
- ...settingsWithoutCustomProperties,
- } as BlockConfiguration< T >,
- isVariationBlock: isVariationBlock ?? false,
- variationName: variationName ?? undefined,
- isAvailableOnPostEditor: isAvailableOnPostEditor ?? false,
+ metadata,
+ isVariationBlock: settings?.isVariationBlock ?? false,
+ variationName: settings?.variationName ?? undefined,
+ isAvailableOnPostEditor: settings?.isAvailableOnPostEditor ?? false,
};
BlockRegistrationManager.getInstance().registerBlockConfig(
diff --git a/plugins/woocommerce/client/blocks/assets/js/utils/test/register-product-block-type.test.ts b/plugins/woocommerce/client/blocks/assets/js/utils/test/register-product-block-type.test.ts
index b2c66c1829d..7e60b7a7f4b 100644
--- a/plugins/woocommerce/client/blocks/assets/js/utils/test/register-product-block-type.test.ts
+++ b/plugins/woocommerce/client/blocks/assets/js/utils/test/register-product-block-type.test.ts
@@ -54,8 +54,12 @@ type RegisterProductBlockType =
const blockSettings = {
title: 'Test product block',
- category: 'woocommerce',
-} as Partial< BlockConfiguration >;
+ category: 'text',
+ apiVersion: 3,
+ attributes: {},
+ edit: () => null,
+ save: () => null,
+} satisfies BlockConfiguration;
const loadRegistrationFunction = (): RegisterProductBlockType => {
let registerProductBlockType: RegisterProductBlockType | undefined;
@@ -76,7 +80,7 @@ const loadRegistrationFunction = (): RegisterProductBlockType => {
describe( 'registerProductBlockType', () => {
beforeEach( () => {
jest.resetModules();
- jest.clearAllMocks();
+ jest.resetAllMocks();
mockPostType = 'post';
mockTemplateSlug = '';
mockIsSiteEditor = false;
@@ -94,19 +98,29 @@ describe( 'registerProductBlockType', () => {
it( 'registers only post-editor-enabled blocks with the Single Product ancestor', () => {
const registerProductBlockType = loadRegistrationFunction();
- registerProductBlockType( 'woocommerce/post-enabled', {
- ...blockSettings,
- isAvailableOnPostEditor: true,
- } );
- registerProductBlockType( 'woocommerce/post-disabled', {
- ...blockSettings,
- isAvailableOnPostEditor: false,
- } );
+ registerProductBlockType(
+ {
+ ...blockSettings,
+ name: 'woocommerce/post-enabled',
+ },
+ {
+ isAvailableOnPostEditor: true,
+ }
+ );
+ registerProductBlockType(
+ {
+ ...blockSettings,
+ name: 'woocommerce/post-disabled',
+ },
+ {
+ isAvailableOnPostEditor: false,
+ }
+ );
mockContextSubscription();
expect( mockRegisterBlockType ).toHaveBeenCalledTimes( 1 );
expect( mockRegisterBlockType ).toHaveBeenCalledWith(
- 'woocommerce/post-enabled',
+ expect.objectContaining( { name: 'woocommerce/post-enabled' } ),
expect.objectContaining( {
ancestor: [ 'woocommerce/single-product' ],
} )
@@ -120,15 +134,17 @@ describe( 'registerProductBlockType', () => {
mockIsSiteEditor = true;
const registerProductBlockType = loadRegistrationFunction();
- registerProductBlockType(
- 'woocommerce/site-editor-block',
- blockSettings
- );
+ registerProductBlockType( {
+ ...blockSettings,
+ name: 'woocommerce/site-editor-block',
+ } );
mockContextSubscription();
expect( mockRegisterBlockType ).toHaveBeenCalledTimes( 1 );
expect( mockRegisterBlockType ).toHaveBeenCalledWith(
- 'woocommerce/site-editor-block',
+ expect.objectContaining( {
+ name: 'woocommerce/site-editor-block',
+ } ),
expect.objectContaining( {
ancestor: [ 'woocommerce/single-product' ],
} )
@@ -142,14 +158,14 @@ describe( 'registerProductBlockType', () => {
mockIsSiteEditor = true;
const registerProductBlockType = loadRegistrationFunction();
- registerProductBlockType(
- 'woocommerce/transition-block',
- blockSettings
- );
- registerProductBlockType(
- 'woocommerce/transition-block',
- blockSettings
- );
+ registerProductBlockType( {
+ ...blockSettings,
+ name: 'woocommerce/transition-block',
+ } );
+ registerProductBlockType( {
+ ...blockSettings,
+ name: 'woocommerce/transition-block',
+ } );
mockContextSubscription();
expect( mockRegisterBlockType ).toHaveBeenCalledTimes( 1 );
@@ -163,7 +179,7 @@ describe( 'registerProductBlockType', () => {
);
expect( mockRegisterBlockType ).toHaveBeenNthCalledWith(
2,
- 'woocommerce/transition-block',
+ expect.objectContaining( { name: 'woocommerce/transition-block' } ),
expect.objectContaining( { ancestor: undefined } )
);
@@ -178,7 +194,7 @@ describe( 'registerProductBlockType', () => {
expect( mockRegisterBlockType ).toHaveBeenCalledTimes( 3 );
expect( mockRegisterBlockType ).toHaveBeenNthCalledWith(
3,
- 'woocommerce/transition-block',
+ expect.objectContaining( { name: 'woocommerce/transition-block' } ),
expect.objectContaining( {
ancestor: [ 'woocommerce/single-product' ],
} )
@@ -191,14 +207,17 @@ describe( 'registerProductBlockType', () => {
mockIsSiteEditor = true;
const registerProductBlockType = loadRegistrationFunction();
const variationSettings = {
- name: 'related-products',
title: 'Related products',
isVariationBlock: true,
variationName: 'related-products',
};
registerProductBlockType(
- 'woocommerce/product-query',
+ {
+ ...blockSettings,
+ name: 'woocommerce/product-query',
+ title: 'Related products',
+ },
variationSettings
);
mockContextSubscription();
diff --git a/plugins/woocommerce/client/blocks/changelog/fix-block-metadata-translations b/plugins/woocommerce/client/blocks/changelog/fix-block-metadata-translations
new file mode 100644
index 00000000000..c3129267e19
--- /dev/null
+++ b/plugins/woocommerce/client/blocks/changelog/fix-block-metadata-translations
@@ -0,0 +1,4 @@
+Significance: patch
+Type: fix
+
+Restore translated titles and descriptions for product, Cart, and Checkout blocks in the editor.