Criando shortcodes personalizados no WordPress: do básico ao avançado.

Fundo escuro com bloco de código flutuante, logo do WordPress, selo ACF e ícone de multisite, destacando o título 'WordPress".

🔧 Shortcode personalizado WordPress: o básico

Um cliente queria repetir o mesmo aviso em várias páginas sem colar HTML toda vez — a saída foi um shortcode personalizado WordPress: uma função PHP registrada com add_shortcode(), que roda dentro de páginas, posts ou widgets. Vamos montar três, do texto fixo ao que busca dado em outro site da rede.

				
					// No functions.php ou em um plugin
function infotechjs_mensagem_simples() {
    return '<p>Olá, este é meu primeiro shortcode!</p>';
}
add_shortcode('mensagem_simples', 'infotechjs_mensagem_simples');
				
			

Agora, basta usar [mensagem_simples] no conteúdo de uma página e pronto!

🧩 Shortcode personalizado WordPress com dado dinâmico (ACF)

Vamos dar um passo além. Imagine que você tem um campo personalizado chamado mensagem_boas_vindas criado com o ACF. É o mesmo princípio do shortcode anterior, mas em vez de texto fixo no código, ele lê um valor que você edita pelo painel — sem tocar em PHP depois de pronto.

				
					function infotechjs_mensagem_dinamica() {
    $mensagem = get_field('mensagem_boas_vindas', 'option'); // ou outro post ID
    if ( $mensagem ) {
        return '<p>' . esc_html($mensagem) . '</p>';
    }
    return '';
}
add_shortcode('mensagem_dinamica', 'infotechjs_mensagem_dinamica');
				
			

Esse shortcode [mensagem_dinamica] vai puxar o conteúdo dinâmico do ACF, e já com esc_html() para manter a segurança.

Na próxima seção: 🔁 Vamos evoluir para buscar conteúdo de outro site na rede Multisite usando switch_to_blog().

🌐 Shortcode personalizado WordPress no Multisite

Imagine que você tem um campo personalizado no site principal (ID 1) com banners ou dados compartilhados. Podemos criar um shortcode para buscá-lo, mesmo que ele seja usado em outro site da rede.

💻 Exemplo prático:

				
					function infotechjs_banner_global_shortcode() {
    $output = '';

    // ID do site principal onde os dados estão salvos
    $blog_id_origem = 1;

    // Página ou post onde o conteúdo está
    $post_id = 7; // Substitua pelo ID real

    // Troca temporariamente para o site principal
    switch_to_blog($blog_id_origem);

    // Obtém os campos ACF
    $banner = get_field('banner_destacado', $post_id); // exemplo de campo

    // Retorna ao site atual
    restore_current_blog();

    // Monta o HTML
    if ( $banner ) {
        $output .= '<div class="banner-global">';
        $output .= '<img decoding="async" src="' . esc_url($banner['url']) . '" alt="' . esc_attr($banner['alt']) . '">';
        $output .= '</div>';
    }

    return $output;
}
add_shortcode('banner_global', 'infotechjs_banner_global_shortcode');
				
			

🔖 Use o shortcode [banner_global] onde quiser exibir o conteúdo do site principal.


🧠 Dica de performance

Evite usar switch_to_blog() dentro de loops grandes. Se você tiver que exibir vários conteúdos de outros sites, prefira agrupar os dados em cache com transient ou APIs personalizadas.

Esses três casos cobrem a régua inteira de um shortcode personalizado WordPress: texto fixo, dado dinâmico do próprio site via ACF, e dado buscado em outro site da rede via switch_to_blog(). Comece pelo mais simples — na maioria dos projetos, o primeiro já resolve; o Multisite só entra quando o dado de verdade mora em outro site.

Do mesmo assunto

Tutoriais, WordPress

25 ago 2026

Webhook de pedido no WordPress: não perder e não duplicar

Webhook de loja chega duas vezes, chega fora de ordem
Capa: Tema filho, a armadilha do index.php

Tutoriais, WordPress

20 ago 2026

Tema filho no WordPress: por que o index.php pode deixar sua página em branco

Um tema filho com um index.php genérico pode devolver 200
Capa: Criando seu próprio endpoint REST no WordPress

Desenvolvimento WordPress

28 jun 2026

Como criar um endpoint REST customizado no WordPress (passo a passo)

Mais cedo ou mais tarde todo dev WordPress precisa expor

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *