Итак, покопавшись, я сам все понял.На случай, если кто-то еще столкнулся с этой проблемой, вот решение:
Прежде всего, атрибуты должны быть определены в registerBlockType
function
registerBlockType( 'cgb/your-block-type', {
title: __( 'Your Block Name' ),
icon: 'shield',
category: 'maybe-a-category',
keywords: [
__( 'some keywords' ),
],
attributes: {
background_color: {
type: 'string',
default: 'default' //we will use the "default"-value later
},
},
Так что теперь Wordpress знает, какие атрибуты вы хотите сохранить,Проблема теперь, пока значение «по умолчанию» не перезаписывается, Wordpress не будет сохранять значение в атрибутах объекта блока.Для решения этой проблемы мы будем использовать функцию save
из registerBlockType
.(Краткое примечание: это не вызовет значение по умолчанию для виджета редактора, поэтому вам всегда нужно изменить значение background_color, чтобы увидеть его при первой вставке виджета в редактор gutenberg. Чтобы исправить это, используйте saveDefaultValue(this.props)
вправов начале вашей render()
функции.)
save: function( props ) {
saveDefaultValues(props);
const { attributes: {background_color}} = props;
return (
//... here's your html that's beeing saved
);
},
function saveDefaultValues(props) {
if(props.attributes.background_color === 'default'){
props.attributes.background_color = '#f1f6fb';
}
}
При этом мы заставляем wordpress сохранить наше значение по умолчанию.Я уверен, что есть лучшее решение для этого, но так как я только начал с реакции / Гутенберга, это единственное, что заставило его работать на меня.
Хорошо, теперь мы можем сохранить наши атрибуты в объекте Block,Теперь мы хотим создать нашу динамическую таблицу стилей.Для этого мы создаем новый файл .php в следующем каталоге /plugin-dir/src/
, так как мы используем create-guten-block.Имя не имеет значения, но я назвал его так же, как моя таблица стилей.`gutenberg-styles.css.php``
Позже gutenberg-styles.css.php
будет создавать файл gutenberg-styles.css
каждый раз, когда кто-то посещает сообщение.Но сначала мы смотрим в файл plugin.php
.Добавьте следующий код:
function create_dynamic_gutenberg_stylesheet() {
global $post;
require_once plugin_dir_path( __FILE__ ) . 'src/gutenberg-styles.css.php';
wp_enqueue_style('cgb/gutenberg-styles', plugins_url( 'src/gutenberg-styles.css', __FILE__ ));
}
add_action('wp_head', 'create_dynamic_gutenberg_stylesheet', 5, 0);
Этот код обращается к переменной global $post
, он нужен нам для получения всех блоков Гутенберга из текущего посещенного сообщения.После этого нам требуется собственный gutenberg-styles.css.php
, который автоматически создаст нашу таблицу стилей, которая будет помещена в следующую строку.Теперь подключите его к wp_head
(вы, вероятно, могли бы также подключить его к действию сохранения WordPress, но вам придется проделать большую работу для постановки в очередь таблицы стилей)
Наконец, заглянем в наш gutenberg-styles.css.php
:
$styleSheetPath = plugin_dir_path( __FILE__ ) . 'gutenberg-styles.css';
$styleSheet = '';
$blocks = parse_blocks($post->post_content);
//loop over all blocks and create styles
foreach($blocks as $block) {
$blockType = $block['blockName'];
$blockAttributes = $block['attrs']; //these are the attributes we've forced to saved in our block's save function
//switch case so you can target different blocks
switch ($blockType) {
case 'cgb/your-block-type':
$styleSheet .= '.your-block-class {'.PHP_EOL
$styleSheet .= 'background-color: '.$blockAttributes['background_color'].';'.PHP_EOL
$styleSheet .= '}'.PHP_EOL
break;
}
}
file_put_contents($styleSheetPath, $styleSheet); //write css styles to stylesheet (creates file if it not exists)
Я добавил PHP_EOL
в каждую строку, чтобы генерировать разрывы строк, вам не нужно этого делать.Но теперь вы можете посетить страницу со своим пользовательским блоком и увидеть, что gutenberg-styles.css
загружен и применен к вашим блокам.