0
27

SHARE

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

Salvando Dados Personalizados no Backend via REST API

Aprenda a criar blocos personalizados no WordPress Gutenberg que salvam dados via REST API com uma estrutura moderna e profissional.
Este post é a parte 11 de 16 da Série WordPress Extremo: Gutenberg + React + Blocos Customizados

Fala, pessoal! 👋
Hoje a coisa fica séria: vamos aprender como salvar dados personalizados de um bloco no backend via REST API — usando React no editor, uma rota customizada no plugin e mantendo tudo organizado na arquitetura que criamos.

Essa técnica é essencial para blocos interativos que vão além de apenas exibir texto ou imagens: agora seus blocos poderão armazenar e recuperar dados reais no banco de dados do WordPress.

Bora lá codar? 🚀


🧠 Por que usar a REST API em blocos?

Ao invés de armazenar tudo no HTML do post (via atributos), podemos separar a lógica de visualização e persistência de dados, ideal para:

  • Formulários com lógica de envio.
  • Campos sensíveis (ex: tokens, senhas, configurações).
  • Integração com APIs externas.
  • Blocos com atualizações em tempo real.

🧱 Etapas do Dia

✅ 1. Criar a estrutura do bloco custom-data

Crie a pasta blocks/custom-data/ com os seguintes arquivos:

block.json

{
  "apiVersion": 2,
  "name": "wp24h/custom-data",
  "title": "Custom Data Block",
  "category": "widgets",
  "icon": "admin-generic",
  "description": "Bloco com dados salvos via REST API.",
  "supports": {
    "html": false
  },
  "editorScript": "file:../../dist/custom-data.js"
}

edit.js

import { useBlockProps } from '@wordpress/block-editor';
import { TextControl, Button } from '@wordpress/components';
import { useState } from '@wordpress/element';
import apiFetch from '@wordpress/api-fetch';

export default function Edit() {
  const [texto, setTexto] = useState('');
  const [resposta, setResposta] = useState(null);

  const salvarDados = () => {
    apiFetch({
      path: '/wp24h/v1/custom-data',
      method: 'POST',
      data: { texto }
    }).then(res => setResposta(res?.message || 'Salvo!'));
  };

  return (
    <div {...useBlockProps()}>
      <TextControl
        label="Digite algo"
        value={texto}
        onChange={setTexto}
      />
      <Button variant="primary" onClick={salvarDados}>Salvar via REST</Button>
      {resposta && <p>{resposta}</p>}
    </div>
  );
}

save.js

export default function save() {
  return null; // renderização apenas no editor
}

index.js (ESSENCIAL para build e registro)

import { registerBlockType } from '@wordpress/blocks';
import edit from './edit';
import save from './save';
import metadata from './block.json';

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

✅ 2. Atualizar o Webpack

No arquivo webpack.config.js, adicione a nova entrada:

entry: {
  'card': path.resolve(__dirname, 'blocks/card/index.js'),
  'hello': path.resolve(__dirname, 'blocks/hello/index.js'),
  'posts': path.resolve(__dirname, 'blocks/posts/index.js'),
  'custom-data': path.resolve(__dirname, 'blocks/custom-data/index.js') // 👈 Aqui
},

✅ 3. Criar a Rota da REST API

Na pasta src/Routes/, crie CustomDataRoute.php:

<?php

namespace WpArquiteturaExtrema\Routes;

class CustomDataRoute
{
    public function register()
    {
        register_rest_route('wp24h/v1', '/custom-data', [
            'methods' => 'POST',
            'callback' => [$this, 'handle'],
            'permission_callback' => '__return_true', // segurança simplificada
        ]);
    }

    public function handle($request)
    {
        $texto = sanitize_text_field($request->get_param('texto'));

        if (!$texto) {
            return new \WP_REST_Response(['message' => 'Texto vazio.'], 400);
        }

        // Simulando salvamento no banco
        update_option('wp24h_custom_data', $texto);

        return new \WP_REST_Response(['message' => 'Salvo com sucesso!'], 200);
    }
}

✅ 4. Registrar as rotas no Init.php

No seu src/Hooks/Init.php, adicione:

use WpArquiteturaExtrema\Routes\CustomDataRoute;

public function register()
{
    add_action('rest_api_init', function () {
        (new CustomDataRoute())->register();
    });

    // já existente
    add_action('init', [$this, 'register_blocks']);
}
public function register_blocks()
    {
        $blocks = ['card', 'hello', 'custom-data']; // 👈 adicione o bloco novo

        foreach ($blocks as $block) {
            $asset_path = __DIR__ . "/../../dist/{$block}.asset.php";
            if (!file_exists($asset_path)) continue;

            $asset = include $asset_path;

            wp_register_script(
                "wp24h-{$block}",
                plugins_url("dist/{$block}.js", dirname(__DIR__, 2)),
                $asset['dependencies'],
                $asset['version']
            );

            register_block_type(__DIR__ . "/../../blocks/{$block}", [
                'editor_script' => "wp24h-{$block}"
            ]);
        }
    }

✅ 5. Rodar o build

npm run build

💥 Resultado

Você terá um bloco onde:

  • O usuário digita um texto no editor.
  • Clica em “Salvar via REST”.
  • O texto é enviado e salvo no banco via update_option.

Bloco funcional, dinâmico e com separação entre front e backend.


📌 Extras

Quer exibir os dados salvos no frontend?

Você pode criar um render_callback no PHP que lê get_option('wp24h_custom_data') e exibe esse conteúdo dinamicamente — ou até montar uma tela administrativa para isso.


🔗 Continuação da Série

Navegação<< Criando Blocos Personalizados com Gutenberg e ReactBlocos Reutilizáveis com InnerBlocks no Gutenberg >>

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
Como Carregar Scripts e Estilos no WordPress Apenas Quando Necessário

Scripts e Estilos Condicionais: Carregando apenas quando necessário

Internacionalização de Blocos Gutenberg (i18n)

Internationalização de Blocos Gutenberg (i18n)

Como Criar Blocos Condicionais no Gutenberg com Atributos

Como Criar Blocos Condicionais no Gutenberg com Atributos

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

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

Blocos Reutilizáveis com InnerBlocks no Gutenberg

Blocos Reutilizáveis com InnerBlocks no Gutenberg

Checklist Final de Publicação - WordPress.org e Produção

Checklist Final de Publicação: WordPress.org e Produção

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!