{"id":3258,"date":"2025-10-06T16:09:25","date_gmt":"2025-10-06T14:09:25","guid":{"rendered":"https:\/\/tecnologia.euroinnova.com\/aprende-a-crear-un-plugin-de-wordpress-paso-a-paso\/"},"modified":"2025-10-07T14:52:23","modified_gmt":"2025-10-07T12:52:23","slug":"crear-plugin-wordpress","status":"publish","type":"post","link":"https:\/\/tecnologia.euroinnova.com\/en\/crear-plugin-wordpress","title":{"rendered":"Learn how to create a WordPress plugin step-by-step"},"content":{"rendered":"<p><strong>WordPress<\/strong> es uno de los gestores de contenido (CMS) m\u00e1s populares del mercado. Todo el mundo parece conocer esta herramienta, que incluye una enorme colecci\u00f3n de plugins. \u00bfPero <strong>qu\u00e9 es un plugin de WordPress<\/strong>? B\u00e1sicamente, completan funcionalidades personalizadas a tu web para mejorar su calidad. Eso s\u00ed, con ellos no tienes que tocar el c\u00f3digo, ya que vienen configurados de f\u00e1brica.<\/p>\n<p>Sin embargo, puede ser que haya una funcionalidad importante para ti que ning\u00fan plugin sea capaz de realizar. \u00bfPuedes <strong>crear un plugin de WordPress<\/strong> tu mismo? Por supuesto, aunque debes tener en cuenta una serie de pr\u00e1cticas y normas para no perder la cabeza en el intento.<\/p>\n<p>\u00bfEst\u00e1s preparado? \u00a1Comenzamos!<\/p>\n<h2 id=\"checklist-con-lo-que-necesitaras-para-crear-un-plugin-en-wordpress\"><strong>Checklist con lo que necesitar\u00e1s para crear un plugin en WordPress<\/strong><\/h2>\n<p>Lo primero que vas a necesitar es un editor de texto para escribir el <strong>c\u00f3digo del plugin<\/strong>, como, por ejemplo, <strong>Notepad ++<\/strong> o <strong>Atom.<\/strong> Aqu\u00ed escribir\u00e1s todo el c\u00f3digo, pero, antes, tendr\u00e1s que aprender a <strong>conectar Notepad ++ con tu servidor FTP.<\/strong> Inmediatamente despu\u00e9s deber\u00e1s configurar tu cliente FTP para subir el archivo del plugin a tu web.<\/p>\n<p>Paralelamente tendr\u00e1s que comprobar que <strong>tu versi\u00f3n instalada de WordPress est\u00e1 actualizada<\/strong>, adem\u00e1s de completar una copia de seguridad que garantice que ante cualquier error o contratiempo, podr\u00e1s salvar tus datos y restaurar todo de nuevo.<\/p>\n<p>Una alternativa para probar tu plugin <strong>sin ning\u00fan tipo de peligro<\/strong> es instalando WordPress de manera local. As\u00ed, podr\u00e1s no tener un sitio web con un dominio y un hosting para realizar pruebas, de manera que, lo que vayas implementando, no afecte de manera directa a los usuarios.<\/p>\n<p>Por \u00faltimo, y m\u00e1s importante, debes tener unos <strong>conocimientos b\u00e1sicos de PHP<\/strong> para, por ejemplo, escribir una funci\u00f3n personalizada o llamar a funciones del n\u00facleo de WordPress. Si no conoces nada sobre PHP, es el momento de pasar a la acci\u00f3n con nuestra formaci\u00f3n espec\u00edfica en PHP.<\/p>\n<h2 id=\"diferencia-entre-un-plugin-y-un-tema-de-wordpress\"><strong>Diferencia entre un plugin y un tema de WordPress<\/strong><\/h2>\n<p>Tanto los <strong>temas<\/strong> como los <strong>plugins<\/strong> pueden cambiar alguna funcionalidad de tu sitio web, sin embargo, cuentan con una gran diferencia.<\/p>\n<p>Por un lado, los <strong>temas de WordPress<\/strong> tienen un <strong>archivo functions.php<\/strong>, dentro de la carpeta <strong>\/wp-includes\/<\/strong>, cuya funci\u00f3n es poder a\u00f1adir nuevas funcionalidades, cambiando el c\u00f3digo. \u00bfCu\u00e1l es el problema? Que si desactivas dicho tema o realizas una actualizaci\u00f3n, se sobrescribir\u00e1 el archivo functions.php, lo que implica volver a personalizar el c\u00f3digo.<\/p>\n<p>Por eso, no es recomendable implementar peque\u00f1os cambios desde el tema, sino desde un <strong>plugin de WordPress.<\/strong> \u00bfPor qu\u00e9? Porque puedes a\u00f1adir plugins desde cualquier instalaci\u00f3n de WordPress. No van a sufrir ning\u00fan tipo de modificaci\u00f3n o van a dejar de funcionar, aunque cambies de tema. No habr\u00e1 nada que sobrescriba las <strong>funciones del plugin<\/strong>, lo que lo convierte en una incre\u00edble opci\u00f3n para alteraciones leves.<\/p>\n<h2 id=\"aprendiendo-que-son-los-hooks-de-wordpress\"><strong>Aprendiendo qu\u00e9 son los hooks de WordPress<\/strong><\/h2>\n<p>Antes de avanzar y explicar c\u00f3mo <strong>desarrollar un plugin en WordPress,<\/strong> creemos que es importante que conozcas <strong>qu\u00e9 son los hooks.<\/strong> Y bien, estos <strong>hooks de WordPress<\/strong> se pueden definir como puntos espec\u00edficos dentro del sistema que permiten modificar o agregar funcionalidades sin la necesidad de tocar el c\u00f3digo base.<\/p>\n<p>Imag\u00ednate que WordPress es una gran m\u00e1quina en la que los hooks son peque\u00f1os botones que, al presionarlos, alteran el comportamiento de dicha m\u00e1quina. Lo realmente positivo de los hooks de WordPress es que puedes <strong>personalizar tu sitio web sin correr el riesgo de romperlo<\/strong> y tener problemas serios de cara al futuro.<\/p>\n<p>En resumen, un <strong>hook<\/strong> engancha tu propio c\u00f3digo a una parte espec\u00edfica del ciclo de vida de <strong>WordPress.<\/strong> Por ejemplo, t\u00fa puedes usar un hook para mostrar contenido extra despu\u00e9s de cada post o para modificar c\u00f3mo se muestra el t\u00edtulo de una entrada. Sin duda, la gran ventaja de WordPress es que ya te proporciona montones de hooks para hacer cualquier cosa que tengas en mente.<\/p>\n<p>Ahora bien, existen <strong>dos tipos principales de hooks<\/strong>: los action hooks (acciones) y los filtes hooks (filtros). \u00a1Vamos a verlos!<\/p>\n<h3 id=\"hooks-de-accion\"><strong>Hooks de acci\u00f3n<\/strong><\/h3>\n<p>Los <strong>hooks de acci\u00f3n<\/strong>, o <strong>action hooks<\/strong>, son puntos en el flujo de ejecuci\u00f3n de WordPress que permiten que tu c\u00f3digo se ejecute en un monto particular, sin alternar el flujo general del sitio web. Un ejemplo claro de acci\u00f3n es <strong>wp_footer<\/strong>, que se ejecuta justo antes de que WordPress termine de cargar la p\u00e1gina, permiti\u00e9ndote agregar contenido en el <strong>pie de p\u00e1gina<\/strong>, o footer, sin tener que incorporar cambios en la plantilla.<\/p>\n<p>Otro <strong>ejemplo de hook<\/strong> de acci\u00f3n es <strong>init<\/strong>, que se ejecuta cuando WordPress termin\u00f3 de cargar completamente la p\u00e1gina y est\u00e1 listo. Por norma general, se usa este hook para inicializar tus propios scripts o plugins.<\/p>\n<p><strong>\u00bfC\u00f3mo se estructura un hook de acci\u00f3n?<\/strong> Es muy sencillo, ya que tan solo debes de definir la funci\u00f3n con el c\u00f3digo que prefieras y luego enganchas esa funci\u00f3n a un hook espec\u00edfico usando <strong>add_action()<\/strong>. Aqu\u00ed te mostramos un ejemplo:<\/p>\n<p><em>function mi_funcion_personalizada() { <\/em><\/p>\n<p><em>echo &#8216;\u00a1Hola desde el footer!&#8217;; <\/em><\/p>\n<p><em>} <\/em><\/p>\n<p><em>add_action(&#8216;wp_footer&#8217;, &#8216;mi_funcion_personalizada&#8217;);<\/em><\/p>\n<p>Este c\u00f3digo, b\u00e1sicamente, permite que en el <strong>pie de p\u00e1gina<\/strong> de tus p\u00e1ginas aparezca la frase \u201c\u00a1Hola desde el footer!\u201d.<\/p>\n<h3 id=\"hooks-de-filtro\"><strong>Hooks de filtro<\/strong><\/h3>\n<p>Los <strong>hooks de filtro<\/strong> se centran en modificar datos antes de que estos sean mostrados o guardadas. Por ello, podemos concluir que ejecutan un c\u00f3digo en un momento espec\u00edfico, estando dise\u00f1ados para interceptar y cambiar informaci\u00f3n en su trayecto.<\/p>\n<p>Vamos a poner un ejemplo: imagina que quieres cambiar el t\u00edtulo de tus entradas antes de que se muestren en la p\u00e1gina. Pues bien, con un <strong>hook de filtro<\/strong> como <strong>the_title<\/strong> conseguir\u00edas capturar este valor, modificarlo y devolverlo actualizado. De esta manera puedes personalizar cualquier cosa en WordPress, as\u00ed que apunto estos hooks de filtro.<\/p>\n<p>Mira este ejemplo:<\/p>\n<p><em>function cambiar_titulo($titulo) { <\/em><\/p>\n<p><em>return &#8216;\u00a1T\u00edtulo modificado: &#8216; . $titulo . &#8216;!&#8217;;<\/em><\/p>\n<p><em>\u00a0} <\/em><\/p>\n<p><em>add_filter(&#8216;the_title&#8217;, &#8216;cambiar_titulo&#8217;);<\/em><\/p>\n<p>Aqu\u00ed, le estamos diciendo que cada vez que muestre un t\u00edtulo de post, aplique este filtro y muestro \u201c\u00a1T\u00edtulo modificado: [t\u00edtulo original]!\u201d.<\/p>\n<h2 id=\"crear-un-plugin-en-wordpress-paso-a-paso\"><strong>Crear un plugin en WordPress: paso a paso<\/strong><\/h2>\n<p>Ahora s\u00ed, vamos a entrar de lleno a explicarte de manera detallada <strong>c\u00f3mo puedes crear un plugin en WordPress.<\/strong><\/p>\n<h3 id=\"crea-una-carpeta-para-tu-plugin\"><strong>Crea una carpeta para tu plugin<\/strong><\/h3>\n<p>Aunque parezca obvio, necesitas un lugar en el que almacenar tu plugin de WordPress. Por ello, es necesario que vayas a la carpeta donde tienes instalada tu copia de WordPress. All\u00ed, busca la <strong>carpeta wp-content<\/strong> y, dentro de ella, vete hasta otra llamada <strong>plugins.<\/strong><\/p>\n<p>Guarda esta ruta en tu cabeza porque es donde tendr\u00e1s que crear una nueva carpeta para cada uno de tus plugins personalizadas. Nunca olvides de <strong>nombrar cada nueva carpeta<\/strong> de manera concreta. Por ejemplo, si vas a crear un plugin para una funcionalidad de contacto, lo podr\u00edas llamar <strong>plugin-formulario-contacto.<\/strong><\/p>\n<p>Nombrar de manera muy concreta no es un paso que te puedas saltar, ya que en esta carpeta vas a tener todos tus plugins, lo que puede ser algo lioso. Por ello, ten ordenada esta carpeta para identificar y poder gestionar con rapidez los distintos archivos.<\/p>\n<h3 id=\"crea-tu-primer-archivo\"><strong>Crea tu primer archivo<\/strong><\/h3>\n<p>Imagina que ya tienes la carpeta para tu plugin personalizado creada. Ahora, ser\u00eda el momento de <strong>crear tu primer archivo<\/strong>, para lo que debes tener en cuenta que cada plugin necesita de un archivo principal. En este ir\u00e1s agregando el c\u00f3digo necesario.<\/p>\n<p>As\u00ed, crea un archivo en tu carpeta y n\u00f3mbralo de manera descriptiva, como, por ejemplo, <strong>formulario-contacto.php.<\/strong> Dentro de este archivo, no te olvides de colocar siempre una cabecera especial para que WordPress reconozca tu plugin. Aqu\u00ed te damos un ejemplo:<\/p>\n<p><em>&lt;?php <\/em><\/p>\n<p><em>\/* <\/em><\/p>\n<p><em>Plugin Name: Formulario de Contacto <\/em><\/p>\n<p><em>Description: Un plugin simple para a\u00f1adir un formulario de contacto\u00a0<\/em><\/p>\n<p><em>Version: 1.0 <\/em><\/p>\n<p><em>Author: Tu Nombre\u00a0<\/em><\/p>\n<p><em>*\/<\/em><\/p>\n<p>Esto te sirve para ir hasta el <strong>panel de administraci\u00f3n de WordPress<\/strong> y encontrarte el tuyo en la lista, aunque todav\u00eda no contenga ninguna funcionalidad.<\/p>\n<h3 id=\"manos-a-la-obra-escribe-las-funciones-de-tu-plugin\"><strong>\u00a1Manos a la obra! Escribe las funciones de tu plugin<\/strong><\/h3>\n<p>Llegamos al momento en el que tienes que <strong>a\u00f1adir funciones de WordPress a tu plugin.<\/strong> \u00bfPero qu\u00e9 son las funciones? B\u00e1sicamente, son bloques de c\u00f3digo que realizar tareas espec\u00edficas, siendo la parte esencial de un plugin.<\/p>\n<p>Siguiendo con el ejemplo del formulario de contacto, podr\u00eda ser algo as\u00ed:<\/p>\n<p><em>function mostrar_formulario_contacto() {<\/em><\/p>\n<p><em>\u00a0echo &#8216;&lt;form action=\u00bb\u00bb method=\u00bbpost\u00bb&gt;<\/em><\/p>\n<p><em>&lt;label for=\u00bbnombre\u00bb&gt;Nombre:&lt;\/label&gt;<\/em><\/p>\n<p><em>&lt;input type=\u00bbtext\u00bb name=\u00bbnombre\u00bb id=\u00bbnombre\u00bb required&gt; <\/em><\/p>\n<p><em>&lt;input type=\u00bbsubmit\u00bb value=\u00bbEnviar\u00bb&gt; &lt;\/form&gt;&#8217;; <\/em><\/p>\n<p><em>}<\/em><\/p>\n<p>Aqu\u00ed hemos creado una funci\u00f3n que genera un formulario de contacto cuando es llamada. \u00bfPero cu\u00e1ndo es llamada? A trav\u00e9s de un hook. En este caso, podr\u00edamos usar el <strong>hook the_content<\/strong> para que tu formulario apareciese as\u00ed:<\/p>\n<p><em>add_filter(&#8216;the_content&#8217;, &#8216;mostrar_formulario_contacto&#8217;);<\/em><\/p>\n<h3 id=\"ultimo-paso-crear-la-pagina-de-administracion\"><strong>\u00daltimo paso: crear la p\u00e1gina de administraci\u00f3n<\/strong><\/h3>\n<p>Un plugin puede tener su propia p\u00e1gina dentro del panel de administraci\u00f3n de WordPress. Esto ocurre, sobre todo, en estos plugins que necesitan opciones de configuraci\u00f3n. Por ello, te vamos a mostrar c\u00f3mo puedes crear la <strong>p\u00e1gina de administraci\u00f3n<\/strong> para tu plugin.<\/p>\n<p>Lo primero: usar la funci\u00f3n <strong>add_menu_page()<\/strong> de WordPress, que te permite agregar un nuevo \u00edtem en el men\u00fa del panel de control. Este ser\u00eda el ejemplo:<\/p>\n<p><em>function agregar_menu_administracion() {<\/em><\/p>\n<p><em>\u00a0add_menu_page( &#8216;Formulario de Contacto&#8217;, <\/em><em>\/\/ T\u00edtulo de la p\u00e1gina <\/em><\/p>\n<p><em>&#8216;Contacto&#8217;, \/\/ Texto del men\u00fa &#8216;<\/em><\/p>\n<p><em>manage_options&#8217;, \/\/ Capacidad de usuario <\/em><\/p>\n<p><em>&#8216;formulario-contacto&#8217;, \/\/ Slug \u00fanico <\/em><\/p>\n<p><em>&#8216;mostrar_pagina_admin&#8217;, \/\/ Funci\u00f3n que mostrar\u00e1 el contenido <\/em><\/p>\n<p><em>\u00bb, \/\/ Icono (opcional) <\/em><\/p>\n<p><em>6 \/\/ Posici\u00f3n en el men\u00fa <\/em><\/p>\n<p><em>); <\/em><\/p>\n<p><em>} <\/em><\/p>\n<p><em>add_action(&#8216;admin_menu&#8217;, &#8216;agregar_menu_administracion&#8217;);<\/em><\/p>\n<p>Ya sabemos que contamos con un elemento llamado \u201cContacto\u201d en el men\u00fa de administraci\u00f3n. Sin embargo, ahora puedes personalizarlo a trav\u00e9s de la funci\u00f3n <strong>mostrar_pagina_admin(),<\/strong> en la que puedes poner todo lo que necesites. Por ejemplo:<\/p>\n<p><em>function mostrar_pagina_admin() { <\/em><\/p>\n<p><em>echo &#8216;&lt;h1&gt;Configuraci\u00f3n del Formulario de Contacto&lt;\/h1&gt;&#8217;;<\/em><\/p>\n<p><em>echo &#8216;&lt;form method=\u00bbpost\u00bb action=\u00bboptions.php\u00bb&gt;&#8217;;<\/em><\/p>\n<p><em>\/\/ Aqu\u00ed ir\u00e1n los campos de tu formulario <\/em><\/p>\n<p><em>echo &#8216;&lt;\/form&gt;&#8217;; <\/em><\/p>\n<p><em>}<\/em><\/p>\n<h2 id=\"practicas-a-tener-en-cuenta-al-crear-plugins-personalizados\"><strong>Pr\u00e1cticas a tener en cuenta al crear plugins personalizados<\/strong><\/h2>\n<p>Para terminar este post, te queremos acercar algunas de las <strong>mejores pr\u00e1cticas de codificaci\u00f3n y desarrollo de plugins.<\/strong> Al fina, se trata de una serie de consejos que te pueden ahorrar mucho tiempo a la hora de crear un plugin en WordPress:<\/p>\n<ul>\n<li>Prueba tus plugins en un <strong>entorno de staging<\/strong> para que rompas tu sitio web.<\/li>\n<li><strong>Cuida la estructura de carpetas,<\/strong> usando la l\u00f3gica: crea subcarpetas para cada funcionalidad y divide el c\u00f3digo en archivos separados.<\/li>\n<li>Nombra cada archivo, carpeta y elemento con mucho cuidado.<\/li>\n<li><strong>A\u00f1adir comentarios<\/strong> te permite adelantarte a los problemas del futuro.<\/li>\n<li><strong>Crea documentaci\u00f3n<\/strong> que ayude a entender tu plugin.<\/li>\n<li>Consulta el <strong>Codex de WordPress<\/strong> para interiorizar las normas de codificaci\u00f3n espec\u00edficas del idioma.<\/li>\n<li>Usa una herramienta de depuraci\u00f3n cuando <strong>desarrolles plugins,<\/strong> lo que har\u00e1 que encuentres cualquier error de manera r\u00e1pida.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>WordPress es uno de los gestores de contenido (CMS) m\u00e1s populares del mercado. Todo el mundo parece conocer esta herramienta, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":869,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-3258","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sin-categorizar"],"acf":[],"_links":{"self":[{"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/posts\/3258","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/comments?post=3258"}],"version-history":[{"count":0,"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/posts\/3258\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/media\/869"}],"wp:attachment":[{"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/media?parent=3258"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/categories?post=3258"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/tags?post=3258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}