W tym wpisie przedstawię jak można stworzyć własny blok w WordPress. Stworzymy blok pokazujący listę wad i zalet w dwóch kółkach.
Tak naprawdę tworzymy plugin do WordPressa. W instalacji wordpressa w katalogu wp-content/plugins stwórzmy folder „example-blocks” a w nim plik block.json z poniższą zawartością:
{
"$schema": "https://json.schemastore.org/block.json",
"apiVersion": 2,
"name": "example-blocks/pros-cons",
"title": "Pros / Cons",
"icon": "index-card",
"category": "layout",
"attributes": {
"pros": {
"type": "string",
"source": "html",
"selector": ".pros"
},
"cons": {
"type": "string",
"source": "html",
"selector": ".cons"
}
},
"editorScript": "file:./block.js",
"style": "file:./style.css"
}
Name to nazwa naszego bloku, title to nazwa wyświetlana dla użytkownika. Konieczne jest dodanie pliku edytora i opcjonalnie stylów.
Plik edytora block.js w naszym wypadku wygląda tak:
( function ( blocks, _, i18n, element, _, _, blockEditor ) {
var __ = i18n.__;
var el = element.createElement;
var RichText = blockEditor.RichText;
var useBlockProps = blockEditor.useBlockProps;
blocks.registerBlockType( 'example-blocks/pros-cons', {
title: 'Pros / Cons',
icon: 'index-card',
category: 'layout',
attributes: {
pros: {
type: 'array',
source: 'children',
selector: '.pros',
},
cons: {
type: 'array',
source: 'children',
selector: '.cons',
},
},
example: {
attributes: {
pros: [
{ type: 'li', props: { children: [ 'First pros...' ] } },
{ type: 'li', props: { children: [ 'Second pros...' ] } },
],
cons: [
{ type: 'li', props: { children: [ 'First cons...' ] } },
{ type: 'li', props: { children: [ 'Second pros...' ] } },
],
},
},
edit: function ( props ) {
var attributes = props.attributes;
return el(
'div',
useBlockProps( { className: props.className } ),
el( 'h3', {}, 'Pros:' ),
el( RichText, {
tagName: 'ul',
multiline: 'li',
placeholder: 'Write a list of pros…',
value: attributes.pros,
onChange: function ( value ) {
props.setAttributes( { pros: value } );
},
className: 'pros',
} ),
el( 'h3', {}, 'Cons:' ),
el( RichText, {
tagName: 'ul',
multiline: 'li',
placeholder: 'Write a list of cons…',
value: attributes.cons,
onChange: function ( value ) {
props.setAttributes( { cons: value } );
},
} )
);
},
save: function ( props ) {
var attributes = props.attributes;
return el(
div',
useBlockProps.save( { className: props.className } ),
el('div',
{ className: 'row' },
el('div',
{ className: 'col-md-4 offset-md-1' },
el('div',
{ className: 'pros-cons' },
el('div',
{ className: 'pros-cons-text' },
el( 'h3', {}, 'PROS' ),
el( RichText.Content, {
tagName: 'ul',
className: 'pros',
value: attributes.pros,
} ),
)
)
),
el('div',
{ className: 'col-md-4 offset-md-2' },
el('div',
{ className: 'pros-cons cons' },
el('div',
{ className: 'pros-cons-text' },
el( 'h3', {}, 'CONS' ),
el( RichText.Content, {
tagName: 'ul',
className: 'cons',
value: attributes.cons,
} ),
)
)
),
),
);
},
} );
} )(
window.wp.blocks,
window.wp.editor,
window.wp.i18n,
window.wp.element,
window.wp.components,
window._,
window.wp.blockEditor
);
Widzimy tutaj strukturę jaka będzie generowana w czasie edycji bloku w panelu admina oraz po zapisaniu bloku. Widzimy że podobnie jak w Reakcie tworzymy tutaj elementy, ich dzieci i ustalamy dla nich klasy CSS.
W pliku style.css możemy dodać własne style, pamiętajmy że element nadrzędny w naszym przypadku będzie miał klasę wp-block-example-blocks-pros-cons
Następnie tworzymy plik index.php z taką zawartością:
<?php
/**
* Plugin Name: Example blocks
* Version: 1.0.0
* Author: Kamil Wyremski
*/
defined( 'ABSPATH' ) || exit;
function example_blocks_register_block() {
if ( ! function_exists( 'register_block_type' ) ) {
return;
}
register_block_type( __DIR__ );
wp_register_style('example_blocks', plugins_url('style.css',__FILE__ ));
wp_enqueue_style('example_blocks');
}
add_action( 'init', 'example_blocks_register_block' );
Tutaj zarejestrujemy nasz blok oraz style do niego.
W pliku block.asset.php dodajemy zależności:
<?php return array('dependencies' => array('wp-blocks', 'wp-element', 'wp-i18n', 'wp-editor'), 'version' => 'a35cc1c098b69994c9c6d6dc1416bb90');
Teraz możemy w panelu admina w WordPressie przejść do Wtyczki, aktywować nasz plugin o nazwie „Example blocks” i jeśli przejdziemy do edycji/dodawania wpisu zobaczymy nowy blok o nazwie Pros / Cons.
Zamieszczam link do GitHub z kodem z tego wpisu: https://github.com/kamilwyremski/wordpress-example-blocks
