Saltar al contenido

Categoría: Planetas

Agregar rutas personalizadas en el API REST de WooCommerce

WooCommerce es una excelente plataforma para montar tu propia tienda en línea. Aunque mucha gente piensa que WordPress sigue siendo solo una plataforma para blogs, desde hace años se ha cambiado el funcionamiento interno para soportar todo tipo de contenido. WooCommerce es un ejemplo de ellos, pues este plugin permite soportar todo el contenido requerido en una tienda en línea como: productos, órdenes, pagos, descuentos, entre otros. Además de incluir una API REST para realizar acciones adicionales sobre él.

API REST

El plugin incluye una API REST para las operaciones mas básicas (se debe activar previamente), permitiendo comunicación hacia o desde aplicaciones externas, extendiendo aún mas las posibilidades de procesos que se pueden implementar en la tienda. Sin embargo, si manejas flujos de compras personalizados o deseas realizar acciones mas allá de las disponibles en el API por defecto, puedes agregar las tuyas tal como se explicará a continuación.

Desarrollo del plugin

El plugin se divide en 2 archivos, el principal para definir el plugin como tal y permitirle indicar a WordPress en que momento se va a cargar el segundo archivo, que contiene los métodos que responden a las rutas personalizadas del API.

Cargador de la clases

Para modificar WordPress, siempre es recomendable hacerlo a través de plugins, por eso el primer paso es definir un plugin como cualquier otro y dentro del constructor de la clase del plugin, indicar a WooCommerce que luego de cargar el código necesario para implementar el API (a través del hook woocommerce_api_loaded) se deben agregar la(s) clase(s) que implementan las rutas personalizadas (a través del hook woocommerce_api_classes), este código lo pueden ver a continuación:

/**
 * Custom API REST path  class
 *
 * @package MyPlugin
 * @author Skatox
 */
class WC_API_Custom extends WC_API_Resource
{

    const PATH = '/custom';

    /**
     * Function to define each of the custom path
     */
    public function register_routes($routes)
    {
        //GET Request
        $routes[self::PATH . '/orders'] = array(
            array(array($this, 'listShippingOrders'), WC_API_Server::READABLE),
        );

        //POST Request
        $routes[self::PATH . '/orders/(?P<order_id>\d+)/fulfillments.json'] = array(
            array(array($this, 'createItem'), WC_API_Server::CREATABLE | WC_API_Server::ACCEPT_DATA),
        );

        //PUT Request
        $routes[self::PATH . '/variants/(?P<id>\d+).json'] = array(
            array(array($this, 'updateItem'), WC_API_Server::EDITABLE | WC_API_Server::ACCEPT_DATA),
        );

        return $routes;
    }

    public function listShippingOrders($fields = null, $filter = array(), $status = null, $page = 1)
    {
        $wcApiOrders = new WC_API_Orders($this->server);
        $orders = $wcApiOrders->get_orders($fields, $filter, $status, $page);

        //Removes orders without shipping methods
        foreach ($orders['orders'] as $key => $order)
        {
            if (empty($order['shipping_methods'])) {
                unset($orders['orders'][$key]);
                continue;
            }
        }

        return $order;
    }

    public function createItem($order_id, $data)
    {
        //Do insert proccess and then return the response array
    }

    public function updateItem($id, $data)
    {
        //Do update proccess and then return the response array

    }
}

Leyendo observarán que es un plugin de WordPress donde la clase WD_API_LOADER registra los hooks mencionados anteriormente, para inyectar en el momento que Woocommerce carga sus clases del API, las clases que instancia los procesos personalizados a ser implementados en el API.

Al final es recomendable instanciar la clase en un objeto, de este modo es posible acceder a los métodos de forma global desde plugines externos, como por ejemplo para detener la carga de las clases o implementar modificaciones permitiendo dar mayor flexibilidad al plugin.

Clase con los métodos de la API REST

El siguiente paso corresponde a crear la clase que responde a las peticiones HTTP del API. En este ejemplo, se define una constante con el PATH personalizado y en el constructor se definen las rutas personalizadas y el método que se debe llamar que responderá a la petición realizada. Si observas, el parámetro recibido es un array donde la llave representa la ruta relativa del API y como valor, otro arreglo con el nombre de la función a procesar la petición y las banderas del tipo de petición. Estas últimas banderas permiten definir el tipo de petición a recibir, por ejemplo
WC_API_Server::READABLE indica que lee datos desde la petición tal como es una petición GET,
WC_API_Server::ACCEPT_DATA permite decir que lea el cuerpo de la petición y permite leer información para peticiones POST y PUT, entre otros.

/**
 * Custom API REST path  class
 *
 * @package MyPlugin
 * @author Skatox
 */
class WC_API_Custom extends WC_API_Resource
{

    const PATH = '/custom';

    /**
     * Function to define each of the custom path
     */
    public function register_routes($routes)
    {
        //GET Request
        $routes[self::PATH . '/orders'] = array(
            array(array($this, 'listShippingOrders'), WC_API_Server::READABLE),
        );

        //POST Request
        $routes[self::PATH . '/orders/(?P<order_id>\d+)/fulfillments.json'] = array(
            array(array($this, 'createItem'), WC_API_Server::CREATABLE | WC_API_Server::ACCEPT_DATA),
        );

        //PUT Request
        $routes[self::PATH . '/variants/(?P<id>\d+).json'] = array(
            array(array($this, 'updateItem'), WC_API_Server::EDITABLE | WC_API_Server::ACCEPT_DATA),
        );

        return $routes;
    }

    public function listShippingOrders($fields = null, $filter = array(), $status = null, $page = 1)
    {
        $wcApiOrders = new WC_API_Orders($this->server);
        $orders = $wcApiOrders->get_orders($fields, $filter, $status, $page);

        //Removes orders without shipping methods
        foreach ($orders['orders'] as $key => $oreder)
        {
            if (empty($oreder['shipping_methods'])) {
                unset($oreders['orders'][$key]);
                continue;
            }
        }

        return $order;
    }

    public function createItem($order_id, $data)
    {
        //Do insert proccess and then return the response array
    }

    public function updateItem($id, $data)
    {
        //Do update proccess and then return the response array

    }
}

Una vez que proceses la petición, si necesitas devolver un objeto JSON, simplemente debes retornar un array con la información deseada y automáticamente Woocommerce se encargará de transformarlo en un objeto JSON e imprimirlo en la salida.

Recomendaciones

Como podrás observar, no es difícil. En caso que no sepas como desarrollar debido a la poca documentación. Te recomiendo leer el código fuente de las clases del API de Woocommerce, son fáciles de entender, creadas por el mismo equipo del plugin y verás como están creados los métodos existentes. Una de las mejores clases para guiarte, es la de productos que se encuentra ubicada en la ruta wp-plugins/woocommerce/includes/api/class-wc-api-products.php, pues es muy completa y posee todas las operaciones REST soportadas.

Recuerda crear un plugin para esto, evita colocarlo en el functions.php pues será difícil de mantener y dificulta migrar de tema (porque el API dependerá de ésta). Finalmente, recuerda respetar el estándar REST, he visto gente que implementa todo en POST y agrega incompatibilidades a aplicaciones.

Ya depende de tu imaginación, descubrir como extender las funcionalidades de WooCommerce a través de un API REST personalizado.

2 comentarios

Sir.O te canta los términos de uso de Windows 10

Tenía tiempo sin colocar música geek en mi blog, por ello he vuelto con esta entrada, donde les comparto una canción de una parte de los términos de usos de Windows 10 (mejor conocido como EULA), específicamente la sección que canta es la parte 7b, donde habla principalmente de software no autorizado. Aunque eso incluye juegos piratas, todos sabemos que puede ser aplicado a cualquier cosa, inclusive aquellos programas que poseas legalmente o hayas desarrollado por ti mismo que al no estar autorizado por Microsoft te lo podrán: quitar, inhabilitar, bloquear o suspenderte de otros servicios que legalmente estés usando.

Algo complicado en realidad, pero lo importante es que escuches la canción y te entretengas un rato.

Sir. O / Microsoft Service Agreement (section 7b)

Deja un comentario

Citizen Four: El documental de Edward Snowden que ganó los premios Oscar

En el 2013 conocimos a Edward Snowden, un ex-agente de la NSA quien nos reveló como el gobierno de Estados Unidos espía a sus ciudadanos y algunos otros funcionarios de otros países. Lo cual causó una gran conmoción a nivel mundial, pues muchas cosas que sospechábamos sobre la invasión a nuestra privacidad, resultaron ciertas e incluso por encima de lo imaginado.

Aunque hayamos leídos artículos, publicaciones y demás. Les recomiendo observar este excelente documental realizado por Laura Poitras, donde documentó todo el proceso de revelación de información clasificada por Snowden en un hotel de Hong Kong, increíblemente lo que se ve no es ciencia ficción ni recreación, sino realmente el proceso de liberación de la información.

El documental muestra el proceso de como fue el contacto de Snowden con Poitras, el proceso de revelación, como construyen las noticia, la liberación planificada de información y finalmente la forma en que lograron sacar a Edward del hotel.

Me llamó la atención la forma en que el reportero maneja el proceso de liberación de la información, cómo planifica los datos a presentar al noticiero y al mismo tiempo tratar de proteger a la fuente lo mas posible para mantener la noticia por muchos días. Ademas, la paranoia del ex-agente respecto a teléfonos, computadoras y cualquier medio de información, realmente impresiona, pues no pensé en la existencia de todo tipo de tecnología para espiarte donde estés.

Citizenfour Official Trailer #1 (2014) - Edward Snowden Documentary HD

Así que si les llama la atención la privacidad en la red, seguridad informática y similares, no dejen de ver este documental ganador de los premios Oscar en el año 2015. Luego de verlo, te deja una sensación de vulnerabilidad de datos en tu red y creo que crea conciencia a ser mas precavidos con la información que publicamos en la red.

Deja un comentario

Las calcomanías de mi computadora portátil (2015)

Quienes me conocen saben que todas mis computadoras están llenas de calcomanías (stickers) y aunque ya llevo casi 2 años con mi actual portátil, decidí crear esta entrada para explicar el origen de mis calcomanías tal como lo hice con mi anterior portátil.

Tapa de portátil

  • La mayoría de las etiquetas son de Mozilla y las obtuve en el Mozilla summit del 2013, ahí pueden ver la de las sedes de las oficinas de Toronto, Beijing, Japón, París, Londres, San Francisco, Vancouver.
  • Otras etiquetas incluyen proyectos de Mozilla como Firefox, Firefox OS (tuve un teléfono para desarrolladores), Open Badges.
  • Muchas calcomanías las compré o me las regalaron en el FudCon 2012, como son las de Hacker, CC, Fedora.
  • La del día del software libre me la regaló Xombra cuando fui a un evento de ese tipo en Valencia.
  • La de Noisebridge me la regaló Ghostbar en un viajo que hizo a SF (sé que la pegué mal).

Calcomanías en la tapa de la portátil
Calcomanías en la tapa de la portátil

Frente

  • Tengo unas calcomanías de Fedora con unos logos de Android encima, las obtuve en el Fudcon del 2012.
  • La del día de Software Libre la obtuve por Xombra como lo comenté anteriormente.
  • La de enjoi skateboarding me regalo mi amiga Ver perfil en Twitter
  • La de Bones y de Crailtap (la azul con el arcoiris) las obtuve al comprar una patineta.
  • La de MVA (Microsoft Virtual Academy) la obtuve en un evento de Microsoft en la universidad que trabajo, porque tengo un perfil en el sitio y he finalizado varios cursos allí.
  • La de Pop Out, es de una marca de ropa para skaters de la ciudad de donde vivo, y me la regaló el dueño.
  • La de Angular y Dart las obtuve en un meetup de Google en Bogotá en agosto del 2014.
  • La de Mozilla Hispano me la regalaron en el Work Week del 2014.

Calcomanías en la parte frontal
Calcomanías en la parte frontal

Se que a algunos les parece mal haber dañado la laptop, para mí es personalización.

Nota: redactando este artículo, me di cuenta que la mayoría de calcomanías las he adquirido en eventos. 

Deja un comentario