0
50

SHARE

Conectando Blocos Gutenberg à REST API

Conectando Blocos com a REST API do WordPress

Aprenda a criar blocos Gutenberg que acessam dados da REST API do WordPress. Exiba posts dinâmicos no editor usando apiFetch, React hooks e boas práticas
Este post é a parte 4 de 16 da Série WordPress Extremo: Gutenberg + React + Blocos Customizados

Fala dev! No dia 13 da nossa trilha WordPress Extremo, a gente entra no mundo real: blocos que se conectam com dados vivos do WordPress — direto da REST API.

Vamos montar um bloco chamado posts, que traz os últimos posts publicados e exibe isso no editor de blocos, tudo dinamicamente.


✅ O que você vai aprender

  • Como acessar a REST API do WordPress dentro de um bloco
  • Como usar useEffect, useState e apiFetch
  • Como separar a listagem em um componente próprio
  • Como montar blocos que respondem a dados reais do site

📁 Estrutura do bloco

blocks/
└── posts/
    ├── block.json
    ├── index.js
    ├── edit.js
    ├── save.js
    └── components/
        └── PostList.js

📄 Arquivos completos


📌 block.json

{
  "apiVersion": 2,
  "name": "wp24h/posts",
  "title": "Lista de Posts WP24H",
  "category": "widgets",
  "icon": "list-view",
  "description": "Um bloco que exibe os últimos posts via REST API.",
  "editorScript": "file:../../dist/posts.js",
  "attributes": {
    "quantidade": {
      "type": "number",
      "default": 3
    }
  },
  "supports": {
    "html": false
  }
}

📌 index.js

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

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

📌 edit.js

import { useBlockProps, InspectorControls } from '@wordpress/block-editor';
import { PanelBody, RangeControl } from '@wordpress/components';
import { useState, useEffect } from '@wordpress/element';
import apiFetch from '@wordpress/api-fetch';
import PostList from './components/PostList';

export default function Edit({ attributes, setAttributes }) {
  const { quantidade } = attributes;
  const [posts, setPosts] = useState([]);

  useEffect(() => {
    apiFetch({ path: `/wp/v2/posts?per_page=${quantidade}` })
      .then((data) => setPosts(data));
  }, [quantidade]);

  return (
    <>
      <InspectorControls>
        <PanelBody title="Configurações">
          <RangeControl
            label="Quantidade de posts"
            min={1}
            max={10}
            value={quantidade}
            onChange={(val) => setAttributes({ quantidade: val })}
          />
        </PanelBody>
      </InspectorControls>

      <div {...useBlockProps()}>
        <PostList posts={posts} />
      </div>
    </>
  );
}

📌 save.js

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

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

📌 components/PostList.js

export default function PostList({ posts }) {
  if (!posts.length) return <p>Carregando posts...</p>;

  return (
    <ul className="wp24h-post-list">
      {posts.map(post => (
        <li key={post.id}>
          <strong>{post.title.rendered}</strong>
        </li>
      ))}
    </ul>
  );
}

🧠 Explicações rápidas

ElementoFunção
apiFetch()Chama a REST API nativa do WordPress
useState()Armazena os posts localmente
useEffect()Executa o carregamento assim que o bloco carrega
InspectorControlsAdiciona painel lateral no editor
RangeControlPermite ao usuário escolher quantos posts exibir
PostList (componente)Separa a exibição da lógica do bloco

📦 Build com Webpack

Garanta que o webpack.config.js contenha a entrada posts:

entry: {
  'hello': path.resolve(__dirname, 'blocks/hello/index.js'),
  'card': path.resolve(__dirname, 'blocks/card/index.js'),
  'posts': path.resolve(__dirname, 'blocks/posts/index.js'),
}

Não esqueça do registro do bloco, no caso aqui ficou assim:

public function register_blocks()
    {
        $blocks = ['card', 'hello', 'posts']; //add posts

        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}"
            ]);
        }
    }

E rode:

npm run build

✅ O que conseguimos

✔️ Bloco dinâmico, conectado ao conteúdo real do site
✔️ Experiência moderna no editor
✔️ Pronto pra evoluir e ser reaproveitado com outros endpoints

Navegação<< Bloco Dinâmico com Renderização no ServidorComponentes Reutilizáveis e Atributos Compostos em Blocos 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

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

Salvando Dados Personalizados no Backend via REST API

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!