Commit 8ea05f6fca9 for woocommerce
commit 8ea05f6fca968b3ed08f9092d7e1728fdfe46b8d
Author: Luigi Teschio <gigitux@gmail.com>
Date: Fri May 29 09:37:31 2026 +0200
Remove product editor template system feature flag (#65387)
diff --git a/packages/js/product-editor/changelog/remove-product-editor-template-system-flag b/packages/js/product-editor/changelog/remove-product-editor-template-system-flag
new file mode 100644
index 00000000000..a960a747e60
--- /dev/null
+++ b/packages/js/product-editor/changelog/remove-product-editor-template-system-flag
@@ -0,0 +1,4 @@
+Significance: patch
+Type: tweak
+
+Remove the disabled product editor template system feature flag.
diff --git a/packages/js/product-editor/src/blocks/product-fields/product-details-section-description/edit.tsx b/packages/js/product-editor/src/blocks/product-fields/product-details-section-description/edit.tsx
index 8c1d442b436..b48643482df 100644
--- a/packages/js/product-editor/src/blocks/product-fields/product-details-section-description/edit.tsx
+++ b/packages/js/product-editor/src/blocks/product-fields/product-details-section-description/edit.tsx
@@ -32,12 +32,10 @@ import { TRACKS_SOURCE } from '../../../constants';
import { WPError, useErrorHandler } from '../../../hooks/use-error-handler';
import type {
ProductEditorBlockEditProps,
- ProductFormPostProps,
ProductTemplate,
} from '../../../types';
import { ProductDetailsSectionDescriptionBlockAttributes } from './types';
import * as wooIcons from '../../../icons';
-import isProductFormTemplateSystemEnabled from '../../../utils/is-product-form-template-system-enabled';
import { formatProductError } from '../../../utils/format-product-error';
export function ProductDetailsSectionDescriptionBlockEdit( {
@@ -100,20 +98,6 @@ export function ProductDetailsSectionDescriptionBlockEdit( {
const [ unsupportedProductTemplate, setUnsupportedProductTemplate ] =
useState< ProductTemplate >();
- // Pull the product templates from the store.
- const productFormPosts = useSelect( ( sel ) => {
- // Do not fetch product form posts if the feature is not enabled.
- if ( ! isProductFormTemplateSystemEnabled() ) {
- return [];
- }
-
- return (
- sel( 'core' ).getEntityRecords( 'postType', 'product_form', {
- per_page: -1,
- } ) || []
- );
- }, [] ) as ProductFormPostProps[];
-
const { isSaving } = useSelect(
( select ) => {
const { isSavingEntityRecord } = select( 'core' );
@@ -382,22 +366,6 @@ export function ProductDetailsSectionDescriptionBlockEdit( {
) }
</MenuGroup>
- { isProductFormTemplateSystemEnabled() && (
- <MenuGroup>
- { productFormPosts.map( ( formPost ) => (
- <MenuItem
- key={ formPost.id }
- icon={ resolveIcon( 'external' ) }
- info={ formPost.excerpt.raw }
- iconPosition="left"
- onClick={ onClose } // close the dropdown for now
- >
- { formPost.title.rendered }
- </MenuItem>
- ) ) }
- </MenuGroup>
- ) }
-
{ unsupportedProductTemplates.length > 0 && (
<MenuGroup>
<Dropdown
diff --git a/packages/js/product-editor/src/components/block-editor/block-editor.tsx b/packages/js/product-editor/src/components/block-editor/block-editor.tsx
index 2cf06d6a7ab..2dcc2f6ec2f 100644
--- a/packages/js/product-editor/src/components/block-editor/block-editor.tsx
+++ b/packages/js/product-editor/src/components/block-editor/block-editor.tsx
@@ -3,7 +3,6 @@
*/
import {
BlockInstance,
- parse,
synchronizeBlocksWithTemplate,
} from '@wordpress/blocks';
import {
@@ -44,8 +43,7 @@ import { wooProductEditorUiStore } from '../../store/product-editor-ui';
import { ProductEditorSettings } from '../editor';
import { BlockEditorProps } from './types';
import { LoadingState } from './loading-state';
-import type { ProductFormPostProps, ProductTemplate } from '../../types';
-import isProductFormTemplateSystemEnabled from '../../utils/is-product-form-template-system-enabled';
+import type { ProductTemplate } from '../../types';
const PluginArea = lazy( () =>
import( '@wordpress/plugins' ).then( ( module ) => ( {
@@ -81,10 +79,6 @@ export function BlockEditor( {
productId,
setIsEditorLoading,
}: BlockEditorProps ) {
- const [ selectedProductFormId, setSelectedProductFormId ] = useState<
- number | null
- >( null );
-
useConfirmUnsavedProductChanges( postType );
/**
@@ -212,24 +206,6 @@ export function BlockEditor( {
{ id: productId !== -1 ? productId : 0 }
) as [ BlockInstance[], BlockChangeHandler, BlockChangeHandler ];
- // Pull the product templates from the store.
- const productForms = useSelect( ( sel ) => {
- return (
- sel( 'core' ).getEntityRecords( 'postType', 'product_form', {
- per_page: -1,
- } ) || []
- );
- }, [] ) as ProductFormPostProps[];
-
- // Set the default product form template ID.
- useEffect( () => {
- if ( ! productForms.length ) {
- return;
- }
-
- setSelectedProductFormId( productForms[ 0 ].id );
- }, [ productForms ] );
-
const isEditorLoading =
! settings ||
! layoutTemplate ||
@@ -238,28 +214,6 @@ export function BlockEditor( {
productId === -1 ||
! hasResolved;
- const productFormTemplate = useMemo(
- function pickAndParseTheProductFormTemplate() {
- if (
- ! isProductFormTemplateSystemEnabled() ||
- ! selectedProductFormId
- ) {
- return undefined;
- }
-
- const productFormPost = productForms.find(
- ( form ) => form.id === selectedProductFormId
- );
-
- if ( productFormPost ) {
- return parse( productFormPost.content.raw );
- }
-
- return undefined;
- },
- [ productForms, selectedProductFormId ]
- );
-
useLayoutEffect(
function setupEditor() {
if ( isEditorLoading ) {
@@ -272,13 +226,7 @@ export function BlockEditor( {
layoutTemplate.blockTemplates
);
- /*
- * If the product form template is not available, use the block instances.
- * ToDo: Remove this fallback once the product form template is stable/available.
- */
- const editorTemplate = blockInstances ?? productFormTemplate;
-
- onChange( editorTemplate, {} );
+ onChange( blockInstances, {} );
dispatch( 'core/editor' ).updateEditorSettings( {
...settings,
@@ -294,7 +242,6 @@ export function BlockEditor( {
layoutTemplate,
settings,
productTemplate,
- productFormTemplate,
productId,
]
);
diff --git a/packages/js/product-editor/src/types.ts b/packages/js/product-editor/src/types.ts
index 5e1a2560d11..9dc455e259b 100644
--- a/packages/js/product-editor/src/types.ts
+++ b/packages/js/product-editor/src/types.ts
@@ -49,43 +49,3 @@ export interface Taxonomy {
export interface TaxonomyMetadata {
hierarchical: boolean;
}
-
-export type ProductFormPostProps = {
- id: number;
- date: string;
- date_gmt: string;
- guid: {
- rendered: string;
- raw: string;
- };
- modified: string;
- modified_gmt: string;
- password: string;
- slug: string;
- status: 'publish' | 'future' | 'draft' | 'pending' | 'private';
- type: 'product_form';
- link: string;
- title: {
- raw: string;
- rendered: string;
- };
- content: {
- raw: string;
- rendered: string;
- protected: false;
- block_version: number;
- };
- excerpt: {
- raw: string;
- rendered: string;
- protected: boolean;
- };
- featured_media: number;
- comment_status: 'open' | 'closed';
- ping_status: 'closed' | 'open';
- template: '';
- meta: [];
- permalink_template: string;
- generated_slug: string;
- class_list: string[];
-};
diff --git a/packages/js/product-editor/src/utils/is-product-form-template-system-enabled.ts b/packages/js/product-editor/src/utils/is-product-form-template-system-enabled.ts
deleted file mode 100644
index 5645e6149b0..00000000000
--- a/packages/js/product-editor/src/utils/is-product-form-template-system-enabled.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function isProductFormTemplateSystemEnabled() {
- return !! window.wcAdminFeatures?.[ 'product-editor-template-system' ];
-}
diff --git a/plugins/woocommerce/changelog/remove-product-editor-template-system-flag b/plugins/woocommerce/changelog/remove-product-editor-template-system-flag
new file mode 100644
index 00000000000..a960a747e60
--- /dev/null
+++ b/plugins/woocommerce/changelog/remove-product-editor-template-system-flag
@@ -0,0 +1,4 @@
+Significance: patch
+Type: tweak
+
+Remove the disabled product editor template system feature flag.
diff --git a/plugins/woocommerce/client/admin/config/core.json b/plugins/woocommerce/client/admin/config/core.json
index b4cf5e4a387..395517b6dc5 100644
--- a/plugins/woocommerce/client/admin/config/core.json
+++ b/plugins/woocommerce/client/admin/config/core.json
@@ -40,7 +40,6 @@
"wc-pay-welcome-page": true,
"async-product-editor-category-field": false,
"launch-your-store": true,
- "product-editor-template-system": false,
"use-wp-horizon": false,
"rest-api-v4": false,
"order-detail-redesign": false,
diff --git a/plugins/woocommerce/client/admin/config/development.json b/plugins/woocommerce/client/admin/config/development.json
index 756db8d4b46..7f42945fc4b 100644
--- a/plugins/woocommerce/client/admin/config/development.json
+++ b/plugins/woocommerce/client/admin/config/development.json
@@ -40,7 +40,6 @@
"wc-pay-welcome-page": true,
"async-product-editor-category-field": true,
"launch-your-store": true,
- "product-editor-template-system": false,
"use-wp-horizon": false,
"rest-api-v4": false,
"order-detail-redesign": false,
diff --git a/plugins/woocommerce/includes/class-wc-post-types.php b/plugins/woocommerce/includes/class-wc-post-types.php
index 7efed18e73a..dec6caf8e33 100644
--- a/plugins/woocommerce/includes/class-wc-post-types.php
+++ b/plugins/woocommerce/includes/class-wc-post-types.php
@@ -12,7 +12,6 @@ defined( 'ABSPATH' ) || exit;
use Automattic\WooCommerce\Enums\OrderInternalStatus;
use Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController;
-use Automattic\WooCommerce\Admin\Features\Features;
/**
* Post types Class.
@@ -406,73 +405,6 @@ class WC_Post_Types {
)
);
- // Register the product form post type when the feature is enabled.
- if ( Features::is_enabled( 'product-editor-template-system' ) ) {
- register_post_type(
- 'product_form',
- /**
- * Allow developers to customize the product form post type registration arguments.
- *
- * @since 9.1.0
- * @param array $args The default post type registration arguments.
- */
- apply_filters(
- 'woocommerce_register_post_type_product_form',
- array(
- 'labels'
- => array(
- 'name' => __( 'Product Forms', 'woocommerce' ),
- 'singular_name' => __( 'Product Form', 'woocommerce' ),
- 'all_items' => __( 'All Product Form', 'woocommerce' ),
- 'menu_name' => _x( 'Product Forms', 'Admin menu name', 'woocommerce' ),
- 'add_new' => __( 'Add New', 'woocommerce' ),
- 'add_new_item' => __( 'Add new product form', 'woocommerce' ),
- 'edit' => __( 'Edit', 'woocommerce' ),
- 'edit_item' => __( 'Edit product form', 'woocommerce' ),
- 'new_item' => __( 'New product form', 'woocommerce' ),
- 'view_item' => __( 'View product form', 'woocommerce' ),
- 'view_items' => __( 'View product forms', 'woocommerce' ),
- 'search_items' => __( 'Search product forms', 'woocommerce' ),
- 'not_found' => __( 'No product forms found', 'woocommerce' ),
- 'not_found_in_trash' => __( 'No product forms found in trash', 'woocommerce' ),
- 'parent' => __( 'Parent product form', 'woocommerce' ),
- 'featured_image' => __( 'Product form image', 'woocommerce' ),
- 'set_featured_image' => __( 'Set product form image', 'woocommerce' ),
- 'remove_featured_image' => __( 'Remove product form image', 'woocommerce' ),
- 'use_featured_image' => __( 'Use as product form image', 'woocommerce' ),
- 'insert_into_item' => __( 'Insert into product form', 'woocommerce' ),
- 'uploaded_to_this_item' => __( 'Uploaded to this product form', 'woocommerce' ),
- 'filter_items_list' => __( 'Filter product forms', 'woocommerce' ),
- 'items_list_navigation' => __( 'Product forms navigation', 'woocommerce' ),
- 'items_list' => __( 'Product forms list', 'woocommerce' ),
- 'item_link' => __( 'Product form Link', 'woocommerce' ),
- 'item_link_description' => __( 'A link to a product form.', 'woocommerce' ),
- ),
- 'description' => __( 'This is where you can set up product forms for various product types in your dashboard.', 'woocommerce' ),
- 'public' => true,
- 'menu_icon' => 'dashicons-forms',
- 'capability_type' => 'product',
- 'map_meta_cap' => true,
- 'publicly_queryable' => true,
- 'hierarchical' => false, // Hierarchical causes memory issues - WP loads all records!
- 'rewrite' => $permalinks['product_rewrite_slug'] ? array(
- 'slug' => $permalinks['product_rewrite_slug'],
- 'with_front' => false,
- 'feeds' => true,
- ) : false,
- 'query_var' => true,
- 'supports' => $supports,
- 'has_archive' => $has_archive,
- 'show_in_rest' => true,
- 'show_ui' => true,
- 'show_in_menu' => true,
- 'exclude_from_search' => true,
- 'show_in_nav_menus' => false,
- )
- )
- );
- }
-
register_post_type(
'product_variation',
apply_filters(
diff --git a/plugins/woocommerce/src/Admin/Features/ProductBlockEditor/Init.php b/plugins/woocommerce/src/Admin/Features/ProductBlockEditor/Init.php
index 071bbe13bff..7b10ca46402 100644
--- a/plugins/woocommerce/src/Admin/Features/ProductBlockEditor/Init.php
+++ b/plugins/woocommerce/src/Admin/Features/ProductBlockEditor/Init.php
@@ -7,7 +7,6 @@ declare(strict_types = 1);
namespace Automattic\WooCommerce\Admin\Features\ProductBlockEditor;
-use Automattic\WooCommerce\Admin\Features\Features;
use Automattic\WooCommerce\Admin\Features\ProductBlockEditor\ProductTemplate;
use Automattic\WooCommerce\Admin\PageController;
use Automattic\WooCommerce\Enums\ProductType;
@@ -418,12 +417,6 @@ class Init {
);
$this->redirection_controller->set_product_templates( $this->product_templates );
-
- // PFT: Initialize the product form controller.
- if ( Features::is_enabled( 'product-editor-template-system' ) ) {
- $product_form_controller = new ProductFormsController();
- $product_form_controller->init();
- }
}
/**