Wordpress

Block pattern não aparece no inseridor: registre pelo arquivo em /patterns

O register_block_pattern está lá no functions.php, roda sem erro nenhum, o cache já foi limpo duas vezes e a aba Padrões do inseridor continua sem o padrão. Na maioria das vezes o motivo é chamada fora do hook init. No WordPress 6.9 dá pra pular esse problema inteiro: um arquivo dentro de patterns/, no tema, que o core lê sozinho.

O arquivo que o WordPress lê sozinho

Crie wp-content/themes/seu-tema/patterns/chamada-botao.php. O cabeçalho de comentário é o registro em si: Title e Slug são obrigatórios, sem um deles o core dispara um _doing_it_wrong e pula o arquivo. O resto entra conforme a necessidade. Logo abaixo do cabeçalho vai a marcação dos blocos, copiada do editor pela opção Copiar todos os blocos.

<?php
/**
 * Title: Chamada com botão
 * Slug: seutema/chamada-botao
 * Description: Faixa de destaque com título, texto curto e botão.
 * Categories: banner, call-to-action
 * Keywords: chamada, cta, destaque
 * Viewport Width: 1280
 * Inserter: yes
 */?>

Funciona em tema de blocos e em tema clássico, e vale também pro tema pai: o core varre a pasta dos dois no init e deixa o filho sobrescrever o slug repetido. Não precisa de hook nem de add_theme_support.

As armadilhas que sobram

  • Inserter: no registra o padrão mas some com ele do inseridor. Só use isso em padrão que serve de área de template ou que é preso a um bloco.
  • Slug sem namespace funciona, mas colide com padrão de plugin de mesmo nome. Prefixe com o tema.
  • Desde o 6.4 os padrões do tema ficam em cache. Enquanto você edita o arquivo, ligue o modo de desenvolvimento no wp-config.php.
define( 'WP_DEVELOPMENT_MODE', 'theme' );

# conferir o que está registrado de verdade
sudo -u www-data wp eval 'foreach (WP_Block_Patterns_Registry::get_instance()->get_all_registered() as $p) { echo $p["name"], PHP_EOL; }'

Se o slug sair nessa lista e mesmo assim não aparecer no editor, olhe a categoria: categoria que ninguém registrou não vira aba própria, e o padrão fica só na listagem geral, onde ninguém procura.

Se travou nisso e precisa de ajuda, me chama aqui.

Post Recentes

Tamanho das tabelas MySQL 8: a query que acha o vilão do disco

Disco lotando por causa do banco? Uma query no information_schema mostra qual tabela cresceu, quanto é dado, quanto é índice…

11 horas atrás

CodeIgniter 3 PHP 8.3: os erros fatais que aparecem logo no boot

Sistema em CodeIgniter 3.1.13 morre no primeiro request depois do upgrade. Os três pontos que quebram no PHP 8.3 e…

1 dia atrás

rsync do pub/media no Magento 2: copiar as imagens sem levar o cache

Metade do seu pub/media é miniatura descartável. Veja o rsync com os excludes certos e o comando que reconstrói o…

2 dias atrás

mu-plugins no WordPress: onde colocar snippets em vez do functions.php

Tire os snippets do functions.php e coloque num must-use plugin: carrega sempre, sobrevive à atualização do tema e ninguém desativa…

2 dias atrás

preg_replace_callback no PHP: substituir cada match com uma função

Quando o valor novo depende do que a regex achou, preg_replace não resolve. Exemplo real aplicando 10% de desconto em…

3 dias atrás

Cron do Magento 2 não roda: status missed e pending no cron_schedule

Pedido que não fatura e e-mail que não sai porque todo job fica missed: como ler a cron_schedule, conferir o…

4 dias atrás