Saltar al contenido

Categoría: Javascript

Cómo migrar un widget de WordPress a un bloque de Gutenberg

Hace varios años desarrollé dos plugins para WordPress: JS Archive List y JS Categories List. Ambos nacieron cuando los widgets de WordPress se desarrollaban prácticamente por completo en PHP: creabas una clase, extendías WP_Widget, generabas el formulario de configuración y, finalmente, renderizabas el HTML. Funcionaba bastante bien, pero WordPress ha cambiado mucho desde la llegada de Gutenberg. Así que decidí migrar ambos plugins para que pudieran utilizarse como un bloque de Gutenberg. En el caso de JS Categories List, ocurrió desde la versión 4.0 y en JS Archive List desde la versión 5.0, manteniendo además el widget anterior en PHP por compatibilidad con instalaciones existentes.

Lo interesante de esta migración no fue solo aprender a crear un bloque. También me hizo ver, de una forma diferente, cómo ha evolucionado WordPress.

Se acabaron los tiempos de plugins 100% hechos en PHP, ahora es bloque de Gutenberg en JS (React) + PHP
Se acabaron los tiempos de plugins 100% hechos en PHP, ahora es bloque de Gutenberg en JS (React) + PHP

De widgets en PHP a una interfaz en React

Un widget clásico de WordPress normalmente hacía casi todo en PHP. Por ejemplo, teníamos algo parecido a esto:

class My_Widget extends WP_Widget {

    public function widget( $args, $instance ) {
        // Obtener datos.
        // Generar HTML.
        // Mostrar el widget.
    }

    public function form( $instance ) {
        // Formulario de configuración.
    }
}

El formulario que veía el administrador, la configuración y el HTML final estaban muy ligados entre sí. Con Gutenberg la separación es diferente. Ahora puedes tener PHP encargándose de los datos y del renderizado mientras que el editor utiliza JavaScript y React para construir la interfaz de configuración.

Por esta razón, siento que WordPress cada vez se siente más como un CMS que ofrece servicios y APIs en PHP, mientras que diferentes interfaces consumen esos servicios.

Gutenberg es probablemente el mejor ejemplo, porque el editor trabaja con entidades como posts, páginas, usuarios o términos mediante @wordpress/core-dataQue internamente puede procesar los datos mediante las APIs de WordPress.

PHP no desapareció. Simplemente ya no tiene que encargarse de toda la interfaz.

¿Cómo comenzar un bloque de Gutenberg?

WordPress posee una herramienta oficial llamada @wordpress/create-block que genera la estructura inicial de un plugin con un bloque, incluyendo JavaScript, PHP, CSS y la configuración necesaria para compilar todo. Puedes crear uno ejecutando:

npx @wordpress/create-block@latest my-block --namespace=my-plugin

Luego:

cd my-block
npm start

Aunque estés migrando un plugin existente, te recomiendo ejecutar este comando al menos una vez. Es una forma sencilla de entender cuál es la estructura recomendada actualmente por WordPress.

Entre los archivos encontrarás uno particularmente importante:

block.json

Este archivo contiene la definición del bloque: nombre, atributos, scripts, estilos y demás metadatos. Por ejemplo:

{
    "apiVersion": 3,
    "name": "my-plugin/archive-list",
    "title": "Archive List",
    "category": "widgets",
    "attributes": {
        "showCount": {
            "type": "boolean",
            "default": false
        }
    }
}

WordPress actualmente recomienda registrar los bloques utilizando esta metadata y register_block_type() Desde PHP se hace asi:

add_action( 'init', function() {
    register_block_type( __DIR__ . '/build' );
} );

Con eso PHP conoce nuestro bloque y WordPress puede cargar los scripts y estilos necesarios.

La configuración del bloque de Gutenberg ahora vive en React

En un widget clásico, las opciones se construían con inputs HTML generados en PHP. En un bloque de Gutenberg puedes crear esa interfaz con los componentes que ya ofrece WordPress. Por ejemplo:

import { InspectorControls } from '@wordpress/block-editor';
import {
    PanelBody,
    ToggleControl
} from '@wordpress/components';

export default function Edit({ attributes, setAttributes }) {
    return (
        <InspectorControls>
            <PanelBody title="Options">
                <ToggleControl
                    label="Show post count"
                    checked={ attributes.showCount }
                    onChange={ ( value ) =>
                        setAttributes({ showCount: value })
                    }
                />
            </PanelBody>
        </InspectorControls>
    );
}

De esta forma, Gutenberg se encarga de gran parte de la experiencia del editor y nosotros solo debemos definir qué opciones necesita nuestro bloque.

En mis plugins esto reemplazó buena parte de los formularios que antes tenía que generar manualmente desde PHP.

Consumir los datos de WordPress desde el bloque de Gutenberg

Otra parte interesante es que no necesariamente tienes que crear tus propios endpoints para obtener información que WordPress ya conoce. Desde el editor puedes consultar entidades utilizando core-data. Por ejemplo, para obtener páginas puedes utilizar:

import { useEntityRecords } from '@wordpress/core-data';

const { records, isResolving } = useEntityRecords(
    'postType',
    'page'
);

WordPress se encarga de resolver la petición, de mantener los datos en su store y de entregarlos al componente. En un plugin como JS Categories List, el mismo concepto permite trabajar con taxonomías y categorías desde la interfaz del bloque, sin tener que imprimir previamente toda esa información en el HTML generado por PHP.

Eso también tiene otra ventaja, la nueva versión de mis plugins puede leer la información dinámicamente y cargar JavaScript y CSS solamente cuando realmente existe un bloque o widget en la página, en lugar de cargar recursos innecesariamente en todo el sitio.

No tienes que reescribir todo tu PHP

Esta fue una de las cosas que pensé inicialmente que serían más complicadas.

Migrar a un bloque de Gutenberg no significa necesariamente convertir todo el plugin a JavaScript. Puedes crear un bloque dinámico y continuar renderizando su contenido desde PHP, por ejemplo, block.json puede indicar:

{
    "render": "file:./render.php"
}

Y dentro de render.php Puedes reutilizar buena parte de la lógica que ya tenía tu antiguo widget, permitiendo tener una migración más progresiva:

<?php

$show_count = $attributes['showCount'] ?? false;

echo my_old_archive_render_function(
    $show_count
);

La interfaz del editor puede estar hecha con React, mientras que el frontend todavía utiliza funciones PHP que llevan años funcionando. Los bloques dinámicos están diseñados precisamente para casos donde el contenido debe calcularse al momento de renderizar la página, y WordPress permite hacerlo mediante un archivo render.php o un render_callback.

En mi caso, esto fue bastante útil porque no tenía sentido reescribir código estable solamente por utilizar Gutenberg.

Mantener el antiguo widget por retrocompatibilidad

También decidí no eliminar de inmediato los widgets anteriores. Tanto JS Archive List como JS Categories List mantienen una versión legacy en PHP para instalaciones que todavía la utilizan, mientras que el desarrollo nuevo está enfocado en el bloque Gutenberg.

Creo que esta es una buena estrategia para plugins que llevan muchos años publicados. Puedes modernizar el código sin afectar las instalaciones de los usuarios que configuraron el widget hace más de cinco años. Ya con el tiempo puedes dejar la implementación antigua únicamente en modo de mantenimiento.

WordPress es bastante diferente ahora

Después de hacer esta migración, creo que desarrollar para WordPress actualmente se parece bastante menos al WordPress con el que comencé hace años.

PHP continúa siendo una parte fundamental, pero ahora tenemos una capa de APIs, bases de datos, componentes y una interfaz escrita en React.

En lugar de pensar:

“Tengo que crear una página PHP para configurar esto.”

Cada vez pienso más:

“¿Qué datos o servicios debe proporcionar WordPress y cómo los va a consumir la interfaz?”

Ese cambio de mentalidad hace que Gutenberg tenga mucho más sentido. Así que si tienes un plugin antiguo basado en WP_Widget, no necesitas reescribirlo por completo de una vez. Puedes comenzar creando un bloque, mover las opciones del formulario a React y reutilizar tu código PHP para el renderizado. Luego moderniza el resto poco a poco.

Para empezar y entender cómo funciona todo, crea primero un bloque vacío con @wordpress/create-block, ejecuta npm start Y comienza a modificarlo. Es probablemente la forma más rápida de dejar de ver Gutenberg como algo extraño y comenzar a verlo simplemente como la nueva interfaz de desarrollo de WordPress.

Happy coding!

Deja un comentario

Documental sobre la historia de Vite

La gente de CultRepo ha sacado un documental sobre la historia de Vite, el software de construcción de Javascript más popular en los últimos años. Me sorprende la realización de este documental porque, a pesar de que Vite es muy usado actualmente, generalmente los documentales que hacen son de tecnologías más viejas y muy estables en el mercado.

La historia de Vite

Vite es un proyecto desarrollado por el mismo creador de Vue.js: Evan You. Así que podrás ver la razón de por qué y cómo nació el proyecto por parte de su mismo creador. Adicionalmente, podrás ver a otros miembros iniciales del proyecto e influencers hablando sobre cómo fue la adopción de esta tecnología.

No quiero comentar mucho porque la historia es realmente breve; además, pienso que deberías verla. Es inspiradora, concreta y muy reciente.

A continuación puedes ver el documenta sobre la historia de Vite:

VITE: The Documentary

Recuerda que, si quieres ver más documentales de este tipo, no dudes en ver mi sección de documentales informáticos en mi blog.

¿Ya estás usando o migrando a Vite en tus proyectos de Javascript? Comenta la razón de ello y comparte este post para llegar a más personas.

Happy Coding o, en este caso, Happy Tooling!

Deja un comentario

Documental sobre la creación de Angular

De nuevo Honeypot nos sorprende con un nuevo documental sobre la creación de Angular. El cual nos narra desde sus inicios en Google hasta su evolución como uno de los frameworks más utilizados en el desarrollo web de gran calidad, esta vez le toca a Angular, el famoso framework creado por Google y del cual fui parte de su comunidad en Venezuela (ngVenezuela).

¿De qué se trata este documental sobre la creación de Angular?

Este documental explica la interesante historia sobre cómo este proyecto nació dentro de Google para resolver los problemas que enfrentaban al desarrollar aplicaciones en JavaScript. Sin embargo, no todo fue fácil: en sus inicios, Angular tuvo dificultades para conseguir apoyo interno dentro de la empresa. Fue solo cuando un ejecutivo lo vio en acción que comprendió su verdadero potencial y quedó sorprendido, decía que no era real lo que habían hecho.

El documental reúne a todas las personas clave en la creación y difusión de Angular. Es interesante ver cómo evolucionó el framework, desde su primera versión hasta el lanzamiento de Angular 2, un cambio radical que redefinió su arquitectura y luego su posterior adopción del compilador Ivy que fue controversial su. También se habla de la creación de ng-conf, la conferencia que ayudó a consolidar su comunidad.

Uno de los momentos que más me llamó la atención fue recordar viejas tecnologías como AtScript, que sirvió como base antes de que TypeScript tomara su lugar definitivo. También me sorprendió cuando hablaron de la migración a Angular 9, y un ingeniero mencionó que Google tenía 2,500 aplicaciones basadas en este framework. ¡Una cifra impresionante!

En definitiva, si alguna vez has trabajado con Angular, este documental es imperdible. Ofrece una perspectiva única sobre su evolución y el impacto que ha tenido en el mundo del desarrollo web.

Angular: The Documentary | An origin story

Palabras finales

Angular es uno de los frameworks más sólidos y versátiles en el desarrollo web. Google lo utiliza en múltiples proyectos internos, y aunque algunos piensan que ha perdido relevancia, en realidad ha ganado cada vez más impulso en los últimos años.

Así que, ¡disfruta de este documental y anímate a explorar todo el potencial de este poderoso framework!

Deja un comentario

Node.js: el documental de su origen

Le llegó el turno a Node.js para ser protagonista de un documental de Honeypot. Esta vez veremos en Node.js: el documental, una mirada íntima a la creación, evolución y triunfos de una de las tecnologías más influyentes en la última década. Desde sus humildes comienzos hasta convertirse en un pilar fundamental en el desarrollo web moderno, el documental nos sumerge en la historia de Node.js, contada por su creador original, Ryan Dahl, y las mentes brillantes que contribuyeron a su crecimiento.

El documental relata cómo Ryan Dahl, inicialmente no estaba seguro sobre el potencial de su proyecto, pero cuando liberó Node.js al público, desató una ola de interés a medida que los desarrolladores descubrían las ventajas de las operaciones de entrada/salida asincrónicas. También Node.js: el documental, explora los desafíos enfrentados en las primeras versiones, donde la implementación de nuevas características a menudo requería sacrificar la retrocompatibilidad. Ocasionando quejas de los primeros usuarios de Node quienes querían una versión estable para sus proyectos.

El relato continúa con la aparición de npm y el arduo trabajo de aquellos que llevaron Node.js a Windows, superando obstáculos para manejar operaciones de archivos de manera asincrónica y desarrollando bibliotecas para facilitar el proceso.

El drama en Node.js: el documental

El documental toma un giro intrigante al abordar la controversia en torno al control de Node.js por parte de Joyent y la posterior creación de io.js. Mientras los desarrolladores buscaban innovar y actualizar el motor de node, la empresa priorizaba la estabilidad para sus principales clientes. Sin embargo, a través de entrevistas francas, obtenemos una visión completa de ambos lados. De hecho, me gustó como incluyeron el CEO de Joyent de esa época, para revelar los motivos para tener control de Node.

Esta sección culmina mostrando como fue la fusión de los proyectos y la formación de la Node Foundation, un hito crucial que garantizó una gestión colaborativa y transparente del desarrollo de Node.js. También luego muestra como Node.js ahora es parte integral de la Open JS Foundation y cuenta con un desarrollo abierto.

En resumen, «Node.js: El Documental» no solo ofrece una mirada fascinante a la historia de Node.js, sino que también presenta un drama empresarial cautivador y un final feliz para una tecnología que ha transformado nuestro mundo digital. Espero que te inspires con en este documental emocionante y descubre cómo una idea revolucionaria cambió para siempre el panorama tecnológico.

Node.js: The Documentary | An origin story
Deja un comentario