• dancolgh

    (@dancolgh)


    Descripción del Error:
    Se produce un error del tipo E_ERROR al intentar acceder al método get_cart() sobre un objeto null. Esto ocurre en la línea 3301 del archivo woocommerce-pagopar-gateway.php, lo que indica que la función show_flete_in_checkout() se está invocando en un momento en el que el carrito de WooCommerce no ha sido inicializado.

    Mensaje de Error

    Se ha producido un error del tipo E_ERROR en la línea 3301 del archivo /wp-content/plugins/pagopar-woocommerce-gateway/woocommerce-pagopar-gateway.php. Mensaje de error: Uncaught Error: Call to a member function get_cart() on null in /wp-content/plugins/pagopar-woocommerce-gateway/woocommerce-pagopar-gateway.php:3301
    Stack trace:
    #0 /wp-content/plugins/pagopar-woocommerce-gateway/woocommerce-pagopar-gateway.php(2804): show_flete_in_checkout()
    #1 /wp-includes/class-wp-hook.php(324): make_fields_non_required()
    #2 wp-includes/plugin.php(205): WP_Hook->apply_filters() ...

    Ambiente Afectado:

    • WordPress: 6.7.1
    • Plugin: Pagopar – WooCommerce Gateway (versión 2.7.1)
    • Tema Activo: Bricks (versión 1.12.1)
    • PHP: 8.1.27

    Explicación del Problema

    • Causa Raíz:
      La función show_flete_in_checkout() accede directamente a WC()->cart->get_cart() sin verificar que el objeto del carrito (WC()->cart) esté correctamente inicializado. Cuando esta función se invoca demasiado temprano en el ciclo de carga de WordPress o debido a una interacción con otro plugin (como BricksUltimate), el carrito puede ser null, lo que provoca un error fatal al intentar llamar al método get_cart().
    • Deficiencias en la implementación:
      • Falta de Comprobación de Nulos:
        El código no verifica si WC() existe ni si WC()->cart está inicializado antes de utilizarlo. Esto viola una buena práctica de programación, que es validar los objetos y condiciones antes de usarlos, especialmente en entornos donde la secuencia de inicialización puede variar.
      • Orden de Ejecución:
        La función parece estar siendo llamada en un momento del ciclo de ejecución en el que WooCommerce aún no ha inicializado el objeto del carrito. Esto puede deberse a un hook o filtro que se ejecuta prematuramente en el flujo de WordPress, afectando la compatibilidad con otros plugins (en este caso, BricksUltimate).

    Solución Propuesta

    Modificación en la Función:
    Se debe agregar una comprobación inicial en la función show_flete_in_checkout() para verificar que WooCommerce y el carrito estén disponibles antes de proceder. De esta manera, se evita llamar a get_cart() en un objeto nulo.

    Código Propuesto:

    function show_flete_in_checkout() {
    // Comprobación: Verificar que WooCommerce esté activo y el carrito esté inicializado.
    if ( ! function_exists( 'WC' ) || ! WC()->cart ) {
    return false;
    }

    foreach ( WC()->cart->get_cart() as $cart_item ) {
    $item = $cart_item['data'];

    // Obtener el ID real del producto: si es variable, usar el parent_id.
    if ( is_numeric( $item->get_parent_id() ) && $item->get_parent_id() > 0 ) {
    $idProductoReal = $item->get_parent_id();
    } else {
    $idProductoReal = $item->get_id();
    }

    $pp_parent_id = explode( ",", get_post_meta( $idProductoReal, 'pagopar_cats_id', true ) );
    $pagopar_parent_id = (int) reset( $pp_parent_id );

    // Si la categoría padre es igual a 906, se debe mostrar el flete.
    if ( $pagopar_parent_id == 906 ) {
    return true;
    }
    }

    return false;
    }

    }

    Explicación de la Solución:

    • Verificación de Existencia:
      Antes de iterar sobre el carrito, se comprueba que la función WC() esté definida y que WC()->cart no sea null.
    • Prevención del Error:
      Con esta validación, en caso de que WooCommerce no haya inicializado el carrito, la función devuelve false inmediatamente, evitando la llamada a get_cart() sobre un objeto inexistente.
    • Compatibilidad:
      Esta solución garantiza que la función solo se ejecute cuando WooCommerce y el carrito están listos, previniendo errores en entornos donde se interactúa con otros plugins como BricksUltimate.
  • You must be logged in to reply to this topic.