Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. WooCommerce
Code

Crear un Método de Envío a Medida para WooCommerce

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by Eva Collados Pascual (you can also view the original English article)

Si alguna vez has desarrollado algo para WordPress, ya sea un tema o un simple plugin, estarás familiarizado con la modularidad de WordPress. WooCommerce está desarrollado también con la extensibilidad en mente.

En este tutorial crearemos un simple método de envío para WooCommerce que calculará los costes del mismo. También añadiremos algunas restricciones a nuestros plugins de forma que nuestro método esté disponible solo para ciertos países.

Para seguir con el tutorial necesitarás:

  • WordPress
  • El plugin WordPress instalado y activado
  • El editor de tu elección

Reglas de Envío para Nuestro Método de Envío

Antes de proseguir, necesitamos definir cómo calculará el método los costes de envío y a dónde puede enviar.

Los costos serán determinados por el peso que enviamos y por la zona a la debemos llevarlo. Una zona es una cifra que se asigna a los países y a los precios. Cuanto más alta sea, más larga se presupone la distancia. Nuestra compañía de mensajería realiza envíos solo a ciertos países:

  • USA
  • Canadá
  • Alemania
  • Reino Unido
  • Italia
  • España
  • Croacia

Nuestra compañía es croata, así que Croacia es nuestra zona 0.Definamos las zonas del resto de países:

  • USA: 3
  • Canadá: 3
  • Alemania: 1
  • Reino Unido: 2
  • Italia: 1
  • España: 2

Ahora que ya tenemos todos los países disponibles para los envíos con su zona correspondiente, es el momento de definir los precios.

  • Zona 0: 10 $
  • Zona 1: 30 $
  • Zona 2: 50 $
  • Zona 3: 70 $

He mencionado también el precio, ¿verdad? Nuestra compañía de mensajería puede enviar hasta 100 Kg, y los precio son:

  • 0-10 kg: 0 $
  • 11-30 kg: 5 $
  • 31-50 kg: 10 $
  • 51-100 kg: 20 $

Tenemos todo lo necesario para crear nuestro método de envío. Aprendamos un poco más sobre la API de envío de WooCommerce.

Introducción al Método de la API de Envío de WooCommerce

Cuando estemos creando un método de envío, debemos extender la clase abstracta de Woocommerce WC_Shipping_Method. Los atributos definidos en esta clase son:

  • $id: ID (slug, Keyword) de nuestro envío. Requerido
  • $number: Integer ID.
  • $method_title: Nombre de nuestro envío que se mostrará en el área de administraciónm
  • $method_description: Breve descripción de nuestro envío que (opcionalmente) se mostrará en administración.
  • $enabled: Cadena Boleana ("Sí" o "no") que proporciona información acerca de si nuestro envío está habilitado y por tanto puede ser empleado o no.
  • $title: Usado para mostrar el nombre de nuestro envío en el sitio.
  • $availability: Define si el envío está disponible o no.
  • $countries: Cadena de países a los que se permite el envío con este método. Los valores predeterminados son una cadena vacía.
  • $tax_status: Por defecto el valor es taxable. Si se les pueden aplicar impuestos, entonces estos serán añadidos.
  • $fee: Por defecto el valor es 0. Tasas para el método.
  • $minimum_fee: La tasa mínima para el método. El valor predeterminado es null (ninguna).
  • $has_settings: Indica si el método contiene algún ajuste. El valor predeterminado es true.
  • $supports: Cadena que contiene las características que este método admite. El valor por defecto es una cadena vacía.
  • $rates: Cadena de porcentajes. Deben ser ordenados para registrar los costos de los envíos. El valor predeterminado es una cadena vacía.

Los métodos definidos en WC_Shipping_Method son:

  • is_taxable(): responde indicando si necesitamos calcular la tasa con preferencia sobre los porcentajes de envío.
  • add_rate( $args = array() ): Manda un porcentaje de envío definido en los parámetro $args al atributo $rates.
  • has_settings(): Devuelve el valor del atributo $has_settings.
  • is_available(): Contesta si el envío está disponible o no. Si indicamos países en el atributo $countries y el atributo $availability está ajustado a valores including, specific o excluding, devolverá true o false dependiendo de la disponibilidad de envío a dicho país.
  • get_title(): devolverá el título del envío.
  • get_fee( $fee, $total ): Devuelve el valor de la tasa para el envío basándose en lo indicado en $fee y $total.
  • supports( $feature ): Responde si este método de envío soporta una característica o no.

Desde que la clase WC_Shipping_Method amplía la clase WC_Settings_API, existen más atributos y métodos que por simplificar no explicaremos aquí.

Existen otros métodos que deben ser definidos para que el envío pueda obtener o establecer los ajustes y además calcular el coste actual del envío. Estos métodos son:

  • init(): Crea los campos y ajustes del formulario (puede ser llamado de manera diferente, mientras usemos en él el método, y lo llamemos en el método __constructor).
  • calculate_shipping( $package ): Este es el método usado para calcular el coste de este envío. Package es una cadena (array) con los productos que deben ser enviados.

En el método alculate_shipping, estamos añadiendo el porcentaje a través de add_rate. Este método acepta una cadena con varias opciones:

  • id: ID del porcentaje.
  • label: Etiqueta para el porcentaje.
  • cost: Monto del envío. Puede consistir en un único valor o un array con los costos de cada artículo del carrito.
  • taxes: Acepta un array de impuestos o nada de manera que WooCommerce calcularía los impuestos Incluso puede aceptar false si no quieres que los impuestos sean calculados.
  • calc_tax: Acepta per_order o per_item. Si usas per_item, será necesario proporcionar un array de costes.

Para registrar el método de envío, necesitamos añadir nuestro método en el array del método registrado enviando el nombre de nuestra clase. Podemos obtener acceso a este array y enviarle el array modificado mediante un filtro de WordPress que se encuentra definido dentro del plugin WooCommerce. El filtro se llama woocommerce_shipping_methods.

Crear una Nueva Clase de Envío

Crearemos nuestra clase de envío en forma de un nuevo plugin que extienda a WooCommerce. Crea una nueva carpeta utsplus-shipping dentro de wp-content/plugins. Crea, además, un archivo con el mismo nombre tutsplus-shipping.php y añade el siguiente código:

Puede parecer que hay demasiado que aprender, pero es sencillo. Primero comprueba si WPINC está definido porque si no es así, significa que alguien está intentando acceder al archivo directamente desde una localización fuera de WordPress.

Ahora que estamos seguros de que este será el acceso desde WordPress, podemos avanzar. Antes de empezar a crear nuestro método de envío para WooCommerce, necesitamos asegurarnos de que WooCommerce está activado. Estamos comprobando que el archivo woocommerce.php está en el array de los plugins activos que han sido guardados en la base de datos con la opción active_plugins.

Después creamos la función tutsplus_shipping_method que también añadiremos a la acción woocommerce_shipping_init. La acción woocommerce_shipping_init es la principal de los Envíos de WooCommerce la cual incluye todas las clases de envío antes de que sean instanciados. Empleando esta acción nos aseguramos de que nuestro método envío será incluido después de la inicialización de WooCommerce y en el lugar correcto para que éste último lo use.

El método __construct de nuestra clase establecerá algunos atributos generales. Algunos podrán ser sobrescritos fácilmente más tarde cuando los ajustes del método init sean cargados de la base de datos. Otros dos métodos los obviamos de momento para definirlos más tarde.

Estableciendo la Disponibilidad Según País

Nuestro método de envío está disponible solo en los países anteriormente citados. Esto será establecido con antelación al método init ubicado dentro del método __construct. Añade esto en el método __construct:

El atributo availability está establecido como 'including' de forma que el envío solo estará disponible para aquellos países incluidos dentro del atributo countries. Cuando WooCommerce quiera mostrar la disponibilidad de envío al cliente, comprobará si el país de envío está incluido en el atributo countries para este envío.

Crear Ajustes

Si observas detenidamente nuestro método __construct, podrás ver que estamos comprobando los ajustes para las propiedades enabled y title. Crearemos campos que permitan modificar nuestras propiedades.

Copia este código y rellena nuestro método init_form_fields:

Ahora puedes ir a la administración de WordPress y cambiar estos ajustes desde WooCommerce > Ajustes > Envíos > TutsPlus Shipping.

The TutsPlus Shipping Options Screen

Intenta cambiar el ajuste Enable y comprueba si en la pestaña Opciones de Envío tu método de envío está habilitado o no.

También hemos definido que nuestro método de envío pueda aceptar hasta 100 Kg. ¿Qué pasaría si esta norma cambia en el futuro? Podemos permitir esta edición fácilmente en los ajustes. Añadiremos este ajuste de forma que ahora nuestro método init_form_fields sea como la muestra que sigue:

Ahora incluso podemos indicar el peso máximo en estos ajustes. Podríamos hacer lo mismo con nuestros países, zonas, pero por para abreviar vamos a pasarlo de largo.

Cálculo del Coste de Envío

Con todo ajustado ya, nos queda un paso más antes de poder usar nuestro método de envío cuando vendamos nuestros productos. Necesitamos calcular el coste del envío basándonos en los productos del carrito del visitante.

Vamos a actualizar el método calculate_shipping paso a paso para que entiendas en qué consiste cada uno. El primer paso consiste en obtener el coste por peso. Añade este código al método:

Hemos definido algunas nuevas variables: $weight$cost, y $country. La variable $weight contendrá el peso total de todos los productos, la variable $cost contendrá el coste de este método de envío, y la variable $country contendrá el código ISO para el país de envío seleccionado.

Estamos obteniendo el peso total operando en el carrito y añadiendo el peso de cada producto en el carro con la variable $weight. Una vez obtenido el peso total, estamos usando la función wc_get_weight para convertir el peso en kilogramos ya que esta es la unidad con la cual nuestro método ha establecido el límite.

Lo que queda es obtener el coste del peso calculado. Si te fijas en la última parte, no hemos indicado el límite de 100 Kg como habíamos dicho. Los gastos de nuestro envío mostrarán el coste incluso para un carro de 101 Kg o más. Este asunto del límite de envío lo abordaremos más adelante en el artículo como una restricción durante el proceso de compra o actualización del pedido.

Calcular el Coste para el País de Envío Seleccionado

Ahora que tenemos el coste basado en el peso del carrito, podemos calcular el coste para el país de envío seleccionado. Añade este código:

El array countryZones contiene las zonas de cada país. La segunda cadena $zonePrices contiene los precios de cada zona. Una vez hayas establecido estas dos cadenas, obtendremos los gastos según zona como se muestra aquí:

  • Enviamos el código ISO del país a la cadena $countryZones para obtener la zona.
  • Enviamos la zona devuelta a la cadena $zonePrices para conseguir los costes.
  • Añadimos el costo resultante a la variable $cost.

Registrar el Porcentaje

Hemos calculado el coste según el peso total, y también hemos añadido el coste según la zona de envío. El último paso es registrar el porcentaje, así que añade esta parte:

Aquí tienes el código completo de este método por si tienes dificultades en seguirlo:

Si ahora intentas ver tu carro o ir a la página de proceso de compra y seleccionas un país disponible para este envío, tendrás el coste mostrado junto a su método de envío. Aquí tienes una imagen de una zona 3:

Cost of our custom shipping method with a shipping country from zone 3

Añadir Restricciones

Como hemos permitido que el método de envío registre el porcentaje incluso si el peso total de nuestro carrito supera nuestro límite, tenemos que añadir algunas restricciones. Estas restricciones notificarán al cliente en el caso de que el envío no pueda ser efectuado debido al peso.

Sorry 120 kg exceeds the maximum weight of 100 kg for TutsPlus Shipping

Función de Restricción

En nuestra función buscaremos el método de envío que ha sido elegido. Si el método es nuestro TutsPlus_Shipping_Method, entonces comprobaremos su límite de peso y el peso total del carrito. Si el peso del carrito excede el establecido como límite, notificaremos a nuestro cliente.

Después del filtro woocommerce_shipping_methods agrega este código:

Estamos consiguiendo los paquetes que están separados por envío Si todos los productos emplean el mismo envío, devolverá solo un paquete con todos los productos. Tras esto, estamos obteniendo los métodos elegidos, y después para cada paquete comprobamos si éste se entrega a través de nuestro método de envío.

Si se entrega con nuestro método de envío, establecemos el peso límite a partir de los ajustes, y después calculamos el peso total de nuestro paquete. Si el peso total excede nuestro límite, notificará al cliente.

Notificar cuando se Actualiza un Pedido

La actualización de una orden se da cada vez que el cliente cambia algo en la página de proceso de compra. Añadiremos la función tutsplus_validate_order a la acción woocommerce_review_order_before_cart_contents. Esta acción es convocada cuando todo lo demás ha sido indicado de forma que podamos obtener el método de envío elegido a partir de la sesión y los paquetes a partir de los envíos. Una vez que el cliente modifica algo, esta acción desencadenará nuestra función y añadirá la advertencia en el caso de que sea necesario.

Añade este código tras nuestra función tutsplus_validate_order:

Notificar la Finalización del Proceso de Compra

Cuando el cliente pulsa el botón para efectuar el pedido o comprarlo, WooCommerce procesa toda la facturación y datos de envío junto con el contenido del carrito y el método de envío elegido.

Si existe algún mensaje de error de WooCoomerce, parará el proceso de compra y mostrará todos esos errores al cliente. Desde el momento en que hemos creado una función que está usando la sesión para obtener el método de envío elegido, tenemos que añadir esta función a una acción que será disparada después de que la sesión haya sido establecida. La acción que se iniciará justo antes de que WooCommerce compruebe si existe algún mensaje de error es woocommerce_after_checkout_validation.

Añadamos nuestra función a esa acción:

Código Completo

Aquí tienes el código completo de este sistema de envío personalizado, así que si tienes algún problema siguiendo este tutorial, échale un vistazo.

Conclusión

La API de Envíos de WooCommerce te permite crear tu propio método de envío con pasos sencillos. Las limitaciones y la disponibilidad pueden establecerse en el mismo método de envío en el momento de calcular la disponibilidad o los gastos del método de envío, pero también pueden establecerse de forma externa al método de envío por medio de las acciones de WooCommerce.

Si estás buscando nuevas utilidades que amplíen tu selección de herramientas para WordPress o código para prepararte y convertirte en experto en WordPress, no olvides echar un vistazo a lo que tenemos en Envato Market.

Si tienes alguna duda sobre lo que hemos visto o algún método de envío, puedes mencionarlo en la sección de comentarios de abajo. También me puedes seguir en mi blog o en Twitter @igorbenic.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.