WP24Horas
♙ ◴
PARCEIRO RECOMENDADO Vai colocar um WordPress no ar? Comece com uma hospedagem que acompanha o seu projeto. Conhecer a HostGator link patrocinado

Desenvolvimento e Programação

Comunicação entre Blocos com Block Context API no WordPress

Por Asllan Maciel4 min de leitura
Comunicação entre Blocos com Block Context API no WordPress
Esta entrada é parte 13 de 20 na série WordPress Extremo: Gutenberg + React + Blocos Customizados

WordPress Extremo: Gutenberg + React + Blocos Customizados

Como Criar um Bloco WordPress com Filtro por Múltiplas Categorias

Bloco de Posts com Filtro por Múltiplas Categorias

Como Filtrar Posts por Categoria em um Bloco Gutenberg

Filtrando Posts por Categoria no Editor do Bloco

Como Criar um Bloco Dinâmico no WordPress com Renderização PHP

Bloco Dinâmico com Renderização no Servidor

Conectando Blocos Gutenberg à REST API

Conectando Blocos com a REST API do WordPress

Componentes Reutilizáveis e Campos Compostos no Gutenberg

Componentes Reutilizáveis e Atributos Compostos em Blocos Gutenberg

Adicionando Imagem Ícone e Classe CSS Personalizada em Bloco Gutenberg

Ícones, Imagens e Classes Personalizadas no Gutenberg

Atributos Visuais e Estilo Dinâmico com Gutenberg

Cor, Alinhamento e Estilo Dinâmico com Gutenberg + React

Como Estilizar Blocos Gutenberg com CSS e Classes Dinâmicas

Estilizando Blocos Gutenberg com CSS e Classes Dinâmicas

Criando Campos Dinâmicos e InspectorControls no Gutenberg

Campos Dinâmicos e InspectorControls no Gutenberg: Deixe Seu Bloco Interativo

Criando Blocos Personalizados com Gutenberg e React

Criando Blocos Personalizados com Gutenberg e React

Como Salvar Dados Personalizados no WordPress Usando Blocos Gutenberg e REST API

Salvando Dados Personalizados no Backend via REST API

Blocos Reutilizáveis com InnerBlocks no Gutenberg

Blocos Reutilizáveis com InnerBlocks no Gutenberg

Comunicação entre Blocos com Block Context API no WordPress

Comunicação entre Blocos com Block Context API no WordPress

Como Criar Blocos Condicionais no Gutenberg com Atributos

Como Criar Blocos Condicionais no Gutenberg com Atributos

Internacionalização de Blocos Gutenberg (i18n)

Internationalização de Blocos Gutenberg (i18n)

Como Carregar Scripts e Estilos no WordPress Apenas Quando Necessário

Scripts e Estilos Condicionais: Carregando apenas quando necessário

Uso de Slots e Templates Personalizados

Como Inserir Blocos Gutenberg via Código, Shortcodes ou PHP

Inserindo Blocos via Código ou Shortcodes

Como Validar e Testar Blocos Gutenberg

Testes e Validação de Blocos com @wordpress/scripts

Como Distribuir Seus Blocos Gutenberg em Plugins ou no GitHub

Distribuindo Seus Blocos: Plugins, Repositório e GitHub

Fala, Dev WordPress! 👋

Aqui é o Asllan Maciel — e hoje a conversa é sobre uma das ferramentas mais poderosas (e menos exploradas) do desenvolvimento com Gutenberg: a Block Context API.

Se você já precisou criar um bloco pai que influencia o comportamento de blocos filhos, já percebeu que passar valores pode virar um emaranhado. A boa notícia? O Block Context resolve isso de forma elegante.


📦 O que é o Block Context?

É como o Context API do React, mas dentro do Gutenberg: um bloco pai fornece dados para seus filhos sem precisar passar explicitamente por atributos ou props.


🧠 Quando Usar?

Use o contexto de bloco quando:

  • Um bloco filho precisa acessar um valor definido no bloco pai;
  • Você quer reduzir repetição de props ou atributos;
  • Precisa padronizar valores compartilhados, como temas de cores, configurações de layout ou visibilidade.

💡 Exemplo Prático: context-box + context-label

Vamos criar dois blocos:

  • wp24h/context-box: Define uma cor de fundo.
  • wp24h/context-label: Lê e exibe essa cor via contexto.

🗂️ Estrutura de Pastas

blocks/
└── context-box/
    ├── block.json
    ├── index.js
    ├── edit.js
    ├── save.js
    ├── style.css
    └── context-label/
        ├── block.json
        ├── index.js
        ├── edit.js
        ├── save.js
        └── style.css

🔧 1. Bloco Pai: context-box

block.json

{
  "apiVersion": 2,
  "name": "wp24h/context-box",
  "title": "Context Box",
  "category": "layout",
  "icon": "screenoptions",
  "attributes": {
    "backgroundColor": {
      "type": "string",
      "default": "#d9f7be"
    }
  },
  "providesContext": {
    "wp24h/bgColor": "backgroundColor"
  },
  "supports": {
    "html": false
  },
  "editorScript": "file:../../dist/context-box.js"
}

index.js

import './style.css';
import edit from './edit';
import save from './save';

import { registerBlockType } from '@wordpress/blocks';

import metadata from './block.json';

registerBlockType(metadata.name, {
  ...metadata,
  edit,
  save,
});

edit.js

import { useBlockProps, InspectorControls, InnerBlocks } from '@wordpress/block-editor';
import { PanelBody, ColorPalette } from '@wordpress/components';

export default function Edit({ attributes, setAttributes }) {
  const { backgroundColor } = attributes;

  const setColor = (color) => setAttributes({ backgroundColor: color });

  return (
    <>
      <InspectorControls>
        <PanelBody title="Cor de Fundo">
          <ColorPalette
            value={backgroundColor}
            onChange={setColor}
          />
        </PanelBody>
      </InspectorControls>
      <div {...useBlockProps({ style: { backgroundColor, padding: '20px' } })}>
        <InnerBlocks allowedBlocks={['wp24h/context-label']} />
      </div>
    </>
  );
}

save.js

import { useBlockProps, InnerBlocks } from '@wordpress/block-editor';

export default function save({ attributes }) {
  return (
    <div {...useBlockProps.save({ style: { backgroundColor: attributes.backgroundColor, padding: '20px' } })}>
      <InnerBlocks.Content />
    </div>
  );
}

style.css

.wp-block-wp24h-context-label {
  font-size: 14px;
  color: #333;
}

🧩 2. Bloco Filho: context-label

block.json

{
  "apiVersion": 2,
  "name": "wp24h/context-label",
  "title": "Context Label",
  "category": "layout",
  "icon": "admin-customizer",
  "usesContext": ["wp24h/bgColor"],
  "editorScript": "file:../../../dist/context-label.js"
}

index.js

import './style.css';
import edit from './edit';
import save from './save';

import { registerBlockType } from '@wordpress/blocks';

import metadata from './block.json';

registerBlockType(metadata.name, {
  ...metadata,
  edit,
  save,
});

edit.js

import { useBlockProps } from '@wordpress/block-editor';

export default function Edit({ context }) {
  const bgColor = context['wp24h/bgColor'];

  return (
    <div {...useBlockProps()} style={{ border: '2px dashed #666', padding: '10px', margin: '10px 0' }}>
      <p>Cor herdada: <strong>{bgColor}</strong></p>
    </div>
  );
}

save.js

import { useBlockProps } from '@wordpress/block-editor';

export default function save() {
  return <div {...useBlockProps()}>Bloco filho</div>;
}

style.css

.wp-block-wp24h-context-label {
  font-size: 14px;
  color: #333;
}

⚙️ 3. Webpack

No webpack.config.js:

entry: {
  'context-box': path.resolve(__dirname, 'blocks/context-box/index.js'),
  'context-label': path.resolve(__dirname, 'blocks/context-box/context-label/index.js'),
  // outros blocos...
},

⚙️ 4. Init

Temos agora que registrar nossos novos blocos, mas para isso, vamos precisar mexer um pouco no método register_blocks() para que:

🧼 Evite registros duplicados e mensagens de erro.
🔍 Varra todos os diretórios de blocos (incluindo blocos filhos);
🚫 Ignore blocos que já foram registrados manualmente (ex: wp24h/posts);
✅ Use block.json como fonte de verdade;
⚙️ Leia automaticamente os scripts gerados no dist/ (ex: dist/context-box.js e .asset.php);

public function register_blocks()
{
    $base_path   = __DIR__ . '/../../blocks/';
    $dist_url    = plugins_url('dist/', dirname(__DIR__, 2));
    $dist_path   = __DIR__ . '/../../dist/';
    $excluir     = ['wp24h/posts']; // blocos com render_callback registrados manualmente

    $iterator = new \RecursiveIteratorIterator(
        new \RecursiveDirectoryIterator($base_path),
        \RecursiveIteratorIterator::SELF_FIRST
    );

    foreach ($iterator as $file) {
        if ($file->getFilename() !== 'block.json') {
            continue;
        }

        $block_dir  = $file->getPath();
        $block_json = json_decode(file_get_contents($file->getRealPath()), true);

        // Verifica se o nome está definido e não é um dos blocos a serem ignorados
        if (!isset($block_json['name'])) {
            continue;
        }

        $block_name = $block_json['name'];

        if (in_array($block_name, $excluir, true)) {
            continue;
        }

        // Extrai o slug final (ex: 'context-box' de 'wp24h/context-box')
        $slug = explode('/', $block_name)[1] ?? null;

        if (!$slug) {
            continue;
        }

        $asset_file = "{$dist_path}{$slug}.asset.php";
        $script_url = "{$dist_url}{$slug}.js";

        if (!file_exists($asset_file)) {
            continue;
        }

        $asset = include $asset_file;

        wp_register_script(
            "wp24h-{$slug}",
            $script_url,
            $asset['dependencies'],
            $asset['version']
        );

        register_block_type($block_dir, [
            'editor_script' => "wp24h-{$slug}"
        ]);
    }
}

✅ Resultado Final

  • O bloco context-box define uma cor de fundo.
  • O bloco context-label, posicionado dentro dele, lê essa cor via contexto e a exibe.
  • Nenhuma prop foi passada diretamente — tudo via contexto, limpo e reutilizável.

WordPress Extremo: Gutenberg + React + Blocos Customizados

Blocos Reutilizáveis com InnerBlocks no Gutenberg Como Criar Blocos Condicionais no Gutenberg com Atributos

Sobre o autor

Asllan Maciel

Asllan Maciel, Fundador do WP24Horas, Consultor de Marketing Digital e amante do Empreendedorismo Digital. Tem um caso de amor com o WordPress.