Aunque WooCommerce ofrece una interfaz de administración desde la que crear cupones, a veces puede que necesitemos crear un cupón de manera automática, con un poco de código, en lugar de tener que crearlo manualmente desde la administración de WooCommerce.
En esta guía vamos a ver cómo crear cupones de WooCommerce mediante programación, incluyendo algunas opciones disponibles a la hora de crear el cupón.
Índice de contenidos
Crear un cupón automáticamente
Empezamos sin anestesia. Esta función creará un cupón:
function generate_coupon($coupon_code) { $coupon = new WC_Coupon(); $coupon->set_code($coupon_code); //el tipo de descuento puede ser 'fixed_cart' 'percent' o 'fixed_product' por defecto es 'fixed_cart' $coupon->set_discount_type('fixed_cart'); //cantidad de descuento, por defecto es cero $coupon->set_amount(20); //fecha de caducidad del cupon, por defecto es cero $coupon->set_date_expires(null); //determina si el cupon solo se puede usar individualmente, por defecto es false $coupon->set_individual_use(false); //los productos a los que se aplicara el descuento, por defecto es un array vacio $coupon->set_product_ids(array()); //los productos excluidos del descuento, por defecto es un array vacio $coupon->set_excluded_product_ids(array()); //veces que se puede usar el cupon, por defecto es cero $coupon->set_usage_limit(0); //veces que se puede usar el cupon por usuario, por defecto es cero $coupon->set_usage_limit_per_user(0); //si el cupon incluye envio gratis, por defecto es false $coupon->set_free_shipping(false); //categorias de producto incluidas en el descuento, por defecto es un array vacio $coupon->set_product_categories(array()); //categorias de producto excluidas en el descuento, por defecto es un array vacio $coupon->set_excluded_product_categories(array()); //si los productos rebajados estan excluidos del cupon, por defecto es false $coupon->set_exclude_sale_items(false); //la cantidad minina gastada requerida para que se active el cupon, por defecto es una cadena vacia $coupon->set_minimum_amount(''); //la cantidad maxima gastada requerida para que se active el cupon, por defecto es una cadena vacia $coupon->set_maximum_amount(''); //lista de direcciones de email a las que se aplicara el cupon, por defecto es un array vacio $coupon->set_email_restrictions(array()); //guardamos el cupon $coupon->save(); return $coupon_code; }
Te habrás dado cuenta de que hay un montón de llamadas a funciones del tipo set_
, y en la mayoría de los casos he pasado un valor a la función que no hará nada, no tendrá un resultado real. Simplemente he añadido las llamadas para que sepas qué tipo de campos podrías necesitar.
En realidad, puedes crear un cupón usando una función mucho más corta, como esta…
function generate_coupon($coupon_code) { $coupon = new WC_Coupon(); $coupon->set_code($coupon_code); //el tipo de descuento puede ser 'fixed_cart' 'percent' o 'fixed_product' por defecto es 'fixed_cart' $coupon->set_discount_type('fixed_cart'); //cantidad de descuento, por defecto es cero $coupon->set_amount(20); //guardamos el cupon $coupon->save(); return $coupon_code; }
La idea es que añadas las funciones set_
que necesites realmente.
Cómo añadir automáticamente un cupón al carrito del usuario
¡Al ataque! Sería algo así…
add_action('woocommerce_before_calculate_totals', 'ayudawp_agregar_cupon_automatico_carrito'); function ayudawp_agregar_cupon_automatico_carrito( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return; $coupon_code = 'cupon_generado_ayudawp'; if (!coupon_exists($coupon_code)) { generate_coupon($coupon_code); } $applied_coupons = $cart->get_applied_coupons(); if( ! in_array($coupon_code, $applied_coupons) && cart_contains_items('espadrillas' )){ $cart->add_discount( $coupon_code ); wc_clear_notices(); wc_add_notice(__("Como tu pedido contiene unas espadrillas hemos aplicado un descuento", "woocommerce"), "notice"); } elseif( in_array($coupon_code, $applied_coupons) && !cart_contains_items('espadrillas' )){ $cart->remove_coupon( $coupon_code ); } }
Este código contiene una función que hace gancho en la acción woocommerce_before_calculate_totals
y hace lo siguiente:
- Primero añadimos algo de código para salir de la función si recibe una llamada desde la administración o hay una acción AJAX en curso
- Luego aseguramos que la acción
woocommerce_before_calculate_totals
no tenga más de dos llamadas previas usando la función de WordPressdid_action
- A continuación creamos un nombre para el cupón, y lo almacenamos en la variable
$coupon_code
- Lo siguiente es comprobar si se ha creado el cupón, usando la función
coupon_exists
. - Si existiese ya un cupón con el mismo nombre que el de la variable
$coupon_code
entonces no creamos el nuevo cupón, y si no hay ningún cupón entonces llamamos agenerate_coupon
definida anteriormente. Si necesitas una lógica distinta, como crear un cupón para cada cliente, tendrás que cambiar esta lógica a la que se ajuste a tu necesidad. - Ahora que ya tenemos listo el cupón revisamos los cupones que ya estén aplicados en el carrito, y lo hacemos con la función de WooCommerce
$cart->get_applied_coupons()
, esta información la escribimos en el array denominado$applied_coupon
. - Lo siguiente es probar la misma lógica para ver si deberíamos aplicar el cupón al carrito. Cuando apliques este código en tu tienda puedes aplicar el cupón a todos los carritos o configurar la lógica en el mismo cupón, pero en este ejemplo se aplica algo de esta lógica para mostrar el efecto cuando el cupón se aplica o no al carrito.
- Para ofrecer la lógica
if
añadimos la funcióncart_contains_items
, que devuelve true si hay algún producto en el carrito, en el ejemplo si se añade al carrito un producto cuyo slug sea ‘espadrillas’. - Si en el carrito hay unas espadrillas entonces llamamos a
$cart->add_discount( $coupon_code )
para añadir el cupón al carrito, luego limpiamos los avisos y añadimos el nuevo aviso que le informa al cliente que se le ha aplicado el descuento. - Para finalizar, la lógica
elseif
al final de la función gestiona el caso en el que el usuario no tenga unas espadrillas en su carrito, y entonces llamamos a$cart->remove_coupon( $coupon_code )
para eliminar el cupón del carrito del usuario. Esta parte del código se ocupa de la situación en la que el usuario tenía unas espadrillas en su carrito pero las quitó, y llamando aremove_coupon
te aseguras que el cliente no reciba el cupón después de quitar las espadrillas.
Un poco más de detalle sobre el código
Al revisar antes el código hay un par de funciones personalizadas del mismo que conviene repasar con algo más de detalles. Me refiero, por ejemplo, a la función coupon_exists
.
function coupon_exists($coupon_code) { global $wpdb; $sql = $wpdb->prepare( "SELECT post_name FROM $wpdb->posts WHERE post_type = 'shop_coupon' AND post_name = '%s'", $coupon_code ); $coupon_codes = $wpdb->get_results($sql); if (count($coupon_codes)> 0) { return true; } else { return false; } }
En esta función usamos la consulta global de objetos $wpdb
para consultar la base de datos de WordPress y ver si ya hay un código de cupón como el que queremos usar.
El paso a paso es este:
- Primero va la declaración SQL que consulta las bases de datos para buscar si algún registro de la tabla
posts
tiene unpost_type
deshop_coupon
y el nombre elegido. - Observa que pasamos la declaración SQL a la función
$wpdb->prepare
para protegernos de una posible inyección SQL. - A continuación usamos la función
$wpdb->get_results
para devolver un array de los resultados devueltos por la consulta SQL. - Si el array está vacío entonces devolvemos
false
(lo que indica que el cupón no existe), y si el array contiene algún resultado entonces devolvemostrue
.
Ahora podemos ya usar esta función para determinar si existe un cupón, y solo crear el nuevo cupón si no lo encontramos en la base de datos.
Para terminar, repasemos la función cart_contains_items
.
function cart_contains_items( $search_products ) { $searching_for_single_product = !is_array($search_products); if ( ! WC()->cart->is_empty() ) { // Loop de los productos en el carrito foreach(WC()->cart->get_cart() as $cart_item ) { // Tambien incluimos productos variables y sus variaciones $products_ids_array[] = $cart_item['product_id']; $products_ids_array[] = $cart_item['variation_id']; $products_ids_array[] = $cart_item['data']->get_slug(); } } if ($searching_for_single_product) { return in_array($search_products, $products_ids_array); } else { return !array_diff($search_products, $products_ids_array); } }
No creo que haga falta repasar este código línea por línea, pues son funciones que calculan cuántos productos de un tipo determinado hay en el carrito, y está suficientemente documentado, pero creo que observándolo al detalles podrás analizar cómo funciona.
Resumiendo
Hay muchas opciones diferentes disponibles al crear un cupón en WooCommerce y es posible especificar todas estas opciones al crear un cupón automáticamente mediante programación.
De paso, hemos analizado cómo aplicar un cupón al carrito de un usuario después de crearlo automáticamente, con lo que queda el bucle al completo, y espero que te sirva de base para crear tus propias automatizaciones de cupones mediante programación.
¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!