Error fatal en la función show_flete_in_checkout()
-
Descripción del Error:
Se produce un error del tipoE_ERROR
al intentar acceder al métodoget_cart()
sobre un objetonull
. Esto ocurre en la línea 3301 del archivowoocommerce-pagopar-gateway.php
, lo que indica que la funciónshow_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ónshow_flete_in_checkout()
accede directamente aWC()->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 sernull
, lo que provoca un error fatal al intentar llamar al métodoget_cart()
. - Deficiencias en la implementación:
- Falta de Comprobación de Nulos:
El código no verifica siWC()
existe ni siWC()->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).
- Falta de Comprobación de Nulos:
Solución Propuesta
Modificación en la Función:
Se debe agregar una comprobación inicial en la funciónshow_flete_in_checkout()
para verificar que WooCommerce y el carrito estén disponibles antes de proceder. De esta manera, se evita llamar aget_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ónWC()
esté definida y queWC()->cart
no seanull
. - Prevención del Error:
Con esta validación, en caso de que WooCommerce no haya inicializado el carrito, la función devuelvefalse
inmediatamente, evitando la llamada aget_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.