Obtener los métodos de envío de WooCommerce programáticamente
¿Cómo puedo obtener los métodos de envío en mi tienda WooCommerce? Tengo esto en mi página de pago:
Y dentro de mi panel de administración se ve así:
He intentado hacer esto:
WC()->shipping->load_shipping_methods()
Pero no devuelve el texto/precio de GLS o Click and collect. Devuelve estos datos: https://paste.laravel.io/0c1aff96-dbed-452c-856f-6d62b6f1f47e

Necesitas usar algo diferente como lo siguiente (comentado):
// Recorrer los paquetes de envío desde WC_Session (Pueden haber múltiples en algunos casos)
foreach ( WC()->cart->get_shipping_packages() as $package_id => $package ) {
// Verificar si existe un envío para el paquete actual
if ( WC()->session->__isset( 'shipping_for_package_'.$package_id ) ) {
// Recorrer las tarifas de envío para el paquete actual
foreach ( WC()->session->get( 'shipping_for_package_'.$package_id )['rates'] as $shipping_rate_id => $shipping_rate ) {
$rate_id = $shipping_rate->get_id(); // lo mismo que la variable $shipping_rate_id (combinación del método de envío y el ID de instancia)
$method_id = $shipping_rate->get_method_id(); // El slug del método de envío
$instance_id = $shipping_rate->get_instance_id(); // El ID de instancia
$label_name = $shipping_rate->get_label(); // El nombre de la etiqueta del método
$cost = $shipping_rate->get_cost(); // El costo sin impuestos
$tax_cost = $shipping_rate->get_shipping_tax(); // El costo de impuestos
$taxes = $shipping_rate->get_taxes(); // Los detalles de impuestos (array)
}
}
}
Ahora si la sesión del cliente aún no está habilitada (el cliente no ha agregado ningún producto al carrito todavía), necesitas forzar la activación de la sesión del cliente en WooCommerce usando lo siguiente:
// Habilitar WC_Session del cliente add_action( 'init', 'wc_session_enabler' ); function wc_session_enabler() { if ( is_user_logged_in() || is_admin() ) return; if ( isset(WC()->session) && ! WC()->session->has_session() ) { WC()->session->set_customer_session_cookie( true ); } }
El código va en el archivo functions.php de tu tema hijo activo (o tema activo).
Si es necesario, también puedes obtener el/los método(s) de envío elegido(s) por el cliente con lo siguiente:
$chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' );

¿Sabes si WC()->session->get( 'chosen_shipping_methods' ); sigue funcionando si solo hay un método de envío disponible?
