fix(gutenberg): 修复 MediaUpload 未定义与无效块分类
声明 MediaUpload、服务端注册 aksrt-blocks 分类、默认 apiVersion 3,避免编辑器脚本中断与 WP 6.9 弃用警告。
This commit is contained in:
1 parent
b7dc3d170d
commit
a4cd5276e2
2 files changed
+66
-21
No files matched your search
@@ -16,10 +16,12 @@
|
|||||||
|
|
||||||
var el = wp.element.createElement;
|
var el = wp.element.createElement;
|
||||||
var Fragment = wp.element.Fragment;
|
var Fragment = wp.element.Fragment;
|
||||||
var registerBlockType = wp.blocks.registerBlockType;
|
var registerBlockTypeRaw = wp.blocks.registerBlockType;
|
||||||
var InspectorControls = wp.blockEditor ? wp.blockEditor.InspectorControls : (wp.editor ? wp.editor.InspectorControls : null);
|
var blockEditor = wp.blockEditor || wp.editor || {};
|
||||||
var InnerBlocks = wp.blockEditor ? wp.blockEditor.InnerBlocks : (wp.editor ? wp.editor.InnerBlocks : null);
|
var InspectorControls = blockEditor.InspectorControls || null;
|
||||||
var RichText = wp.blockEditor ? wp.blockEditor.RichText : (wp.editor ? wp.editor.RichText : null);
|
var InnerBlocks = blockEditor.InnerBlocks || null;
|
||||||
|
var RichText = blockEditor.RichText || null;
|
||||||
|
var MediaUpload = blockEditor.MediaUpload || null;
|
||||||
var ColorPicker = wp.components.ColorPicker;
|
var ColorPicker = wp.components.ColorPicker;
|
||||||
var PanelBody = wp.components.PanelBody;
|
var PanelBody = wp.components.PanelBody;
|
||||||
var SelectControl = wp.components.SelectControl;
|
var SelectControl = wp.components.SelectControl;
|
||||||
@@ -27,7 +29,7 @@
|
|||||||
var ToggleControl = wp.components.ToggleControl;
|
var ToggleControl = wp.components.ToggleControl;
|
||||||
var RangeControl = wp.components.RangeControl;
|
var RangeControl = wp.components.RangeControl;
|
||||||
|
|
||||||
if (!registerBlockType || !el) return;
|
if (!registerBlockTypeRaw || !el) return;
|
||||||
|
|
||||||
// ── Helper: create element shorthand ──
|
// ── Helper: create element shorthand ──
|
||||||
function h(tag, props, children) {
|
function h(tag, props, children) {
|
||||||
@@ -55,6 +57,33 @@
|
|||||||
h('path', { d: 'M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5', fill: 'none', stroke: 'currentColor', strokeWidth: 2 })
|
h('path', { d: 'M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5', fill: 'none', stroke: 'currentColor', strokeWidth: 2 })
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Register category BEFORE any registerBlockType (filter-after-register is too late).
|
||||||
|
if (window.wp.hooks && window.wp.hooks.addFilter) {
|
||||||
|
wp.hooks.addFilter('blocks.getBlockCategories', 'aksrt/block-categories', function (categories) {
|
||||||
|
var list = Array.isArray(categories) ? categories.slice() : [];
|
||||||
|
var hasAksrt = list.some(function (c) { return c && c.slug === CATEGORY; });
|
||||||
|
if (hasAksrt) return list;
|
||||||
|
list.push({
|
||||||
|
slug: CATEGORY,
|
||||||
|
title: 'AKSRT',
|
||||||
|
icon: null,
|
||||||
|
});
|
||||||
|
return list;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// WP 6.9+ expects apiVersion 3 for iframe editor compatibility.
|
||||||
|
function registerBlockType(name, settings) {
|
||||||
|
settings = settings || {};
|
||||||
|
if (settings.apiVersion == null) {
|
||||||
|
settings.apiVersion = 3;
|
||||||
|
}
|
||||||
|
if (!settings.category) {
|
||||||
|
settings.category = CATEGORY;
|
||||||
|
}
|
||||||
|
return registerBlockTypeRaw(name, settings);
|
||||||
|
}
|
||||||
|
|
||||||
// ================================================================
|
// ================================================================
|
||||||
// 1. Tabs Block
|
// 1. Tabs Block
|
||||||
// ================================================================
|
// ================================================================
|
||||||
@@ -627,22 +656,9 @@
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
// ── Register block category ──
|
|
||||||
|
|
||||||
if (window.wp.hooks && window.wp.hooks.addFilter) {
|
|
||||||
wp.hooks.addFilter('blocks.getBlockCategories', 'aksrt/block-categories', function (categories) {
|
|
||||||
var hasAksrt = categories.some(function (c) { return c.slug === CATEGORY; });
|
|
||||||
if (hasAksrt) return categories;
|
|
||||||
return categories.concat([{
|
|
||||||
slug: CATEGORY,
|
|
||||||
title: 'AKSRT',
|
|
||||||
icon: BLOCK_ICON,
|
|
||||||
}]);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── Carousel Block (Gallery → Swiper) ──
|
// ── Carousel Block (Gallery → Swiper) ──
|
||||||
if (MediaUpload && InnerBlocks) {
|
// MediaUpload lives on wp.blockEditor; skip registration if unavailable.
|
||||||
|
if (MediaUpload) {
|
||||||
registerBlockType('aksrt/carousel', {
|
registerBlockType('aksrt/carousel', {
|
||||||
title: '轮播图',
|
title: '轮播图',
|
||||||
icon: 'images-alt2',
|
icon: 'images-alt2',
|
||||||
|
|||||||
@@ -104,6 +104,34 @@ add_action('pre_get_posts', function ($query) {
|
|||||||
// Gutenberg 自定义块注册
|
// Gutenberg 自定义块注册
|
||||||
// ============================================================
|
// ============================================================
|
||||||
|
|
||||||
|
// Register category server-side so it exists before JS registerBlockType runs.
|
||||||
|
// Keep untyped + defensive: some plugins pass unexpected shapes; typed params can 500 the editor.
|
||||||
|
add_filter('block_categories_all', static function ($categories, $context = null) {
|
||||||
|
if (!is_array($categories)) {
|
||||||
|
return $categories;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($categories as $category) {
|
||||||
|
$slug = '';
|
||||||
|
if (is_array($category)) {
|
||||||
|
$slug = (string) ($category['slug'] ?? '');
|
||||||
|
} elseif (is_object($category) && isset($category->slug)) {
|
||||||
|
$slug = (string) $category->slug;
|
||||||
|
}
|
||||||
|
if ($slug === 'aksrt-blocks') {
|
||||||
|
return $categories;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$categories[] = [
|
||||||
|
'slug' => 'aksrt-blocks',
|
||||||
|
'title' => 'AKSRT',
|
||||||
|
'icon' => null,
|
||||||
|
];
|
||||||
|
|
||||||
|
return $categories;
|
||||||
|
}, 10, 2);
|
||||||
|
|
||||||
add_action('enqueue_block_editor_assets', function () {
|
add_action('enqueue_block_editor_assets', function () {
|
||||||
$base_uri = get_template_directory_uri();
|
$base_uri = get_template_directory_uri();
|
||||||
$version = wp_get_theme()->get('Version');
|
$version = wp_get_theme()->get('Version');
|
||||||
@@ -113,7 +141,8 @@ add_action('enqueue_block_editor_assets', function () {
|
|||||||
wp_enqueue_script(
|
wp_enqueue_script(
|
||||||
'aksrt-gutenberg-blocks',
|
'aksrt-gutenberg-blocks',
|
||||||
$base_uri . '/assets/js/gutenberg-blocks.js',
|
$base_uri . '/assets/js/gutenberg-blocks.js',
|
||||||
['wp-blocks', 'wp-element', 'wp-components', 'wp-block-editor', 'wp-hooks'],
|
// wp-media-utils: MediaUpload for carousel block
|
||||||
|
['wp-blocks', 'wp-element', 'wp-components', 'wp-block-editor', 'wp-hooks', 'wp-media-utils'],
|
||||||
(string) filemtime($blocks_js),
|
(string) filemtime($blocks_js),
|
||||||
true
|
true
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in new issue
Block a user