Por Que Blocos PHP-Only Importam

Olha só: durante anos, criar um bloco customizado no WordPress significava aprender React, configurar um build pipeline com NPM e manter um block.json junto com PHP e JavaScript. Isso é uma barreira enorme para milhares de devs que dominam PHP mas não têm tempo (ou paciência) para o ecossistema JavaScript moderno.

O WordPress 7.0 muda isso com uma flag autoRegister que permite registrar um bloco totalmente funcional usando apenas PHP. O WordPress gera automaticamente o JavaScript necessário para o preview no editor com base no seu registro PHP.

Isso não substitui blocos feitos em JavaScript—é uma ponte. O valor real está em migrar código PHP legado (widgets, shortcodes, template parts) para temas de bloco sem reescrever tudo em React. Para uma visão de como outras plataformas estão priorizando a experiência do desenvolvedor, dá uma olhada na nossa análise sobre a infraestrutura de datacenters da Azure para a plataforma Rubin da NVIDIA.

Vamos ver como funciona, o que dá e o que não dá pra fazer, e quando usar. Vamos lá! 🚀

Developer writing PHP code for WordPress block registration on a code editor Software Concept Art

Criando um Bloco PHP-Only: Passo a Passo

1. Registre um Bloco Básico

O segredo é a flag 'autoRegister' => true dentro de supports. O WordPress cuida do registro client-side e do preview no editor automaticamente.

function meu_bloco_hello_world() {
    register_block_type(
        'meu-plugin/hello-world',
        [
            'title'           => 'Hello World',
            'render_callback' => function () {
                return sprintf(
                    '<div %s>Hello World!</div>',
                    get_block_wrapper_attributes()
                );
            },
            'supports'        => [
                'autoRegister' => true,
            ],
        ]
    );
}
add_action( 'init', 'meu_bloco_hello_world' );

2. Adicione Atributos (Controles Auto-Gerados)

Defina atributos em PHP e o WordPress gera os controles de input correspondentes na sidebar de configurações do bloco.

function meu_bloco_saudacao() {
    register_block_type(
        'meu-plugin/saudacao',
        [
            'title'           => 'Saudação',
            'render_callback' => function ( $attributes ) {
                return sprintf(
                    '<div %s>%s</div>',
                    get_block_wrapper_attributes(),
                    esc_html( $attributes['saudacao'] )
                );
            },
            'supports'        => [ 'autoRegister' => true ],
            'attributes'      => [
                'saudacao' => [
                    'type'    => 'string',
                    'default' => 'Olá, Mundo!',
                ],
            ],
        ]
    );
}
add_action( 'init', 'meu_bloco_saudacao' );

3. Detecte Editor vs. Frontend

Use wp_is_rest_endpoint() combinado com uma checagem de rota pra saber quando o bloco está sendo renderizado no preview do editor.

function meu_bloco_contexto() {
    register_block_type(
        'meu-plugin/contexto',
        [
            'title'           => 'Contexto',
            'render_callback' => function () {
                $is_editor = wp_is_rest_endpoint()
                    && str_contains( $GLOBALS['wp']->query_vars['rest_route'] ?? '', 'v2/block-renderer/' );
                $bgcolor   = $is_editor ? '#0073aa' : '#46b450';
                $label     = $is_editor ? 'Renderizado no editor' : 'Renderizado no frontend';

                return sprintf(
                    '<div %s>%s</div>',
                    get_block_wrapper_attributes( [ 'style' => "background:$bgcolor;color:#fff;padding:1em;" ] ),
                    esc_html( $label )
                );
            },
            'supports'        => [ 'autoRegister' => true ],
        ]
    );
}
add_action( 'init', 'meu_bloco_contexto' );

4. Enfileire Estilos e Scripts

Use style para editor e frontend, editor_style para overrides só no editor, e view_script para JavaScript só no frontend.

function meu_bloco_estilizado() {
    wp_register_style(
        'meu-plugin-block-style',
        plugins_url( 'style.css', __FILE__ ),
        [],
        filemtime( plugin_dir_path( __FILE__ ) . 'style.css' )
    );

    register_block_type(
        'meu-plugin/estilizado',
        [
            'title'           => 'Bloco Estilizado',
            'render_callback' => function () {
                return sprintf(
                    '<div %s>Conteúdo estilizado</div>',
                    get_block_wrapper_attributes()
                );
            },
            'supports'        => [ 'autoRegister' => true ],
            'style'           => 'meu-plugin-block-style',
        ]
    );
}
add_action( 'init', 'meu_bloco_estilizado' );

Server-side rendering diagram showing PHP block output in WordPress editor Dev Environment Setup

Limitações Que Você Precisa Conhecer

Blocos PHP-only não substituem blocos em JavaScript. Veja o que você perde:

RecursoBloco PHP-OnlyBloco em JS
Edição inline no preview do bloco❌ Não✅ Sim
Anexar JS ao DOM do preview❌ Não (quebra no re-render)✅ Sim
Acesso a dados frescos do client-side❌ Não (consulta o DB direto)✅ Sim
Acesso ao contexto do post atual❌ Não (REST é stateless)✅ Sim
Tipos de atributosStrings, números, booleanosQualquer um
Controles no editorTexto, número, checkbox, dropdownComponentes React completos
Upload de imagem / rich text / date picker❌ Não suportado✅ Sim
Dropdown com arrays keyed (label ≠ valor)❌ Não✅ Sim

Essas limitações são arquiteturais, não temporárias. Não vão mudar em releases futuros.

O Caso de Uso Matador: Migrar PHP Legado

O valor real dos blocos PHP-only é migrar temas clássicos para temas de bloco. Se você tem widgets legados, shortcodes ou template parts, pode envolvê-los em um bloco PHP-only e colocá-los renderizando no editor de blocos em horas em vez de dias.

O preview no editor não vai ser perfeito—pode não ser responsivo, os controles podem não funcionar—mas se o frontend renderiza certo, muitas vezes isso basta. Para uma outra perspectiva sobre trade-offs pragmáticos de engenharia, dá uma olhada em como treinamos um modelo text-to-image em 24 horas.

Block Supports Úteis para Blocos PHP-Only

'supports' => [
    'autoRegister' => true,
    'inserter'     => false,        // Esconde do inserter de blocos
    'multiple'     => false,        // Só uma instância por post
    'align'        => [ 'left', 'center', 'right' ], // Alinhamento seletivo
    'color'        => [ 'background' => true, 'text' => true ],
],

Dica Pro: Use o Editor com Iframe

A partir do WordPress 7.0, o editor de posts usa iframe se todos os blocos forem Block API Version 3 ou superior. O WordPress 7.1 vai forçar o iframe independentemente. Pra se preparar, garanta que seus blocos usem API Version 3—isso evita que estilos do admin interfiram nos estilos do seu bloco.

Laptop screen displaying WordPress block editor with PHP-only block preview System Abstract Visual

Conclusão: Valeu a Espera de 7,5 Anos?

Pra criar blocos ricos e interativos do zero—não. Você ainda precisa de JavaScript pra experiências de edição nativas.

Mas pra migrar código PHP legado pra temas de bloco? Com certeza. O registro de blocos PHP-only remove as duas maiores barreiras: aprender desenvolvimento de blocos em JavaScript e reescrever tudo em React. Agora você pode portar shortcodes, widgets e template parts usando as habilidades PHP que você já tem.

Próximos passos:

  • Audite seu tema clássico em busca de widgets e shortcodes que podem virar blocos PHP-only
  • Comece com um template part de baixo risco (header, footer, bio do autor) e envolva em um bloco
  • Ative Block API Version 3 em todos os blocos pra se preparar pro iframe obrigatório do WordPress 7.1
  • Mantenha o desenvolvimento de blocos em JavaScript no seu roadmap—blocos PHP-only complementam, não substituem, blocos JS

Atenção: Não espere previews perfeitos no editor. Aceite que alguns blocos vão parecer quebrados no editor mas renderizar bem no frontend. Esse é o trade-off.

Fonte: CSS-Tricks

Este conteúdo foi elaborado com o auxílio de ferramentas de IA, com base em fontes confiáveis, e revisado pela nossa equipe editorial antes da publicação. Não substitui o aconselhamento de um profissional especializado.