Cuando necesitas modificar la plantilla de una instalación de WordPress, la forma correcta de hacerlo es mediante un tema hijo. De esta manera puedes realizar modificaciones solo a los archivos que necesites y es mas fácil llevar los cambios; si actualizas no perderás nada pues solo los archivos del «tema padre» se sobrescribe y no tus cambios.

La configuración de tema hijo

WordPress guarda la configuración del tema (incluyendo datos de los widgets y su posición en las barras laterales) en la base de datos. Al momento de almacenarlo utiliza el nombre de la carpeta del tema como identificador esto ocasiona la pérdida de la configuración si el nombre de la carpeta cambia por:
  • Agregaron el número de la versión del tema al nombre de la carpeta y el mismo es distinto en una versión superior.
  • Se crea un tema hijo que obviamente tendrá otro nombre.
Algunos temas posee una configuración compleja o tal vez en algunos sitios tienes una configuración de widgets muy larga como para recrearla. Por ello puedes automatizar este proceso utilizando la herramienta WP-CLI que te permite realizar tareas desde la consola.

Migrar la configuración

Asumiento que el tema padre se encuentra en la carpeta llamada tema_padre y el hijo en la carpeta tema_hijo el comando a ejecutar sería:
wp option get tema_padre --format=json > tema_hijo_settings.txt

wp option update tema_hijo "`cat tema_hijo_settings.txt`" --format=json
¡Listo! Al refrescar verás como la configuración del tema fue actualizada correctamente.Espero que te sirva de gran utilidad y recuerda compartir esta información si te fue útil.

El diseño web constituye la imagen que vamos a dar de nuestro proyecto online. La presencia que desvelamos es el primer contacto del cliente con nosotros. Resaltar nuestros puntos fuertes y hacer un espacio atractivo no es algo sencillo pero en cambio sí un concepto en el que nos tenemos que esforzar. ¿Sabes cuáles son las ventajas de hacerte con boceto interesante.

Cuando organizamos un proyecto web en el que hemos depositado toda nuestra confianza, todos esos puntos en los que invirtamos tiempo y dinero nos servirán en un momento futuro. Sin embargo, cuando tenemos la página delante de nosotros son muchas las dudas que aparecen por nuestra cabeza.Laptop Hands

Estudiar el diseño que vamos a dejar ver en nuestra página es una de las tareas más entretenidas que existen. No todas las estructuras valen para un mismo proyecto por eso, dar con aquella que nos llena resulta cada vez más complicado. ¿Serías capaz de conseguir el modelo mas parecido a tu proyecto a colocar línea?

¿Cómo puedo resaltar el diseño de mi página web?

Hoy en día existen todo tipo de programas que nos ayudan a tener un diseño web que gusta a todos los usuarios. Las plantillas WordPress constituyen una serie de ventajas que debemos siempre tener muy en cuenta. Por lo general esta distribución cuenta con modelos singulares que logran un proyecto único para nuestra empresa. La cantidad de vertientes programadas que tiene, nos ahorra cantidad de trabajo a nosotros los desarrolladores, la mano de obra.

Cuando hemos ideado un proyecto en línea y tenemos las pautas en nuestra cabeza es fundamental que pensemos también en la base del usuario. No es lo mismo que diseñemos una plataforma a ciegas que, como consumidores, nos pongamos también delante de la pantalla para implementar las mejoras.

La temática de nuestra web es algo que debemos tener muy en cuenta antes de pensar en la idea del proyecto. Dependiendo de aquello que vayamos a vender o promocionar en nuestro espacio en línea podremos hacernos con un tipo u otro de plantilla que sea más acorde con lo que queremos ofertar.

Si estamos pensando en un sistema de localizador de coches es fundamental que el tema de vehículos y modelos de conducción lo tengamos más que esclarecido. Solo de esta forma podremos haber unificado la idea de la plantilla con lo que queremos ofrecer al usuario desde el primer momento en que entra en nuestra página web.

¿Existen temáticas adaptadas a una plantilla?

Si nos ajustamos lo suficiente, cualquier temática o producto que queramos vender en un momento determinado se puede organizar en la plantilla que tienes en mente. Para una página de uber iniciar sesión nos bastará con un sistema sencillo que nos refleje cuáles son las aplicaciones que consiguen esto o dónde podemos descargarlas con mayor facilidad.

Un proyecto web debe reunir una serie de cualidades que lo hagan atractivo a los ojos que lo están descubriendo pero también interesante de trabajar para la persona que se puso a idearlo. La temática es la base de cualquier idea que tengamos en la cabeza. Siempre que nos metamos en una plataforma para dejar un producto al cliente somos nosotros los primeros que tenemos que confiar en este.

Para un espacio que vende teléfonos móviles (por ejemplo esta página web) debemos estar al tanto de los temas (themes) sencillos y que tienen la imagen como la base principal de su concepto. Siempre que estemos ante un proyecto de productos que salen a la venta debemos apostar por un ejemplar a modo de catálogo dónde veamos todos los modelos de una tirada y podamos, en base a la fotografía y las características que tenga el artículo, escoger el que más nos ha gustado.

Las plantillas de wordpress nos sacan de muchos apuros. Antes teníamos que programar todo desde cero y si fallábamos en cualquier parte del código debíamos repetir todo de nuevo. Pero todo esto ha cambiado bastante y debemos darle las gracias a los CMS por haberlo hecho posible.

El pasado noviembre me hicieron una entrevista en WordPress.tv, pues desde el 2016 he estado organizando encuentros de WordPress en San Cristóbal, Venezuela. El 12 de noviembre de 2016, organizamos el único Global WordPress Translation Day de latinoamérica. Allí explicamos como realizar traducciones y una herramienta para facilitar las hecha por Diego Juliao con la participación del localizador oficial para Venezuela Jordi Cuevas.

Mi entrevista en WordPress.tv

Puedes ver la entrevista a continuación, está en ingles, hablo un poco de mí y las tareas que realizo en los meetups. También explico como nació la comunidad local de WordPress y otras cosas.

Espero que les guste.

Desde Enero del 2016 nos estamos reuniendo varios entusiastas de WordPress ubicados en el estado Táchira (Venezuela). Para hablar sobre temas relacionados al mundo WordPress, tales como: desarrollo de temas, los mejores plugins, casos de éxito, diseño web, mercadeo, entre otros. Estos encuentros, mejor conocidos como meetup de WordPress han sido reconocido oficialmente por Automattic, la compañía detrás de WordPress. Por lo tanto nos han colaborado pagando la plataforma Meetup.com y aparecemos listados dentro sus meetups oficiales (ya aparecemos en el widget de encuentros cercanos).

¿Qué es un meetup de WordPress?

Es un encuentro de varios entusiastas, aficionados y profesionales que utilicen WordPress. En los encuentros se comparten diversos temas relacionados al gestor, como información técnica para crear sitios, experiencias de negocio, recomendaciones de plugines, experiencias laborales, entre otros. Los asistentes pueden ser creadores de páginas web, dueños de negocios con sitios hechos en WordPress, personas de mercadeo, profesores, desarrolladores web, diseñadores gráficos, comunicadores sociales, bloggers, entre otros. Los asistentes de este tipo de eventos suelen ser personas de distintas ramas y por lo tanto, se aprende mucho al aprender de ellos.

No todos los meetups son académicos y escuchar ponencias, algunos son eventos sociales donde nos reunimos en un sitio para compartir comida o bebidas. Pues la idea es compartir experiencias, crear lazos profesionales, laborales y de amistad.

¿Cómo puedo participar y colaborar?

Puedes participar de 4 formas: asistiendo, dictando una charla, patrocinando u organizando. Siempre buscamos nuevos colaboradores para participar:

  • Asistiendo: es la mas importante, pues sin asistentes no podemos realizar el evento. Como asistente debes confirmar tu puesto en el sitio de meetup de WordPress e invitar cada vez mas gente para crecer como comunidad.
  • Dictando una ponencia: necesitamos ponencia para compartir contenido en los encuentros. Este punto es nuestro mayor limitante para planificar encuentros. Los temas son relacionados a WordPress, puedes hablar de mercado de sitios, de la funcionalidad de un plugin que te guste, como desarrollar un tema, diseño gráfico, base de datos, seguridad de sitios, entre otros. Lo importante es que el tema este orientado a WordPress. Nos gusta tener ponencias sobre casos de éxito, donde nuestros colaboradores compartes sus experiencias empresariales al usar WordPress.
  • Patrocinando: colabora prestando un lugar para poder reunirnos, llevando refrigerios para compartir luego de cada encuentro, por mencionar algunas ideas. Los patrocinantes aparecer en el sitio del meetup y pueden dar un mensaje o publicidad a todos los asistentes.
  • Organizando: actualmente solo hay 1 persona organizando el evento. Requerimos mas colaboradores para buscar sitios, personas que quieran dar una ponencia. También necesitamos alguien que pueda grabar las ponencias, tomar fotos y luego publicarlas en Internet para las personas que viven fuera del estado. Si te interesa colaborar puedes escribirme.

No vivo en el Táchira, ¿cómo puedo participar?

También estamos de forma virtual en distintos medios. Te recomendamos unirte a nuestro canal en telegram creado por Richzendy. Allí intercambiamos información de complementos y resolvemos las dudas de la comunidad. Muchos participantes comparten videos, artículos y libros para adquirir nuevos conocimientos. Uno de los miembros administra la cuenta de @wordpressvzla en Twitter donde se comparte información de este gestor.

¡Así que puedes participar remotamente con la comunidad!

¿Cada cuanto se reúnen?

Nos solemos reunir cada dos meses, dependemos principalmente de la situación del país, la disponibilidad de un aula en la UNET y si podemos conseguir al menos dos ponencias. La mejor forma de enterarse del próximo evento es uniéndose a la página de Meetup de WordPress San Cristóbal. El sitio notifica cada vez que publicamos un evento, el llamado a ponencias, mensaje enviados a la comunidad, entre otros. Consideramos importante confirmar tu asistencia al evento, para conocer si el aula posee suficiente capacidad y comprobar ante Automattic el interés en los encuentros.

Logros del meetup de WordPress del Táchira

A pesar de tener poco tiempo de reunirnos hemos podido:

  • Ser reconocido como un meetups oficial de WordPress, el único en el país.
  • Ser el único grupo de latinoamérica en participar en el WordPress Global Translation Day.
  • Fuimos entrevistados en WordPress.tv

Esperamos tener mas logros, por lo tanto te invitamos a unirte en la página de Meetup de WordPress San Cristóbal, colabora invitando a mas amigos, asistiendo o dictando una ponencia. ¡Así creceremos para hacer eventos mas grandes como WordCamps!

En Woocommerce, puedes ordenar el listado de productos de varias formas en Ajustes -> Productos -> Ordenamiento de Productos por defecto, pero si en alguna parte del sitio necesitas crear tu propio listado a través de una consulta (generalmente mediante WP_Query) a la base de datos, lo mas probable es que desees mantener el orden establecido en ese apartado.

La manera de mantener el orden, es extraer esa configuración inicial mediante el objeto global $wp_query, pues posee la información por defecto (o la modificada por el usuario) para realizar una consulta, así que accediendo a los atributos order, orderby y enviando ambos al la consulta, obtendrás el orden de la configuración inicial, tal como se muestra en el siguiente ejemplo:

$args = array(
   'posts_per_page' => -1,
   'post_type'      => array('product'), //Para consultar solo los productos
   'product_cat'    => $category, //Me traigo una categoria deseada
   'order'          => $wp_query->get('order'), //Trae el orden seleccionado en frontend
   'orderby'        => $wp_query->get('orderby') //Trae el atributo de orden seleccionado en el frontend
);
$loop = new WP_Query( $args );

Recuerda que debes previamente traer el objeto global $wp_query y luego con el resultado de la consulta, la puedes recorrer con los métodos normales de WordPress.

Woocommerce es una excelente herramienta para montar tu propia tienda en línea, es fácil de instalar y usar gracias que está construida sobre WordPress. Ademas es posible modificar todo su comportamiento mediante la instalación o construcción de plugins.

Hace unas semanas construyendo un plugin para cambiar el flujo normal de los estados de una orden, me tocó enviar los correos predefinidos (nueva orden, orden procesada, etc) manualmente. Para mi sorpresa no encontré documentación sobre como hacerlo, y al leer el código fuente de la clase para enviar correos, me dí cuenta que posee estructura extraña porque utiliza muchos hooks y variables globales, así que me costó hacerlo.

Envío de correos

Woocommerce posee una clase llamada WC_Emails (no confundir con WC_Email que es abstracta para definir una plantilla de correo) cuya tarea es cargar todas las plantillas de correos definidas y posee métodos para enviar el correo. Pues simplemente se debe seleccionar una de las plantillas disponibles y ejecutar el método trigger con los parámetros requeridos para enviar el correo electrónico, es importante NO instanciar un objeto desde esta clase, pues al momento de crearse se instancia ciertas cosas de la plantilla y se ejecutan, ocasionando bugs como repetición del encabezado y ejecución múltiple de hooks.

Por ello, solo debemos llamar a la función WC()->mailer() que siempre nos devuelve el objeto global de WC_Emails, seleccionamos la plantilla en el atributo emails, podemos personalizar el texto del sujeto o encabezado del correo y finalmente se ejecuta el método trigger con los parámetros del contenido del correo (los cuales varían en cada plantilla), tal como se puede observar en el siguiente ejemplo:


$wcEmail = WC()->mailer();
$emailer = $wcEmail->emails['WC_Email_Customer_Note']; //Enviar una nota al usuario
$emailer->subject = $subject; //Sujeto del correo
$emailer->heading = $title; //Título del contenido del correo
$emailer->trigger(array(
   'order_id' => $order_id, //Número de la orden
   'customer_note' => $msg  //Contenido de la nota
));

Las plantillas de correo disponibles por defecto (ya que puedes agregar tus propias plantillas) son:

  • WC_Email_New_Order
  • WC_Email_Cancelled_Order
  • WC_Email_Customer_Processing_Order
  • WC_Email_Customer_Completed_Order
  • WC_Email_Customer_Refunded_Order
  • WC_Email_Customer_Invoice
  • WC_Email_Customer_Note
  • WC_Email_Customer_Reset_Password
  • WC_Email_Customer_New_Account

En caso de necesitar los parametros, simplemente chequeen los archivos con las clases. El nombre del archivo es la misma constante pero todo en minúsculas y cambiando piso por guiones, por ejemplo, WC_Email_Customer_Invoice está definido en el archivo wc-email-customer-invoice.php. Es fácil, aunque parezca lo contrario. Pero descubrir esta información me tomó tiempo al tener que chequear el código fuente de los correos en woocommerce, así que espero que les haya servido de gran ayuda y ahorra de tiempo.

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.

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 constructo 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:


/**
 * Plugin Name: Woocommerce custom path example
 * Description: Custom API calls plugin
 * Version: 1.0
 * Author: Miguel Useche
 * Author URI: http://migueluseche.com
 * License: GPL 3.0
 *
 * @package MyPlugin
 */

 
if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly
}

if (!class_exists('WD_API_LOADER')) {

    /**
     * Main plugin class
     *
     * @package MyPlugin
     * @author Skatox
     */

    class WD_API_LOADER
    {
        public function init()
        {
          add_action( 'woocommerce_api_loaded', array( $this, 'load' ) );
        }

        public function load()
        {
            require_once plugin_dir_path( __FILE__ ).'wc-api-custom.php';
            add_filter( 'woocommerce_api_classes', array( $this, 'register' ) );
        }

        public function register( $api_classes=array() )
        {
          array_push( $api_classes, 'WC_API_Custom' );

          return $api_classes;
        }
    }
}

$wc_custom_api = new WD_API_LOADER();
$wc_custom_api->init();

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.