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: noregistra 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.