FOX - WooCommerce Currency Switcher Professional

Coste de envío de WooCommerce en la moneda incorrecta: causas y soluciones

Un coste de envío de WooCommerce en la moneda incorrecta se manifiesta de tres maneras después de que un visitante cambia de moneda: el símbolo cambia pero el número sigue igual, el coste se convierte dos veces y resulta demasiado alto o demasiado bajo, o el envío cae a cero o desaparece. Los precios de los productos suelen estar bien al mismo tiempo, porque la causa está en el origen del coste de envío. A continuación verás cómo convierte FOX el envío, cómo distinguir los tres casos con una sola prueba y la solución para las tarifas planas, los plugins de transportistas y los importes fijos por moneda.

Cómo convierte FOX los costes de envío

WooCommerce da por hecho que todo importe que almacena está en la moneda base, costes de envío incluidos. Los métodos de envío construyen sus tarifas, WooCommerce pasa la lista por el filtro woocommerce_package_rates y FOX la convierte ahí con prioridad 9999: el coste de cada tarifa y sus impuestos se multiplican por el tipo de cambio de la moneda seleccionada y se redondean a los decimales de esa moneda.

  • Esta conversión solo se ejecuta con Es múltiple permitido (Is multiple allowed) = Sí (Yes) en la pestaña Avanzado (Advanced) de los ajustes de FOX, el modo en que los clientes pagan en la moneda que seleccionaron.
  • Con Es múltiple permitido (Is multiple allowed) = No, las tarifas se mantienen en la moneda base. El carrito las muestra convertidas a título informativo, y la página de finalizar compra lo recalcula todo en la moneda base, que es lo que paga el cliente. Esta configuración se explica en mostrar la moneda local y cobrar en la moneda base.
  • Las fórmulas del campo de coste de Tarifa plana (Flat rate), como [qty] * 2 o [fee percent="10" min_fee="5"], se evalúan con el total del carrito convertido de nuevo a la moneda base, de modo que los porcentajes y las tarifas mínimas funcionan en términos de moneda base y el resultado se convierte después junto con las demás tarifas.

De aquí se deduce una regla: todo lo que llegue a woocommerce_package_rates antes de la prioridad 9999 debe estar en la moneda base. Un coste que ya está en la moneda del visitante se convierte por segunda vez; un coste que un plugin establece después de que FOX haya terminado no se convierte en absoluto.

Coste de envío en la moneda incorrecta: averigua qué caso tienes

Toma un método de envío y un coste conocido en la moneda base, por ejemplo 10,00 USD, y una moneda con un tipo de cambio conocido, por ejemplo EUR a 0,92 en la tabla de monedas de FOX. Cambia a EUR, modifica una vez la cantidad del carrito (WooCommerce guarda las tarifas calculadas en la sesión y las reutiliza hasta que cambia el carrito o la dirección) y compara:

Envío en EURQué significa
9,20 €Convertido correctamente
10,00 €Sin convertir: la tarifa se estableció después de FOX, o por un plugin que se salta las tarifas de WooCommerce
8,46 €Convertido dos veces: el plugin ya devolvió 9,20 en EUR y FOX lo multiplicó de nuevo
Otro importe cualquieraEl transportista devolvió un precio en la moneda de su propia cuenta, y se trató como moneda base
0,00 € o ningún método de envíoUn tipo de cambio de 0 para esta moneda, o un código de moneda que el transportista no reconoce

Durante la prueba, la opción Modo de depuración (Debug mode) en WooCommerce → Ajustes → Envío desactiva la caché de tarifas de envío, de modo que cada carga de página calcula tarifas nuevas. Vuelve a desactivarla después.

Fija un coste de envío exacto por moneda

Convertir según el tipo de cambio da importes como 9,20 € o 1.486 ₹. Cuando quieras números redondos, un nivel de precios distinto por mercado (18 € para Europa, 32 $ para el resto del mundo), o un coste de envío que no siga un margen añadido al tipo de cambio, fija el importe por moneda:

  1. En la pestaña Avanzado (Advanced) de los ajustes de FOX establece Es múltiple permitido (Is multiple allowed) en Sí (Yes). La opción Importe fijo individual para envío (Individual fixed amount for shipping) está oculta hasta que lo hagas.
  2. Activa Importe fijo individual para envío (Individual fixed amount for shipping) y guarda.
  3. Abre WooCommerce → Ajustes → Envío, una zona de envío, y edita su método Tarifa plana (Flat rate). Debajo de los campos de WooCommerce hay ahora un campo Coste fijo (Fixed cost) para cada moneda excepto la base, por ejemplo Coste fijo EUR (Fixed cost EUR).
  4. Introduce el importe en esa moneda. Un campo vacío (marcador de posición auto) significa "convertir según el tipo de cambio".

Un importe fijo sustituye todo el coste convertido de esa tarifa plana, incluidos los costes por clase de envío o el resultado de una fórmula, y el impuesto de envío se recalcula a partir de él. Solo se usan importes mayores que 0: un 0 cuenta como vacío, así que para un envío gratuito en una moneda usa un método de Envío gratuito (Free shipping). La misma opción añade campos Importe mínimo del pedido en EUR (Minimum order amount in EUR) a los métodos de Envío gratuito (Free shipping), de modo que el umbral de envío gratuito también se puede fijar por moneda; sin ellos, FOX compara el subtotal del carrito convertido de nuevo a la moneda base con el mínimo en moneda base.

Los campos existen solo para los métodos Tarifa plana (Flat rate) y Envío gratuito (Free shipping) propios de WooCommerce. Los plugins de tarifas por tabla y las tarifas de transportistas siempre se convierten según el tipo de cambio. Si no ves los campos, comprueba que la opción siga activada después de guardar y que la ventana de ajustes del método de envío se abra sin errores de JavaScript en la consola del navegador.

Para costes convertidos que solo quieres dejar más limpios, un filtro de redondeo es la mejor herramienta; redondear los precios convertidos incluye uno para el envío que se ejecuta después de la conversión de FOX.

Plugins de transportistas que devuelven tarifas en otra moneda

Los plugins de UPS, DHL, FedEx, Printful, Easyship y servicios de reparto locales piden un precio en vivo a la API del transportista. La API responde en la moneda que se le pidió, o en la moneda de la cuenta del transportista. Muchos de estos plugins piden "la moneda de la tienda" con get_woocommerce_currency(), y FOX responde a esa función con la moneda del visitante, así que la API devuelve, por ejemplo, 9,20 EUR. El plugin entrega 9,20 a WooCommerce como si fueran dólares, y FOX lo convierte otra vez. Algunos plugins comparan la moneda de la cuenta con la moneda de la tienda y no devuelven ninguna tarifa cuando difieren.

Hay tres formas de solucionarlo, de la más limpia a la más general:

  1. Haz que el plugin solicite la moneda base. Busca un ajuste de moneda en el plugin del transportista. Si no hay ninguno, su solicitud se puede cambiar para que use $WOOCS->default_currency; esta es la solución para Printful.
  2. Usa una adaptación ya preparada. Existe código listo para UPS Shipping Method, el plugin oficial de UPS, DHL Express Commerce, Printful, Easyship, Aramex e Ingrid. Packeta convierte sus tarifas a través del propio FOX y no necesita código, siempre que esté actualizado. Las modificaciones dentro de los archivos de otro plugin se pierden cuando ese plugin se actualiza, así que anótalas.
  3. Convierte las tarifas de nuevo a la moneda base antes de que FOX las convierta. Funciona con cualquier transportista y sobrevive a las actualizaciones del plugin.
/*
 * Carrier rates that arrive in a currency other than the base currency:
 * turn them back into the base currency before FOX converts all rates (priority 9999).
 * Child theme functions.php or a code snippets plugin.
 */
add_filter('woocommerce_package_rates', function ($rates, $package) {
    if (!class_exists('WOOCS')) {
        return $rates;
    }
    global $WOOCS;

    $methods       = array('ups'); // method IDs of the carrier plugins (see below)
    $rate_currency = $WOOCS->current_currency;  // or a fixed code, e.g. 'GBP' for the account currency

    $currencies = $WOOCS->get_currencies();
    if ($rate_currency === $WOOCS->default_currency || empty($currencies[$rate_currency]['rate'])) {
        return $rates;
    }
    $factor = (float) $currencies[$rate_currency]['rate'];

    foreach ($rates as $rate) {
        if (!in_array($rate->get_method_id(), $methods, true)) {
            continue;
        }
        $rate->set_cost((float) $rate->get_cost() / $factor);

        $taxes = $rate->get_taxes();
        if (!empty($taxes)) {
            foreach ($taxes as $key => $tax) {
                $taxes[$key] = (float) $tax / $factor;
            }
            $rate->set_taxes($taxes);
        }
    }
    return $rates;
}, 100, 2);

Para encontrar el ID de un método, inspecciona el botón de opción del método de envío en la página del carrito: su valor se parece a ups:4:03 o flat_rate:2, y la parte anterior a los primeros dos puntos suele ser el ID del método. Mantén $rate_currency como la moneda del visitante cuando el transportista cotiza en la moneda que se le pide; establece un código fijo cuando siempre cotiza en la moneda de la cuenta. Esa moneda debe existir en la tabla de monedas de FOX con un tipo de cambio actual; de lo contrario, el fragmento deja las tarifas sin tocar. El mismo fragmento sirve también para "no convertir el envío de este método": el importe que devuelve el método se muestra entonces sin cambios en todas las monedas.

Envío que no se convierte en absoluto

Cuando el número se mantiene y solo cambia el símbolo, el coste nunca pasó por la conversión de FOX. Razones habituales:

  • El plugin modifica sus tarifas en su propia función de woocommerce_package_rates con una prioridad superior a 9999, después de que FOX las haya convertido.
  • El precio lo establece el widget de finalización de compra del propio plugin, o se añade como un cargo del carrito en lugar de una tarifa de envío.
  • Las reglas del plugin de envío comparan el total del carrito con umbrales introducidos en la moneda base, de modo que las reglas basadas en el valor del carrito eligen el tramo equivocado en otras monedas.

Estos casos necesitan un cambio por parte del plugin: tiene que pasar sus importes por FOX con apply_filters('woocs_exchange_value', $amount), descrito en la página de woocs_exchange_value, o comparar valores en moneda base. Pregunta a los autores del plugin, o consulta FOX Labs para ver adaptaciones de otros plugins.

El envío pasa a cero o desaparece al cambiar de moneda

  • Un tipo de cambio de 0. FOX multiplica el coste de envío por el tipo de cambio de la moneda, de modo que un tipo guardado como 0 hace gratuitas todas las tarifas en esa moneda. Ocurre cuando un agregador no devuelve datos, a menudo después de cambiar la moneda base. Revisa la columna Tarifa (Rate) en la pestaña Divisas (Currencies); los tipos de cambio que no se actualizan explica las causas.
  • Un código de moneda que el transportista no conoce. Las API de los transportistas cotizan por código ISO, así que una moneda añadida como UK en lugar de GBP no devuelve tarifas y la página de finalizar compra no muestra métodos de envío. Usa el código ISO real para cualquier moneda que vea un transportista o una pasarela de pago; los códigos de moneda personalizados explica cuándo un código que no es ISO es seguro.
  • El transportista rechaza la moneda. Algunos plugins de transportistas devuelven tarifas solo cuando la moneda de la tienda coincide con la moneda de la cuenta. Usa una de las tres soluciones de la sección de transportistas anterior.

Lista de verificación

  • Es múltiple permitido (Is multiple allowed) está establecido como se pretende: Sí (Yes) para cobrar en la moneda del visitante, No para cobrar en la moneda base.
  • Todas las monedas tienen un tipo de cambio distinto de cero y un código ISO real.
  • Las tarifas planas que necesitan importes exactos tienen valores de Coste fijo (Fixed cost) para cada moneda, con Importe fijo individual para envío (Individual fixed amount for shipping) activado.
  • Los plugins de transportistas solicitan la moneda base, usan su adaptación o están cubiertos por el fragmento de conversión inversa.
  • Probado en una ventana privada, con el carrito modificado o con el Modo de depuración (Debug mode) de envío activado, en cada moneda.

Si un método de envío sigue siendo incorrecto en una moneda, abre un tema en el foro de soporte de FOX con el nombre del plugin de envío, tu ajuste de Es múltiple permitido (Is multiple allowed) y el coste que ves en la moneda base y en la otra moneda, y lo revisaremos.