Criei um canal no YouTube para compartilhar algumas coisas por vídeo e o primeiro deles é sobre como criar um bloco no Gutenberg, o novo editor do WordPress. Ele será o padrão a partir da versão 5.0, que será lançada em breve, então é bom ir se preparando.

Se você curte meus textos, assine o canal, assista ao vídeo e, se gostou, deixe um like lá e comenta sobre ele com seus amiguinhos 🙂

Códigos

Aqui estão os códigos dos arquivos que eu usei no vídeo.

meu-primeiro-bloco.php

<?php
/**
 * Plugin Name: Meu Primeiro Bloco
 */

defined( 'ABSPATH' ) || exit;

function init_meu_primeiro_bloco() {
	// JavaScript para o editor.
	wp_register_script(
		'meu-primeiro-bloco',
		plugins_url( 'meu-primeiro-bloco.js', __FILE__ ),
		array( 'wp-blocks', 'wp-element', 'wp-editor' ),
		filemtime( plugin_dir_path( __FILE__ ) . 'meu-primeiro-bloco.js' )
	);

	// CSS para o frontend e editor.
	wp_register_style(
		'meu-primeiro-bloco',
		plugins_url( 'frontend.css', __FILE__ ),
		array(),
		filemtime( plugin_dir_path( __FILE__ ) . 'frontend.css' )
	);

	// CSS para o editor.
	wp_register_style(
		'meu-primeiro-bloco-editor',
		plugins_url( 'editor.css', __FILE__ ),
		array( 'wp-edit-blocks' ),
		filemtime( plugin_dir_path( __FILE__ ) . 'editor.css' )
	);

	// Registra o bloco.
	register_block_type(
		'blocos-de-exemplo/meu-primeiro-bloco',
		array(
			'style'         => 'meu-primeiro-bloco',
			'editor_style'  => 'meu-primeiro-bloco-editor',
			'editor_script' => 'meu-primeiro-bloco',
		)
	);
}
add_action( 'init', 'init_meu_primeiro_bloco' );

meu-primeiro-bloco.js

( function() {
	var el = wp.element.createElement,
		RichText = wp.editor.RichText;

	wp.blocks.registerBlockType(
		'blocos-de-exemplo/meu-primeiro-bloco',
		{
			title: 'Bloco de Exemplo',
			icon: 'heart',
			category: 'common',

			attributes: {
				conteudo: {
					type: 'string',
					source: 'html',
					selector: 'p',
				},
			},

			edit: function( props ) {
				var conteudo = props.attributes.conteudo;
				function onChangeConteudo( novoConteudo ) {
					props.setAttributes( { conteudo: novoConteudo } );
				}

				return el(
					RichText,
					{
						tagName: 'p',
						className: props.className,
						onChange: onChangeConteudo,
						value: conteudo,
					}
				);
			},

			save: function( props ) {
				return el(
					RichText.Content,
					{
						tagName: 'p',
						value: props.attributes.conteudo,
					}
				);
			},
		}
	);
}() );

frontend.css

.wp-block-blocos-de-exemplo-meu-primeiro-bloco {
	color: darkred;
	background: #fcc;
	border: 2px solid #c99;
	padding: 20px;
}

editor.css

.wp-block-blocos-de-exemplo-meu-primeiro-bloco {
	color: green;
	background: #cfc;
	border: 2px solid #9c9;
	padding: 20px;
}

Vou deixar aqui um zip com tudo junto também. Espero que ajude!