Вопрос или проблема
Я пытаюсь создать пользовательские блоки и не могу заставить их отображаться в редакторе контента при вставке новых блоков, несмотря на возможность активировать плагин в меню Плагины.
Я видел несколько сообщений с подобными проблемами, но я не понимаю ответы (я не использую NPX или NPM и даже не совсем знаю, что это такое).
Я упростил всё до самого базового вида блока, который только могу придумать, и всё равно сталкиваюсь с той же проблемой.
Это просто блок, который отображает ‘abc’.
Может ли кто-нибудь увидеть, что я делаю неправильно?
Я использую локальное окружение с MAMP для Mac, если это имеет значение.
Также я заметил, что получаю следующую ошибку в консоли:
Uncaught SyntaxError: Cannot use import statement outside a module (at
index.js?ver=6.7.2:1:1)
custom-blocks/index.js
import { registerBlockType } from '@wordpress/blocks';
registerBlockType('custom-blocks/simple-block', {
edit: () => 'abc',
save: () => 'abc'
});
custom-blocks/custom-blocks.php
<?php
/**
* Plugin Name: Custom Blocks
* Description: A simple Gutenberg block that displays 'abc'.
* Version: 1.0
* Author: Your Name
*/
if (! defined('ABSPATH')) {
exit; // Exit if accessed directly.
}
function custom_blocks_init()
{
register_block_type(__DIR__);
}
add_action('init', 'custom_blocks_init');
custom-blocks/block.json
{
"apiVersion": 2,
"name": "custom-blocks/simple-block",
"title": "Simple Block",
"category": "widgets",
"editorScript": "file:./index.js"
}
Синтаксис import
работает только в том случае, если вы используете систему сборки (те самые npm/npx).
Если вы не хотите использовать это сейчас, вы можете заменить import
на wp.<module>
, например:
const { registerBlockType } = wp.blocks;
registerBlockType('custom-blocks/simple-block', {
edit: () => 'abc',
save: () => 'abc'
});
Или напрямую, например:
wp.blocks.registerBlockType('custom-blocks/simple-block', {
edit: () => 'abc',
save: () => 'abc'
});
Также, вам нужно будет создать файл index.asset.php
с метаданными о файле index.js
для регистрации скрипта в WordPress. Когда вы используете wordpress-scripts
для этого (через npm), этот файл создаётся автоматически. Однако, мы можем создать его сами, например:
<?php
return array(
'dependencies' => array(
'wp-blocks'
),
'version' => hash_file( 'sha256', __DIR__ . '/index.js' )
);
Ключ dependencies
связан с компонентами wp.blocks
, к которым нам нужно получить доступ. Значение ключа version
создаёт уникальный хэш файла index.js
в зависимости от его содержимого для управления кешированием.
Просто хочу упомянуть адрес страницы на WordPress.org, где описано, как настроить окружение для блоков: WordPress Create Custom blocks Block Environment
.
Ответ или решение
Когда ваши кастомные Gutenberg-блоки не отображаются в редакторе WordPress, это может быть вызвано рядом факторов, таких как неправильная регистрация блоков или проблема с кодом JavaScript. Рассмотрим основные аспекты, которые могли бы привести к такой ситуации, следуя структуре TEA.
Теория (Theory)
Система блоков Gutenberg в WordPress позволяет разработчикам создавать пользовательские блоки, которые можно использовать в редакторе контента. Эти блоки регистрируются с помощью функции registerBlockType
. Обычно код регистрации для блоков хранится в файле JavaScript, который связывается с WordPress через функцию register_block_type
в PHP.
Пример (Example)
В предоставленном вами примере, есть несколько ключевых моментов:
-
Синтаксис
import
и ошибка в консоли: Вы столкнулись с ошибкой "Uncaught SyntaxError: Cannot use import statement outside a module". Это связано с тем, что вы используете ECMAScript модули без соответствующей среды (например, сборщик вроде Webpack), что требует транспиляции кода из ECMAScript модулей в формат, который может быть исполнен браузером. -
PHP регистрация блока:
function custom_blocks_init() { register_block_type(__DIR__); } add_action('init', 'custom_blocks_init');
Этот код пытается зарегистрировать ваш блок, используя папку, где расположен
block.json
. Однако ваш JavaScript файл, описанный вblock.json
, не обрабатывается правильно. -
JavaScript регистрация блока:
import { registerBlockType } from '@wordpress/blocks'; registerBlockType('custom-blocks/simple-block', { edit: () => 'abc', save: () => 'abc' });
Этот код содержит ошибку, из-за которой ваш блок не будет зарегистрирован – используемый синтаксис не поддерживается без дополнительной настройки окружения.
Применение (Application)
Чтобы решить проблему, следуйте следующим шагам:
-
Отказ от использования
import
: Как вы упомянули, вы не используете инструменты, такие как npm или npx. Исходя из этого вам следует убрать использованиеimport
и заменить его другим способом:wp.blocks.registerBlockType('custom-blocks/simple-block', { edit: () => 'abc', save: () => 'abc' });
Таким образом, вы используете глобально доступный объект
wp
для доступа к методам блоков. -
Создание
index.asset.php
: Вам необходимо создать файлindex.asset.php
, который даст WordPress знать о зависимостях и версии вашего JavaScript файла:<?php return array( 'dependencies' => array('wp-blocks'), 'version' => hash_file('sha256', __DIR__ . '/index.js') );
Это обеспечит потерю зависимости для
wp.blocks
и возможность корректного кэширования изменений в ваших скриптах. -
Отладка через консоль: Убедитесь, что ошибок JavaScript больше нет в консоли, после перехода на использование
wp
API, и что блок доступен для добавления в редакторе. -
Проверка регистрации в
block.json
: Убедитесь, что файлblock.json
правильно загружает скрипты и указывает наeditorScript: "file:./index.js"
.
Вывод
Регистрация пользовательских блоков в WordPress может быть неочевидной задачей без правильного понимания как работают модули JS и их интеграция в WordPress среду. Несмотря на это, благодаря изменению регистрации с import
на wp.blocks
, создание мета-файла index.asset.php
, и устранению ошибок консоли, ваши блоки должны быть успешно доступны для добавления в Gutenberg редакторе. Эти шаги помогут вам наладить работу блоков без использования сложных инструментов сборки, которые требуют дополнительные знания и настройки.