Medios de pago en función de la zona de envío en WooCommerce

Programación

Un cliente tiene varias zonas de envío en WooCommerce. La zona 1 es muy cercana y el transporte lo hace el mismo, así que tiene un coste manejable mientras que las zonas 2 y 3 requiere de mensajería y, por tanto, el coste es mayor.

Como medios de pago tenía el pago contrareembolso y la transferencia previa. Sin embargo, le ha ocurrido un par de veces que la gente hace el pedido y luego no lo acepta y, por tanto, se come el coste del envío.

Para evitarlo, lo que necesitamos es poder asignar formas de pago en función de la zona de envío. No he encontrado ningún plugin para hacerlo, así que nos toca hacerlo por código.

Tendríamos que aplicar este código en el functions.php o el fichero de funciones.

<?php
add_filter( 'woocommerce_available_payment_gateways', 'jpd_eliminar_formas_de_pago_por_zonas', 20, 1);
function jpd_eliminar_formas_de_pago_por_zonas( $gateways ){
    // No es el backend (admin)
    if( is_admin() ) 
        return $gateways;

    // Zonas en las que debe estar el pago contrareembolso (COD)
    //Usamos el nombre de las zonas en WooCommerce/Envios/zonas
    $zonas_contrareembolso = array('Zona 1');

    $metodos_elegidos = WC()->session->get( 'chosen_shipping_methods' ); // El método de envío elegido
    $metodo = explode(':', reset($metodos_elegidos) );
    $zona_envio = WC_Shipping_Zones::get_zone_by( 'instance_id', $metodo[1] );
    $nombre_zona_actual = $zona_envio->get_zone_name();

    //Si no está en las zonas autorizadas, ocultamos el método de contrareembolso
    if( !in_array( $nombre_zona_actual, $zonas_contrareembolso ) ) {
        unset( $gateways['cod'] );
    }

    return $gateways;
}

Si la zona está en la lista de zonas autorizadas (utilizando el nombre de la zona tal y como se muestra en WooCommerce/Envios/zonas) mantendremos la forma de pago COD (Cash on Delivery o Contra reembolso). En caso contrario, la ocultaremos.

Deja un comentario