0
10

SHARE

Adicionando Imagem Ícone e Classe CSS Personalizada em Bloco Gutenberg

Ícones, Imagens e Classes Personalizadas no Gutenberg

Aprenda a adicionar imagens, ícones SVG e classes personalizadas em blocos Gutenberg com React. Eleve a interação e personalização no editor
Este post é a parte 10 de 10 da Série WordPress Extremo

Bora, Asllan! Entramos agora no Dia 11 da Trilha WordPress Extremo, e o foco de hoje é deixar nosso bloco mais versátil, profissional e com componentes visuais reais, como ícones, imagens e suporte a classes personalizadas.


🧠 Dia 11 – Ícones, Imagens e Classes Personalizadas no Gutenberg

Chega de blocos com texto simples. Hoje vamos integrar elementos visuais como ícones SVG, imagens customizadas e até permitir que o usuário escolha classes CSS externas para estilização avançada.


✅ O que você vai aprender hoje

  • Adicionar campos de imagem via MediaUpload
  • Inserir ícones SVG diretamente no bloco
  • Usar TextControl para classes CSS extras
  • Deixar o bloco mais visual e aplicável em produção real

📦 Estrutura atual do bloco hello

/blocks/hello/
├── block.json
├── edit.js
├── save.js
├── index.js
├── style.css
├── editor.css
└── build/hello.js

🧩 1. Atualize os atributos no block.json

"attributes": {
  "mensagem": {
    "type": "string",
    "default": "Olá do WP24Horas!"
  },
  "destaque": {
    "type": "boolean",
    "default": false
  },
  "corTexto": {
    "type": "string",
    "default": "#333333"
  },
  "alinhamento": {
    "type": "string",
    "default": "left"
  },
  "imagem": {
    "type": "string",
    "default": ""
  },
  "classeExtra": {
    "type": "string",
    "default": ""
  }
}

🛠 2. Atualize o edit.js

import { __ } from '@wordpress/i18n';
import {
  useBlockProps,
  InspectorControls,
  MediaUpload,
  BlockControls,
  AlignmentToolbar
} from '@wordpress/block-editor';
import {
  PanelBody,
  TextControl,
  ToggleControl,
  ColorPalette,
  Button
} from '@wordpress/components';

const CORES = [
  { name: 'Azul', color: '#007cba' },
  { name: 'Verde', color: '#46b450' },
  { name: 'Cinza', color: '#555d66' },
  { name: 'Preto', color: '#000000' }
];

export default function Edit({ attributes, setAttributes }) {
  const { mensagem, destaque, corTexto, alinhamento, imagem, classeExtra } = attributes;

  const baseClasses = ['wp-block-wp24h-hello'];
  if (destaque) baseClasses.push('is-highlighted');
  if (classeExtra) baseClasses.push(classeExtra);

  const styles = {
    color: corTexto,
    textAlign: alinhamento
  };

  return (
    <>
      <BlockControls>
        <AlignmentToolbar
          value={alinhamento}
          onChange={(align) => setAttributes({ alinhamento: align })}
        />
      </BlockControls>

      <InspectorControls>
        <PanelBody title="Configurações">
          <TextControl
            label="Mensagem"
            value={mensagem}
            onChange={(value) => setAttributes({ mensagem: value })}
          />
          <ToggleControl
            label="Destaque"
            checked={destaque}
            onChange={(value) => setAttributes({ destaque: value })}
          />
          <p><strong>Cor do texto:</strong></p>
          <ColorPalette
            colors={CORES}
            value={corTexto}
            onChange={(value) => setAttributes({ corTexto: value })}
          />
          <TextControl
            label="Classe CSS extra"
            value={classeExtra}
            onChange={(value) => setAttributes({ classeExtra: value })}
          />
          <MediaUpload
            onSelect={(media) => setAttributes({ imagem: media.url })}
            type="image"
            render={({ open }) => (
              <Button onClick={open} variant="secondary">
                { imagem ? 'Trocar imagem' : 'Selecionar imagem' }
              </Button>
            )}
          />
        </PanelBody>
      </InspectorControls>

      <div {...useBlockProps({ className: baseClasses.join(' '), style: styles })}>
        { imagem && <img src={imagem} alt="Imagem personalizada" style={{ maxWidth: '100%' }} /> }
        <p>{ mensagem }</p>
        <span style={{ display: 'inline-block', marginTop: '10px' }}>
          {/* Ícone embutido como exemplo */}
          <svg width="24" height="24" viewBox="0 0 24 24" fill={corTexto}>
            <path d="M12 0L15.09 7.26L23 8.27L17 14.14L18.18 22.02L12 18.77L5.82 22.02L7 14.14L1 8.27L8.91 7.26L12 0Z"/>
          </svg>
        </span>
      </div>
    </>
  );
}

💾 3. Atualize o save.js

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

export default function save({ attributes }) {
  const { mensagem, destaque, corTexto, alinhamento, imagem, classeExtra } = attributes;

  const baseClasses = ['wp-block-wp24h-hello'];
  if (destaque) baseClasses.push('is-highlighted');
  if (classeExtra) baseClasses.push(classeExtra);

  const styles = {
    color: corTexto,
    textAlign: alinhamento
  };

  return (
    <div {...useBlockProps.save({ className: baseClasses.join(' '), style: styles })}>
      { imagem && <img src={imagem} alt="Imagem personalizada" style={{ maxWidth: '100%' }} /> }
      <p>{ mensagem }</p>
      <span style={{ display: 'inline-block', marginTop: '10px' }}>
        <svg width="24" height="24" viewBox="0 0 24 24" fill={corTexto}>
          <path d="M12 0L15.09 7.26L23 8.27L17 14.14L18.18 22.02L12 18.77L5.82 22.02L7 14.14L1 8.27L8.91 7.26L12 0Z"/>
        </svg>
      </span>
    </div>
  );
}

✅ Resultado:

  • Você pode:
    • Adicionar uma imagem via upload
    • Ver um ícone SVG embutido (editável via código)
    • Definir uma classe CSS customizada (pra aplicar estilos externos via tema)
  • O bloco agora é mais flexível e visual

🔨 Compile:

npm run build

✅ Conclusão do Dia 11

Hoje você:

✔️ Aprendeu a usar MediaUpload para imagens
✔️ Incorporou ícones SVG diretamente no bloco
✔️ Deu liberdade total com classes CSS externas


💬 Curtiu o conteúdo?

Se quiser que seu plugin WordPress tenha esse nível de controle, interação e organização, bora conversar.

👉 Deixe seu comentário abaixo!

Navegação<< Cor, Alinhamento e Estilo Dinâmico com Gutenberg + React

Não perca mais nenhuma atualização aqui!

Ative as Notificações!

Clique aqui e, em seguida, clique em Permitir na caixa que aparecerá na parte superior da janela, próximo à barra de endereços.

Torne-se um Assinante e Eleve seu Conhecimento do WordPress!

Acesso Exclusivo, Suporte Especializado e Muito Mais.

Se você está aproveitando nosso conteúdo gratuito, vai adorar os benefícios exclusivos que oferecemos aos nossos assinantes! Ao se tornar um assinante do WP24Horas, você terá acesso a:

Não perca a oportunidade de maximizar seu potencial no WordPress. Clique no botão abaixo para se tornar um assinante e leve suas habilidades ao próximo nível!

Não perca mais nenhuma atualização aqui!

Tabela de Conteúdo
PUBLICIDADE
Últimos Posts
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 Criar Comandos WP-CLI Personalizados para Plugins

Criando Comandos WP-CLI Personalizados para Plugins WordPress

Como Funciona o apply_filters no WordPress

Como Funciona o apply_filters() no WordPress (com Exemplos Práticos)

Você precisa estar logado para ver esta informação.

Torne-se um Assinante e Eleve seu Conhecimento do WordPress!

Acesso Exclusivo, Suporte Especializado e Muito Mais.

Se você está aproveitando nosso conteúdo gratuito, vai adorar os benefícios exclusivos que oferecemos aos nossos assinantes! 

Não perca a oportunidade de maximizar seu potencial no WordPress. Clique no botão abaixo para se tornar um assinante e leve suas habilidades ao próximo nível!