Crear una página de opciones en WordPress con React – Parte 1
A pesar de los avances en Gutenberg que hemos visto los últimos años, con la idea de que las opciones de un post (o una página) deben ser manejadas dentro del propio editor de WordPress (a.k.a Gutenberg). Muchas veces aún nos vemos en la necesidad de tener una página en donde podamos manejar todas nuestras opciones globales, fuera de cada post en específico. A continuación mostraré como crear una página de opciones en WordPress con React.
Tabla de Contenido
- Introducción
- Paso 1: Creando el ambiente local
- Paso 2: Crear una página de opciones en WordPress
- Paso 3: Registrar nuestros scripts
- Conclusión
Decisiones, decisiones…
Como todo en WordPress (y en desarrollo en general), tenemos varias opciones, una de ellas es utilizar Customizer, o utilizamos una página de opciones. ¿Cuáles son las diferencias entre estas?
Opción 1: Customizer
Customizer es la parte de WordPress que ha sido creada para personalizar nuestro sitio (“customise”), fue creada precisamente para ello, y con ello tienes sus pros y sus contras:
Pros
- Fue diseñada especificamente para este fin
- Cada opción puede ser agregada a su panel personalizado, o a uno general
- Ofrece live preview para ver los cambios al momento
- Ofrece una gama de controles existentes para hacer el trabajo más fácil
Cons
- Será descontinuado en un futuro no muy lejano
- Su biblioteca de controles no es muy amplia
- Los controles más personalizados puedes ser difíciles de implementar
Opción 2: Página de opciones
En cambio, si creamos nuestra propia página de opciones, tenemos más control sobre nuestro resultado; sin embargo, al mismo tiempo, tenemos que crear todo nosotros mismos1.
Pros
- Control total sobre lo que hacemos
- Puede vivir en cualquier parte de la administración
- Podemos usar la Settings API para facilitar el trabajo
Cons
- Requiere más código
Para propositos de este tutorial, utilizaré la opción dos, pero con una diferencia importante. No utilizaré la mencionada Settings API, si no que en su lugar utilizaré React, con ayuda de los componentes existentes en Gutenberg.
¿Por qué React?
A lo largo de mis años de carrera, he creado un sin fin de páginas de opciones, cada una diferente a la anterior, pero algo que casi todas tienen en común es la necesidad de agregar Javascript a las opciones, es por eso que en éste tutorial me brincaré esa realización y en su lugar comenzaré haciéndolo con React desde el inicio.
Ahora si, después de esta enorme introducción (¡lo siento!) podemos comenzar con el tutorial.
Paso 1: Creando el ambiente local
Debido a que este es un tutorial técnico, asumiré que tienes cierto conocimiento
sobre como iniciar un proyecto local, normalmente diría que puedes usar cualquier
ambiente que desees, y sigo diciéndolo, unicamente pediré que sea capaz de utilizar
node e instales el paquete @wordpress/scripts
(como en mi tutorial Compilando CSS y Javascript con wp-scripts).
Utilizando wp-env
Si no eres muy familiar con ambientes locales te invito a ver mi video Creando un ambiente local para WordPress con WP-ENV en youtube donde explico una manera fácil de lograrlo con las herramientas que ofrece WordPress.
Después de tener nuestro ambiente local, podemos crear nuestro plugin, en éste caso necesitamos uno muy sencillo, simplemente una clase que iniciaremos para poder registrar nuestra página:
mah-settings.php
1<?php2/**3 * Plugin Name: Mah Settings4 * Description: Tutorial para crear una página de opciones con React5 * Version: 1.0.06 * Author: Mario Aguiar7 * Author URI: https://marioaguiar.net8 * License: GPLv2 or later9 * Text Domain: mah-settings10 */11namespace Mah_Settings;1213require_once __DIR__ . '/php/class-mah-settings.php';1415use Mah_Settings\Settings;1617// Exit if accessed directly.18if ( ! defined( 'ABSPATH' ) ) {19 exit;20}2122$settings = new Settings();23$settings->init();24
php/class-mah-settings.php
1<?php2/**3 * @package Mah_Settings4 */5namespace Mah_Settings;6/**7 * Maneja la página de opciones8 */9class Settings {10 /**11 * Registra los hooks.12 *13 * @return void14 */15 public function init(): void {16 var_dump( 'Mi página' );17 }18}19
Una vez creados estos archivos podremos entrar en nuestro sitio y ver Mi página
en la parte superior, esto significa que nuestro plugin está funcionando.
¿Por qué una clase?
Si bien todo este código podría ir únicamente en el archivo donde registramos nuestro plugin, es una buena práctica el separar cada componente en su propia clase, nos ayuda a tener las cosas más organizadas y a prevenir conflictos con otro tipo de código que utilizemos.
Paso 2: Crear una página de opciones en WordPress
Una vez que tenemos nuestro plugin functionando, reemplazaremos el contenido de
la función init
por el hook admin_menu
, que nos ayuda a registrar nuestra página
en el menú:
1/**2 * @var string3 */4private $plugin_path = '';56/**7 * Menu slug.8 *9 * @var string10 */11private $menu_slug = '';1213public function __construct( string $plugin_file ) {14 $this->plugin_path = plugin_dir_path( $plugin_file );15}1617/**18 * Registra los hooks.19 *20 * @return void21 */22public function init(): void {23 add_action( 'admin_menu', [ $this, 'add_menu_page' ] );24}2526/**27 * Registra la página de opciones.28 *29 * @return void30 */31 public function add_menu_page(): void {32 $this->menu_slug = add_menu_page(33 __( 'Mah Settings', 'mah-settings' ),34 __( 'Mah Settings', 'mah-settings' ),35 'manage_options',36 'mah-settings',37 [ $this, 'render_settings_page' ],38 'dashicons-admin-generic',39 9940 );41 }4243/**44 * Renderiza la página de opciones.45 *46 * @return void47 */48public function render_settings_page(): void {49 ?>50 <div class="wrap">51 <h1><?php esc_html_e( 'Mah Settings', 'mah-settings' ); ?></h1>52 <div id="mah-settings"></div>53 </div>54 <?php55}56
Hay un par de cosas importantes sucediendo aquí, trataré de explicarlas brevemente:
- La función
add_menu_page
simplemente registra un enlace en el menu izquierdo de la administración, en ella agregamos el título, las capabilidades (o permisos) requeridos para ver ese menú, y especificamos que función debe ser ejecutada cuando se accede a ese menú, que en este caso serárender_settings_page
. Esta función regresa el hook de esta nueva página, el cual guardaremos para después. - En la función
render_settings_page
, que será mostrada cuando se acceda a esta página, simplemente agregamos un título (opcional) y un contenedor vacío. ¿Por qué agregamos esto? Porque será llenado con React.
Paso 3: Registrar nuestros scripts
Para poder registrar nuestros scripts dentro de la página, primero necesitamos
crearlos, para ello comenzaremos con utilizar el paquete @wordpress/scripts
del
que hablamos anteriormente, así que, en una terminal corremos:
1npm install --save-dev @wordpress/scripts2
Después de esto podemos actualizar la configuración para que compile nuestros
nuevos archivos, ya sea dentro el mismo package.json
o con un simple archivo de
configuración de webpack, así que creamos un archivo llamado webpack.config.js
y colocamos lo siguiente:
webpack.config.js
1const defaultConfig = require('@wordpress/scripts/config/webpack.config');23module.exports = {4 ...defaultConfig,5 entry: {6 ...defaultConfig.entry(),7 settings: './js/src/settings.js',8 },9};10
package.json
1"scripts": {2 "test": "echo \"Error: no test specified\" && exit 1",3 "start": "wp-env start",4 "stop": "wp-env stop",5 "build": "wp-scripts build",6 "dev": "wp-scripts start"7}8
js/src/settings.js
1console.log('Hello settings');2
Básicamente estamos extendiendo la configuración por defecto que provee WordPress
para agregar un nuevo archivo: settings.js
, después de esto podemos correr npm run dev
para que nuestro archivo sea vigilado y cada nuevo cambio sea compilado.

Después de tener nuestros archivos creados, podemos registrarlos con el hook admin_enqueue_scripts
1public static function init(): void {2 add_action( 'admin_menu', [ $this, 'add_menu_page' ] );3 add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] );4}5
1/**2 * Registra los scripts y estilos.3 *4 * @return void5 */6public function enqueue_scripts(): void {7 $screen = get_current_screen();8 if ( $screen->id !== $this->menu_slug ) {9 return;10 }11 $asset = include $this->plugin_path . '/build/settings.asset.php';12 wp_enqueue_script(13 'mah-settings',14 plugins_url() . '/mah-settings-react/build/settings.js',15 $asset['dependencies'],16 $asset['version'],17 true18 );19}20
Ahora explicaré un poco lo que sucede aquí:
- Conseguimos la información de la página actual utilizando
get_current_screen
- Comparamos el ID de la página actual con el hook que guardamos cuando creamos la página, si es el mismo, continuamos; si no, aquí terminamos.
- Finalmente registramos nuestro nuevo script utilizando las dependencias que se
agregan al archivo (gracias a
@wordpress/scripts
)
Si todo salió bien, tendremos nuestro archivo funcionando en la página:

¿Qué sigue?
En la parte 2 de este tutorial, explicaré como podemos agregar la parte React a
nuestro sitio utilizando los componentes de @wordpress/components
. Por ahora,
espero que esta introducción haya sido útil para crear una página de opciones
en WordPress con React y por favor hazme saber cualquier duda que tengas. Si
quieres ver el código fuente que utilicé en este tutorial puedes hacerlo mi
repositorio:
Leer más…
Notas al pie
-
¿O no? ↩