Fundamentos del desarrollo de complementos de WordPress.
Antes de profundizar en el código, es de vital importancia comprender los conceptos básicos y la estructura de los plugins de WordPress. Un plugin de WordPress es, en esencia, un script PHP adicional que interactúa con el núcleo del sistema a través del sistema de ganchos (Hooks) proporcionado por WordPress, con el fin de expandir o modificar las funcionalidades del sitio web. Puede ser un único archivo, o bien un directorio completo que contiene múltiples archivos, hojas de estilo CSS y scripts JavaScript.
La tarea principal en el desarrollo de plugins es crear un archivo principal que cumpla con los estándares. Por lo general, este archivo principal lleva el nombre del plugin.my-custom-plugin.phpEn la parte superior de este archivo, debe contener un bloque de comentarios con la información estándar del plugin. Estos comentarios no solo sirven para describir tu plugin a WordPress, sino que también se mostrarán en la página de administración de plugins del backend.
/**
* Plugin Name: 我的自定义功能扩展
* Plugin URI: https://example.com/my-custom-plugin
* Description: 这是一个用于演示的WordPress插件,用于添加自定义功能。
* Version: 1.0.0
* Author: 开发者名称
* Author URI: https://example.com
* License: GPL v2 or later
* Text Domain: my-custom-plugin
*/ En las notas…Plugin NameEs un campo obligatorio; el resto es opcional, aunque se recomienda completarlo. Después de crear este archivo, colócalo en.../wp-content/plugins/Una carpeta independiente dentro del directorio (por ejemplo…)my-custom-pluginPuede encontrarlo y activarlo en la página de “Plugins” del panel de administración de WordPress.
Lecturas recomendadas De los principios a la práctica: Guía completa para el desarrollo de plugins para WordPress y trucos avanzados。
El mecanismo central de funcionamiento de los plugins de WordPress se basa en los “ganchos” (hooks). Existen dos tipos de ganchos: los ganchos de acción (action hooks) y otros tipos de ganchos.(Action Hooks)Hookes para filtros(Filter Hooks)Los ganchos de acción (action hooks) te permiten ejecutar código personalizado en momentos específicos, como al cargar la parte superior de la página o al publicar un artículo.add_action()La función monta tu propia función en el gancho de acción (action hook).
Los ganchos de filtro te permiten modificar los datos que se generan durante el proceso. Por ejemplo, el contenido de los artículos pasa por una serie de filtros antes de ser mostrado.add_filter()Las funciones pueden modificar estos datos.
La internacionalización y la localización son partes esenciales de los plugins profesionales. Al utilizarlas…__( ‘文本’, ‘text-domain’ )o_e( ‘文本’, ‘text-domain’ )La función envuelve todas las cadenas de texto visibles para el usuario y, en combinación con los campos de texto que se cargan, permite que el complemento sea compatible con múltiples idiomas.Text DomainDebe ser consistente con la información definida en el encabezado del plugin; por lo general, se trata de la versión del nombre del directorio del plugin o del nombre del archivo principal.
Crea tu primer plugin de funcionalidad.
Comencemos creando un plugin sencillo que agregará una columna de administración personalizada a la lista de artículos de un sitio web, para mostrar el número de palabras de cada artículo. Este ejemplo cubre los procesos básicos de creación de plugins, uso de hooks y salida de datos de manera segura.
Primero, en tu…/wp-content/plugins/Cree una nueva carpeta en el directorio y llámelamy-first-extensionEn esa carpeta, cree el archivo principal.my-first-extension.phpY añada la información de cabecera del plugin descrita en la sección anterior.
Lecturas recomendadas Guía para principiantes en el desarrollo de plugins para WordPress: Crea tus propios módulos de funcionalidades personalizadas desde cero。
A continuación, necesitamos agregar una nueva columna a la lista de gestión de artículos. Esto implica dos ganchos de acción (action hooks):manage_posts_columnsYmanage_posts_custom_columnEl primero se utiliza para definir el encabezado de la nueva columna, mientras que el segundo se utiliza para llenar el contenido de cada fila de dicha columna.
// 为文章列表添加“字数统计”列
function mfe_add_word_count_column( $columns ) {
$columns['word_count'] = __( '字数统计', 'my-first-extension' );
return $columns;
}
add_filter( 'manage_posts_columns', 'mfe_add_word_count_column' );
// 填充“字数统计”列的内容
function mfe_display_word_count_column( $column, $post_id ) {
if ( $column === 'word_count' ) {
$post_content = get_post_field( 'post_content', $post_id );
$word_count = str_word_count( strip_tags( $post_content ) );
echo esc_html( $word_count );
}
}
add_action( 'manage_posts_custom_column', 'mfe_display_word_count_column', 10, 2 ); En este fragmento de código,mfe_add_word_count_columnLa función recibe un array de columnas existentes y agrega una nueva.word_countTecla, y devuelve el array modificado.add_filterConéctelo a…manage_posts_columnsEn el filtro.mfe_display_word_count_columnLa función primero verifica si la columna que se está procesando es la que hemos añadido, llamada “word_count”, y luego obtiene el contenido del artículo para utilizarlo en el proceso posterior.strip_tags()Elimina los etiquetas HTML y luego utiliza el contenido restante.str_word_count()Calcule el número de palabras (en el caso del chino, el número de caracteres), y luego utilice el resultado.esc_html()Después de realizar la escapada de seguridad, el resultado es el siguiente:
Este plugin sencillo ya cuenta con las funciones básicas, pero un plugin más profesional debería considerar la posibilidad de realizar ciertas operaciones al activarse o desactivarse. Por ejemplo, podríamos crear tablas en una base de datos personalizada o limpiar opciones temporales. Esto se puede lograr mediante la registración de “ganchos” (hooks) de activación y desactivación.
// 插件激活时执行的操作
function mfe_plugin_activation() {
// 例如:添加一个版本号选项,用于后续升级判断
if ( ! get_option( 'mfe_plugin_version' ) ) {
add_option( 'mfe_plugin_version', '1.0.0' );
}
// 触发一个自定义动作,供其他开发者扩展
do_action( 'mfe_plugin_activated' );
}
register_activation_hook( __FILE__, 'mfe_plugin_activation' );
// 插件停用时执行的操作
function mfe_plugin_deactivation() {
// 例如:清除计划任务或临时数据
// 注意:通常不在停用时删除用户数据(如表)
}
register_deactivation_hook( __FILE__, 'mfe_plugin_deactivation' ); Por favor, tenga en cuenta que…register_activation_hookYregister_deactivation_hookSe necesita la ruta completa del archivo principal.FILELa constante debe ser utilizada como el primer parámetro. La lógica para activar, desactivar y desinstalar el complemento (la desinstalación ocurre cuando el usuario elimina el complemento) debe ser gestionada de manera separada.
Implementar la página de configuración del plugin
Un plugin con funciones completas suele necesitar ofrecer opciones de configuración para los usuarios. La forma más estándar de hacerlo es crear una página de configuración en el backend de WordPress. Esto se puede lograr utilizando…add_menu_page()oadd_options_page()Se pueden implementar mediante funciones como…
Primero crearemos un elemento de menú de nivel superior. En el ejemplo que sigue,mfe_create_admin_menuUso de funcionesadd_menu_page()Vamos a agregar una nueva página. Esta función necesita el título de la página, el título del menú, los permisos requeridos, el slug del menú, la función de callback para generar el contenido de la página, la URL de la imagen del ícono y la posición que ocupará dentro del menú.
Lecturas recomendadas Desde cero: Guía completa para el desarrollo de plugins para WordPress y compartición de las mejores prácticas。
// 创建后台管理菜单
function mfe_create_admin_menu() {
add_menu_page(
__( '我的扩展设置', 'my-first-extension' ), // 页面标题
__( '我的扩展', 'my-first-extension' ), // 菜单标题
'manage_options', // 权限(管理员)
'mfe-settings', // 菜单slug
'mfe_settings_page_html', // 显示页面内容的函数
'dashicons-admin-generic', // 图标
80 // 位置
);
}
add_action( 'admin_menu', 'mfe_create_admin_menu' ); A continuación, necesitamos definirmfe_settings_page_htmlSe utiliza una función para renderizar el contenido de la página. Una página de configuración profesional debe utilizar la API de configuración estándar de WordPress, la cual se encarga de manejar tareas complejas como el envío de formularios, la validación de campos y otros asuntos relacionados con la seguridad. En primer lugar, necesitamos utilizar…register_setting()Registra un grupo de configuraciones y campos.
// 初始化设置
function mfe_settings_init() {
// 注册一个新的设置组 “mfe_settings_group” 到页面 “mfe-settings”
register_setting( 'mfe-settings', 'mfe_settings_options' );
// 在设置组内添加一个区域(Section)
add_settings_section(
'mfe_settings_section',
__( '基本设置', 'my-first-extension' ),
'mfe_settings_section_cb',
'mfe-settings'
);
// 在区域内添加一个字段
add_settings_field(
'mfe_field_api_key',
__( 'API密钥', 'my-first-extension' ),
'mfe_field_api_key_cb',
'mfe-settings',
'mfe_settings_section',
[ 'label_for' => 'mfe_field_api_key' ]
);
}
add_action( 'admin_init', 'mfe_settings_init' ); Luego, necesitamos definir las funciones de callback para las áreas y los campos a fin de generar el código HTML correspondiente. La función de callback para los campos es especialmente importante, ya que se encarga de renderizar los cuadros de entrada del formulario y de asegurarse de que sus valores coincidan con los ajustes guardados.
/\n// Configurar el texto de descripción de la zona
function mfe_settings_section_cb( $args ) {
?>
<p id="<?php echo esc_attr( $args['id'] ); ?>"><?php esc_html_e( '请在此配置插件的基本参数。', 'my-first-extension' ); ?></p>
¿php?
}
// Función de devolución de llamada para el campo de clave API
function mfe_field_api_key_cb( $args ) {
// Obtener el valor de las opciones de configuración registradas
$options = get_option( 'mfe_settings_options' );
$value = $options[ $args['label_for'] ] ?? '';
?>
<input type="text"
id="<?php echo esc_attr( $args['label_for'] ); ?>"
name="mfe_settings_options[<?php echo esc_attr( $args['label_for'] ); ?>]"
value="<?php echo esc_attr( $value ); ?>"
class="regular-text">
<p class="description">¿Podría, por favor, introducir la clave API de su servicio?</p>
¿php?
} Finalmente, cree la función para la página de configuraciones principales, y utilícela.settings_fields()Ydo_settings_sections()Para mostrar todo el formulario de forma segura.
// 设置页面的HTML结构
function mfe_settings_page_html() {
// 检查用户权限
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
?>
<div class="wrap">
<h1>¿¿¿¿php echo esc_html( get_admin_page_title() ); ?></h1>
<form action="/es/options.php/" method="post" data-trp-original-action="options.php">
<?php
// 输出安全字段、区域和字段
settings_fields( 'mfe-settings' );
do_settings_sections( 'mfe-settings' );
submit_button( __( '保存设置', 'my-first-extension' ) );
?>
<input type="hidden" name="trp-form-language" value="es"/></form>
</div>
¿php?
} De esta manera, al crear la página de configuración, la validación, el limpieza y el almacenamiento de todos los datos de los formularios se realizan automáticamente a través de la API de configuración de WordPress, y estos datos se almacenan en…wp_optionsEn la tabla, el nombre es…mfe_settings_optionsEntre las opciones disponibles, se ha logrado un gran aumento en la seguridad y la conveniencia.
Seguridad de los plugins y prácticas recomendadas
Es necesario desarrollar un plugin profesional, seguro y fácil de mantener, siguiendo una serie de buenas prácticas. El principio fundamental es nunca confiar en los datos introducidos por los usuarios. Todos los datos provenientes de fuentes externas deben ser verificados y procesados de manera segura.$_GET、$_POST、$_COOKIELos datos (incluso los de la base de datos) deben ser verificados, limpiados y escapados de manera adecuada antes de ser emitidos, utilizados o almacenados.
Validación y limpieza de datos: Antes de utilizar los datos para realizar juicios lógicos, se debe verificar si cumplen con el formato esperado. Por ejemplo, si un campo debe contener un número, se debe utilizar un método adecuado para asegurarse de que el valor ingresado realmente sea un número.intval()ois_numeric()WordPress ofrece muchas funciones auxiliares, como…sanitize_text_field()Se utiliza para limpiar cadenas de texto.sanitize_email()Se utiliza para limpiar las direcciones de correo electrónico.
Escape de datos: Cuando se envían datos a HTML, JavaScript o URL, es necesario escaparlos para evitar ataques de cross-site scripting (XSS). Se debe usar .esc_html()Exportar texto puro a HTML,esc_attr()\nSe envía como una propiedad HTML.esc_url()Salida de la URL,wp_json_encode()Combinaciónwp_slash()Exportar a JavaScript.
Un error de seguridad común es utilizar variables no verificadas directamente en las consultas a la base de datos, lo que puede provocar inyecciones SQL. Nunca debe concatenar las instrucciones SQL de forma manual. Se debe utilizar lo que ofrece WordPress para evitar este problema.$wpdbClases y sus métodos para preparar consultas.
global $wpdb;
$user_input = $_POST['search_term'];
// 错误做法:直接拼接
// $sql = “SELECT * FROM {$wpdb->posts} WHERE post_title LIKE ‘%$user_input%’”;
// 正确做法:使用prepare方法
$sql = $wpdb->prepare(
“SELECT * FROM {$wpdb->posts} WHERE post_title LIKE %s”,
‘%’ . $wpdb->esc_like( $user_input ) . ‘%’
);
$results = $wpdb->get_results( $sql ); Verificación de permisos: Antes de que un complemento realice cualquier operación de administración, modificación de datos o exhibición de información sensible, se debe verificar si el usuario actual tiene los permisos necesarios para realizar dicha acción.current_user_can( $capability )ocheck_admin_referer()Se realizan verificaciones en estos aspectos, entre otros.
Cargue los scripts y las hojas de estilo de forma secuencial: nunca lo haga directamente desde un plugin.<link>o<script>Las etiquetas introducen archivos CSS y JS. Se debe usar The tags introduce CSS and JS files. It should be usedwp_enqueue_style()Ywp_enqueue_script()Función, y asegúrate de utilizar los hooks adecuados (como…).wp_enqueue_scriptsPara uso en el front end.admin_enqueue_scriptsSe utiliza para ejecutar las tareas en el backend. Esto evita conflictos y asegura que las dependencias se carguen de manera correcta.
Convenciones de organización y nomenclatura de código: utilice un prefijo único para los nombres de las funciones, clases, variables y opciones de su complemento (por ejemplo, <).mfe_Esto se hace para evitar conflictos con el tema, otros plugins o el núcleo de WordPress. Organizar plugins complejos en varios archivos y utilizar la programación orientada a objetos (POO) puede mejorar la legibilidad y reutilizabilidad del código.
Se debe proporcionar una función de desinstalación y limpieza: si el complemento ha creado tablas de base de datos u opciones personalizadas, es conveniente incluir una función de limpieza cuando el usuario elige “eliminar” el complemento en lugar de “Desactivar”lo. Esto se puede lograr a través de un archivo de desinstalación independiente. En el archivo principal del complemento, se puede utilizar…register_uninstall_hook( FILE, ‘mfe_plugin_uninstall’ )Para registrar la función de desinstalación, pero lo más común es crear una en el directorio del complemento.uninstall.phpAl eliminar un plugin, WordPress ejecuta automáticamente ese archivo.
resúmenes
El desarrollo de plugins para WordPress es un proceso que combina un pensamiento estructurado con una comprensión profunda de la arquitectura central de WordPress. Desde escribir la información de cabecera del plugin de acuerdo con los estándares, hasta entender y utilizar con habilidad los ganchos de acciones (action hooks) y los ganchos de filtros (filter hooks), todo esto constituye la base para crear cualquier extensión de funcionalidad. Para crear un plugin útil, no solo es necesario implementar las funcionalidades frontales, sino también diseñar una interfaz de configuración en el backend que sea clara y segura, lo cual se puede lograr de manera eficiente a través de la API de configuración de WordPress.
La seguridad es una línea de vida que debe guiar todo el proceso: desde la validación de los datos ingresados y el escape de los datos generados, hasta el control de los permisos y las operaciones seguras en la base de datos. Ninguno de estos pasos puede ser ignorado. Seguir las mejores prácticas, como cargar los scripts de manera ordenada, utilizar prefijos únicos y mantener una estructura de código clara, hará que tu plugin sea más robusto y fácil de mantener, y que pueda coexistir de manera armoniosa con la vasta comunidad de WordPress. A través de los pasos de esta guía, has adquirido los conocimientos y habilidades esenciales para crear un plugin de nivel profesional para WordPress desde cero.
FAQ Preguntas más frecuentes
¿Cómo puedo agregar un código corto a mi plugin?
Los códigos cortos permiten a los usuarios insertar fácilmente funciones de plugins en artículos o páginas.add_shortcode()Función para registrar tu código corto.
Cree una función de callback que maneje la lógica de códigos cortos. Esta función recibe como parámetro un atributo.$atts)y el contenido ($content(2) Recibe los parámetros y devuelve el HTML procesado. Recuerde que la función de devolución de llamada de los códigos cortos debe devolver (return) el contenido, en lugar de mostrarlo directamente (echo). El contenido devuelto también debe estar debidamente escapado para garantizar la seguridad.
¿Dónde deberían almacenarse las opciones de los plugins?
Para la configuración sencilla de pares clave-valor, se recomienda encarecidamente utilizar la API Options de WordPress.add_option()、get_option()Yupdate_option()Funciones. Estos datos se almacenarán automáticamente.wp_optionsEn la tabla de la base de datos.
Si tu plugin necesita almacenar una gran cantidad de datos estructurados (por ejemplo, entradas de formularios o registros de actividad), deberías considerar crear tablas de base de datos personalizadas.dbDelta()Existen funciones que garantizan que la creación y actualización de la estructura de las tablas se realicen de manera segura y compatible. Por lo general, la creación de tablas personalizadas se maneja dentro de los hooks de activación de los plugins.
¿Cómo puedo asegurarme de que mi plugin sea compatible con otros plugins o temas?
La clave para mejorar la compatibilidad es seguir los estándares de codificación de WordPress, utilizar prefijos únicos y aprovechar los hooks (ganchos) para agregar funcionalidades adicionales. Es importante evitar modificar directamente los archivos centrales del sistema o las variables globales.
En tu plugin, utiliza…do_action()oapply_filters()Cree ganchos personalizados que permitan a otros desarrolladores modificar o expandir el comportamiento de tu plugin. Además, antes de realizar operaciones que puedan generar conflictos (como agregar estilos o scripts), utiliza comprobaciones condicionales o ofrezca la opción de desactivar dichas funciones.
¿Cómo agregar un mecanismo de actualización a un plugin?
Para los plugins que se encuentran en el directorio oficial de plugins de WordPress, las actualizaciones se gestionan automáticamente. En el caso de plugins privados o comerciales, es necesario implementar un verificador de actualizaciones personalizado.
Esto generalmente implica crear una clase que revise periódicamente si hay nuevas versiones en tu servidor remoto y permita a los usuarios actualizar el software con solo un clic. Puedes consultar bibliotecas como “Plugin Update Checker” como referencia, o implementarlo tú mismo; lo esencial es utilizar mecanismos para detectar las nuevas versiones y facilitar el proceso de actualización.set_site_transient()Ganchos (como…)pre_set_site_transient_update_pluginsUtiliza este método para introducir tus informaciónes de actualización. Asegúrate de que el servidor de actualizaciones sea seguro y fiable.
¿Qué sigue, qué sigue?
Lectura ampliada y conocimientos prácticos
Los siguientes están relacionados con el tema de este artículo y son adecuados para una lectura más profunda. A menudo es mejor priorizar empezando por el artículo que más se acerque a su problema actual y ampliando gradualmente a los temas circundantes.
- Guía de iniciación para la creación de sitios web: Domine todo el proceso de desarrollo de sitios web modernos desde cero.
- Guía para el desarrollo de plugins para WordPress: Crea tu primer plugin personalizado desde cero
- ¿Qué es un subtema de WordPress?
- Convertirse en desarrollador de plugins para WordPress: Una guía completa desde cero
- Guía completa para dominar el desarrollo de temas para WordPress: Cómo crear sitios web profesionales desde cero