diff --git a/assets/js/gutenberg-blocks.js b/assets/js/gutenberg-blocks.js index 944b8667..1c5293be 100644 --- a/assets/js/gutenberg-blocks.js +++ b/assets/js/gutenberg-blocks.js @@ -16,10 +16,12 @@ var el = wp.element.createElement; var Fragment = wp.element.Fragment; - var registerBlockType = wp.blocks.registerBlockType; - var InspectorControls = wp.blockEditor ? wp.blockEditor.InspectorControls : (wp.editor ? wp.editor.InspectorControls : null); - var InnerBlocks = wp.blockEditor ? wp.blockEditor.InnerBlocks : (wp.editor ? wp.editor.InnerBlocks : null); - var RichText = wp.blockEditor ? wp.blockEditor.RichText : (wp.editor ? wp.editor.RichText : null); + var registerBlockTypeRaw = wp.blocks.registerBlockType; + var blockEditor = wp.blockEditor || wp.editor || {}; + var InspectorControls = blockEditor.InspectorControls || null; + var InnerBlocks = blockEditor.InnerBlocks || null; + var RichText = blockEditor.RichText || null; + var MediaUpload = blockEditor.MediaUpload || null; var ColorPicker = wp.components.ColorPicker; var PanelBody = wp.components.PanelBody; var SelectControl = wp.components.SelectControl; @@ -27,7 +29,7 @@ var ToggleControl = wp.components.ToggleControl; var RangeControl = wp.components.RangeControl; - if (!registerBlockType || !el) return; + if (!registerBlockTypeRaw || !el) return; // ── Helper: create element shorthand ── 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 }) ); + // 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 // ================================================================ @@ -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) ── - if (MediaUpload && InnerBlocks) { + // MediaUpload lives on wp.blockEditor; skip registration if unavailable. + if (MediaUpload) { registerBlockType('aksrt/carousel', { title: '轮播图', icon: 'images-alt2', diff --git a/inc/core-hooks/part-3.php b/inc/core-hooks/part-3.php index 6762538a..a1ddf8b4 100644 --- a/inc/core-hooks/part-3.php +++ b/inc/core-hooks/part-3.php @@ -104,6 +104,34 @@ add_action('pre_get_posts', function ($query) { // 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 () { $base_uri = get_template_directory_uri(); $version = wp_get_theme()->get('Version'); @@ -113,7 +141,8 @@ add_action('enqueue_block_editor_assets', function () { wp_enqueue_script( 'aksrt-gutenberg-blocks', $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), true );