0
2

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 15 de 15 da Série WordPress Extremo

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ção<< Filtrando 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 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

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!