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

Uso de Slots e Templates Personalizados

Por Asllan Maciel2 min de leitura
Esta entrada é parte 17 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! 👋

Hoje vamos subir mais um degrau na criação de blocos Gutenberg com React. Vamos explorar dois recursos poderosos para criar blocos complexos e reutilizáveis:

  • Slots: permitem organizar conteúdo filho de maneira controlada.
  • Templates personalizados: definem a estrutura inicial de InnerBlocks com blocos e atributos pré-configurados.

Esses recursos são muito úteis quando você precisa garantir uma estrutura específica para os blocos internos ou quer facilitar a criação de layouts padronizados.


🧠 Cenário prático: Bloco de Card com título, imagem e conteúdo

Vamos criar um bloco wp24h/card com três áreas distintas:

  • Um título (heading)
  • Uma imagem (image)
  • Um conteúdo (paragraph)

Essas áreas serão controladas com template e templateLock, garantindo que o usuário não quebre o layout principal.


🧱 Estrutura de arquivos

blocks/
└── cardnovo/
    ├── block.json
    ├── index.js
    ├── edit.js
    ├── save.js
    └── style.css

📦 block.json

{
  "apiVersion": 2,
  "name": "wp24h/cardnovo",
  "title": "Card Novo",
  "category": "design",
  "icon": "format-image",
  "supports": {
    "html": false
  },
  "editorScript": "file:../../dist/cardnovo.js",
  "style": "file:./style.css",
  "editorStyle": "file:./style.css"
}

✍️ edit.js com Template

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

const TEMPLATE = [
  ['core/heading', { placeholder: 'Título do card' }],
  ['core/image'],
  ['core/paragraph', { placeholder: 'Descrição do card...' }]
];

export default function Edit() {
  return (
    <div {...useBlockProps({ className: 'cardnovo' })}>
      <InnerBlocks
        template={TEMPLATE}
        templateLock="all" // ou "insert" para permitir edição mas bloquear adição
      />
    </div>
  );
}

💾 save.js

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

export default function save() {
  return (
    <div {...useBlockProps.save({ className: 'cardnovo' })}>
      <InnerBlocks.Content />
    </div>
  );
}

🎨 style.css

.cardnovo {
  border: 1px solid #ccc;
  border-radius: 8px;
  padding: 20px;
  background-color: #fff;
  box-shadow: 0 2px 8px rgba(0,0,0,0.05);
  max-width: 480px;
}
.cardnovo h2 {
  margin-top: 0;
}
.cardnovo img {
  max-width: 100%;
  height: auto;
  border-radius: 6px;
}

📦 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,
});

💡 Slots vs Template

RecursoAplicação
InnerBlocks com templateDefine estrutura fixa ou orientada para os filhos
templateLock'all', 'insert', 'false' para travar ou permitir ajustes
Slots avançados (React + contexto)Exigem implementação manual com props, context ou composição de componentes (não padrão do core ainda)

🧪 Resultado

Você terá um bloco de card padronizado, com três áreas definidas, protegidas contra alterações acidentais e que guiam o usuário a preencher corretamente.

WordPress Extremo: Gutenberg + React + Blocos Customizados

Scripts e Estilos Condicionais: Carregando apenas quando necessário Inserindo Blocos via Código ou Shortcodes

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.