0
55

SHARE

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

Bloco de Posts com Filtro por Múltiplas Categorias

Aprenda a criar um bloco Gutenberg com filtro por múltiplas categorias no WordPress. Ideal para projetos profissionais e sites dinâmicos!
Este post é a parte 1 de 16 da Série WordPress Extremo: Gutenberg + React + Blocos Customizados

Hoje vamos aprimorar ainda mais o bloco de exibição de posts do WP24Horas. Se no dia anterior adicionamos a seleção de uma única categoria, agora avançamos para suporte a múltiplas categorias. Isso transforma o bloco em uma ferramenta muito mais flexível para páginas que agrupam conteúdos por interesses diversos — e te coloca no top 1% dos devs WP.

Se você chegou agora, confira os dias anteriores da Trilha WordPress Extremo em: wp24horas.com.br/series/wordpress-extremo


📦 O que faremos hoje:

  • Permitir seleção de múltiplas categorias no painel lateral do bloco.
  • Usar o hook useState para armazenar categorias e useEffect para buscar da REST API.
  • Ajustar a chamada à API de posts incluindo múltiplas categorias.
  • Preparar o bloco para filtragem múltipla no editor e renderização no frontend.

🛠️ Arquivo edit.js atualizado

import { useBlockProps, InspectorControls } from '@wordpress/block-editor';
import { PanelBody, RangeControl, FormTokenField } 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, categorias } = attributes;
  const [posts, setPosts] = useState([]);
  const [todasCategorias, setTodasCategorias] = useState([]);

  useEffect(() => {
    apiFetch({ path: '/wp/v2/categories?per_page=100' }).then((data) => {
      setTodasCategorias(data);
    });
  }, []);

  useEffect(() => {
    const categoriasQuery = categorias && categorias.length > 0
      ? `&categories=${categorias.join(',')}`
      : '';

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

  const sugestoes = todasCategorias.map(cat => ({
    value: cat.id.toString(),
    label: cat.name
  }));

  return (
    <>
      <InspectorControls>
        <PanelBody title="Configurações">
          <RangeControl
            label="Quantidade de posts"
            min={1}
            max={10}
            value={quantidade}
            onChange={(val) => setAttributes({ quantidade: val })}
          />
          <FormTokenField
            label="Categorias"
            value={(categorias || []).map(String)}
            suggestions={sugestoes.map(s => s.label)}
            onChange={(values) => {
              const selecionadas = values.map(val =>
                sugestoes.find(s => s.label === val)?.value || null
              ).filter(Boolean);
              setAttributes({ categorias: selecionadas.map(Number) });
            }}
          />
        </PanelBody>
      </InspectorControls>

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

🧠 Ajustes no block.json

Atualize o bloco com um novo atributo:

"attributes": {
  "quantidade": {
    "type": "number",
    "default": 3
  },
  "categorias": {
    "type": "array",
    "items": {
      "type": "number"
    },
    "default": []
  }
}

🔄 No save.js, mantenha:

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

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

🧩 PostList.js

Sem mudanças desde o dia anterior:

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

🚀 Pronto para produção

  • Atualize o build com npm run build.
  • Atualize seu render_callback no PHP se quiser exibir no frontend com filtragem.
  • Teste no editor com múltiplas categorias selecionadas.

✅ Conclusão

Com isso, você adiciona uma funcionalidade super desejada em sites profissionais. Filtrar por várias categorias torna seu bloco mais versátil e personalizado.

NavegaçãoFiltrando Posts por Categoria no Editor do Bloco >>

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!