{"id":12369093,"date":"2026-03-14T21:13:17","date_gmt":"2026-03-14T13:13:17","guid":{"rendered":"https:\/\/www.likacloud.com\/knowledge\/%e6%8e%8c%e6%8f%a1wordpress%e6%8f%92%e4%bb%b6%e5%bc%80%e5%8f%91%ef%bc%9a%e4%bb%8e%e9%9b%b6%e5%88%b0%e4%b8%80%e6%9e%84%e5%bb%ba%e4%bd%a0%e7%9a%84%e7%ac%ac%e4%b8%80%e4%b8%aa%e8%87%aa%e5%ae%9a%e4%b9%89\/"},"modified":"2026-06-03T20:48:56","modified_gmt":"2026-06-03T12:48:56","slug":"wordpress-plugin-development-tutorial-custom-plugin-from-scratch-2026","status":"publish","type":"knowledge_post","link":"https:\/\/www.likacloud.com\/pt\/knowledge\/wordpress\/wordpress-plugin-development-tutorial-custom-plugin-from-scratch-2026\/","title":{"rendered":"Dominar o desenvolvimento de plugins para o WordPress: Construa o seu primeiro plugin personalizado do zero."},"content":{"rendered":"<h2 class=\"wp-block-heading\">Por que escolher o desenvolvimento de plugins para o WordPress?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O WordPress, como o sistema de gerenciamento de conte\u00fado mais popular mundialmente, deve sua forte capacidade de expans\u00e3o principalmente aos plugins. Ao desenvolver plugins personalizados, voc\u00ea pode adicionar funcionalidades \u00fanicas \u00e0 plataforma principal, atendendo a necessidades comerciais espec\u00edficas, sem a necessidade de modificar os arquivos do tema. Isso garante que o c\u00f3digo das suas funcionalidades n\u00e3o seja perdido ao atualizar o tema e tamb\u00e9m torna as funcionalidades modulares, facilitando seu reuso em diferentes sites.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aprender o desenvolvimento de plugins n\u00e3o s\u00f3 permite que voc\u00ea crie produtos para serem utilizados por outros, mas tamb\u00e9m lhe permite compreender mais profundamente o funcionamento do WordPress, incluindo seu sistema de ganchos (hooks), a intera\u00e7\u00e3o com o banco de dados e as melhores pr\u00e1ticas de seguran\u00e7a. Este \u00e9 um passo crucial para evoluir de um usu\u00e1rio comum para um desenvolvedor avan\u00e7ado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Construa o seu primeiro plugin.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de come\u00e7ar a escrever o c\u00f3digo, voc\u00ea precisa configurar um ambiente padr\u00e3o do WordPress localmente ou em um servidor de teste. Isso \u00e9 a base de todo o trabalho de desenvolvimento.<\/p>\n<!-- AUTO_INTERNAL_LINKS_START --><p>Leitura recomendada <a href=\"https:\/\/www.likacloud.com\/ja\/knowledge\/wordpress\/wordpress-plugin-development-tutorial-first-custom-function\/\">Aprender a desenvolver plugins para o WordPress do zero: construa sua primeira funcionalidade personalizada<\/a>\u3002<\/p><!-- AUTO_INTERNAL_LINKS_END -->\n\n\n\n\n<h3 class=\"wp-block-heading\">Criar o arquivo principal do plugin<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cada plugin do WordPress deve ter um arquivo principal, que geralmente recebe o mesmo nome do plugin. Vamos criar um arquivo chamado\u2026<code data-no-auto-translation=\"\">my-first-plugin<\/code>O plugin. Primeiro, dentro do diret\u00f3rio de instala\u00e7\u00e3o do seu WordPress\u2026<code data-no-auto-translation=\"\">\/wp-content\/plugins\/<\/code>Dentro da pasta, crie uma nova pasta com o nome de<code data-no-auto-translation=\"\">my-first-plugin<\/code>\u3002<\/p>\n<!-- AUTO_SYNCED_PATTERN_INSERT_START -->\n\r\n<div class=\"flex justify-between items-center flex-col lg:flex-row xl:flex-col 2xl:flex-row gap-6 sm:gap-8 rounded-lg border border-gray-200 dark:border-gray-700 p-4 mb-8 lg:mb-10 sm:p-6 bg-white dark:bg-gray-750 shadow-md transition-colors duration-300\"\r\n     data-link=\"https:\/\/www.likacloud.com\/pt\/tolink\/ultahost-wordpress-hosting\/\">\r\n     \r\n  <div class=\"flex flex-col gap-3 gap-4 sm:gap-6 w-full\">\r\n    <strong class=\"text-2xl font-semibold text-gray-900 dark:text-gray-200\">\r\n      Hospedagem para sites WordPress da UltraHost    <\/strong>\r\n    <div class=\"text-gray-600 dark:text-gray-300 word-word\">Garantia de reembolso em 30 dias, largura de banda ilimitada e banco de dados, prote\u00e7\u00e3o contra DDoS gratuita; desconto de 50% na compra de 3 anos (planos de 4 TB a 10 TB).<\/div>\r\n  <\/div>\r\n\r\n  <div class=\"flex items-center flex-col md:flex-row lg:flex-col xl:flex-row 2xl:flex-col gap-6 shrink-0\">\r\n          <a href=\"https:\/\/www.likacloud.com\/pt\/tolink\/ultahost-wordpress-hosting\/\">\r\n                  <img decoding=\"async\" src=\"https:\/\/www.likacloud.com\/wp-content\/uploads\/2025\/12\/20251227020448.webp\" alt=\"LOGO da UltaHost\" class=\"content-promotion-card-icon h-9 min-h-9 dark:hidden\" title=\"\">\r\n          <img decoding=\"async\" src=\"https:\/\/www.likacloud.com\/wp-content\/uploads\/2025\/12\/20251229052118.webp\" alt=\"LOGO da UltaHost\" class=\"content-promotion-card-icon h-9 min-h-9 hidden dark:block\" title=\"\">\r\n              <\/a>\r\n    \r\n    <a href=\"https:\/\/www.likacloud.com\/pt\/tolink\/ultahost-wordpress-hosting\/\"\r\n       class=\"bg-blue-500 w-full md:w-auto lg:w-full xl:w-auto 2xl:w-full text-center !text-white dark:!text-gray-200 !px-5 !py-1.5 rounded-full hover:bg-blue-600 transition-colors\">\r\n       p\u00e1gina de acesso    <\/a>\r\n  <\/div>\r\n<\/div>\n<!-- AUTO_SYNCED_PATTERN_INSERT_END -->\n\n\n\n\n\n<p class=\"wp-block-paragraph\">Nesse folder, crie um arquivo chamado<code data-no-auto-translation=\"\">my-first-plugin.php<\/code>\u00c9 um arquivo PHP. Este arquivo \u00e9 o ponto de entrada do plugin. Abra-o e adicione as seguintes notas de cabe\u00e7a do plugin; essas informa\u00e7\u00f5es s\u00e3o essenciais para que o WordPress reconhe\u00e7a o seu plugin.<\/p>\n\n\n\n<pre class=\"wp-block-code\" data-no-auto-translation=\"\"><code class=\"language-php\" data-no-auto-translation=\"\">&lt;?php\n\/**\n * Plugin Name:       \u6211\u7684\u7b2c\u4e00\u4e2a\u63d2\u4ef6\n * Plugin URI:        https:\/\/yourwebsite.com\/my-first-plugin\n * Description:       \u8fd9\u662f\u4e00\u4e2a\u5b66\u4e60WordPress\u63d2\u4ef6\u5f00\u53d1\u7684\u793a\u4f8b\u63d2\u4ef6\uff0c\u7528\u4e8e\u5728\u6587\u7ae0\u5e95\u90e8\u6dfb\u52a0\u81ea\u5b9a\u4e49\u5185\u5bb9\u3002\n * Version:           1.0.0\n * Author:            \u4f60\u7684\u540d\u5b57\n * Author URI:        https:\/\/yourwebsite.com\n * License:           GPL v2 or later\n * Text Domain:       my-first-plugin\n * Domain Path:       \/languages\n *\/<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Implementar a primeira funcionalidade simples<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Uma funcionalidade cl\u00e1ssica para iniciantes \u00e9 a adi\u00e7\u00e3o autom\u00e1tica de um texto no final de todo o conte\u00fado dos artigos no site. Vamos usar o WordPress para isso. <code data-no-auto-translation=\"\">the_content<\/code> Isso \u00e9 realizado usando os \u201cganchos de filtro\u201d (filter hooks). Adicione a seguinte fun\u00e7\u00e3o abaixo das notas de cabe\u00e7a do seu arquivo principal:<\/p>\n\n\n\n<pre class=\"wp-block-code\" data-no-auto-translation=\"\"><code class=\"language-php\" data-no-auto-translation=\"\">\/ \/ Evitar o acesso direto aos ficheiros\nif ( ! defined( &#039;ABSPATH&#039; ) ) {\n    exit;\n}\n\n\/**\n * Adicionar texto personalizado no final do conte&uacute;do do artigo\n *\n * @param string $content O conte&uacute;do original do artigo.\n * @return string O conte&uacute;do do artigo modificado.\n *\/\nfunction mfp_add_footer_text( $content ) {\n    \/\/ Verificar se &eacute; o ciclo principal e se est&aacute; na p&aacute;gina de um artigo individual\n    if ( is_single() &amp;amp;&amp;amp; in_the_loop() &amp;amp;&amp;amp; is_main_query() ) {\n        $custom_text = &#039; &lt;p&gt;Texto personalizado&lt;\/p&gt;&#039;;\n    }\n}&#039;&lt;div class=&quot;mfp-footer-note&quot;&gt;&lt;p&gt;&lt;em&gt;Obrigado pela leitura! Este artigo foi apresentado para voc&ecirc; por &ldquo;Meu Primeiro Plugin&rdquo;.&lt;\/em&gt;&lt;\/p&gt;&lt;\/div&gt;&#039;\/\/ Define o conte&uacute;do do footer do plugin My Favourite Plugin (MFP) para ser exibido no final de todos os artigos.  \nfunction mfp_add_footer_text( $content ) {  \n    if ( has_shortcode( $content, &#039;mfp_custom_text&#039; ) ) {  \n        $content = str_replace( &#039;$content&#039;, &#039;$custom_text&#039;, $content );  \n    }  \n    return $content;  \n}\n\/\/ Adiciona a fun&ccedil;&atilde;o ao filtro &#039;the_content&#039;  \nadd_filter( &#039;the_content&#039;, &#039;mfp_add_footer_text&#039; );<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este c\u00f3digo define uma fun\u00e7\u00e3o. <code data-no-auto-translation=\"\">mfp_add_footer_text<\/code>Ele recebe o conte\u00fado do artigo. <code data-no-auto-translation=\"\">$content<\/code> Como par\u00e2metro, a fun\u00e7\u00e3o verifica primeiro se o ambiente atual est\u00e1 na p\u00e1gina de um \u00fanico artigo, no ciclo principal ou na consulta principal. Isso \u00e9 feito para evitar que texto seja adicionado no resumo, em ferramentas adicionais ou em outros locais. Se as condi\u00e7\u00f5es forem atendidas, ela cria um trecho de texto HTML personalizado e o anexa ao conte\u00fado original.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Aprofundando-se na arquitetura e seguran\u00e7a de plugins<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c0 medida que o n\u00famero de funcionalidades dos plugins aumenta, uma boa organiza\u00e7\u00e3o do c\u00f3digo torna-se essencial. Al\u00e9m disso, a seguran\u00e7a \u00e9 a chave para todo o desenvolvimento com WordPress.<\/p>\n<!-- AUTO_INTERNAL_LINKS_START --><p>Leitura recomendada <a href=\"https:\/\/www.likacloud.com\/ja\/knowledge\/wordpress\/wordpress-plugin-development-tutorial-build-first-extension-module\/\">Dominar o desenvolvimento de plugins para o WordPress: Construa seu primeiro m\u00f3dulo de funcionalidade expansiva do zero.<\/a>\u3002<\/p><!-- AUTO_INTERNAL_LINKS_END -->\n\n\n\n\n<h3 class=\"wp-block-heading\">Reestruturar o c\u00f3digo utilizando programa\u00e7\u00e3o orientada a objetos.<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para melhorar a manuten\u00e7\u00e3o e a escalabilidade do c\u00f3digo, recomenda-se o uso de uma abordagem orientada a objetos (OOP) para organizar os plugins. Vamos reestruturar as funcionalidades descritas acima em uma classe.<\/p>\n\n\n\n<pre class=\"wp-block-code\" data-no-auto-translation=\"\"><code class=\"language-php\" data-no-auto-translation=\"\">\/\\n  \/\/ Evitar o acesso direto aos ficheiros\nif ( ! defined( &#039;ABSPATH&#039; ) ) {\n    exit;\n}\n\nclass My_First_Plugin {\n    \/**\n     * Construtor, inicializa os ganchos do plugin.\n     *\/\n    public function __construct() {\n        \/\/ Adiciona os m&eacute;todos aos ganchos no construtor\n        add_action( &#039;init&#039;, array( $this, &#039;load_textdomain&#039; ) );\n        add_filter( &#039;the_content&#039;, array( $this, &#039;add_footer_to_content&#039; ) );\n        add_action( &#039;wp_enqueue_scripts&#039;, array( $this, &#039;enqueue_styles&#039; ) );\n    }\n\n\/**\n     * Carrega o dom&iacute;nio de tradu&ccedil;&atilde;o de texto do plugin.\n     *\/\n    public function load_textdomain() {\n        load_plugin_textdomain( &#039;my-first-plugin&#039;, false, dirname( plugin_basename( __FILE__ ) ) . &#039;\/languages&#039; );\n    }\n\n\/**\n     * Adiciona texto personalizado no final do conte&uacute;do do artigo.\n     *\/\n    public function add_footer_to_content( $content ) {\n        if ( is_single() &amp;amp;&amp;amp; in_the_loop() &amp;amp;&amp;amp; is_main_query() ) {\n            $custom_text = &#039; &lt;p&gt;Texto personalizado&lt;\/p&gt;&#039;;\n        }\n    }\n\n    public function enqueue_styles() {\n        wp_enqueue_style( &#039;my-first-plugin-style&#039;, plugins_url( &#039;style.css&#039;, __FILE__ ) );\n    }\n}\n\n?&amp;gt;&#039;&lt;div class=&quot;mfp-footer-note&quot;&gt;&lt;p&gt;&lt;em&gt;&#039;\\n&#039; . esc_html__( &ldquo;Obrigado por ler! Este artigo &eacute; apresentado a voc&ecirc; por &rdquo;Meu Primeiro Plugin&#039;.&#039;, &#039;my-first-plugin&#039; ) . &#039;&lt;\/em&gt;&lt;\/p&gt;&lt;\/div&gt;&#039;return $content . $custom_text;\n        }\n        return $content;\n    }\n\n\/**\n     * Adicionar estilos ao plugin.\n     *\/\n    public function enqueue_styles() {\n        wp_enqueue_style( &#039;mfp-style&#039;, plugins_url( &#039;assets\/css\/style.css&#039;, __FILE__ ), array(), &#039;1.0.0&#039; );\n    }\n}\n\n\/\/ Instanciar a classe do plugin\n$my_first_plugin_instance = new My_First_Plugin();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Por favor, note que estamos\u2026 <code data-no-auto-translation=\"\">add_footer_to_content<\/code> O m\u00e9todo utilizou\u2026 <code data-no-auto-translation=\"\">esc_html__()<\/code> Uma fun\u00e7\u00e3o para encapsular texto. Esta \u00e9 uma fun\u00e7\u00e3o de tradu\u00e7\u00e3o que tamb\u00e9m realiza a devida escapagem dos caracteres da sa\u00edda, o que representa a melhor pr\u00e1tica para a exibi\u00e7\u00e3o segura de texto. Al\u00e9m disso, adicionamos um m\u00e9todo para carregar tabelas de estilos e introduzimos suporte a campos de texto, preparando o plugin para a internacionaliza\u00e7\u00e3o (i18n).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Compreender e implementar a valida\u00e7\u00e3o e a fuga de dados.<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nunca confie no que os usu\u00e1rios inserem ou em quaisquer dados externos. Ao receber, processar ou exibir dados, \u00e9 essencial realizar verifica\u00e7\u00f5es, limpezas e a\u00e7\u00f5es de \u201cescape\u201d (para evitar problemas de seguran\u00e7a). Por exemplo, se voc\u00ea estiver criando uma p\u00e1gina de gerenciamento com formul\u00e1rios de entrada, certifique-se de usar as fun\u00e7\u00f5es fornecidas pelo WordPress que n\u00e3o s\u00e3o baseadas no mecanismo de autentica\u00e7\u00e3o \u201cCE\u201d (Content Security), bem como as fun\u00e7\u00f5es de verifica\u00e7\u00e3o de permiss\u00f5es e valida\u00e7\u00e3o de dados.<\/p>\n<!-- AUTO_SYNCED_PATTERN_INSERT_START -->\n\r\n<div class=\"flex justify-between items-center flex-col lg:flex-row xl:flex-col 2xl:flex-row gap-6 sm:gap-8 rounded-lg border border-gray-200 dark:border-gray-700 p-4 mb-8 lg:mb-10 sm:p-6 bg-white dark:bg-gray-750 shadow-md transition-colors duration-300\"\r\n     data-link=\"https:\/\/www.likacloud.com\/pt\/tolink\/hosting-shared-hosting\/\">\r\n     \r\n  <div class=\"flex flex-col gap-3 gap-4 sm:gap-6 w-full\">\r\n    <strong class=\"text-2xl font-semibold text-gray-900 dark:text-gray-200\">\r\n      hospedagem compartilhada da hosting.com    <\/strong>\r\n    <div class=\"text-gray-600 dark:text-gray-300 word-word\">Alto desempenho com CPUs AMD EPYC, armazenamento SSD NVMe e LiteSpeed, suporte interno especializado 24 horas por dia, 7 dias por semana, medidas de seguran\u00e7a avan\u00e7adas, incluindo SSL, for\u00e7a bruta, malware e prote\u00e7\u00e3o contra DDoS, economia de at\u00e9 73%<\/div>\r\n  <\/div>\r\n\r\n  <div class=\"flex items-center flex-col md:flex-row lg:flex-col xl:flex-row 2xl:flex-col gap-6 shrink-0\">\r\n          <a href=\"https:\/\/www.likacloud.com\/pt\/tolink\/hosting-shared-hosting\/\">\r\n                  <img decoding=\"async\" src=\"https:\/\/www.likacloud.com\/wp-content\/uploads\/2025\/09\/20250901222940.svg\" alt=\"LOGOTIPO da hosting.com\" class=\"content-promotion-card-icon h-9 min-h-9 dark:hidden\" title=\"\">\r\n          <img decoding=\"async\" src=\"https:\/\/www.likacloud.com\/wp-content\/uploads\/2025\/12\/20251228220957.webp\" alt=\"LOGOTIPO da hosting.com\" class=\"content-promotion-card-icon h-9 min-h-9 hidden dark:block\" title=\"\">\r\n              <\/a>\r\n    \r\n    <a href=\"https:\/\/www.likacloud.com\/pt\/tolink\/hosting-shared-hosting\/\"\r\n       class=\"bg-blue-500 w-full md:w-auto lg:w-full xl:w-auto 2xl:w-full text-center !text-white dark:!text-gray-200 !px-5 !py-1.5 rounded-full hover:bg-blue-600 transition-colors\">\r\n       p\u00e1gina de acesso    <\/a>\r\n  <\/div>\r\n<\/div>\n<!-- AUTO_SYNCED_PATTERN_INSERT_END -->\n\n\n\n\n\n<p class=\"wp-block-paragraph\">A funcionalidade deste plugin \u00e9 relativamente simples, mas j\u00e1 o utilizamos ao gerar o c\u00f3digo HTML. <code data-no-auto-translation=\"\">esc_html__()<\/code> \u00c9 necess\u00e1rio realizar a escape dos dados. Se o plugin precisar processar os dados enviados pelo usu\u00e1rio, por exemplo, atrav\u00e9s de um formul\u00e1rio, ent\u00e3o a escape deve ser utilizada obrigatoriamente. <code data-no-auto-translation=\"\">sanitize_text_field()<\/code>, <code data-no-auto-translation=\"\">wp_kses_post()<\/code> Use fun\u00e7\u00f5es como essas para fazer a limpeza e, em seguida, aplique-as. <code data-no-auto-translation=\"\">wp_verify_nonce()<\/code> Vamos verificar a legitimidade do pedido.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Criar a p\u00e1gina de gerenciamento de plugins.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Um plugin maduro geralmente requer uma p\u00e1gina de configura\u00e7\u00e3o no backend. Vamos aprender como usar a API de configura\u00e7\u00f5es do WordPress para criar uma p\u00e1gina de gerenciamento simples e padr\u00e3o.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Adicionar o menu de configura\u00e7\u00f5es do plugin<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Primeiramente, precisamos adicionar uma nova p\u00e1gina de menu subordinado no menu \u201cConfigura\u00e7\u00f5es\u201d do backend do WordPress. Adicione um novo m\u00e9todo \u00e0 sua classe e, no construtor, utilize essa nova p\u00e1gina de menu para configurar as op\u00e7\u00f5es desejadas. <code data-no-auto-translation=\"\">add_action('admin_menu', ...)<\/code> O \u201cgancho\u201d (hook) o chama.<\/p>\n<!-- AUTO_INTERNAL_LINKS_START --><p>Leitura recomendada <a href=\"https:\/\/www.likacloud.com\/ja\/knowledge\/wordpress\/wordpress-plugin-development-beginner-guide-first-functional-plugin\/\">Guia de introdu\u00e7\u00e3o para iniciantes no desenvolvimento de plugins do WordPress: crie o seu primeiro plugin funcional do zero.<\/a>\u3002<\/p><!-- AUTO_INTERNAL_LINKS_END -->\n\n\n\n\n<pre class=\"wp-block-code\" data-no-auto-translation=\"\"><code class=\"language-php\" data-no-auto-translation=\"\">\/**\n * \u6ce8\u518c\u63d2\u4ef6\u7ba1\u7406\u9875\u9762\u3002\n *\/\npublic function register_admin_menu() {\n    add_options_page(\n        __( &#039;\u6211\u7684\u63d2\u4ef6\u8bbe\u7f6e&#039;, &#039;my-first-plugin&#039; ), \/\/ \u9875\u9762\u6807\u9898\n        __( &#039;\u6211\u7684\u7b2c\u4e00\u4e2a\u63d2\u4ef6&#039;, &#039;my-first-plugin&#039; ), \/\/ \u83dc\u5355\u6807\u9898\n        &#039;manage_options&#039;, \/\/ \u6240\u9700\u6743\u9650\n        &#039;mfp-settings&#039;, \/\/ \u83dc\u5355slug\n        array( $this, &#039;display_settings_page&#039; ) \/\/ \u663e\u793a\u9875\u9762\u7684\u56de\u8c03\u51fd\u6570\n    );\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Em seguida, adicione o seguinte no construtor:<code data-no-auto-translation=\"\">add_action( 'admin_menu', array( $this, 'register_admin_menu' ) );<\/code>\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Construir uma p\u00e1gina de configura\u00e7\u00f5es e campos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Em seguida, precisamos definir\u2026 <code data-no-auto-translation=\"\">display_settings_page<\/code> M\u00e9todo utilizado para renderizar o conte\u00fado HTML da p\u00e1gina de configura\u00e7\u00f5es e para registrar um campo de configura\u00e7\u00e3o utilizando a API de configura\u00e7\u00f5es.<\/p>\n<!-- AUTO_SYNCED_PATTERN_INSERT_START -->\n\r\n<div class=\"flex justify-between items-center flex-col lg:flex-row xl:flex-col 2xl:flex-row gap-6 sm:gap-8 rounded-lg border border-gray-200 dark:border-gray-700 p-4 mb-8 lg:mb-10 sm:p-6 bg-white dark:bg-gray-750 shadow-md transition-colors duration-300\"\r\n     data-link=\"https:\/\/www.likacloud.com\/pt\/tolink\/interserver-webhosting\/\">\r\n     \r\n  <div class=\"flex flex-col gap-3 gap-4 sm:gap-6 w-full\">\r\n    <strong class=\"text-2xl font-semibold text-gray-900 dark:text-gray-200\">\r\n      Hospedagem Compartilhada InterServer    <\/strong>\r\n    <div class=\"text-gray-600 dark:text-gray-300 word-word\">Hospedagem compartilhada $2.50 USD por m\u00eas, primeiro m\u00eas $0.1 USD c\u00f3digo promocional tryinterserver, 461 scripts de aplicativos em nuvem, instala\u00e7\u00e3o com um clique.<\/div>\r\n  <\/div>\r\n\r\n  <div class=\"flex items-center flex-col md:flex-row lg:flex-col xl:flex-row 2xl:flex-col gap-6 shrink-0\">\r\n          <a href=\"https:\/\/www.likacloud.com\/pt\/tolink\/interserver-webhosting\/\">\r\n                  <img decoding=\"async\" src=\"https:\/\/www.likacloud.com\/wp-content\/uploads\/2025\/12\/20251228045033.svg\" alt=\"Logo da InterServer\" class=\"content-promotion-card-icon h-9 min-h-9 dark:hidden\" title=\"\">\r\n          <img decoding=\"async\" src=\"https:\/\/www.likacloud.com\/wp-content\/uploads\/2025\/12\/20251229054830.webp\" alt=\"Logo da InterServer\" class=\"content-promotion-card-icon h-9 min-h-9 hidden dark:block\" title=\"\">\r\n              <\/a>\r\n    \r\n    <a href=\"https:\/\/www.likacloud.com\/pt\/tolink\/interserver-webhosting\/\"\r\n       class=\"bg-blue-500 w-full md:w-auto lg:w-full xl:w-auto 2xl:w-full text-center !text-white dark:!text-gray-200 !px-5 !py-1.5 rounded-full hover:bg-blue-600 transition-colors\">\r\n       p\u00e1gina de acesso    <\/a>\r\n  <\/div>\r\n<\/div>\n<!-- AUTO_SYNCED_PATTERN_INSERT_END -->\n\n\n\n\n\n<pre class=\"wp-block-code\" data-no-auto-translation=\"\"><code class=\"language-php\" data-no-auto-translation=\"\">**\n * Mostra a p&aacute;gina de configura&ccedil;&otilde;es do plugin.\n *\/\npublic function display_settings_page() {\n    ?&amp;gt;\n    &lt;div class=&quot;wrap&quot;&gt;\n        &lt;h1&gt;&lt;\/h1&gt;\n        &lt;form action=&quot;\/pt\/options.php\/&quot; method=&quot;post&quot; data-trp-original-action=&quot;options.php&quot;&gt;\n            \n        &lt;input type=&quot;hidden&quot; name=&quot;trp-form-language&quot; value=&quot;pt&quot;\/&gt;&lt;\/form&gt;\n    &lt;\/div&gt;\n    &lt;?php\n}\n\n\/**\n * \u521d\u59cb\u5316\u63d2\u4ef6\u8bbe\u7f6e\u3002\n *\/\npublic function initialize_settings() {\n    \/\/ \u6ce8\u518c\u4e00\u4e2a\u8bbe\u7f6e\n    register_setting(\n        &#039;mfp_settings_group&#039;, \/\/ \u8bbe\u7f6e\u7ec4\u540d\n        &#039;mfp_footer_text&#039;, \/\/ \u9009\u9879\u540d\n        array(\n            &#039;type&#039; =&gt; &#039;\\n&#039;string&#039;,\n            &#039;sanitize_callback&#039; =&amp;gt; &#039;sanitize_text_field&#039;, \/\/ Fun&ccedil;&atilde;o de limpeza de callback\n            &#039;default&#039; =&amp;gt; __( &#039;Obrigado por ler! Este artigo &eacute; apresentado por &ldquo;O Meu Primeiro Plugin&rdquo;.&#039;, &#039;my-first-plugin&#039; ),\n        )\n    );\n\n\/\/ Adicionar uma se&ccedil;&atilde;o de configura&ccedil;&otilde;es\n    add_settings_section(\n        &#039;mfp_main_section&#039;,\n        __( &#039;Configura&ccedil;&otilde;es principais&#039;, &#039;my-first-plugin&#039; ),\n        null, \/\/ Fun&ccedil;&atilde;o de descri&ccedil;&atilde;o da se&ccedil;&atilde;o opcional\n        &#039;mfp-settings&#039;\n    );\n\n\/\/ Adicionar um campo &agrave; se&ccedil;&atilde;o\n    add_settings_field(\n        &#039;mfp_footer_field&#039;,\n        __( &#039;Texto do rodap&eacute;&#039;, &#039;my-first-plugin&#039; ),\n        array( $this, &#039;render_footer_field&#039; ), \/\/ Fun&ccedil;&atilde;o de renderiza&ccedil;&atilde;o do campo\n        &#039;mfp-settings&#039;,\n        &#039;mfp_main_section&#039;,\n        array( &#039;label_for&#039; =&amp;gt; &#039;mfp_footer_text&#039; )\n    );\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea precisa definir\u2026 <code data-no-auto-translation=\"\">render_footer_field<\/code> Um m\u00e9todo para renderizar o campo de entrada real e atualizar o conte\u00fado anterior. <code data-no-auto-translation=\"\">add_footer_to_content<\/code> M\u00e9todo para que ele seja retirado das op\u00e7\u00f5es do banco de dados. <code data-no-auto-translation=\"\">get_option('mfp_footer_text')<\/code> Leia o texto a partir de um arquivo, em vez de usar strings hardcoded (predefinidas em c\u00f3digo). Por fim, adicione o seguinte no construtor:<code data-no-auto-translation=\"\">add_action( 'admin_init', array( $this, 'initialize_settings' ) );<\/code>\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">resumos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ao longo desta jornada, voc\u00ea construiu um plugin para o WordPress completamente funcional, partindo do zero. Apreendeu a criar a estrutura b\u00e1sica de um plugin, a usar ganchos de a\u00e7\u00f5es (actions) e filtros (filters) para expandir as funcionalidades do WordPress, a organizar o c\u00f3digo de forma orientada a objetos a fim de melhorar a qualidade, a seguir as melhores pr\u00e1ticas de seguran\u00e7a para verificar e escapolar dados, e a utilizar a API de configura\u00e7\u00f5es do WordPress para criar uma interface de gerenciamento de backend profissional.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O n\u00facleo do desenvolvimento de plugins reside no entendimento do sistema de ganchos (hooks) e do fluxo de dados do WordPress. Pratique continuamente, come\u00e7ando com funcionalidades simples, aumentando gradualmente a complexidade, e sempre priorize a seguran\u00e7a, o desempenho e a manutenibilidade. Com a acumula\u00e7\u00e3o de experi\u00eancia, voc\u00ea ser\u00e1 capaz de desenvolver plugins para o WordPress que sejam poderosos, profissionais e populares.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Perguntas frequentes Perguntas frequentes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Quais s\u00e3o as no\u00e7\u00f5es b\u00e1sicas necess\u00e1rias para desenvolver plugins para o WordPress?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea precisa ter conhecimentos s\u00f3lidos em programa\u00e7\u00e3o PHP, pois o plugin \u00e9 principalmente escrito em PHP. Al\u00e9m disso, \u00e9 necess\u00e1rio ter um entendimento b\u00e1sico de HTML, CSS e JavaScript, j\u00e1 que voc\u00ea precisar\u00e1 lidar com a exibi\u00e7\u00e3o e a intera\u00e7\u00e3o do lado cliente. O mais importante \u00e9 que voc\u00ea esteja familiarizado com os conceitos fundamentais do WordPress, como ganchos (a\u00e7\u00f5es e filtros), ciclos, estrutura de templates e opera\u00e7\u00f5es com o banco de dados (usando classes como WP_Query e WP_User_Query).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Como depurar e testar meu plugin?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Primeiramente, \u00e9 altamente recomendado desenvolver o projeto em um ambiente de desenvolvimento local (como o Local by Flywheel ou o XAMPP) ou em um site de teste online, a fim de evitar impactos no site em produ\u00e7\u00e3o. Ative o modo de depura\u00e7\u00e3o do WordPress no seu ambiente de desenvolvimento.<code data-no-auto-translation=\"\">wp-config.php<\/code>Configura\u00e7\u00f5es no arquivo<code data-no-auto-translation=\"\">define( &#039;WP_DEBUG&#039;, true );<\/code>Isso exibir\u00e1 os erros e avisos do PHP na tela. Use-o.<code data-no-auto-translation=\"\">error_log()<\/code>A fun\u00e7\u00e3o registra informa\u00e7\u00f5es de depura\u00e7\u00e3o personalizadas no log de erros do servidor. Para uma depura\u00e7\u00e3o mais avan\u00e7ada, voc\u00ea pode considerar o uso de plugins de depura\u00e7\u00e3o profissionais, como o Query Monitor ou o Debug Bar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Como meu plugin pode ser compat\u00edvel com diferentes vers\u00f5es do WordPress?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Durante o desenvolvimento, \u00e9 importante prestar aten\u00e7\u00e3o \u00e0s notifica\u00e7\u00f5es sobre fun\u00e7\u00f5es descontinuadas presentes nos documentos oficiais do WordPress. Evite usar fun\u00e7\u00f5es que tenham sido marcadas como \u201cdescontinuadas\u201d. No arquivo principal do plugin, isso pode ser feito atrav\u00e9s de\u2026<code data-no-auto-translation=\"\">Requires at least<\/code>e<code data-no-auto-translation=\"\">Tested up to<\/code>Use as informa\u00e7\u00f5es de cabe\u00e7alho para declarar a vers\u00e3o do WordPress com a qual o seu plugin \u00e9 compat\u00edvel. Teste seu plugin regularmente em vers\u00f5es mais recentes do WordPress e acompanhe o log de atualiza\u00e7\u00f5es do core (o software principal do WordPress) para poder ajustar o c\u00f3digo a tempo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Como publicar meu plugin no diret\u00f3rio oficial de plugins do WordPress?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Primeiramente, voc\u00ea precisa garantir que o seu plugin esteja em total conformidade com as especifica\u00e7\u00f5es oficiais de desenvolvimento de plugins e com as diretrizes de envio. Isso inclui a qualidade do c\u00f3digo, a seguran\u00e7a, o acordo de licen\u00e7a (que deve ser a GPLv2 ou uma vers\u00e3o mais recente), entre outros aspectos. Em seguida, solicite um reposit\u00f3rio SVN no WordPress.org. Envie o c\u00f3digo do seu plugin para esse reposit\u00f3rio SVN.<code data-no-auto-translation=\"\">trunk<\/code>No diret\u00f3rio, crie os arquivos correspondentes.<code data-no-auto-translation=\"\">readme.txt<\/code>O arquivo deve seguir um formato espec\u00edfico. Ap\u00f3s a aprova\u00e7\u00e3o, seu plugin ser\u00e1 adicionado ao diret\u00f3rio oficial.<\/p>","protected":false},"excerpt":{"rendered":"<p>Este artigo apresenta os valores centrais e os passos iniciais para o desenvolvimento de plugins para o WordPress. Primeiramente, explica a import\u00e2ncia do desenvolvimento de plugins personalizados para a expans\u00e3o de funcionalidades e a manuten\u00e7\u00e3o do c\u00f3digo. Em seguida, atrav\u00e9s de um exemplo concreto, guia os leitores na cria\u00e7\u00e3o do arquivo principal do plugin e no uso do filtro `the_content` para adicionar texto no final dos artigos. Por fim, destaca a import\u00e2ncia da reestrutura\u00e7\u00e3o do c\u00f3digo utilizando programa\u00e7\u00e3o orientada a objetos e da ades\u00e3o a pr\u00e1ticas de seguran\u00e7a, fornecendo um caminho claro para iniciantes no desenvolvimento de plugins.<\/p>","protected":false},"author":7,"featured_media":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"tags":[2026,2416,1978,1934,1967],"knowledge_category":[280],"class_list":["post-12369093","knowledge_post","type-knowledge_post","status-publish","hentry","tag-php-programming","tag-wordpress-development-tutorial","tag-wordpress-plugin-development","tag-wordpress-hooks","tag-custom-plugins","knowledge_category-wordpress"],"acf":{"site_seo_keywords":"WordPress\u63d2\u4ef6\u5f00\u53d1,\u81ea\u5b9a\u4e49\u63d2\u4ef6,WordPress\u5f00\u53d1\u6559\u7a0b,\u63d2\u4ef6\u5f00\u53d1\u5165\u95e8,\u94a9\u5b50\u7cfb\u7edf,\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b,WordPress\u5b89\u5168,\u4ece\u96f6\u5f00\u59cb\u5efa\u63d2\u4ef6"},"_links":{"self":[{"href":"https:\/\/www.likacloud.com\/pt\/wp-json\/wp\/v2\/knowledge_posts\/12369093","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.likacloud.com\/pt\/wp-json\/wp\/v2\/knowledge_posts"}],"about":[{"href":"https:\/\/www.likacloud.com\/pt\/wp-json\/wp\/v2\/types\/knowledge_post"}],"author":[{"embeddable":true,"href":"https:\/\/www.likacloud.com\/pt\/wp-json\/wp\/v2\/users\/7"}],"version-history":[{"count":1,"href":"https:\/\/www.likacloud.com\/pt\/wp-json\/wp\/v2\/knowledge_posts\/12369093\/revisions"}],"predecessor-version":[{"id":12404182,"href":"https:\/\/www.likacloud.com\/pt\/wp-json\/wp\/v2\/knowledge_posts\/12369093\/revisions\/12404182"}],"wp:attachment":[{"href":"https:\/\/www.likacloud.com\/pt\/wp-json\/wp\/v2\/media?parent=12369093"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.likacloud.com\/pt\/wp-json\/wp\/v2\/tags?post=12369093"},{"taxonomy":"knowledge_category","embeddable":true,"href":"https:\/\/www.likacloud.com\/pt\/wp-json\/wp\/v2\/knowledge_category?post=12369093"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}