php - plugin - ¿Cómo aplico programáticamente un cupón en WooCommerce?
get tag name wordpress (3)
Creo que esta extensión puede hacer lo que quieras: https://awodev.com/products/wordpress/awocoupon
Tenía una aplicación similar y me puse en contacto con el desarrollador y agregaron la función que estaba buscando en cuestión de horas. Muy amable y recomiendo comprar de este desarrollador!
En WooCommerce estoy tratando de encontrar una forma de aplicar un descuento del 10% a todo el pedido de un cliente si el peso en el carrito es más de 100 lb. Soy parte de camino para lograr esto. Para el siguiente paso, estoy buscando una forma de aplicar programáticamente un código de cupón a través de action / hook a través de functions.php.
Parece que puedo usar la función woocommerce_ajax_apply_coupon para hacer esto ( http://docs.woothemes.com/wc-apidocs/function-woocommerce_ajax_apply_coupon.html ) pero no estoy seguro de cómo usarlo.
Hasta ahora he modificado cart.php para obtener el peso total de todos los productos en el carrito, he creado un cupón que aplica el descuento (si se ingresó manualmente) y he agregado un código a functions.php para verificar el peso y mostrar un mensaje al usuario.
EDITAR: código parcial eliminado, código completado incluido en la solución a continuación.
Gracias por la guía Freney. Este es el resultado final que aplica correctamente el cupón de descuento cuando se cumple la condición y también lo elimina cuando ya no se cumple:
/* Mod: 10% Discount for weight greater than 100 lbs
Works with code added to child theme: woocommerce/cart/cart.php lines 13 - 14: which gets $total_weight of cart:
global $total_weight;
$total_weight = $woocommerce->cart->cart_contents_weight;
*/
add_action(''woocommerce_before_cart_table'', ''discount_when_weight_greater_than_100'');
function discount_when_weight_greater_than_100( ) {
global $woocommerce;
global $total_weight;
if( $total_weight > 100 ) {
$coupon_code = ''999'';
if (!$woocommerce->cart->add_discount( sanitize_text_field( $coupon_code ))) {
$woocommerce->show_messages();
}
echo ''<div class="woocommerce_message"><strong>Your order is over 100 lbs so a 10% Discount has been Applied!</strong> Your total order weight is <strong>'' . $total_weight . ''</strong> lbs.</div>'';
}
}
/* Mod: Remove 10% Discount for weight less than or equal to 100 lbs */
add_action(''woocommerce_before_cart_table'', ''remove_coupon_if_weight_100_or_less'');
function remove_coupon_if_weight_100_or_less( ) {
global $woocommerce;
global $total_weight;
if( $total_weight <= 100 ) {
$coupon_code = ''999'';
$woocommerce->cart->get_applied_coupons();
if (!$woocommerce->cart->remove_coupons( sanitize_text_field( $coupon_code ))) {
$woocommerce->show_messages();
}
$woocommerce->cart->calculate_totals();
}
}
Primero, cree un cupón de descuento (a través de http://docs.woothemes.com/document/create-a-coupon-programatically/ ):
$coupon_code = ''UNIQUECODE''; // Code - perhaps generate this from the user ID + the order ID
$amount = ''10''; // Amount
$discount_type = ''percent''; // Type: fixed_cart, percent, fixed_product, percent_product
$coupon = array(
''post_title'' => $coupon_code,
''post_content'' => '''',
''post_status'' => ''publish'',
''post_author'' => 1,
''post_type'' => ''shop_coupon''
);
$new_coupon_id = wp_insert_post( $coupon );
// Add meta
update_post_meta( $new_coupon_id, ''discount_type'', $discount_type );
update_post_meta( $new_coupon_id, ''coupon_amount'', $amount );
update_post_meta( $new_coupon_id, ''individual_use'', ''no'' );
update_post_meta( $new_coupon_id, ''product_ids'', '''' );
update_post_meta( $new_coupon_id, ''exclude_product_ids'', '''' );
update_post_meta( $new_coupon_id, ''usage_limit'', ''1'' );
update_post_meta( $new_coupon_id, ''expiry_date'', '''' );
update_post_meta( $new_coupon_id, ''apply_before_tax'', ''yes'' );
update_post_meta( $new_coupon_id, ''free_shipping'', ''no'' );
A continuación, aplique ese cupón a su pedido:
if (!$woocommerce->cart->add_discount( sanitize_text_field( $coupon_code )))
$woocommerce->show_messages();
Esa última función devuelve un valor BOOL: TRUE si el descuento fue exitoso, FALSE si falla por una variedad de razones.
Usé esta solución, pero contiene un error como lo escribió el OP. Si el usuario se salta la vista previa del carro y va directamente al formulario de pago, no aplica el cupón. Aquí estaba mi solución.
// Independence day 2013 coupon auto add
// Add coupon when user views cart before checkout (shipping calculation page).
add_action(''woocommerce_before_cart_table'', ''add_independence_day_2013_coupon_automatically'');
// Add coupon when user views checkout page (would not be added otherwise, unless user views cart first).
add_action(''woocommerce_before_checkout_form'', ''add_independence_day_2013_coupon_automatically'');
// Check if php function exists. If it doesn''t, create it.
if (!function_exists(''add_independence_day_2013_coupon_automatically'')) {
function add_independence_day_2013_coupon_automatically() {
global $woocommerce;
$coupon_code = ''independencedaysale'';
$bc_coupon_start_date = ''2013-06-30 17:00:00'';
$bc_coupon_end_date = ''2013-07-08 06:59:59'';
// Only apply coupon between 12:00am on 7/1/2013 and 11:59pm on 7/7/2013 PST.
if ((time() >= strtotime($bc_coupon_start_date)) &&
(time() <= strtotime($bc_coupon_end_date))) {
// If coupon has been already been added remove it.
if ($woocommerce->cart->has_discount(sanitize_text_field($coupon_code))) {
if (!$woocommerce->cart->remove_coupons(sanitize_text_field($coupon_code))) {
$woocommerce->show_messages();
}
}
// Add coupon
if (!$woocommerce->cart->add_discount(sanitize_text_field($coupon_code))) {
$woocommerce->show_messages();
} else {
$woocommerce->clear_messages();
$woocommerce->add_message(''Independence day sale coupon (10%) automatically applied'');
$woocommerce->show_messages();
}
// Manually recalculate totals. If you do not do this, a refresh is required before user will see updated totals when discount is removed.
$woocommerce->cart->calculate_totals();
} else {
// Coupon is no longer valid, based on date. Remove it.
if ($woocommerce->cart->has_discount(sanitize_text_field($coupon_code))) {
if ($woocommerce->cart->remove_coupons(sanitize_text_field($coupon_code))) {
$woocommerce->show_messages();
}
// Manually recalculate totals. If you do not do this, a refresh is required before user will see updated totals when discount is removed.
$woocommerce->cart->calculate_totals();
}
}
}
}