{"id":75838,"date":"2026-07-22T10:31:29","date_gmt":"2026-07-22T13:31:29","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=75838&#038;preview=true&#038;preview_id=75838"},"modified":"2026-07-28T10:58:30","modified_gmt":"2026-07-28T13:58:30","slug":"ia-wordpress","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/","title":{"rendered":"Integra\u00e7\u00e3o de IA no WordPress: uma an\u00e1lise detalhada da arquitetura e de um caso de uso real"},"content":{"rendered":"<p>Antes do <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-7-0\/\">WordPress 7.0<\/a>, os <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-plugins-ia\/\">plugins que adicionavam recursos de IA<\/a> precisavam solicitar e gerenciar uma chave de API para se comunicar com um provedor de IA.<\/p>\n<p>Isso trazia v\u00e1rias desvantagens em termos de tamanho do c\u00f3digo e facilidade de manuten\u00e7\u00e3o. Era necess\u00e1rio incluir bibliotecas propriet\u00e1rias de SDK pesadas nos plugins e escrever solicita\u00e7\u00f5es cURL espec\u00edficas para cada provedor.<\/p>\n<p>Esse cen\u00e1rio fragmentado mudou completamente com a <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-7-0\/#integration-with-ai\">integra\u00e7\u00e3o nativa de IA<\/a> introduzida no WordPress 7.0. Agora, o WordPress conta com uma interface centralizada para configurar credenciais de diversos provedores de IA, al\u00e9m de uma nova API em PHP. Essa nova arquitetura permite enviar comandos, instru\u00e7\u00f5es, arquivos de m\u00eddia e estruturas de dados de forma transparente, enquanto o Core gerencia as solicita\u00e7\u00f5es.<\/p>\n<p>A nova arquitetura oferece benef\u00edcios significativos tanto para administradores de sites quanto para desenvolvedores de plugins.<\/p>\n<p>Os administradores n\u00e3o precisam mais configurar defini\u00e7\u00f5es de IA em v\u00e1rios plugins. A partir do WordPress 7.0, basta instalar e ativar os conectores do plugin, inserir as chaves de API na interface unificada <strong>Connectors<\/strong>, e elas ficar\u00e3o imediatamente dispon\u00edveis para todos os plugins com recursos de IA do site. Tamb\u00e9m \u00e9 poss\u00edvel monitorar facilmente o uso da IA, alterar o modelo preferido ou revogar o acesso de um provedor para todos os plugins com apenas um clique.<\/p>\n<p>Para desenvolvedores de plugins, as vantagens s\u00e3o ainda maiores, abrangendo desde seguran\u00e7a de dados at\u00e9 portabilidade de c\u00f3digo e uma redu\u00e7\u00e3o dr\u00e1stica da <a href=\"https:\/\/kinsta.com\/pt\/blog\/agencias-wordpress-escalaveis\/#technical-debt\">d\u00edvida t\u00e9cnica<\/a>.<\/p>\n<p>Pronto para conhecer a nova arquitetura de IA do WordPress? Vamos come\u00e7ar.<br \/>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>As tr\u00eas camadas da arquitetura de IA do WordPress<\/h2>\n<p>Hoje, seus sites WordPress j\u00e1 est\u00e3o preparados nativamente para IA. Isso n\u00e3o significa que o WordPress ofere\u00e7a recursos de IA prontos para uso, mas sim que fornece a base necess\u00e1ria para criar sites com funcionalidades baseadas em IA.<\/p>\n<p>A nova arquitetura \u00e9 estruturada em tr\u00eas camadas distintas:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>AI Connector<\/h3>\n<p>Antes do <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-7-0\/\">WordPress 7.0<\/a>, todo plugin que adicionava recursos de IA ao site precisava do pr\u00f3prio sistema para armazenar e gerenciar suas chaves API. As credenciais precisavam ser incorporadas diretamente ao plugin ou gerenciadas por meio de uma p\u00e1gina de configura\u00e7\u00f5es personalizada. Em ambos os casos, essa estava longe de ser uma solu\u00e7\u00e3o ideal para lidar com dados sens\u00edveis.<\/p>\n<figure id=\"attachment_211404\" aria-describedby=\"caption-attachment-211404\" style=\"width: 1462px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211404 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/connectors-screen.png\" alt=\"Tela Connectors.\" width=\"1462\" height=\"1404\"><figcaption id=\"caption-attachment-211404\" class=\"wp-caption-text\">A interface centralizada de AI Connectors no painel de controle do WordPress.<\/figcaption><\/figure>\n<p>Uma interface unificada permite configurar todos os provedores de servi\u00e7os de IA em um \u00fanico local centralizado. Essa interface oferece v\u00e1rios benef\u00edcios importantes para o gerenciamento do site.<\/p>\n<p>Do ponto de vista da administra\u00e7\u00e3o e da seguran\u00e7a, a maior vantagem \u00e9 que basta configurar os provedores uma \u00fanica vez na interface Connectors e depois esquecer essa etapa, independentemente da quantidade de plugins que os utilizam. Se precisar alterar as chaves de API no futuro, n\u00e3o ser\u00e1 necess\u00e1rio reconfigurar cada plugin individualmente; basta atualiz\u00e1-las uma \u00fanica vez na tela Connectors.<\/p>\n<p>Centralizar as credenciais tamb\u00e9m melhora a seguran\u00e7a do site ao reduzir o risco de exposi\u00e7\u00e3o de dados sens\u00edveis por meio de plugins de terceiros que possam ter sido mal desenvolvidos ou n\u00e3o sejam confi\u00e1veis.<\/p>\n<p>Outra vantagem importante \u00e9 a portabilidade do c\u00f3digo. Os plugins n\u00e3o precisam mais saber qual provedor de IA est\u00e1 sendo utilizado, pois a nova arquitetura desacopla a autentica\u00e7\u00e3o da l\u00f3gica do plugin. Isso significa que, se voc\u00ea mudar de provedor de IA, o plugin continuar\u00e1 funcionando sem exigir uma \u00fanica altera\u00e7\u00e3o no c\u00f3digo.<\/p>\n<p>No entanto, o maior avan\u00e7o em termos de portabilidade \u00e9 a possibilidade de os administradores configurarem v\u00e1rios conectores simultaneamente. Quando um plugin envia uma solicita\u00e7\u00e3o, o WordPress seleciona automaticamente o provedor de IA e o modelo mais adequados para gerar a resposta, com base tanto na <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/introducing-the-ai-client-in-wordpress-7-0\/#ai-model-preferences\">configura\u00e7\u00e3o espec\u00edfica do plugin<\/a> quanto nos recursos dos modelos dispon\u00edveis.<\/p>\n<h3>AI Client<\/h3>\n<p>Enquanto a tela Connectors fornece a interface de configura\u00e7\u00e3o dos provedores de IA, o <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/introducing-the-ai-client-in-wordpress-7-0\/\">AI Client<\/a> oferece aos desenvolvedores a ferramenta operacional para se comunicar com os modelos de IA.<\/p>\n<p>Trata-se de uma interface de software nativa que padroniza a intera\u00e7\u00e3o com modelos de intelig\u00eancia artificial por meio da fun\u00e7\u00e3o global <code>wp_ai_client_prompt()<\/code> e de um conjunto unificado de m\u00e9todos em PHP.<\/p>\n<h4>Redu\u00e7\u00e3o da d\u00edvida t\u00e9cnica<\/h4>\n<p>Para os desenvolvedores, uma das principais vantagens da nova arquitetura de IA \u00e9 a redu\u00e7\u00e3o da d\u00edvida t\u00e9cnica e das depend\u00eancias. Antes do WordPress 7.0, adicionar recursos de IA implicava um custo muito alto em termos de manuten\u00e7\u00e3o do c\u00f3digo. Era necess\u00e1rio incluir SDKs propriet\u00e1rios de terceiros (como as bibliotecas oficiais da <a href=\"https:\/\/developers.openai.com\/api\/docs\/libraries\" target=\"_blank\" rel=\"noopener noreferrer\">OpenAI<\/a> ou da <a href=\"https:\/\/platform.claude.com\/docs\/en\/api\/client-sdks\">Anthropic<\/a>) e monitorar constantemente suas vers\u00f5es. Isso tornava a base de c\u00f3digo do plugin mais pesada e aumentava a possibilidade de erros de compatibilidade.<\/p>\n<p>Al\u00e9m disso, era preciso escrever muitas linhas de c\u00f3digo para lidar com a l\u00f3gica de rede e o processamento das respostas. Para piorar, esse c\u00f3digo era espec\u00edfico para cada fornecedor. Assim, se voc\u00ea decidisse mudar de provedor de IA, precisaria reescrever toda a arquitetura de comunica\u00e7\u00e3o do plugin.<\/p>\n<p>O AI Client resolve esse problema na origem ao transferir todo esse trabalho para o Core do WordPress. O c\u00f3digo torna-se completamente independente do provedor de IA: basta escrever as instru\u00e7\u00f5es uma \u00fanica vez, e o WordPress as traduzir\u00e1 para o &#8220;dialeto&#8221; espec\u00edfico do modelo utilizado.<\/p>\n<h4>Sele\u00e7\u00e3o inteligente de modelos<\/h4>\n<p>Um recurso poderoso da Fluent Interface do AI Client \u00e9 a possibilidade de definir modelos preferenciais por meio do m\u00e9todo <code>using_model_preference()<\/code>, dispon\u00edvel na fun\u00e7\u00e3o construtora <code>wp_ai_client_prompt()<\/code>. Esse m\u00e9todo permite declarar uma lista ordenada de modelos para a tarefa espec\u00edfica do plugin. Por exemplo, o c\u00f3digo abaixo solicita a gera\u00e7\u00e3o de texto priorizando tr\u00eas modelos:<\/p>\n<pre><code class=\"language-php\">$text_result = wp_ai_client_prompt( 'Convert the following transcript into a concise, blog-ready draft.' )\n\t-&gt;using_model_preference(\n\t\t'gemini-2.5-flash',\n\t\t'claude-3-5-sonnet',\n\t\t'gpt-4o'\n\t)\n\t-&gt;generate_text();<\/code><\/pre>\n<p>O WordPress verificar\u00e1 os provedores configurados na tela Connectors e comparar\u00e1 a lista de modelos definida no c\u00f3digo do plugin, selecionando o primeiro conector que tamb\u00e9m esteja dispon\u00edvel no site. Se nenhum dos modelos especificados no c\u00f3digo estiver dispon\u00edvel entre os Connectors ativos, o WordPress ignorar\u00e1 a lista de prefer\u00eancia e utilizar\u00e1 o primeiro modelo compat\u00edvel configurado no site.<\/p>\n<p>Esse mecanismo garante que o plugin continuar\u00e1 funcionando mesmo que o administrador do site decida mudar para outro provedor de IA.<\/p>\n<h3>Provedor de IA<\/h3>\n<p>Um provedor de IA \u00e9 a empresa que possui, treina e hospeda os Grandes Modelos de Linguagem (LLMs) que usamos todo dia. OpenAI, Google Gemini e Anthropic s\u00e3o os provedores de IA mais comuns suportados por meio de conectores dedicados no WordPress 7.0, mas os desenvolvedores podem registrar provedores de IA personalizados adicionais.<\/p>\n<p>Quando o c\u00f3digo do plugin chama o m\u00e9todo <code>generate_text()<\/code>, ou qualquer outro m\u00e9todo de gera\u00e7\u00e3o, o WordPress compila e envia uma carga de dados (<em>payload<\/em>) para o provedor de IA por meio do endpoint definido pelo Connector. Nos bastidores, a sequ\u00eancia de opera\u00e7\u00f5es ocorre da seguinte forma:<\/p>\n<ul>\n<li>Primeiro, o provedor de IA recebe o texto do prompt de entrada juntamente com todos os arquivos de m\u00eddia anexados (carga de dados).<\/li>\n<li>Em seguida, processa a solicita\u00e7\u00e3o, aplicando as instru\u00e7\u00f5es do sistema, quando houver.<\/li>\n<li>Depois, gera a resposta estruturada como texto livre ou como um objeto JSON.<\/li>\n<li>Por fim, envia o resultado de volta ao WordPress por meio de uma resposta HTTP.<\/li>\n<\/ul>\n<p>Cada provedor oferece uma ampla variedade de modelos com diferentes capacidades, velocidades e custos. H\u00e1 modelos especializados exclusivamente em processamento de texto, modelos multimodais que aceitam arquivos de m\u00eddia (\u00e1udio, imagens e v\u00eddeos) juntamente com um prompt de texto e modelos desenvolvidos para tarefas espec\u00edficas, como gera\u00e7\u00e3o de imagens ou convers\u00e3o de fala em texto.<\/p>\n<figure id=\"attachment_211411\" aria-describedby=\"caption-attachment-211411\" style=\"width: 1718px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211411 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/gemini-3-models.png\" alt=\"Modelos Gemini 3.\" width=\"1718\" height=\"1534\"><figcaption id=\"caption-attachment-211411\" class=\"wp-caption-text\">A fam\u00edlia de modelos Gemini 3 do Google.<\/figcaption><\/figure>\n<p>Novamente, os modelos dispon\u00edveis para um site WordPress dependem dos provedores de IA configurados pelo usu\u00e1rio na tela Connectors. Isso significa que o plugin n\u00e3o determina qual provedor espec\u00edfico ser\u00e1 utilizado.<\/p>\n<h2>Uma an\u00e1lise detalhada da fun\u00e7\u00e3o wp_ai_client_prompt()<\/h2>\n<p>A fun\u00e7\u00e3o <code>wp_ai_client_prompt()<\/code> permite que os plugins se comuniquem com modelos de IA de forma padronizada. Assim, voc\u00ea n\u00e3o precisa instalar bibliotecas externas, lidar com configura\u00e7\u00f5es espec\u00edficas de cada provedor nem implementar manualmente solicita\u00e7\u00f5es HTTP.<\/p>\n<p>Ela funciona como uma interface de software que permite escrever o c\u00f3digo apenas uma vez, enquanto o WordPress faz todo o trabalho pesado e traduz as instru\u00e7\u00f5es para o &#8220;dialeto&#8221; espec\u00edfico de cada modelo.<\/p>\n<p>A fun\u00e7\u00e3o retorna uma inst\u00e2ncia da <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_ai_client_prompt_builder\/\">classe <code>WP_AI_Client_Prompt_Builder<\/code><\/a>, que fornece uma interface fluente (<em>Fluent Interface<\/em>) composta por m\u00e9todos encade\u00e1veis para personalizar os prompts. A fun\u00e7\u00e3o \u00e9 <a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/7.0\/src\/wp-includes\/ai-client\/class-wp-ai-client-prompt-builder.php#L33\">descrita da seguinte forma<\/a>:<\/p>\n<pre><code class=\"language-php\">\/**\n * Fluent builder for constructing AI prompts, returning WP_Error on failure.\n *\n * This class provides a fluent interface for building prompts with various\n * content types and model configurations. It wraps the PHP AI Client SDK's\n * PromptBuilder and adds WordPress-specific behavior including WP_Error\n * handling instead of exceptions, snake_case method naming, and integration\n * with the Abilities API.\n *\n * Only the generating methods will return a WP_Error, to not break the fluent\n * interface. As soon as any exception is caught in a chain of method calls,\n * the returned instance will be in an error state, and all subsequent method\n * calls will be no-ops that just return the same error state instance. Only\n * when a generating method is called, the WP_Error will be returned.\n *\/<\/code><\/pre>\n<p>A fun\u00e7\u00e3o <code>wp_ai_client_prompt()<\/code> n\u00e3o faz uma solicita\u00e7\u00e3o HTTP imediatamente. Em vez disso, ela instancia e retorna um objeto <code>WP_AI_Client_Prompt_Builder<\/code>. Mais de 50 m\u00e9todos de configura\u00e7\u00e3o preenchem as propriedades privadas desse objeto por meio de uma <a href=\"https:\/\/en.wikipedia.org\/wiki\/Fluent_interface\">Fluent Interface<\/a>, tornando o c\u00f3digo altamente leg\u00edvel e f\u00e1cil de escrever.<\/p>\n<p>Veja uma lista n\u00e3o exaustiva dos m\u00e9todos que voc\u00ea utilizar\u00e1 com mais frequ\u00eancia:<\/p>\n<ul>\n<li><code>with_text()<\/code>: adiciona texto \u00e0 mensagem atual.<\/li>\n<li><code>with_file()<\/code>: adiciona um arquivo \u00e0 mensagem atual.<\/li>\n<li><code>with_history()<\/code>: adiciona o hist\u00f3rico da conversa.<\/li>\n<li><code>using_model_preference()<\/code>: define os modelos preferenciais em ordem de prioridade.<\/li>\n<li><code>using_system_instruction()<\/code>: define a instru\u00e7\u00e3o do sistema.<\/li>\n<li><code>using_max_tokens()<\/code>: define o n\u00famero m\u00e1ximo de tokens a serem gerados.<\/li>\n<li><code>using_temperature()<\/code>: define a temperatura da gera\u00e7\u00e3o.<\/li>\n<li><code>using_top_p()<\/code>: define o valor de <em>top-p<\/em> da gera\u00e7\u00e3o.<\/li>\n<li><code>using_top_k()<\/code>: define o valor de <em>top-k<\/em> da gera\u00e7\u00e3o.<\/li>\n<li><code>as_output_file_type()<\/code>: define o tipo do arquivo de sa\u00edda.<\/li>\n<li><code>as_json_response()<\/code>: configura o prompt para retornar uma resposta em JSON.<\/li>\n<li><code>is_supported_for_text_generation()<\/code>: verifica se a configura\u00e7\u00e3o ativa oferece suporte \u00e0 gera\u00e7\u00e3o de texto.<\/li>\n<li><code>is_supported_for_image_generation()<\/code>: verifica se a configura\u00e7\u00e3o ativa oferece suporte \u00e0 gera\u00e7\u00e3o de imagens.<\/li>\n<li><code>is_supported_for_text_to_speech_conversion()<\/code>: verifica se a configura\u00e7\u00e3o ativa oferece suporte \u00e0 convers\u00e3o de texto em fala.<\/li>\n<li><code>is_supported_for_video_generation()<\/code>: verifica se a configura\u00e7\u00e3o ativa oferece suporte \u00e0 gera\u00e7\u00e3o de v\u00eddeos.<\/li>\n<li><code>generate_text()<\/code>: gera um resultado em texto a partir do prompt.<\/li>\n<li><code>generate_image()<\/code>: gera uma imagem a partir do prompt.<\/li>\n<li><code>convert_text_to_speech()<\/code>: converte texto em fala.<\/li>\n<li><code>generate_speech()<\/code>: gera fala a partir do prompt.<\/li>\n<li><code>generate_video()<\/code>: gera um v\u00eddeo a partir do prompt.<\/li>\n<\/ul>\n<p>Para obter a lista completa de m\u00e9todos, consulte o <a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/7.0\/src\/wp-includes\/ai-client\/class-wp-ai-client-prompt-builder.php#L33\">c\u00f3digo-fonte do Core do WordPress<\/a>.<\/p>\n<p>Suponha que voc\u00ea queira transcrever com precis\u00e3o o conte\u00fado de um arquivo de \u00e1udio. Nesse caso, voc\u00ea pode utilizar a fun\u00e7\u00e3o da seguinte forma:<\/p>\n<pre><code class=\"language-php\">$transcription_builder = wp_ai_client_prompt( $prompt )\n\t-&gt;with_file( $audio_base64, $mime_type )\n\t-&gt;using_temperature( 0.1 );\n\nif ( ! $transcription_builder-&gt;is_supported_for_text_generation() ) {\n\t\/\/ No configured provider supports the current prompt configuration.\n\treturn new WP_Error(\n\t\t'no_supported_model',\n\t\t'No configured AI model can process this request. Configure a provider in Settings &gt; Connectors.',\n\t\tarray( 'status' =&gt; 400 )\n\t);\n}\n\n$transcript = $transcription_builder-&gt;generate_text();<\/code><\/pre>\n<p>Veja o que esse c\u00f3digo faz:<\/p>\n<ul>\n<li><strong><code>$prompt<\/code><\/strong>: representa a string principal que cont\u00e9m as instru\u00e7\u00f5es centrais.<\/li>\n<li><strong><code>with_file()<\/code><\/strong>: habilita os recursos multimodais da interface. No exemplo acima, passamos o conte\u00fado bin\u00e1rio do \u00e1udio previamente codificado em Base64 juntamente com o respectivo tipo MIME.<\/li>\n<li><strong><code>using_temperature()<\/code><\/strong>: controla o grau de determinismo da resposta. Um valor baixo (0,1) faz com que o modelo permane\u00e7a o mais fiel poss\u00edvel ao conte\u00fado do \u00e1udio, enquanto um valor mais alto permite maior liberdade criativa. Esse m\u00e9todo pode ser combinado com <code>using_top_p()<\/code> (<em>Top-Probability<\/em>) para um controle ainda mais preciso do resultado.<\/li>\n<li><strong><code>is_supported_for_text_generation()<\/code><\/strong>: verifica se os Connectors ativos oferecem suporte aos requisitos do prompt atual antes de consumir recursos com uma chamada de rede.<\/li>\n<li><strong><code>generate_text()<\/code><\/strong>: \u00e9 o m\u00e9todo final da Fluent Interface. Ele envia a solicita\u00e7\u00e3o HTTP unificada ao provedor ativo e retorna o texto gerado ou um objeto <code>WP_Error<\/code> em caso de falha.<\/li>\n<\/ul>\n<p>Em resumo, enviamos ao provedor de IA um prompt de texto acompanhado de um arquivo de \u00e1udio. Definimos uma temperatura baixa para obter o resultado mais determin\u00edstico poss\u00edvel, verificamos se a configura\u00e7\u00e3o ativa era compat\u00edvel com a gera\u00e7\u00e3o de texto e, por fim, executamos a transcri\u00e7\u00e3o de fala para texto com base na resposta da IA.<\/p>\n<p>Com outro prompt, podemos enviar novamente a transcri\u00e7\u00e3o bruta para a IA e solicitar que ela gere uma resposta estruturada como um objeto JSON.<\/p>\n<pre><code class=\"language-php\">$structured_json = wp_ai_client_prompt(\n\t\"Convert the following transcript into a concise, blog-ready draft in American English.n\" .\n\t\"Return JSON with a post title and body sections.n\" .\n\t\"Each section must have: heading, level (2 or 3), and paragraphs (array).n\" .\n\t\"If useful, include bullet_points (array) for short actionable lists.n\" .\n\t\"Use short, clear headings and readable paragraph text.nn\" .\n\t\"Transcript:n\" . $transcript\n)\n\t-&gt;using_system_instruction( \"You are a professional WordPress content editor. Always write in American English (use appropriate spelling, grammar, and conventions for that language variant).\" )\n\t-&gt;using_temperature( 0.4 )\n\t-&gt;as_json_response( $schema )\n\t-&gt;generate_text();<\/code><\/pre>\n<p>Para esse segundo prompt, utilizamos m\u00e9todos adicionais para aproveitar outros recursos da API:<\/p>\n<ul>\n<li><code>using_system_instruction()<\/code>: define o contexto operacional e o papel comportamental do modelo, separando claramente sua persona (\u201cum editor profissional de conte\u00fado do WordPress\u201d) da carga de dados.<\/li>\n<li><code>using_temperature( 0.4 )<\/code>: define uma \u201ctemperatura\u201d mais alta do que na tarefa de transcri\u00e7\u00e3o anterior, permitindo que o modelo use um vocabul\u00e1rio mais rico e produza um conte\u00fado mais fluido.<\/li>\n<li><code>as_json_response()<\/code>: obriga o modelo a retornar uma string JSON estruturada que corresponda ao layout definido na sua vari\u00e1vel <code>$schema<\/code>. Isso \u00e9 \u00fatil ao preparar conte\u00fado para o Gutenberg.<\/li>\n<\/ul>\n<p>Com a sa\u00edda estruturada como JSON, voc\u00ea pode extrair campos individuais e mape\u00e1-los programaticamente para blocos nativos do Gutenberg utilizando as fun\u00e7\u00f5es do Core do WordPress.<\/p>\n<p>Para uma vis\u00e3o mais aprofundada do AI Client, consulte tamb\u00e9m a nota de desenvolvimento <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/introducing-the-ai-client-in-wordpress-7-0\/\">Introducing the AI Client in WordPress 7.0<\/a>.<\/p>\n<h2>Converta um arquivo de \u00e1udio em conte\u00fado pronto para o Gutenberg com IA<\/h2>\n<p>Agora que voc\u00ea entende melhor as tr\u00eas camadas da arquitetura de IA do WordPress, vamos ver como tudo isso funciona na pr\u00e1tica com um exemplo real. Nesta se\u00e7\u00e3o, voc\u00ea aprender\u00e1 a criar a l\u00f3gica principal de um plugin baseado em IA capaz de gerar um rascunho de artigo bem estruturado diretamente a partir de um arquivo de \u00e1udio.<\/p>\n<p>Os casos de uso para esse recurso s\u00e3o in\u00fameros. Imagine criar um artigo completo para um blog a partir de uma r\u00e1pida mensagem de voz enviada pelo seu aplicativo de mensagens favorito ou transcrever uma entrevista gravada no smartphone.<\/p>\n<p>Para implementar essa funcionalidade no seu site WordPress, ser\u00e1 necess\u00e1rio criar um plugin personalizado. N\u00e3o abordaremos aqui os arquivos b\u00e1sicos (<em>boilerplate<\/em>) nem todo o processo de registro do plugin. Se precisar revisar os fundamentos do desenvolvimento de plugins, consulte <a href=\"https:\/\/kinsta.com\/pt\/blog\/plugin-gutenberg\/\">outros tutoriais<\/a> do blog da Kinsta ou a <a href=\"https:\/\/make.wordpress.org\/cli\/handbook\/how-to\/how-to-create-custom-plugins\/\">documenta\u00e7\u00e3o oficial do WordPress.org<\/a>.<\/p>\n<p>Nos concentraremos na l\u00f3gica principal que permite ao plugin se comunicar com o provedor de IA. Mas n\u00e3o se preocupe: o plugin est\u00e1 dispon\u00edvel para consulta e download neste <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\">reposit\u00f3rio do GitHub<\/a>.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>O plugin de exemplo utilizado neste tutorial foi desenvolvido para o WordPress 7.0. Ele n\u00e3o funcionar\u00e1 em vers\u00f5es anteriores do CMS.<\/p>\n<\/aside>\n\n<h3>O que este plugin faz<\/h3>\n<p>Para come\u00e7ar, acesse a <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\">p\u00e1gina do projeto no GitHub<\/a> e baixe o arquivo ZIP do plugin. Em seguida, fa\u00e7a login no painel do WordPress 7.0 ou superior e envie o arquivo em <strong>Plugins &gt; Adicionar plugin &gt; Enviar plugin<\/strong>. Ap\u00f3s instalar e ativar o plugin, voc\u00ea estar\u00e1 pronto para acompanhar este tutorial.<\/p>\n<p>O plugin <strong>AI Content Builder<\/strong> adiciona uma barra lateral de configura\u00e7\u00f5es personalizada, acess\u00edvel por meio de um \u00edcone localizado no canto superior direito da interface do Editor de Blocos. Essa barra lateral inclui uma interface dedicada para o envio de arquivos de \u00e1udio e um bot\u00e3o de altern\u00e2ncia que permite \u00e0 IA substituir o t\u00edtulo atual do artigo.<\/p>\n<figure id=\"attachment_211625\" aria-describedby=\"caption-attachment-211625\" style=\"width: 1612px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211625 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/ai-content-builder-sidebar.png\" alt=\"Barra lateral do AI Content Builder.\" width=\"1612\" height=\"1054\"><figcaption id=\"caption-attachment-211625\" class=\"wp-caption-text\">O plugin AI Content Builder adiciona uma barra lateral de configura\u00e7\u00f5es personalizada ao Editor de Blocos.<\/figcaption><\/figure>\n<p>O bot\u00e3o <strong>Upload audio note<\/strong> abre o carregador de m\u00eddia do WordPress, permitindo enviar um novo arquivo de \u00e1udio ou selecionar um arquivo existente da Biblioteca de M\u00eddia.<\/p>\n<figure id=\"attachment_211626\" aria-describedby=\"caption-attachment-211626\" style=\"width: 1560px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211626 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/select-or-upload-media.png\" alt=\"Biblioteca de M\u00eddia do WordPress.\" width=\"1560\" height=\"1328\"><figcaption id=\"caption-attachment-211626\" class=\"wp-caption-text\">Selecione ou envie arquivos de \u00e1udio na Biblioteca de M\u00eddia do WordPress.<\/figcaption><\/figure>\n<p>Depois que o arquivo de \u00e1udio \u00e9 carregado, o bot\u00e3o <strong>Generate Content<\/strong> dispara uma solicita\u00e7\u00e3o ass\u00edncrona para o provedor de IA ativo.<\/p>\n<figure id=\"attachment_211627\" aria-describedby=\"caption-attachment-211627\" style=\"width: 1616px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211627 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/generate-content-button.png\" alt=\"Barra lateral do plugin\" width=\"1616\" height=\"1062\"><figcaption id=\"caption-attachment-211627\" class=\"wp-caption-text\">A barra lateral do plugin com o bot\u00e3o Generate Content ativo.<\/figcaption><\/figure>\n<p>A imagem abaixo mostra o rascunho final do post gerado pela IA em apenas alguns segundos.<\/p>\n<figure id=\"attachment_211628\" aria-describedby=\"caption-attachment-211628\" style=\"width: 1612px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211628 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/ai-generated-post-content.png\" alt=\"Conte\u00fado gerado por IA.\" width=\"1612\" height=\"1336\"><figcaption id=\"caption-attachment-211628\" class=\"wp-caption-text\">Um rascunho de post para blog, bem formatado, gerado por IA a partir de um arquivo de \u00e1udio bruto.<\/figcaption><\/figure>\n<p>O conte\u00fado resultante \u00e9 estruturado em blocos nativos do Gutenberg, incluindo par\u00e1grafos, t\u00edtulos e listas.<\/p>\n<figure id=\"attachment_211629\" aria-describedby=\"caption-attachment-211629\" style=\"width: 1616px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211629 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/post-content-in-code-editor.png\" alt=\"Conte\u00fado bem estruturado no Editor de C\u00f3digo.\" width=\"1616\" height=\"1396\"><figcaption id=\"caption-attachment-211629\" class=\"wp-caption-text\">Conte\u00fado bem estruturado no Editor de C\u00f3digo do WordPress.<\/figcaption><\/figure>\n<p>Agora, vamos analisar a l\u00f3gica do plugin.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Este plugin foi criado especificamente para este tutorial e destina-se apenas a fins ilustrativos. N\u00e3o o utilize em produ\u00e7\u00e3o.<\/p>\n<\/aside>\n\n<h3>O que voc\u00ea precisa para este plugin<\/h3>\n<p>Estes s\u00e3o os requisitos b\u00e1sicos para criar um plugin WordPress que se integre \u00e0 nova arquitetura de IA para gerar o conte\u00fado dos seus posts:<\/p>\n<ul>\n<li>WordPress 7.0 ou superior.<\/li>\n<li>Uma chave de API de um provedor de IA que ofere\u00e7a um modelo capaz de realizar convers\u00e3o de fala em texto. Em nosso exemplo, usaremos o Google AI.<\/li>\n<li>Seu IDE preferido. Para este plugin, usamos o VS Code.<\/li>\n<li>Conhecimento s\u00f3lido sobre desenvolvimento para WordPress e Gutenberg, APIs REST, PHP e JavaScript.<\/li>\n<\/ul>\n<p>Voc\u00ea n\u00e3o precisa se preocupar com Node.js, processos de build ou importa\u00e7\u00e3o de bibliotecas externas, pois este plugin utiliza exclusivamente as APIs nativas do Core do WordPress. O resultado \u00e9 um plugin leve, seguro e sem d\u00edvida t\u00e9cnica.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Devido a limita\u00e7\u00f5es de espa\u00e7o, as se\u00e7\u00f5es a seguir se concentrar\u00e3o exclusivamente no c\u00f3digo respons\u00e1vel pela comunica\u00e7\u00e3o com o AI Client e pelo processamento do conte\u00fado gerado por IA. O restante do c\u00f3digo est\u00e1 totalmente documentado no <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/tree\/35ef318c10768969e235c89617a59cc4b6b38eb4\" target=\"_blank\" rel=\"noopener noreferrer\">reposit\u00f3rio do GitHub<\/a>.<\/p>\n<\/aside>\n\n<h3>Estrutura do plugin e vers\u00e3o m\u00ednima do WordPress<\/h3>\n<p>O plugin <strong>AI Content Builder<\/strong> \u00e9 composto por apenas dois arquivos:<\/p>\n<ul>\n<li><code>ai-content-builder.php<\/code><\/li>\n<li><code>editor.js.<\/code><\/li>\n<\/ul>\n<p>A vers\u00e3o m\u00ednima necess\u00e1ria do WordPress \u00e9 a 7.0. Portanto, certifique-se de defini-la no cabe\u00e7alho do plugin:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\/**\n * Plugin Name: AI Content Builder\n * Description: Gutenberg sidebar plugin that uploads audio and generates post content using the WordPress 7.0 AI Client.\n * Version: 1.0.0\n * Requires at least: 7.0\n * Requires PHP: 8.0\n * Author: Your Name\n * License: GPL-2.0-or-later\n * Text Domain: ai-content-builder\n *\/<\/code><\/pre>\n<p>Com isso em mente, vamos analisar o processo de cria\u00e7\u00e3o de um plugin para WordPress com recursos de IA.<\/p>\n<h3>O fluxo de dados do plugin<\/h3>\n<p>Antes de analisarmos o c\u00f3digo, vamos entender como os dados percorrem o caminho entre o backend do WordPress, o Editor de Blocos, o servidor PHP e o provedor de IA, e depois retornam ao editor.<\/p>\n<ol>\n<li><a href=\"#register-api-endpoint\">Do navegador para o servidor: chamada REST ass\u00edncrona<\/a>: o navegador envia o ID do arquivo de \u00e1udio para o endpoint REST personalizado do plugin. Para evitar que a interface fique travada, registramos um endpoint REST que permite enviar solicita\u00e7\u00f5es ass\u00edncronas ao servidor PHP.<\/li>\n<li><a href=\"#first-ai-pass\">Primeira etapa de IA: transcri\u00e7\u00e3o de fala em texto<\/a>: o servidor intercepta a solicita\u00e7\u00e3o, recupera o arquivo de \u00e1udio do banco de dados e consulta o AI Client para extrair a transcri\u00e7\u00e3o bruta.<\/li>\n<li><a href=\"#second-ai-pass\">Segunda etapa de IA: estrutura\u00e7\u00e3o do conte\u00fado<\/a>: o servidor envia a transcri\u00e7\u00e3o bruta novamente ao AI Client e solicita que ela seja formatada como um objeto JSON estruturado.<\/li>\n<li><a href=\"#block-generation\">Preenchimento dos dados e gera\u00e7\u00e3o dos blocos<\/a>: o script JavaScript (JS) recebe o objeto JSON estruturado, normaliza os dados e mapeia os campos para blocos nativos do Gutenberg.<\/li>\n<\/ol>\n<p>Agora, vamos analisar a l\u00f3gica por tr\u00e1s de cada etapa.<\/p>\n<h3 id=\"register-api-endpoint\">1. Registrar um endpoint de API personalizado<\/h3>\n<p>O primeiro passo para criar o plugin <strong>AI Content Builder<\/strong> \u00e9 registrar um endpoint de API. Isso \u00e9 essencial porque processar um arquivo de \u00e1udio e gerar uma resposta pode levar v\u00e1rios segundos (ou at\u00e9 minutos) para o modelo de IA. <strong>Registrar um endpoint REST permite que voc\u00ea fa\u00e7a solicita\u00e7\u00f5es ass\u00edncronas pelos controles da barra lateral, evitando que a interface congele.<\/strong><\/p>\n<p>Registrar um endpoint de API tamb\u00e9m permite fazer chamadas seguras \u00e0 IA sem expor credenciais de acesso, aproveitando o sistema nativo de autentica\u00e7\u00e3o do WordPress.<\/p>\n<p>A l\u00f3gica para registrar e inicializar o endpoint \u00e9 tratada no arquivo PHP do plugin usando os dois m\u00e9todos de classe: <code>init()<\/code> e <code>register_rest_routes()<\/code>.<\/p>\n<pre><code class=\"language-php\">public static function init(): void {\n\n\t\/\/ Register the custom REST endpoint used by the sidebar JS.\n\tadd_action( 'rest_api_init', array( __CLASS__, 'register_rest_routes' ) );\n\n\t...\n}<\/code><\/pre>\n<p>Ao vincular a chamada da fun\u00e7\u00e3o ao hook <code>rest_api_init<\/code>, o plugin registra a rota do endpoint somente quando uma solicita\u00e7\u00e3o \u00e0 API REST \u00e9 acionada. Isso melhora o desempenho ao evitar atrasos desnecess\u00e1rios no carregamento das p\u00e1ginas.<\/p>\n<p>Voc\u00ea pode configurar as rotas usando o m\u00e9todo <code>register_rest_routes()<\/code>, conforme mostrado no c\u00f3digo abaixo:<\/p>\n<pre><code class=\"language-php\">public static function register_rest_routes(): void {\n\tregister_rest_route(\n\t\tself::REST_NAMESPACE,\n\t\tself::REST_ROUTE,\n\t\tarray(\n\t\t\t'methods'             =&gt; WP_REST_Server::CREATABLE, \/\/ Alias for POST.\n\t\t\t'callback'            =&gt; array( __CLASS__, 'handle_generate_request' ),\n\t\t\t'permission_callback' =&gt; static function (): bool {\n\t\t\t\t\/\/ Reject unauthenticated or insufficiently privileged requests early.\n\t\t\t\treturn current_user_can( 'edit_posts' );\n\t\t\t},\n\t\t\t'args'                =&gt; array(\n\t\t\t\t'audio_id' =&gt; array(\n\t\t\t\t\t'type'     =&gt; 'integer',\n\t\t\t\t\t'required' =&gt; true,\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\t);\n}<\/code><\/pre>\n<p>Esse m\u00e9todo faz o seguinte:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_rest_route\/\" target=\"_blank\" rel=\"noopener noreferrer\">A fun\u00e7\u00e3o <code>register_rest_route()<\/code><\/a> recebe tr\u00eas par\u00e2metros: o namespace da rota, a pr\u00f3pria rota e um array de configura\u00e7\u00e3o.<\/li>\n<li><code>WP_REST_Server::CREATABLE<\/code> \u00e9 um alias do m\u00e9todo de transporte <code>POST<\/code>, utilizado para garantir a m\u00e1xima compatibilidade com a arquitetura interna do WordPress.<\/li>\n<li><code>permission_callback<\/code> \u00e9 \u00e9 uma fun\u00e7\u00e3o an\u00f4nima que restringe o acesso a usu\u00e1rios autenticados com permiss\u00e3o para criar e editar os pr\u00f3prios posts. Em caso de acesso n\u00e3o autorizado, o WordPress bloqueia a solicita\u00e7\u00e3o antes de process\u00e1-la e retorna automaticamente um erro <a href=\"https:\/\/kinsta.com\/pt\/blog\/erro-401\/\">401 Unauthorized<\/a> ou <a href=\"https:\/\/kinsta.com\/pt\/blog\/erro-403-forbidden\/\">403 Forbidden<\/a>.<\/li>\n<li><code>args<\/code> \u00e9 um array opcional de par\u00e2metros adicionais que podem ser utilizados para modificar a resposta da API. Ele permite especificar os dados que a solicita\u00e7\u00e3o ao endpoint deve retornar.<\/li>\n<li><code>audio_id<\/code> \u00e9 um array de par\u00e2metros que especifica o tipo de dado obrigat\u00f3rio. Se o tipo retornado n\u00e3o for um n\u00famero inteiro ou se o valor estiver ausente, a API REST interromper\u00e1 a execu\u00e7\u00e3o e retornar\u00e1 um erro.<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Consulte a documenta\u00e7\u00e3o oficial para obter mais informa\u00e7\u00f5es sobre <a href=\"https:\/\/developer.wordpress.org\/rest-api\/extending-the-rest-api\/routes-and-endpoints\/\" target=\"_blank\" rel=\"noopener noreferrer\">rotas e endpoints<\/a>.<\/p>\n<\/aside>\n\n<p>Por fim, \u00e9 necess\u00e1rio garantir que a barra lateral do editor saiba para onde enviar os dados. Para isso, usamos a fun\u00e7\u00e3o <code>wp_localize_script()<\/code> dentro do m\u00e9todo <code>enqueue_editor_assets()<\/code>.<\/p>\n<pre><code class=\"language-php\">public static function enqueue_editor_assets(): void {\n\t...\n\n\twp_localize_script(\n\t\t'ai-content-builder-editor',\n\t\t'AICBData',\n\t\tarray(\n\t\t\t'restPath' =&gt; '\/' . self::REST_NAMESPACE . self::REST_ROUTE,\n\t\t\t'nonce'    =&gt; wp_create_nonce( 'wp_rest' ),\n\t\t)\n\t);\n}<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_localize_script\/\" target=\"_blank\" rel=\"noopener noreferrer\">A fun\u00e7\u00e3o <code>wp_localize_script()<\/code><\/a> \u00e9 utilizada principalmente para disponibilizar dados de localiza\u00e7\u00e3o de um script registrado por meio de uma vari\u00e1vel JavaScript. No entanto, aqui ela \u00e9 usada para transferir dados do PHP para o JavaScript por meio do objeto global <code>AICBData<\/code>.<\/li>\n<li><code>restPath<\/code> cont\u00e9m o endere\u00e7o do endpoint. Defini-lo aqui evita que ele precise ser inserido diretamente no arquivo JavaScript.<\/li>\n<li><code>nonce<\/code> define um token de seguran\u00e7a para <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_create_nonce\/\">impedir acessos n\u00e3o autorizados<\/a>.<\/li>\n<\/ul>\n<h3 id=\"first-ai-pass\">2. Acessar o AI Client para extrair texto de um arquivo de \u00e1udio<\/h3>\n<p>O m\u00e9todo <code>handle_generate_request()<\/code> \u00e9 o n\u00facleo do nosso plugin. Ele executa uma sequ\u00eancia de tarefas, come\u00e7ando pelas verifica\u00e7\u00f5es de seguran\u00e7a e terminando com a gera\u00e7\u00e3o do conte\u00fado do post que ser\u00e1 inserido no Editor de Blocos.<\/p>\n<p>Primeiro, ele verifica se o AI Client est\u00e1 dispon\u00edvel e se o suporte \u00e0 IA n\u00e3o foi desativado no site.<\/p>\n<pre><code class=\"language-php\">public static function handle_generate_request( WP_REST_Request $request ) {\n\tif ( ! function_exists( 'wp_ai_client_prompt' ) ) {\n\t\treturn new WP_Error(\n\t\t\t'ai_client_unavailable',\n\t\t\t'WordPress AI Client is not available. This plugin requires WordPress 7.0 .',\n\t\t\tarray( 'status' =&gt; 500 )\n\t\t);\n\t}\n\n\tif ( function_exists( 'wp_supports_ai' ) && ! wp_supports_ai() ) {\n\t\treturn new WP_Error(\n\t\t\t'ai_disabled',\n\t\t\t'AI support is disabled on this site.',\n\t\t\tarray( 'status' =&gt; 403 )\n\t\t);\n\t}\n\t...\n}<\/code><\/pre>\n<p>Em caso de falha, essas verifica\u00e7\u00f5es retornam um erro <code>500<\/code> ou <code>403<\/code>, respectivamente.<\/p>\n<p>O pr\u00f3ximo bloco de c\u00f3digo executa as seguintes a\u00e7\u00f5es:<\/p>\n<ul>\n<li>Extrai o ID do arquivo de \u00e1udio da solicita\u00e7\u00e3o.<\/li>\n<li>Verifica se o ID do arquivo de \u00e1udio \u00e9 um n\u00famero inteiro positivo.<\/li>\n<li>Verifica o tipo do arquivo.<\/li>\n<li>Recupera o tipo MIME.<\/li>\n<li>Extrai e codifica o conte\u00fado do arquivo em Base64.<\/li>\n<\/ul>\n<pre><code class=\"language-php\">$audio_id = absint( $request-&gt;get_param( 'audio_id' ) );\nif ( ! $audio_id ) {\n\treturn new WP_Error( 'invalid_audio_id', 'Invalid audio ID.', array( 'status' =&gt; 400 ) );\n}\n\n$attachment = get_post( $audio_id );\nif ( ! $attachment || 'attachment' !== $attachment-&gt;post_type ) {\n\treturn new WP_Error( 'audio_not_found', 'Audio attachment not found.', array( 'status' =&gt; 404 ) );\n}\n\n$mime_type = (string) get_post_mime_type( $audio_id );\nif ( 0 !== strpos( $mime_type, 'audio\/' ) ) {\n\treturn new WP_Error( 'invalid_audio_type', 'Attachment must be an audio file.', array( 'status' =&gt; 400 ) );\n}\n\n$audio_path = get_attached_file( $audio_id );\nif ( ! $audio_path || ! file_exists( $audio_path ) ) {\n\treturn new WP_Error( 'audio_path_missing', 'Audio file path not found on server.', array( 'status' =&gt; 404 ) );\n}\n\n$audio_bytes = file_get_contents( $audio_path );\nif ( false === $audio_bytes ) {\n\treturn new WP_Error( 'audio_read_failed', 'Unable to read audio file.', array( 'status' =&gt; 500 ) );\n}\n\n$audio_base64 = base64_encode( $audio_bytes );<\/code><\/pre>\n<figure id=\"attachment_211767\" aria-describedby=\"caption-attachment-211767\" style=\"width: 1594px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211767 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/mime-type-error.png\" alt=\"Invalid file type error\" width=\"1594\" height=\"1190\"><figcaption id=\"caption-attachment-211767\" class=\"wp-caption-text\">Uma mensagem de erro \u00e9 gerada quando o usu\u00e1rio tenta processar um tipo de arquivo inv\u00e1lido.<\/figcaption><\/figure>\n<p>Dessa forma, o arquivo bin\u00e1rio \u00e9 convertido em uma string que pode ser enviada ao AI Client. Agora, podemos prosseguir com a extra\u00e7\u00e3o do texto:<\/p>\n<pre><code class=\"language-php\">$output_language = self::get_output_language();\n\n$transcription_builder = wp_ai_client_prompt(\n\t\"Transcribe this voice note accurately into $output_language. Return plain text only.\"\n)\n\t-&gt;with_file( $audio_base64, $mime_type )\n\t-&gt;using_temperature( 0.1 );\n\nif ( ! $transcription_builder-&gt;is_supported_for_text_generation() ) {\n\treturn new WP_Error(\n\t\t'no_supported_model',\n\t\t'No configured AI model can process this request. Configure a provider in Settings &gt; Connectors.',\n\t\tarray( 'status' =&gt; 400 )\n\t);\n}\n\n$transcript = $transcription_builder-&gt;generate_text();<\/code><\/pre>\n<p>Veja em detalhes o que o c\u00f3digo acima faz:<\/p>\n<ul>\n<li><code>get_output_language()<\/code> \u00e9 um m\u00e9todo est\u00e1tico definido em outra parte do script que retorna a localidade do site. Consulte o <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/ai-content-builder.php#L135\">GitHub<\/a>.<\/li>\n<li><code>wp_ai_client_prompt()<\/code> inicializa uma nova solicita\u00e7\u00e3o ao receber o prompt principal.<\/li>\n<li><code>with_file()<\/code> informa ao AI Client que estamos enviando uma solicita\u00e7\u00e3o multimodal. O m\u00e9todo recebe o conte\u00fado do arquivo em Base64 e o tipo MIME.<\/li>\n<li><code>using_temperature()<\/code> permite especificar o n\u00edvel de determinismo da resposta. Definimos um valor baixo para obter uma transcri\u00e7\u00e3o fiel do \u00e1udio.<\/li>\n<li>O m\u00e9todo <code>is_supported_for_text_generation()<\/code> verifica se o provedor de IA pode gerar texto a partir dos dados fornecidos. Caso o provedor n\u00e3o ofere\u00e7a suporte a entradas multimodais, o plugin interrompe a execu\u00e7\u00e3o e retorna uma mensagem de erro.<\/li>\n<li>O m\u00e9todo <code>generate_text()<\/code> inicia a solicita\u00e7\u00e3o HTTP.<\/li>\n<\/ul>\n<h3 id=\"second-ai-pass\">3. Converter a transcri\u00e7\u00e3o do \u00e1udio em conte\u00fado estruturado<\/h3>\n<p>Agora que temos a transcri\u00e7\u00e3o, o plugin precisa se comunicar novamente com o provedor de IA para obter uma resposta JSON estruturada. Para isso, precisamos definir um array estruturado no formato JSON.<\/p>\n<pre><code class=\"language-php\">$schema = array(\n\t'type'       =&gt; 'object',\n\t'properties' =&gt; array(\n\t\t'title'    =&gt; array( 'type' =&gt; 'string' ),\n\t\t'sections' =&gt; array(\n\t\t\t'type'  =&gt; 'array',\n\t\t\t'items' =&gt; array(\n\t\t\t\t'type'       =&gt; 'object',\n\t\t\t\t'properties' =&gt; array(\n\t\t\t\t\t'heading'    =&gt; array( 'type' =&gt; 'string' ),\n\t\t\t\t\t'level'      =&gt; array(\n\t\t\t\t\t\t'type' =&gt; 'integer',\n\t\t\t\t\t),\n\t\t\t\t\t'paragraphs' =&gt; array(\n\t\t\t\t\t\t'type'  =&gt; 'array',\n\t\t\t\t\t\t'items' =&gt; array( 'type' =&gt; 'string' ),\n\t\t\t\t\t),\n\t\t\t\t\t'bullet_points' =&gt; array(\n\t\t\t\t\t\t'type'  =&gt; 'array',\n\t\t\t\t\t\t'items' =&gt; array( 'type' =&gt; 'string' ),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\t'required'   =&gt; array( 'heading', 'level', 'paragraphs' ),\n\t\t\t),\n\t\t),\n\t),\n\t'required'   =&gt; array( 'title', 'sections' ),\n);<\/code><\/pre>\n<p>Com essa estrutura, a IA responder\u00e1 com um objeto JSON contendo um t\u00edtulo e um array de se\u00e7\u00f5es. Cada se\u00e7\u00e3o deve conter um t\u00edtulo, um n\u00edvel de t\u00edtulo, pelo menos um par\u00e1grafo e marcadores.<\/p>\n<p>Agora que o esquema foi definido, podemos prosseguir com a configura\u00e7\u00e3o da segunda solicita\u00e7\u00e3o ao AI Client:<\/p>\n<pre><code class=\"language-php\">$structured_json = wp_ai_client_prompt(\n\t\"Convert the following transcript into a concise, blog-ready draft in $output_language.n\" .\n\t\"Return JSON with a post title and body sections.n\" .\n\t\"Each section must have: heading, level (2 or 3), and paragraphs (array).n\" .\n\t\"If useful, include bullet_points (array) for short actionable lists.n\" .\n\t\"Use short, clear headings and readable paragraph text.nn\" .\n\t\"Transcript:n\" . $transcript\n)\n\t-&gt;using_system_instruction( \"You are a professional WordPress content editor. Always write in $output_language (use appropriate spelling, grammar, and conventions for that language variant).\" )\n\t-&gt;using_temperature( 0.4 )\n\t-&gt;as_json_response( $schema )\n\t-&gt;generate_text();\n\nif ( is_wp_error( $structured_json ) ) {\n\treturn $structured_json;\n}<\/code><\/pre>\n<p>Vamos analisar os principais pontos desse c\u00f3digo:<\/p>\n<ul>\n<li><code>using_system_instruction()<\/code> define a persona do modelo.<\/li>\n<li><code>using_temperature( 0.4 )<\/code> define um valor de temperatura mais alto, dando \u00e0 IA maior liberdade criativa para gerar a resposta e produzir um texto mais fluido e elaborado.<\/li>\n<li><code>as_json_response( $schema )<\/code> instrui o cliente a fornecer a resposta em um formato estruturado.<\/li>\n<li>O plugin interrompe a execu\u00e7\u00e3o em caso de erro.<\/li>\n<\/ul>\n<p>A pr\u00f3xima etapa \u00e9 decodificar e higienizar os dados.<\/p>\n<pre><code class=\"language-php\">$structured = json_decode( (string) $structured_json, true );\n\nif ( ! is_array( $structured ) ) {\n\treturn new WP_Error(\n\t\t'invalid_ai_json',\n\t\t'Could not parse structured AI response.',\n\t\tarray( 'status' =&gt; 500 )\n\t);\n}\n\n$normalized = self::normalize_structured_post( $structured );\n\nif ( '' === $normalized['title'] && empty( $normalized['sections'] ) ) {\n\treturn new WP_Error(\n\t\t'empty_structured_content',\n\t\t'The AI provider returned empty structured content.',\n\t\tarray( 'status' =&gt; 500 )\n\t);\n}<\/code><\/pre>\n<p>No c\u00f3digo acima:<\/p>\n<ul>\n<li>A fun\u00e7\u00e3o <code>json_decode()<\/code> converte a string JSON em um array associativo do PHP.<\/li>\n<li>Se o JSON estiver malformado, a verifica\u00e7\u00e3o seguinte retornar\u00e1 um c\u00f3digo de status <code>500<\/code> acompanhado de uma mensagem de erro clara.<\/li>\n<li>O m\u00e9todo est\u00e1tico <code>normalize_structured_post()<\/code> higieniza e normaliza a sa\u00edda do provedor antes de disponibiliz\u00e1-la ao JavaScript. Consulte a defini\u00e7\u00e3o dessa fun\u00e7\u00e3o no <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/ai-content-builder.php#L476\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub<\/a>).<\/li>\n<\/ul>\n<p>Agora, resta apenas enviar a sa\u00edda resultante ao JavaScript para gerar blocos nativos do Gutenberg.<\/p>\n<h3 id=\"block-generation\">4. Gerar uma sa\u00edda pronta para o Gutenberg<\/h3>\n<p>A pr\u00f3xima etapa \u00e9 mapear a sa\u00edda JSON para blocos nativos do Gutenberg. Essa fase ocorre no lado do cliente e \u00e9 gerenciada pelo arquivo <code>editor.js<\/code>.<\/p>\n<p>Quando o usu\u00e1rio seleciona um arquivo de \u00e1udio, o <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L342\">c\u00f3digo a seguir<\/a> \u00e9 acionado:<\/p>\n<pre><code class=\"language-javascript\">function AIContentBuilderSidebar() {\n\n\tconst [ audioId, setAudioId ] = useState( 0 );\n\t...\n\n\tconst onSelectAudio = function ( media ) {\n\t\tif ( ! media || ! media.id ) {\n\t\t\treturn;\n\t\t}\n\t\tsetAudioId( media.id );\n\t\tsetAudioLabel( media.title || media.filename || ( 'Audio #'   media.id ) );\n\t\tsetNotice( null );\n\t};\n\t...\n}<\/code><\/pre>\n<p>Esse c\u00f3digo recupera do banco de dados do WordPress o ID do arquivo de \u00e1udio gravado.<\/p>\n<p>Quando o usu\u00e1rio clica no bot\u00e3o <strong>Generate Content<\/strong>, a <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L382\">fun\u00e7\u00e3o <code>onGenerate()<\/code><\/a> utiliza <code>apiFetch()<\/code> para enviar uma solicita\u00e7\u00e3o <code>POST<\/code> ao endpoint da API, incluindo, entre outros dados, o ID do arquivo de \u00e1udio.<\/p>\n<pre><code class=\"language-javascript\">const onGenerate = async function () {\n\n\t...\n\n\ttry {\n\t\tconst response = await apiFetch( {\n\t\t\tpath: AICBData.restPath,\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'X-WP-Nonce': AICBData.nonce,\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\taudio_id: audioId,\n\t\t\t},\n\t\t} );\n\t\t...\n\t}\n\t...\n}<\/code><\/pre>\n<ul>\n<li><code>await<\/code> pausa a fun\u00e7\u00e3o temporariamente para evitar que o navegador trave enquanto espera pela resposta da IA.<\/li>\n<li>Assim que for recebido, o objeto JSON fica armazenado temporariamente na vari\u00e1vel <code>response<\/code>.<\/li>\n<\/ul>\n<p>O conte\u00fado da vari\u00e1vel <code>response<\/code>\u00a0ser\u00e1 um objeto estruturado da seguinte forma:<\/p>\n<pre><code class=\"language-json\">{\n\ttitle: \"Two Wheels to the Medina: ...\",\n\tsections: [\n\t\t{\n\t\t\theading: \"A Well-Deserved Rest in the Red City\",\n\t\t\tlevel: 2,\n\t\t\tparagraphs: [ \"On April 24th, our group of seven motorcyclists...\" ],\n\t\t\tbullet_points: []\n\t\t},\n\t\t{\n\t\t\theading: \"Diving into the Medina and Jemaa el-Fnaa\",\n\t\t\tlevel: 2,\n\t\t\tparagraphs: [ \"We spent the day exploring the historic Medina...\" ],\n\t\t\tbullet_points: [ \n\t\t\t\t\"Navigating the vibrant, maze-like alleys of the ancient Medina\", \n\t\t\t\t\"Tasting traditional Berber tagines and Moroccan mint tea\",\n\t\t\t\t\"Shopping for handmade leather goods, spices, and lanterns in the souks\" \n\t\t\t]\n\t\t},\n\t\t{...}\n\t],\n\tcontent: \"Fallback plain text...\",\n\ttranscript: \"Full transcript...\"\n}<\/code><\/pre>\n<p>Esse objeto fornece os dados necess\u00e1rios para criar os blocos. No entanto, o script pode receber uma string JSON ou um JSON aninhado dentro de um objeto. Portanto, \u00e9 necess\u00e1ria uma etapa adicional de normaliza\u00e7\u00e3o antes de extrair os dados usados na gera\u00e7\u00e3o dos blocos:<\/p>\n<pre><code class=\"language-javascript\">const normalizedSections = normalizeSectionsPayload( response.sections );<\/code><\/pre>\n<ul>\n<li>A fun\u00e7\u00e3o <code>normalizeSectionsPayload()<\/code>\u00a0normaliza cargas de dados <code>sections<\/code>\u00a0incertas, transformando-as em um array. (Veja o<a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L171\" target=\"_blank\" rel=\"noopener noreferrer\"> c\u00f3digo no GitHub<\/a>.)<\/li>\n<\/ul>\n<p>Em seguida, a vari\u00e1vel <code>normalizedSections<\/code>\u00a0\u00e9 passada como argumento para a <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L60\" target=\"_blank\" rel=\"noopener noreferrer\">fun\u00e7\u00e3o que converte<\/a> os campos <code>sections<\/code>\u00a0em blocos nativos do Gutenberg:<\/p>\n<pre><code class=\"language-javascript\">const structuredBlocks = buildBlocksFromSections( normalizedSections );<\/code><\/pre>\n<p>Abaixo est\u00e1 um trecho da fun\u00e7\u00e3o <code>buildBlocksFromSections()<\/code>:<\/p>\n<pre><code class=\"language-javascript\">function buildBlocksFromSections( sections ) {\n\tif ( ! Array.isArray( sections ) ) {\n\t\treturn [];\n\t}\n\n\tconst blocks = [];\n\n\tsections.forEach( function ( section ) {\n\t\tif ( ! section || 'object' !== typeof section ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst heading =\n\t\t\t\t( 'string' === typeof section.heading )\n\t\t\t\t\t? section.heading.trim()\n\t\t\t\t\t: '';\n\n\t\t\tconst level = ( 3 === section.level ) ? 3 : 2;\n\n\t\t\tif ( heading ) {\n\t\t\t\tblocks.push(\n\t\t\t\t\tcreateBlock( 'core\/heading', {\n\t\t\t\t\t\tcontent: heading,\n\t\t\t\t\t\tlevel: level,\n\t\t\t\t\t} )\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t...\n\n\t\t} );\n\treturn blocks;\n}<\/code><\/pre>\n<p>No c\u00f3digo acima, o loop <code>forEach()<\/code> percorre o array de dados e extrai <code>section.heading<\/code> e <code>section.level<\/code>, que s\u00e3o utilizados pela fun\u00e7\u00e3o nativa <code>createBlock()<\/code>.<\/p>\n<p>Para o mapeamento de <code>section.paragraphs<\/code>\u00a0e <code>section.bullet_points<\/code>, d\u00e1 uma olhada no <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L60\" target=\"_blank\" rel=\"noopener noreferrer\">c\u00f3digo-fonte no GitHub<\/a>.<\/p>\n<h2>Possibilidades ilimitadas de expans\u00e3o<\/h2>\n<p>A introdu\u00e7\u00e3o da IA no WordPress abre possibilidades completamente novas tanto para administradores de sites quanto para desenvolvedores. Antes, era necess\u00e1rio criar toda uma infraestrutura de comunica\u00e7\u00e3o do zero apenas para adicionar recursos de IA a um site WordPress. Agora, automatizar o fluxo de trabalho editorial e implementar funcionalidades baseadas em IA tornou-se muito mais simples.<\/p>\n<p>O plugin de exemplo apresentado na segunda parte deste artigo demonstra apenas um caso de uso. Ainda assim, ele mostra claramente como agora \u00e9 poss\u00edvel criar ferramentas que simplificam de forma significativa o gerenciamento de sites e a edi\u00e7\u00e3o de conte\u00fado. Al\u00e9m disso, essa arquitetura viabiliza recursos avan\u00e7ados que antes eram complexos demais para implementar ou tinham um custo elevado.<\/p>\n<p>E isso \u00e9 apenas o come\u00e7o. A intelig\u00eancia artificial \u00e9 uma realidade em constante evolu\u00e7\u00e3o que, sem d\u00favida, desencadear\u00e1 uma grande onda de inova\u00e7\u00e3o.<\/p>\n<p>E por falar em inova\u00e7\u00e3o&#8230; Voc\u00ea j\u00e1 experimentou a hospedagem da Kinsta? Para equipar seu site com as melhores tecnologias dispon\u00edveis atualmente para WordPress, experimente a <a href=\"https:\/\/kinsta.com\/pt\/precos\/\">Kinsta sem riscos ou entre em contato com nossa equipe de vendas<\/a> para saber mais.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Antes do WordPress 7.0, os plugins que adicionavam recursos de IA precisavam solicitar e gerenciar uma chave de API para se comunicar com um provedor de &#8230;<\/p>\n","protected":false},"author":36,"featured_media":75839,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1026],"class_list":["post-75838","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-desenvolvimento-wordpress"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Integra\u00e7\u00e3o de IA no WordPress: arquitetura e um exemplo pr\u00e1tico<\/title>\n<meta name=\"description\" content=\"Conhe\u00e7a a nova infraestrutura de IA do WordPress. Descubra sua arquitetura nativa, seus fluxos de funcionamento internos e um exemplo pr\u00e1tico de convers\u00e3o de \u00e1udio em texto.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Integra\u00e7\u00e3o de IA no WordPress: uma an\u00e1lise detalhada da arquitetura e de um caso de uso real\" \/>\n<meta property=\"og:description\" content=\"Conhe\u00e7a a nova infraestrutura de IA do WordPress. Descubra sua arquitetura nativa, seus fluxos de funcionamento internos e um exemplo pr\u00e1tico de convers\u00e3o de \u00e1udio em texto.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-22T13:31:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-28T13:58:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1470\" \/>\n\t<meta property=\"og:image:height\" content=\"735\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Conhe\u00e7a a nova infraestrutura de IA do WordPress. Descubra sua arquitetura nativa, seus fluxos de funcionamento internos e um exemplo pr\u00e1tico de convers\u00e3o de \u00e1udio em texto.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"31 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Integra\u00e7\u00e3o de IA no WordPress: uma an\u00e1lise detalhada da arquitetura e de um caso de uso real\",\"datePublished\":\"2026-07-22T13:31:29+00:00\",\"dateModified\":\"2026-07-28T13:58:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/\"},\"wordCount\":4701,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"inLanguage\":\"pt-PT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/\",\"name\":\"Integra\u00e7\u00e3o de IA no WordPress: arquitetura e um exemplo pr\u00e1tico\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"datePublished\":\"2026-07-22T13:31:29+00:00\",\"dateModified\":\"2026-07-28T13:58:30+00:00\",\"description\":\"Conhe\u00e7a a nova infraestrutura de IA do WordPress. Descubra sua arquitetura nativa, seus fluxos de funcionamento internos e um exemplo pr\u00e1tico de convers\u00e3o de \u00e1udio em texto.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"width\":1470,\"height\":735},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Desenvolvimento WordPress\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/desenvolvimento-wordpress\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Integra\u00e7\u00e3o de IA no WordPress: uma an\u00e1lise detalhada da arquitetura e de um caso de uso real\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinsta.com\/pt\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Integra\u00e7\u00e3o de IA no WordPress: arquitetura e um exemplo pr\u00e1tico","description":"Conhe\u00e7a a nova infraestrutura de IA do WordPress. Descubra sua arquitetura nativa, seus fluxos de funcionamento internos e um exemplo pr\u00e1tico de convers\u00e3o de \u00e1udio em texto.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/","og_locale":"pt_PT","og_type":"article","og_title":"Integra\u00e7\u00e3o de IA no WordPress: uma an\u00e1lise detalhada da arquitetura e de um caso de uso real","og_description":"Conhe\u00e7a a nova infraestrutura de IA do WordPress. Descubra sua arquitetura nativa, seus fluxos de funcionamento internos e um exemplo pr\u00e1tico de convers\u00e3o de \u00e1udio em texto.","og_url":"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2026-07-22T13:31:29+00:00","article_modified_time":"2026-07-28T13:58:30+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Conhe\u00e7a a nova infraestrutura de IA do WordPress. Descubra sua arquitetura nativa, seus fluxos de funcionamento internos e um exemplo pr\u00e1tico de convers\u00e3o de \u00e1udio em texto.","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","twitter_creator":"@carlodaniele","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Carlo Daniele","Tempo estimado de leitura":"31 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Integra\u00e7\u00e3o de IA no WordPress: uma an\u00e1lise detalhada da arquitetura e de um caso de uso real","datePublished":"2026-07-22T13:31:29+00:00","dateModified":"2026-07-28T13:58:30+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/"},"wordCount":4701,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","inLanguage":"pt-PT"},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/","url":"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/","name":"Integra\u00e7\u00e3o de IA no WordPress: arquitetura e um exemplo pr\u00e1tico","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","datePublished":"2026-07-22T13:31:29+00:00","dateModified":"2026-07-28T13:58:30+00:00","description":"Conhe\u00e7a a nova infraestrutura de IA do WordPress. Descubra sua arquitetura nativa, seus fluxos de funcionamento internos e um exemplo pr\u00e1tico de convers\u00e3o de \u00e1udio em texto.","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","width":1470,"height":735},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Desenvolvimento WordPress","item":"https:\/\/kinsta.com\/pt\/topicos\/desenvolvimento-wordpress\/"},{"@type":"ListItem","position":3,"name":"Integra\u00e7\u00e3o de IA no WordPress: uma an\u00e1lise detalhada da arquitetura e de um caso de uso real"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinsta.com\/pt\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/75838","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=75838"}],"version-history":[{"count":7,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/75838\/revisions"}],"predecessor-version":[{"id":75902,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/75838\/revisions\/75902"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75838\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75838\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75838\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75838\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75838\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75838\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75838\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75838\/translations\/es"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75838\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/75839"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=75838"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=75838"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=75838"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}