Прежде всего то, что вы написали в своем вопросе, не является блоком Гутенберга. То, что вы предоставляете для функции registerBlockType, не является блоком. Гутенберг блокирует изящный шорткод, что-то вроде этого:
<!-- wp:image -->
<figure class="wp-block-image"><img src="source.jpg" alt="" /></figure>
<!-- /wp:image -->
Или это:
<!-- wp:latest-posts {"postsToShow":4,"displayPostDate":true} /-->
Первый называется статическим блоком, потому что в нем есть содержимое. Второй называется динамическим блоком, потому что он самозакрывающийся и не имеет содержимого. Контент будет извлечен из обратного вызова php, который вы указали при регистрации вашего блока.
Гутенберг использует React для вывода визуального представления блока на экран редактора. Метод edit объекта настроек должен возвращать реагирующий элемент, этот элемент будет использоваться для создания визуального представления блока в редакторе. Метод save также должен возвращать реагирующий элемент, но этот элемент будет преобразован в статический html и сохранен в базе данных: <figure class="wp-block-image"><img src="source.jpg" alt="" /></figure>
. Теперь у динамических блоков нет возвращаемого элемента, поскольку они возвращают ноль, поэтому в них нет содержимого, поэтому они закрываются самостоятельно. Когда сервер отвечает на запрос, он получает блок, хранящийся в базе данных, и проверяет, является ли блок статическим или динамическим. Если оно статическое, оно имеет свое содержимое, так что содержимое будет возвращено. Если он динамический, будет вызвана зарегистрированная функция обратного вызова и будет возвращено ее возвращаемое значение.
Теперь, чтобы ответить на ваш вопрос, функции сохранения и редактирования должны возвращать реагирующий элемент. Реактивный элемент должен иметь один корневой элемент, но внутренними элементами может быть любой обычный html, подобный этому:
<div>
<h1>Hello world</h1>
<p>This is a sentence</p>
</div>
Это по причинам производительности. Операции DOM стоят дорого, поэтому он имеет единую точку входа в DOM. Вот почему это очень быстро. Затем он имеет свой собственный DOM, целое дерево находится в памяти. React будет проходить через дерево DOM, когда произойдет изменение, и отобразит только измененную ветвь, не будет рисовать все дерево при каждом небольшом изменении.
Важная деталь: приведенный выше код выглядит как HTML, но это не так, это jsx. React не может визуализировать HTML напрямую. Jsx будет перенесен в реактивный элемент транспортером, подобным babel.
В React также есть метод createElement, который можно использовать для создания элемента реагирования. wp реэкспортирует этот метод.
Вы можете визуализировать один реагирующий элемент в другом. Без обучения реакции вы никогда не сможете полностью понять всю мощь или потенциал блоков. Библиотека React не такая большая. Когда вы поймете идею, лежащую в ее основе, вы сможете изучить ее достаточно, чтобы продуктивно работать через неделю или две.