Como crear tu primer plugin en WordPress

Dificultad: Fácil
Tiempo de Lectura: 5 minutos

En WordPress podemos encontrar un sin fin de plugins para casi cualquier tarea, incluso gratuitos y de pagos. Por lo que te preguntaras ¿Por que quiero crear mi propio plugin? Aunque hay gran variedad, no todos son de fuentes confiables, o están abandonados y ya no son compatibles con nuevas versiones.

También pasa que solo necesitamos una cierta funcionalidad y muchas veces los plugins traen un combo de funcionalidades que no vamos a utilizar.

Como crear un plugin en WordPress

Para crear nuestro plugin de WordPress debemos seguir unos pasos bien simples.

  1. Debemos crear una carpeta con el nombre del plugin en en nuestra instalación de WordPress, en el directorio wp-content/plugins/, por ejemplo miplugin
  2. Una vez creada la carpeta debes crear un archivo PHP con el mismo nombre de la carpeta dentro de la misma, por ejemplo miplugin.php.
  3. En el archivo PHP que acabamos de crear debes incluir el siguiente header para que WordPress lo detecte como un plugin:
<?php
/**
 * Plugin Name:       Mi Plugin
 * Plugin URI:        https://misitio.com/plugins/mi-plugin/
 * Description:       Breve descripción de mi plugin.
 * Version:           0.1
 * Requires at least: 5.2
 * Requires PHP:      7.2
 * Author:            Nuestro nombre
 * Author URI:        https://author.misitio.com/
 * License:           GPL v2 or later
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain:       mi-plugin
 * Domain Path:       /languages
 */

Una vez completados estos 3 simples pasos ya podremos ver nuestro plugin desde el administrador de WordPress en la parte de Plugins y activarlo. Claramente no va a realizar ninguna tarea ya que aún no hemos agregado código.

Agregando funcionalidades a nuestro plugin

Para esta parte es necesario que conozcas el lenguaje PHP y/o tengas algún conocimiento de programación. Dado que hay que programar las funcionalidades que queramos.

En la documentación oficial de WordPress en la sección de plugins podemos ver toda la información que debemos saber al momento de crear un plugin.

Por ejemplo, si queremos que nuestro plugin aparezca en el menú principal debemos agregar el siguiente código en nuestro archivo PHP:

function miplugin_options_page_html()
{
    // check user capabilities
    if (!current_user_can('manage_options')) {
        return;
    }
    ?>
    <div class="wrap">
        <h1><?= esc_html(get_admin_page_title()); ?></h1>
        <form action="options.php" method="post">
            <?php
            // output security fields for the registered setting "miplugin_options"
            settings_fields('miplugin_options');
            // output setting sections and their fields
            // (sections are registered for "miplugin", each field is registered to a specific section)
            do_settings_sections('miplugin');
            // output save settings button
            submit_button('Save Settings');
            ?>
        </form>
    </div>
    <?php
}

function miplugin_options_page()
{
    add_menu_page(
        'MiPlugin',
        'MiPlugin Options',
        'manage_options',
        'miplugin',
        'miplugin_options_page_html',
        plugin_dir_url(__FILE__) . 'images/icon_miplugin.png',
        20
    );
}

add_action('admin_menu', 'miplugin_options_page');

Este código lo que haces es agregar en el menú una opción llamada MiPlugin, que nos lleva a una página para nuestro plugin. Como es una prueba, en esta página simplemente se muestra un menú con la opción «Save Settings«.

Para agregar mas funcionalidades debemos ir buscando en el Handbook de Plugin dependiendo que queremos hacer. Es importante realizar nuestro plugin en inglés si queremos publicarlo, ya que así luego puede ser traducido a otros idiomas.

Seguridad en nuestro Plugin

Es muy importante que nuestro plugin sea seguro, ya que como bien sabemos WordPress es el CMS mas popular, por lo cual es uno de los mas atacados.

Si queremos evitar hackeos en nuestro sitio es imprescindible que nuestro plugin sea lo mas seguro posible. Para ello WordPress nos da una serie de recomendaciónes.

Chequear los roles y permisos del usuario

Si nuestro plugin agrega o modifica información, ya sea del lado público o del administrador, es importante verificar los roles y permisos del usuario. Los permisos se manejan en jerarquías, por lo que el usuario superior tiene los permisos del anterior mas los suyos.

Para restringir las funciones por permisos se realiza de la siguiente manera:

if ( current_user_can( 'edit_others_posts' ) ) {
    /**
     * Add the funcion to the end of the post content.
     */
    add_filter( 'the_content', 'miplugin_function' );
 
    /**
     * Register our request handler with the init hook.
     */
    add_action( 'init', 'wporg_request_handler' );
}

Primero se obtiene el usuario actual y se verifica si tiene el permiso ‘edit_others_posts’, si tiene el permiso se le agrega la acción de miplugin y el request. Si no realizamos este chequeo cualquier usuario podría editar post, ya que este es el permiso que estamos verificando en este caso.

Validar la información

La validación de información se trata de chequear los datos que vienen desde el formulario, esto sea realiza por un tema de seguridad para evitar que inyecten código desde una entrada.

Las validaciones pueden ser varias para cada datos, por ejemplo verificar que no sea nulo o que no tenga mas de determinada cantidad de caracteres.

Por otra parte, dependiendo el tipo de dato que necesitemos podemos acotar los tipos y cantidad de caracteres. Por ejemplo si es un nombre que solo incluya letras mayúsculas, minúsculas y tildes.

El core de WordPress nos ofrece algunas funciones para esto como:
is_email() para verificar que sea un correo válido en cuanto al formato
term_exists() Chequea si una etiqueta, categoria o similar existe.
username_exists() Chequea que el nombre de usuario exista.
validate_file() valida que la ruta del archivo exista, pero no si existe el archivo.

Este tipo de validaciones siempre deben realizarse de ambos lados, del lado del cliente, ya sea en el HTML o JS y desde el lado del servidor.

Asegurar las entradas (sanitizar)

Esto se utiliza cuando no esperamos un tipo de valor específico o queremos ser mas permisivos en las validaciones. Es importante que siempre validemos los datos, ya sea con las validaciones o sanitizar.

WordPress nos brinda distintas funciones para sanitizar varios tipos de datos:

sanitize_email()
sanitize_file_name()
sanitize_hex_color()
sanitize_hex_color_no_hash()
sanitize_html_class()
sanitize_key()
sanitize_meta()
sanitize_mime_type()
sanitize_option()
sanitize_sql_orderby()
sanitize_text_field()
sanitize_textarea_field()
sanitize_title()
sanitize_title_for_query()
sanitize_title_with_dashes()
sanitize_user()
esc_url_raw()
wp_kses()
wp_kses_post()

Por ejemplo, para validar textos podemos utilizar la función sanitize_text_field de la siguiente manera:

$title = sanitize_text_field( $_POST['title'] );
update_post_meta( $post->ID, 'title', $title );

Esta realiza una serie de tareas para asegurarse de que el texto sea seguro, primero valida que no tenga caracteres UTF-8 inválidos. Luego convierte los signos menor que a entidad, elimina todas las etiquetas, remueve los espacios en blanco, cambios de línea y tabulaciones.

Asegurar las salidas (escapes)

Asegurar las salidas se refiere a los retornos/devoluciones que realizamos. Es importante que los formatos sean los correctos y que no estemos enviando información sensible de nuestro sitio, fundamental para evitar ataques del tipo Cross-site scripting.

WordPress nos da algunas funciones que renderizan la información asegurándose que solo llegue al usuario final. Con dichas funciones podemos enviar HTML, JS, Texto, URLs y más:

esc_attr()
esc_html() 
esc_js()
esc_textarea()
esc_url()
esc_url_raw()
wp_kses()
wp_kses_post()
wp_kses_data()

Para utilizar estas funciones simplemente llamamos a la función y enviamos el código o lo que queremos validar:

$html = esc_html( '<a href="http://www.example.com/">A link</a>' );

Validar peticiones

Para validar las peticiones se utiliza un token, en WordPress lo llaman Nonces, una abreviación para  “Number used ONCE”. Este funciona al igual que un token para identificar que el usuario sea quien dice ser y efectivamente tenga los permisos necesarios para realizar la acción.

Para generar un token utilizamos la función wp_create_nonce() y esto agrega un número único a nuestro link. Luego cuando alguien realice esta acción se pasará el token y podemos verificar que es el esperado.

Publicando nuestro Plugin

Para poder publicar nuestro plugin hay ciertos requerimientos que debemos seguir. Uno de ellos es utilizar SVN o Subversion, este es un controlador de versiones similar a GIT. Nuestro plugin debe seguir la licencia GNU General Public License v2 o posterior, si no está especificado se tomará bajo dicha licencia.

Es importante tener en cuenta que las etiquetas «Powered By«, publicidad o llamadas a servicios externos no están permitidas, en el caso de esta última se pueden realizar si están debidamente documentadas.

Nunca está demás aclarar que se prohíbe que nuestro plugin realice algo ilegal, ofensivo o moralmente incorrecto. Esto incluye spam o acoso. Además debe cumplir con una guía detallada que brinda WordPress.

Una vez estamos seguros que nuestros plugin cumple con todas las pautas y recomendaciones de WordPress, lo podemos postular para revisión. Para poder enviar nuestro plugin a revisión debes estar registrados en wordpress.org y luego sí podremos proceder a enviar nuestro plugin.

Los plugins son revisados de forma manual por lo que pueden demorar en ser publicados. En caso de no ser aceptados te enviaran un email solicitando mas información.

Ahora que ya sabes como crear un plugin ¿Qué funcionalidades estás pensando en desarrollar?


¿Te resultó útil el artículo? Compártelo con tus colegas: