Merge pull request 'fix(gutenberg): 修复 MediaUpload 未定义与无效块分类' (#86) from worktree-fix-ai-status-403 into main
Reviewed-on: CYL/wordpress-theme-aksrt#86
This commit is contained in:
@@ -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',
|
||||
|
||||
@@ -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
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user