Obtener los métodos de envío de WooCommerce programáticamente

16 feb 2020, 00:28:43
Vistas: 36.5K
Votos: 2

¿Cómo puedo obtener los métodos de envío en mi tienda WooCommerce? Tengo esto en mi página de pago:

mi página de pago

Y dentro de mi panel de administración se ve así:

métodos de envío en el panel de administración de WordPress

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

3
Comentarios

¿Qué salida obtienes al usar WC()->shipping->get_shipping_methods(); ?

7uc1f3r 7uc1f3r
16 feb 2020 10:37:43

@L7c1f3r la misma salida que en el pastebin..

FooBar FooBar
16 feb 2020 11:53:47

Ahora he probado esto y efectivamente, el mismo resultado. Si miro tu salida y la comparo con la mía, veo que los datos están presentes, pero por ejemplo 'GLS' falta como method_title, pero 'Tarifa plana' se muestra ahí, pero esto es lo mismo con mi salida, así que no hay nada malo en eso. 'GLS', resulta ser la etiqueta. ¿Cuál es tu intención final, qué datos quieres recuperar y dónde quieres usarlos después?

7uc1f3r 7uc1f3r
16 feb 2020 22:27:40
Todas las respuestas a la pregunta 1
3

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' );
17 feb 2020 15:49:38
Comentarios

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

Sam Assoum Sam Assoum
25 ene 2021 20:16:38

@SamAssoum Sí, sigue funcionando...

LoicTheAztec LoicTheAztec
25 ene 2021 22:05:10

Quiero mostrar el método de envío seleccionado en la sección Mi Pedido que hice personalizada, ¿Cómo puedo imprimir el método de envío seleccionado en la sesión para mostrarlo en la sección Mi Pedido?

Ravi Ravi
7 mar 2021 17:09:32