Goal
To deprecate and later remove the Classic Block (making it fully opt-in), and lay the groundwork towards making TinyMCE also fully opt-in.
Rationale
We recently started hiding (#77911) the Classic Block from the inserter, but this is just the first step on a long path.
Why make Classic Block opt-in
- Hiding from the inserter only addresses the inflow. It stops new Classic blocks from being created, but the per-load tax is unchanged: every editor still registers
core/freeform, hydrates its edit component, and pulls the TinyMCE-bridging modal into the block-library bundle. On a site with zero Classic content, that's all dead weight.
- Architectural consistency - every other block in Core is a pure block-tree node. Freeform is the lone exception - opaque HTML rendered through a separate editor. Keeping it in the default registry contradicts the block-first model.
- Classic usage is shrinking. New Classic blocks will no longer be insertable by default. The convert-to-blocks feature has been the migration path for years. The set of posts that need Classic block registered is finite and getting smaller - a precondition for safely flipping registration off by default.
- Maintenance leverage - every block-library refactor has to special-case
core/freeform. Each carve-out is small; the cumulative cost is real.
- It paves the road for loading TinyMCE on demand. Classic Block is the only consumer of
window.tinymce / window.wp.oldEditor in Gutenberg. As long as Classic is registered by default, Core has no signal it can use to skip TinyMCE on the post screen.
Why make TinyMCE opt-in
- It's probably the largest single asset Core ships to the post screen that the modern editor doesn't otherwise need.
- The implicit-global API surface (
window.tinymce, window.wp.oldEditor, window.wpEditorL10n.tinymce) is read by an unknown number of plugins. Loading it by default keeps that API alive forever. Loading it on demand makes the dependency explicit and auditable.
- It's already conditional in spirit. Core's
_WP_Editors::enqueue_default_editor() was designed around an era when every post screen needed a WYSIWYG fallback. That premise is gone for block-editor screens.
Plan and next steps
Goal
To deprecate and later remove the Classic Block (making it fully opt-in), and lay the groundwork towards making TinyMCE also fully opt-in.
Rationale
We recently started hiding (#77911) the Classic Block from the inserter, but this is just the first step on a long path.
Why make Classic Block opt-in
core/freeform, hydrates its edit component, and pulls the TinyMCE-bridging modal into the block-library bundle. On a site with zero Classic content, that's all dead weight.core/freeform. Each carve-out is small; the cumulative cost is real.window.tinymce/window.wp.oldEditorin Gutenberg. As long as Classic is registered by default, Core has no signal it can use to skip TinyMCE on the post screen.Why make TinyMCE opt-in
window.tinymce,window.wp.oldEditor,window.wpEditorL10n.tinymce) is read by an unknown number of plugins. Loading it by default keeps that API alive forever. Loading it on demand makes the dependency explicit and auditable._WP_Editors::enqueue_default_editor()was designed around an era when every post screen needed a WYSIWYG fallback. That premise is gone for block-editor screens.Plan and next steps
core/htmlblock to be the default instead ofcore/freeform