Saltar al contenido Saltar a la barra lateral

Este es el foro de soporte técnico de WPML, el plugin multilingüe de WordPress.

Todas las personas pueden leerlo pero solo los clientes de WPML pueden ingresar comentarios. El equipo de WPML responde en los foros 6 días a la semana, 22 horas por día.

Sun Mon Tue Wed Thu Fri Sat
- 9:00 – 13:00 5:00 – 13:00 5:00 – 13:00 5:00 – 13:00 5:00 – 13:00 -
- 14:00 – 18:00 14:00 – 18:00 14:00 – 18:00 14:00 – 18:00 14:00 – 18:00 -

Zona horaria del soporte: America/Argentina/Buenos_Aires (GMT-03:00)

Etiquetado: 

Este tema contiene 15 respuestas, tiene 0 voces.

Última actualización por Otto hace 20 horas, 35 minutos.

Asistido por: Otto.

Autor Publicaciones
agosto 12, 2025 a las 9:41 am #17312653

OscarO-3

Antecedentes del problema:
Estoy intentando actualizar mi tienda online que utiliza Flexible Checkout Fields, Flexible Checkout Fields PRO y WooCommerce Multilingual & Multicurrency. A través de estos plugins, muestro y oculto campos en el formulario de pago según el método de envío seleccionado. He creado un entorno de pruebas para actualizar la web, pero tras la actualización, la funcionalidad de mostrar/ocultar campos deja de funcionar correctamente. El problema se puede ver en enlace oculto.

Síntomas:
Después de actualizar, aunque los campos se muestran y ocultan visualmente, al enviar el formulario se genera un error de campos incompletos para el método de envío no seleccionado. Si desactivo WooCommerce Multilingual & Multicurrency, la funcionalidad vuelve a funcionar, pero pierdo traducciones y enlaces en la versión traducida.

Preguntas:
¿Cómo puedo resolver el problema de incompatibilidad entre Flexible Checkout Fields y WooCommerce Multilingual & Multicurrency?
¿Es posible actualizar la web sin perder la funcionalidad de mostrar/ocultar campos y sin perder traducciones?

agosto 12, 2025 a las 4:57 pm #17314328

Otto
Partidario de WPML desde 09/2015

Idiomas: Inglés (English ) Español (Español )

Zona horaria: America/Argentina/Buenos_Aires (GMT-03:00)

Hola,

¿Solo estás actualizando WPML y WCML o también Flexible Checkout Fields PRO? ¿Desde qué versiones?

¿La página de checkout usa bloques o el shortcode clásico [woocommerce_checkout]?¿Has creado un único grupo de campos en el idioma principal y traducido las cadenas con WPML, o hay grupos duplicados por idioma? ¿Los campos problemáticos están marcados como “required” en FCF?

Prueba volviendo a salvar la configuración de FCF y, si fuera necesario, actualizar sus traducciones.

En tu sitio de pruebas haz el siguiente test por favor:
**Antes de continuar, haz un backup completo y confiable.**
1. Desactiva todos los plugins excepto WooCommerce, FCF, WPML y sus complementos.
2. Cambia a un tema por defecto de WordPress (por ejemplo, Twenty Twenty-Five).
3. Si el problema desaparece, reactiva los plugins uno por uno hasta identificar cuál causa el conflicto.

Saludos cordiales,
Otto

agosto 13, 2025 a las 6:39 am #17315567

OscarO-3

Hola Otto,

Respondo a tus preguntas:

- Estoy actualizando todo (plugins, plantilla y versión de WordPress). El sistema está funcionando perfectamente en producción con esta configuración: FCF (versión 4.1.19), FCF PRO (versión 4.0.14), WCML (versión 5.4.3), WPML Multilingual CMS (versión 4.7.3), WPML String Translation (versión 3.3.2)

- La página de checkout utiliza bloques. He creado un único grupo de campos en el idioma principal y traducido las cadenas con WPML. Los campos conflictivos son required (pero también he intentado, a través de FCF, quitar el required y ponerlo con conditional logic. Lo que ocurre entonces es que el campo deja de ser obligatorio y puedo enviar el pedido sin rellenar estos campos)

- He hecho cambios en la configuración de FCF y diversas pruebas como te he comentado en el punto anterior, pero el problema permanece.

- El problema sólo aparece cuando WCML está activado, si lo desactivo, todo funciona correctamente. He realizado estas pruebas que me comentas para poder detectar dónde estaba el problema o incompatibilidad.

Puedo proporcionarte una copia hecha con Duplicator PRO si necesitáis generar un entorno donde hacer las pruebas o, en su defecto, daros acceso al servidor de pruebas.

Saludos y gracias por adelantado,

agosto 13, 2025 a las 12:53 pm #17317566

Otto
Partidario de WPML desde 09/2015

Idiomas: Inglés (English ) Español (Español )

Zona horaria: America/Argentina/Buenos_Aires (GMT-03:00)

Hola,

Muchas gracias. Una copia del sitio sería genial.

Habilito una respuesta privada para que puedas compartir un link de descarga.

Saludos cordiales,
Otto

agosto 13, 2025 a las 4:44 pm #17318615

Otto
Partidario de WPML desde 09/2015

Idiomas: Inglés (English ) Español (Español )

Zona horaria: America/Argentina/Buenos_Aires (GMT-03:00)

Hola,

Muchas gracias.

He instalado el sitio localmente, he podido reproducir el problema, pero no doy con la solución 🙁

Sería bueno saber si han sido los cambios en WCML o en FCF los que han generado la incompatibilidad.

Para ello, si es posible para ti, podrías mantener las versiones que funcionan:
FCF (versión 4.1.19), FCF PRO (versión 4.0.14) y solo actualizar WPML y sus add-ons y WCML? Alternativamente, puedes proporcionarme una copia de esas versiones y ya lo pruebo yo en mi copia de tu sitio. Habilito una respuesta privada para que me pases un enlace de descarga.

Por otro lado, he notado en el changelg de FCF que ellos mantienen la compatibilidad por lo que te sugiero que consultes con ellos también, si es que aún no lo has hecho.

Saludos cordiales,
Otto

agosto 14, 2025 a las 5:03 pm #17321784

Otto
Partidario de WPML desde 09/2015

Idiomas: Inglés (English ) Español (Español )

Zona horaria: America/Argentina/Buenos_Aires (GMT-03:00)

Hola,

Gracias.

He creado un pequeño plugin que soluciona el problema de compatibilidad.

Al final de la respuesta copio el código para lo pruebes cuidadosamente en un entorno de desarrollo antes de aplicarlo en producción. Puedes instalarlo como un mu-plugin simplemente copiando el archivo a la carpeta wp-content/mu-plugins. O instalarlo como cualquier otro plugin, para ello crea la carpeta fcf-wcml-compat y pon dentro fcf-wcml-compat.php (con el código que te paso al final). Comprime la carpeta en fcf-wcml-compat.zip. Instálalo desde Plugins → Añadir nuevo → Subir plugin.

El problema es el siguiente:
FCF envía al servidor, en un campo oculto, la “lista” de qué campos se mostraron y cuáles no durante el checkout.
Con WCML activo, esa “lista” a veces llega con un formato raro y FCF no la puede leer. Como no sabe qué campos estaban ocultos, WooCommerce intenta validarlos igual y aparece el error de “campo requerido”.

El plugin que te he compartido “Limpia” esa información oculta antes de que FCF la lea, para que FCF entienda correctamente qué campos se mostraron/ocultaron. Además, como red de seguridad, si un campo no llegó en el envío del formulario (porque estaba oculto), se evita que WooCommerce lo exija como obligatorio.

Si bien la "culpa" (en compatibilidad no hay culpas 😉 ) pareciera ser de WCML, yo creo que la solución final tendría que implementarla FCF. Esa información oculta la crea y la usa FCF. Lo ideal es que FCF sea resistente a diferencias de formato para que el checkout nunca se bloquee aunque otro plugin (como WCML) cambie algo en el camino. Arreglarlo en FCF hace que el sistema sea más sólido sin depender de parches externos y reduce el riesgo de que el problema reaparezca con futuras actualizaciones.

Quedo atento a tus comentarios.

Saludos cordiales,
Otto

<?php
/*
Plugin Name: FCF ⇄ WCML Compat (logic_results_storage normalizer)
Description: Normaliza el payload de lógica condicional de Flexible Checkout Fields PRO cuando WCML está activo para evitar fallos de validación por JSON mal decodificado.
Author: DevOps
Version: 0.1
*/

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

/**
 * Intenta decodificar en distintos escenarios de codificación.
 * Devuelve array si tiene éxito o null si falla.
 */
function fcf_wcml_try_decode_results( $raw ) {
    // Sin tocar
    $arr = json_decode( $raw, true );
    if ( is_array( $arr ) ) {
        return $arr;
    }

    // urldecode (una vez)
    $arr = json_decode( urldecode( $raw ), true );
    if ( is_array( $arr ) ) {
        return $arr;
    }

    // rawurldecode
    $arr = json_decode( rawurldecode( $raw ), true );
    if ( is_array( $arr ) ) {
        return $arr;
    }

    // Doble urldecode
    $arr = json_decode( urldecode( urldecode( $raw ) ), true );
    if ( is_array( $arr ) ) {
        return $arr;
    }

    // Quitar slashes extra
    $arr = json_decode( wp_unslash( $raw ), true );
    if ( is_array( $arr ) ) {
        return $arr;
    }

    return null;
}

/**
 * Normaliza $_POST['logic_results_storage'] lo antes posible en el proceso de checkout
 * para que FCF PRO pueda decodificarlo correctamente con su urldecode() interno.
 */
add_action( 'woocommerce_checkout_process', function () {
    $key = 'logic_results_storage';
    if ( empty( $_POST[ $key ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
        return;
    }

    $raw = $_POST[ $key ]; // phpcs:ignore WordPress.Security.NonceVerification.Missing
    // No usar wp_unslash aquí: queremos probar varias ramas nosotros mismos.
    $decoded = fcf_wcml_try_decode_results( $raw );

    if ( is_array( $decoded ) ) {
        // Re-serializamos en el formato que espera FCF: urlencode(JSON)
        $normalized = urlencode( wp_json_encode( $decoded ) );
        $_POST[ $key ] = $normalized; // phpcs:ignore WordPress.Security.NonceVerification.Missing

        // Opcional: logging de diagnóstico (comentado por defecto).
        // error_log( '[FCF-WCML-Compat] logic_results_storage normalizado correctamente.' );
    } else {
        // error_log( '[FCF-WCML-Compat] No se pudo normalizar logic_results_storage.' );
    }
}, 1 );

/**
 * Durante el procesamiento del checkout (solamente en POST), desactiva "required"
 * para aquellos campos que no vienen en $_POST. Esto evita que WooCommerce valide
 * campos que no se mostraron por lógica condicional.
 */
add_filter( 'woocommerce_checkout_fields', function ( $fields ) {
    if ( empty( $_POST ) ) { // Solo actuar en envío del checkout.
        return $fields;
    }

    foreach ( $fields as $section => $section_fields ) {
        if ( ! is_array( $section_fields ) ) {
            continue;
        }
        foreach ( $section_fields as $key => $field ) {
            if ( ! array_key_exists( $key, $_POST ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
                // No venía en el POST → probablemente oculto. Evita que falle la validación.
                $fields[ $section ][ $key ]['required'] = false;
            }
        }
    }

    return $fields;
}, 1000001 );
agosto 18, 2025 a las 11:06 am #17327418

OscarO-3

Hola Otto, buenos días,

Muchas gracias por tu ayuda y disculpa por el retraso en contestar, el viernes fue festivo aquí en España.

He descargado el código que me has facilitado y lo he añadido como plugin y, salvo que haya hecho algo incorrectamente, no está funcionando como debiera.

Es cierto que ya no se solicitan los campos obligatorios del método de envío no seleccionado pero, ahora, sin embargo, en cualquiera de los métodos de envío, los campos creados con FCF dejan de ser obligatorios y puedo enviar el pedido sin rellenarlos y el pedido se tramita igualmente, sin generarme el mensaje de error de campo obligatorio no rellenado (es decir, puedo dejar el campo Seleccione la tienda vacío cuando selecciono recogida en tienda y los campos de dirección cuando es entrega a domicilio).

Si estoy en lo cierto, creo que el plugin que me has facilitado deshabilita la validación de los campos FCF pero no resuelve el problema, ¿me explico?

Muchas gracias de nuevo y saludos,

agosto 18, 2025 a las 1:24 pm #17328051

Otto
Partidario de WPML desde 09/2015

Idiomas: Inglés (English ) Español (Español )

Zona horaria: America/Argentina/Buenos_Aires (GMT-03:00)

Hola,

Es extraño... 🤔

Yo he chequeado el escenario que describes y en mi caso funcionaba correctamente. Si algún campo visible de FCF no estaba completo aparecía la advertencia de campo requerido.

¿Podrías probarlo como mu-plugin?

En mi caso, yo lo he testeado con el setup mínimo. Es decir, habilitando solo los plugins necesarios para reproducir el problema y con un tema por defecto. ¿Podrías chequearlo desactivando todos los plugins salvo WooCommerce, WCML, FCF, FCF PRO, WPML y sus add-ons y con el tema Twenty Twenty Five?
**Haz la prueba en un entorno de desarrollo o con un backup completo y confiable.**

Si el problema desaparece, reactiva los plugins uno por uno hasta identificar cuál causa el conflicto.

Saludos cordiales,
Otto

agosto 19, 2025 a las 2:17 pm #17331772

OscarO-3

Hola Otto,

He probado a añadir el fichero como mu-plugin y tampoco funciona correctamente, hace exactamente lo mismo que como plugin.

Los siguientes comentarios los realizo en tono constructivo, por aquí no se puede interpretar el tono y no me gustaría que hubiera malentendidos, agradezco tu ayuda 🙂

1) Llevo con esta incidencia abierta más de 1 mes entre los foros de soporte de FCF y WPML

2) Como te comenté en post anteriores, la prueba de deshabilitar todo e ir activando ya la he realizado varias veces para detectar dónde estaba el problema. El error sólo aparece con WCML activado. Con todo el resto de software activado el error no se presenta y en cuanto se activa WCML, el error aparece

3) Os facilité una copia del site para que pudierais hacer pruebas, ver el error que se estaba produciendo y, si era pertinente, desarrollar una solución. Veo por lo que me comentas que la hipotética solución que habéis desarrollado está funcionando con más de la mitad del software que la tienda utiliza desactivado y con otra plantilla diferente, es decir, es una solución que no me sirve, no puedo utilizar. ¿Qué sentido tiene entonces que os facilite una copia exacta del site?

Como te digo, no sé si estaré haciendo algo incorrectamente así que, si te parece, ¿podrías por favor facilitarme la copia en la que la solución que me habéis facilitado funciona?

Saludos,

agosto 19, 2025 a las 3:42 pm #17332125

Otto
Partidario de WPML desde 09/2015

Idiomas: Inglés (English ) Español (Español )

Zona horaria: America/Argentina/Buenos_Aires (GMT-03:00)

Hola,

Gracias por tus comentarios.

He creado una nueva versión del plugin y la he probado exhaustivamente en la copia exacta de tu sitio. Dime si he omitido algún escenario, por favor.

Saludos cordiales,
Otto

<?php
/*
Plugin Name: FCF ⇄ WCML Compat (logic_results_storage normalizer)
Description: Normaliza el payload de lógica condicional de Flexible Checkout Fields PRO cuando WCML está activo para evitar fallos de validación por JSON mal decodificado.
Author: DevOps
Version: 0.1
*/

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

/**
 * Intenta decodificar en distintos escenarios de codificación.
 * Devuelve array si tiene éxito o null si falla.
 */
function fcf_wcml_try_decode_results( $raw ) {
    // Sin tocar
    $arr = json_decode( $raw, true );
    if ( is_array( $arr ) ) {
        return $arr;
    }

    // urldecode (una vez)
    $arr = json_decode( urldecode( $raw ), true );
    if ( is_array( $arr ) ) {
        return $arr;
    }

    // rawurldecode
    $arr = json_decode( rawurldecode( $raw ), true );
    if ( is_array( $arr ) ) {
        return $arr;
    }

    // Doble urldecode
    $arr = json_decode( urldecode( urldecode( $raw ) ), true );
    if ( is_array( $arr ) ) {
        return $arr;
    }

    // Quitar slashes extra
    $arr = json_decode( wp_unslash( $raw ), true );
    if ( is_array( $arr ) ) {
        return $arr;
    }

    return null;
}

/**
 * Obtiene resultados de lógica condicional desde $_POST si están presentes.
 *
 * @return array|null
 */
function fcf_wcml_get_results_from_post() {
    $key = 'logic_results_storage';
    if ( empty( $_POST[ $key ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
        return null;
    }

    $raw = $_POST[ $key ]; // phpcs:ignore WordPress.Security.NonceVerification.Missing

    $candidates = [
        $raw,
        urldecode( $raw ),
        rawurldecode( $raw ),
        wp_unslash( $raw ),
        urldecode( wp_unslash( $raw ) ),
    ];

    foreach ( $candidates as $candidate ) {
        $arr = json_decode( $candidate, true );
        if ( is_array( $arr ) ) {
            return $arr;
        }
    }

    return null;
}

/**
 * Normaliza $_POST['logic_results_storage'] lo antes posible en el proceso de checkout
 * para que FCF PRO pueda decodificarlo correctamente con su urldecode() interno.
 */
add_action( 'woocommerce_checkout_process', function () {
    $key = 'logic_results_storage';
    if ( empty( $_POST[ $key ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
        return;
    }

    $raw = $_POST[ $key ]; // phpcs:ignore WordPress.Security.NonceVerification.Missing
    // No usar wp_unslash aquí: queremos probar varias ramas nosotros mismos.
    $decoded = fcf_wcml_try_decode_results( $raw );

    if ( is_array( $decoded ) ) {
        // Re-serializamos en el formato que espera FCF: urlencode(JSON)
        $normalized = urlencode( wp_json_encode( $decoded ) );
        $_POST[ $key ] = $normalized; // phpcs:ignore WordPress.Security.NonceVerification.Missing

        // Opcional: logging de diagnóstico (comentado por defecto).
        // error_log( '[FCF-WCML-Compat] logic_results_storage normalizado correctamente.' );
    } else {
        // error_log( '[FCF-WCML-Compat] No se pudo normalizar logic_results_storage.' );
    }
}, 1 );

/**
 * Durante el procesamiento del checkout (solamente en POST), desactiva "required"
 * para aquellos campos que no vienen en $_POST. Esto evita que WooCommerce valide
 * campos que no se mostraron por lógica condicional.
 */
add_filter( 'woocommerce_checkout_fields', function ( $fields ) {
    if ( empty( $_POST ) ) { // Solo actuar en envío del checkout.
        return $fields;
    }

    $results = fcf_wcml_get_results_from_post();
    if ( ! is_array( $results ) ) {
        // Si no tenemos resultados válidos, no tocar los requeridos para evitar falsos positivos/negativos.
        return $fields;
    }

    foreach ( $fields as $section_name => $section_fields ) {
        if ( ! is_array( $section_fields ) ) {
            continue;
        }
        foreach ( $section_fields as $field_name => $field_def ) {
            if ( ! isset( $results[ $field_name ] ) || ! is_array( $results[ $field_name ] ) ) {
                continue;
            }
            foreach ( $results[ $field_name ] as $action => $value ) {
                switch ( $action ) {
                    case 'required':
                        $fields[ $section_name ][ $field_name ]['required'] = (bool) $value;
                        break;
                    case 'hide':
                        if ( true === (bool) $value ) {
                            unset( $fields[ $section_name ][ $field_name ] );
                        }
                        break;
                    case 'show':
                        if ( false === (bool) $value ) {
                            unset( $fields[ $section_name ][ $field_name ] );
                        }
                        break;
                }
            }
        }
    }

    return $fields;
}, 1000001 );
agosto 20, 2025 a las 12:16 pm #17334181

OscarO-3

Hola Otto,

Muchas gracias por tu ayuda (y tu paciencia).

He hecho un par de pruebas preliminares rápidas (como mu-plugin) y, ahora sí, parece que está funcionando correctamente.

Voy a hacer un set de pruebas más extenso durante la tarde y te confirmo si el problema está solucionado.

Muchas gracias y saludos,

agosto 20, 2025 a las 1:09 pm #17334360

Otto
Partidario de WPML desde 09/2015

Idiomas: Inglés (English ) Español (Español )

Zona horaria: America/Argentina/Buenos_Aires (GMT-03:00)

Excelente, gracias.

Quedo atento a tus comentarios.

Saludos cordiales,
Otto

agosto 20, 2025 a las 3:16 pm #17334802

OscarO-3

Hola de nuevo, Otto,

Acabo de finalizar la revisión, he podido hacer compras en ambos idiomas y el sistema funciona correctamente y muestra los mensajes correctos cuando los campos no se completan (no permite acabar el pedido si están en blanco).

He revisado también la parte de backend, para ver si el proceso de traducción y demás funcionaba correctamente, no he detectado nada raro.

Sin embargo, veo que precisamente hoy ¬¬, WPDesk ha sacado una nueva actualización de FCF (la versión gratuita) y también hay nueva versión de Avada, así que, si no es mucho pedir, déjame por favor un poco de tiempo para hacer pruebas con las nuevas actualizaciones y ver si todo sigue funcionando antes de cerrar el ticket, ¿de acuerdo?

Muchas gracias y saludos,

agosto 20, 2025 a las 4:14 pm #17335122

Otto
Partidario de WPML desde 09/2015

Idiomas: Inglés (English ) Español (Español )

Zona horaria: America/Argentina/Buenos_Aires (GMT-03:00)

Hola,

Desde luego, tómate el tiempo necesario. El ticket solo se cierra automáticamente luego de dos semanas sin interacciones.

Saludos cordiales,
Otto

agosto 21, 2025 a las 8:04 am #17336286

OscarO-3

Hola Otto, buenos días,

Acabo de actualizar todo de nuevo (Wocommerce, plantilla y un par de plugins que también habían lanzado actualizaciones) y he hecho un repaso exhaustivo de todo el site tanto en la part front como backend.

Todo parece funcionar correctamente :), así que voy a proceder a avisar al cliente y a hacer la actualización en producción, si todo va bien, podremos cerrar el ticket, te mantengo informado.

Muchas gracias por tu ayuda y saludos,