Guía definitiva para el desarrollo de plugins para WordPress: Crea tu primer plugin desde cero

Lectura en 3 minutos
2026-03-15
2026-06-04
2,362
Gano comisiones cuando compras a través de los enlaces de abajo, sin coste adicional para ti.

Preparación y configuración del entorno.

Antes de comenzar a escribir código, necesitas un entorno de desarrollo adecuado. Esto incluye una instalación local de WordPress, un editor de código y conocimientos básicos de PHP. Se recomienda utilizar XAMPP, MAMP o Local by Flywheel para configurar rápidamente un entorno local de WordPress. Asegúrate de que tu versión de PHP cumpla con los requisitos oficiales de WordPress, que suelen ser PHP 7.4 o una versión más reciente.

Un plugin es, en esencia, uno o más archivos PHP que se colocan en el sistema de WordPress.wp-content/pluginsEn el directorio, cada plugin debe tener un nombre único, y la cabecera de su archivo principal debe contener las anotaciones de información estándar del plugin. Estas anotaciones son la base para que WordPress reconozca y maneje los plugins.

Crea tu primer archivo de plugin.

En primer lugar, enwp-content/pluginsCree una nueva carpeta dentro del directorio, por ejemplo…my-first-pluginLuego, dentro de esa carpeta, cree el archivo principal de PHP, que suele tener el mismo nombre que la carpeta en sí.my-first-plugin.phpEn este archivo, necesitas escribir la información de la cabecera del plugin.

Lecturas recomendadas Guía completa para el desarrollo de complementos de WordPress: desde cero hasta crear tu primer complemento

<?php
/**
 * Plugin Name:       我的第一个插件
 * Plugin URI:        https://example.com/my-first-plugin
 * Description:       这是一个学习WordPress插件开发的示例插件。
 * Version:           1.0.0
 * Author:            你的名字
 * Author URI:        https://example.com
 * License:           GPL v2 or later
 * Text Domain:       my-first-plugin
 */

Después de guardar el archivo, accede a la página de “Plugins” en el panel de administración de WordPress. Deberías ver que “Mi primer plugin” aparece en la lista de plugins. Actívalo; aunque aún no tiene ninguna función, esto significa que tu plugin ha sido cargado con éxito en WordPress.

Servidor de WordPress de UltaHost
Garantía de reembolso en 30 días, ancho de banda ilimitado y bases de datos, protección gratuita contra ataques DDoS; descuento del 50% al comprar por 3 años (versiones de 4 TB y 5 TB).

Comprender los mecanismos centrales de WordPress: los ganchos (hooks) y los filtros (filters)

La gran capacidad de expansión de WordPress se debe a su arquitectura basada en eventos, cuyo núcleo son los “ganchos” (Hooks). Los ganchos se dividen en dos tipos: Acciones (Actions) y Filtros (Filters). Comprender su funcionamiento es clave para desarrollar plugins de manera efectiva.

Los ganchos de acción (action hooks) te permiten insertar y ejecutar tu propio código en momentos específicos, como cuando se publica un artículo o se carga una página. Por ejemplo, puedes enviar un correo electrónico al momento en que se publica un artículo. Puedes utilizarlos para realizar tareas automatizadas.add_action()La función monta tu función personalizada en el gancho de acción especificado.

Los ganchos de filtro te permiten modificar los datos. Antes de que estos sean utilizados (por ejemplo, al guardarlos en una base de datos o mostrarlos en un navegador), puedes interceptarlos y modificarlos. Por ejemplo, puedes cambiar el título de un artículo o el contenido de un comentario. Puedes utilizar estos ganchos para realizar cualquier tipo de ajuste que necesites.add_filter()Se utiliza una función para aplicar el filtro.

Usar ganchos de acción para agregar funcionalidades.

Supongamos que queremos agregar una línea de texto personalizado en el pie de página de la página de administración del sitio web. WordPress proporciona una función llamada…admin_footerEs un gancho de acción (action hook). Podemos agregar el siguiente código en el archivo principal del plugin:

Lecturas recomendadas Guía para principiantes en el desarrollo de complementos de WordPress: crea tu primer complemento funcional desde cero.

// 定义一个在管理后台页脚显示信息的函数
function myplugin_display_admin_footer_text() {
    echo '<p>¡Gracias por utilizar “Mi primer plugin”!</p>';
}
// 将函数挂载到 admin_footer 动作钩子
add_action( 'admin_footer', 'myplugin_display_admin_footer_text' );

Guarda el archivo y actualiza la página del backend de WordPress. Desplázate hacia la parte inferior de la página; deberías poder ver el texto que has añadido. Esta es la aplicación básica de los “ganchos de acción” (action hooks): permiten ejecutar código en posiciones específicas del sitio web.

Modificar el contenido utilizando filtros.

Ahora, intentemos modificar los títulos de todos los artículos y agregar un símbolo de marca al final de cada título de manera uniforme. Podemos utilizar…the_titleFiltros.

// 定义一个修改文章标题的函数
function myplugin_modify_post_title( $title, $post_id ) {
    // 确保只在主循环且非管理后台中修改
    if ( ! is_admin() && in_the_loop() ) {
        $title = $title . ' ™';
    }
    return $title;
}
// 将函数挂载到 the_title 过滤器钩子,参数2表示接受2个参数
add_filter( 'the_title', 'myplugin_modify_post_title', 10, 2 );

Este código verifica si el entorno actual se encuentra dentro del ciclo principal de generación de artículos en la interfaz frontal. Si es así, añade el símbolo “™” después del título.10Se trata de una cuestión de prioridad: cuanto menor es el número, más rápido se ejecuta la acción correspondiente.2Esto indica que nuestra función acepta dos parámetros (los originales).$titleY$post_id)。

hosting.com Alojamiento compartido
Alto rendimiento con CPU AMD EPYC, almacenamiento SSD NVMe y LiteSpeed, asistencia interna de expertos 24 horas al día, 7 días a la semana, medidas de seguridad avanzadas como SSL, fuerza bruta, protección contra malware y DDoS, ahorro de hasta 73%.

Desarrollo de funciones para plugins: Creación de menús de administración y páginas de configuración

Un plugin maduro suele necesitar ofrecer opciones de configuración en el backend de WordPress. Esto implica crear una página de menú de administración exclusiva para el plugin. WordPress proporciona una amplia gama de funciones de API para realizar esta función.add_menu_page()Yadd_options_page()

Añadir menú de administración de nivel superior

Vamos a agregar un menú principal independiente para el plugin. Esto suele hacerse en…admin_menuSe completó en los ganchos de acción (action hooks). Crearemos una función para definir el menú y las páginas.

// 定义添加管理菜单的函数
function myplugin_add_admin_menu() {
    add_menu_page(
        '我的插件设置',           // 页面标题
        '我的插件',               // 菜单标题
        'manage_options',         // 所需权限(管理员)
        'myplugin-settings-page', // 菜单slug(唯一标识)
        'myplugin_display_settings_page', // 用于显示页面内容的回调函数
        'dashicons-admin-generic', // 菜单图标(Dashicons)
        30                        // 菜单位置
    );
}
// 将函数挂载到 admin_menu 钩子
add_action( ‘admin_menu’, ‘myplugin_add_admin_menu’ );

A continuación, necesitamos definir la función de callback.myplugin_display_settings_page()Para renderizar el contenido HTML de la página de configuración.

Lecturas recomendadas Desarrollo de plugins para WordPress: Desde los principios hasta la maestría: Una guía completa para crear funciones personalizadas

// 定义设置页面的显示内容
function myplugin_display_settings_page() {
    ?&gt;
    <div class="wrap">
        <h1>Configuraciones de mi plugin</h1>
        <form method="post" action="/es/options.php/" data-trp-original-action="options.php">
            <?php
            // 输出设置字段、安全nonce等
            settings_fields( ‘myplugin_settings_group’ );
            do_settings_sections( ‘myplugin-settings-page’ );
            submit_button();
            ?>
        <input type="hidden" name="trp-form-language" value="es"/></form>
    </div>
    ¿php?  
}

Configuraciones de registro, campos y particiones

Para manejar los datos de los formularios de manera segura, necesitamos utilizar la API de configuraciones de WordPress. Esto implica registrar nuevas configuraciones, agregar secciones y campos de configuración.

// 初始化插件设置
function myplugin_settings_init() {
    // 1. 注册一个设置(存储在wp_options表中)
    register_setting(
        ‘myplugin_settings_group’, // 设置组名,与 settings_fields() 对应
        ‘myplugin_options’ // 存储在数据库中的选项名
    );

// 2. 添加一个设置分区
    add_settings_section(
        ‘myplugin_section_basic’, // 分区ID
        ‘基础设置’, // 分区标题
        ‘myplugin_section_basic_callback’, // 分区介绍的回调函数
        ‘myplugin-settings-page’ // 所属页面的slug
    );

// 3. 为分区添加一个字段
    add_settings_field(
        ‘myplugin_field_message’, // 字段ID
        ‘欢迎信息’, // 字段标签
        ‘myplugin_field_message_callback’, // 渲染字段HTML的回调函数
        ‘myplugin-settings-page’, // 所属页面的slug
        ‘myplugin_section_basic’ // 所属分区的ID
    );
}
add_action( ‘admin_init’, ‘myplugin_settings_init’ );

// 分区介绍的回调函数
function myplugin_section_basic_callback() {
    echo ‘<p>Configurar la información básica del plugin.</p>’;
}

// 字段渲染的回调函数
function myplugin_field_message_callback() {
    // 从数据库获取现有值
    $options = get_option( ‘myplugin_options’ );
    $value = $options[‘message’] ?? ‘’; // PHP 7.0+ 空合并运算符
    // 输出输入框
    echo ‘<input type="“text”" name="“myplugin_options[message]”" value="“‘" . esc_attr( $value ) ‘” class ="“regular-text”" />‘;
}

Ahora, tu plugin cuenta con una página de configuración administrativa completa y que cumple con los estándares de WordPress, lo que permite guardar y leer las opciones de configuración de manera segura.

Alojamiento compartido InterServer
Alojamiento compartido $2.50 USD al mes , primer mes $0.1 USD código promocional tryinterserver, 461 scripts de aplicaciones en la nube, instalación en un clic.

Mejores prácticas para la internacionalización y la seguridad de plugins

Para que tu plugin sea utilizado por usuarios de todo el mundo, la internacionalización (i18n) es un paso esencial. Al mismo tiempo, seguir las normas de seguridad es la base para proteger tanto a ti como a los sitios web de tus usuarios de ataques.

Implementar la internacionalización del texto

WordPress se utiliza para crear y administrar sitios web.__()_e()Se utilizan funciones como estas para realizar la traducción. En primer lugar, debes asegurarte de que los ajustes necesarios se hayan configurado correctamente en la parte inicial del plugin.Text Domain(Por ejemplo:my-first-pluginLuego, envuelva todas las cadenas de texto dirigidas al usuario con la función de traducción.

// 在插件代码中,将硬编码的文本替换
// 修改前:echo ‘<p>¡Gracias por utilizar “Mi primer plugin”!</p>’;
// 修改后:
function myplugin_display_admin_footer_text() {
    echo ‘<p>‘ . esc_html__( ‘感谢使用“我的第一个插件”!’, ‘my-first-plugin’ ) . ‘</p>’;
}

A continuación, necesitarás utilizar herramientas como Poedit para generar el contenido correspondiente..potEl archivo (plantilla) se encuentra dentro del complemento (plugin).languagesEn la carpeta. El traductor puede crear lo correspondiente..poY después de la compilación..moArchivo. Finalmente, se utiliza durante la inicialización del plugin.load_plugin_textdomain()Traducción de “Función de carga” (Function loading).

function myplugin_load_textdomain() {
    load_plugin_textdomain( ‘my-first-plugin’, false, dirname( plugin_basename( __FILE__ ) ) . ‘/languages/’ );
}
add_action( ‘plugins_loaded’, ‘myplugin_load_textdomain’ );

Seguir las normas de codificación segura.

La seguridad es de suma importancia. En primer lugar, nunca confíes en los datos introducidos por los usuarios. Todos los datos provenientes de los usuarios o de fuentes externas deben ser verificados y procesados con cautela.$_GET$_POST$_COOKIETodos deben ser verificados, limpiados y escapados.

  • Salida con escape: Cuando se envían datos a HTML, JavaScript o URL, se deben utilizar las funciones de escape correspondientes.
    // 输出到HTML属性
    echo ‘<input value="“‘" . esc_attr( $value ) ‘“ />‘;
    // 输出到HTML内容
    echo ‘<p>‘ . esc_html( $text ) . ‘</p>’;
    // 输出到JavaScript变量
    echo ‘<script>var msg = “‘ . esc_js( $message ) . ‘“;</script>’;
    // 输出到URL
    echo ‘<a href="/es/“‘/" . esc_url( $url ) ‘“>enlace</a>’;
  • Verificación de la entrada: Comprobar si los datos cumplen con el formato esperado (por ejemplo, si se trata de una dirección de correo electrónico o de un número).
    if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
        // 不是有效的邮箱地址
        wp_die( ‘无效的邮箱格式。’ );
    }
  • Verificación de capacidades: Antes de realizar operaciones de administración, se verifica si el usuario actual cuenta con las autorizaciones necesarias.
    if ( ! current_user_can( ‘manage_options’ ) ) {
        wp_die( ‘你没有执行此操作的权限。’ );
    }
  • Verificación de Nonce: Para operaciones que implican cambios de estado (como el envío de formularios o solicitudes AJAX), se utiliza un Nonce (un número único y temporal) para evitar ataques de falsificación de solicitudes entre sitios (CSRF, Cross-Site Request Forgery).
    // 在表单中输出nonce字段
    wp_nonce_field( ‘myplugin_action’, ‘myplugin_nonce’ );
    // 在处理请求时验证nonce
    if ( ! isset( $_POST[‘myplugin_nonce’] ) || ! wp_verify_nonce( $_POST[‘myplugin_nonce’], ‘myplugin_action’ ) ) {
        wp_die( ‘安全校验失败。’ );
    }

resúmenes

A través de esta guía, has completado todo el proceso, desde crear archivos de plugins básicos, comprender y utilizar el sistema de ganchos (hooks) del núcleo de WordPress, hasta desarrollar interfaces de administración en el backend, así como implementar funciones de internacionalización y aplicar prácticas básicas de seguridad. Has adquirido las habilidades esenciales para desarrollar plugins de WordPress que sean funcionales, bien estructurados, seguros y fiables. La esencia del desarrollo de plugins radica en utilizar adecuadamente los ganchos de acciones (actions) y filtros (filters) para expandir las funcionalidades de WordPress, siempre dando prioridad a la seguridad y la mantenibilidad. A continuación, puedes explorar API más complejas, como tablas de bases de datos personalizadas, interacciones AJAX o puntos de terminación de API REST, para crear herramientas aún más potentes.

FAQ Preguntas más frecuentes

¿Qué conocimientos previos se necesitan para desarrollar un plugin para WordPress con el nombre ###?
Es necesario que cuentes con conocimientos básicos de programación en PHP, y sería de gran ayuda también entender HTML, CSS y JavaScript (en particular, jQuery). Lo más importante es que tengas una comprensión preliminar de la arquitectura básica de WordPress, conceptos como temas, plugins, tipos de artículos y roles de usuarios. Esta guía asume que ya posees estos conocimientos fundamentales.

¿Cómo depuro mi plugin para WordPress?

Primero, asegúrate de que…wp-config.phpEn el archivoWP_DEBUGLos constantes se establecen entrueEsto mostrará errores, advertencias y notificaciones de PHP en la página. En segundo lugar, se puede utilizar…error_log()La función escribe información de depuración en el registro de errores del servidor. Para un depurado más avanzado, se puede considerar utilizar plugins de depuración especializados, como Query Monitor, que permiten ver detalles sobre consultas a la base de datos, ejecución de hooks, carga de scripts, entre otros.

¿Cómo debo distribuir los plugins que he desarrollado?

Para uso personal o compartición en un pequeño círculo, puedes simplemente empacar el archivo en formato ZIP. Si deseas publicarlo de manera abierta, hay dos principales opciones: la primera es enviarlo al directorio oficial de plugins de WordPress (WordPress.org), lo que implica seguir sus guías de envío y estándares de código, lo que te asegurará la mayor visibilidad posible; la segunda es distribuirlo a través de tu propio sitio web o de mercados de terceros (como CodeCanyon). Antes de enviarlo al directorio oficial, asegúrate de que la calidad y la seguridad del código sean adecuadas.

¿Cómo puedo agregar tipos de artículos o clasificaciones personalizadas a mi plugin?

Puedes usarregister_post_type()Función para crear tipos de artículos personalizados (CPT, Custom Post Types), utilizando…register_taxonomy()Se utilizan funciones para crear clasificaciones personalizadas. Es conveniente realizar estas operaciones en…initSe ejecuta dentro de los ganchos de acción (action hooks). El WordPress Codex y el Developer Handbook proporcionan descripciones detalladas de los parámetros de estas dos funciones, lo que constituye una forma poderosa de expandir las capacidades de gestión de contenido de WordPress.

¿Cómo evitar que los nombres de las funciones en un plugin coincidan con los de otros plugins?

Para evitar conflictos entre nombres de funciones, clases o constantes, la mejor práctica es utilizar espacios de nombres (desde PHP 5.3 en adelante). Si tu plugin necesita ser compatible con versiones más antiguas de PHP, o si deseas mantener la máxima compatibilidad, puedes agregar un prefijo único a todos los identificadores. Por ejemplo, puedes usar el nombre del plugin o una abreviatura como prefijo.myplugin_function_nameMyPlugin_ClassNameoMYPLUGIN_CONSTANTEl código de ejemplo incluido en esta guía utiliza el método de prefixación.