Actualización del método de envío de woocommerce vía ajax

Estoy construyendo un sitio web para ordenar alimentos usando WordPress y Woocommerce. Hasta ahora me ha ido bien, pero me quedé atascado en un punto donde el método de envío debería elegirse automáticamente.

¿Cómo es el flujo? El usuario visita mis sitios web e ingresa el código postal de la dirección de entrega y luego mi sitio web muestra los restaurantes que entregan en ese código postal. Algunos restaurantes entregan en ese código postal en menos tiempo y menos gastos de envío, pero algunos tardan más tiempo y llevan más gastos de envío.

Lo que he hecho hasta ahora es que obtengo los códigos de envío de la base de datos que cualquier restaurante entrega. Si el código postal del usuario no existe en la lista, le avisamos si no avanzamos.

El siguiente paso es buscar todos los restaurantes que entregan en ese código postal en menos tiempo de entrega y luego los restaurantes que entregan en ese código postal en más tiempo de entrega. Basado en menos o más tiempo de entrega, marqué al usuario en la Zona A o Zona B respectivamente.

Tengo métodos de envío de tarifa plana creados para la Zona A y la Zona B que se pueden seleccionar desde el menú desplegable en la Página de Carro / Pago. Ahora aquí lo que es el problema.

El usuario no debe seleccionar cuál sería la tarifa de envío. Debe seleccionarse y aplicarse automáticamente en función de la zona en la que se haya marcado el usuario.

Esta actualización automática no es lo que puedo lograr.

¿Qué he probado?

El proceso correcto debe ser colocar esta Zona en la sesión de Woocommerce y debe elegirse automáticamente y aplicarse cuando el usuario llegue al carrito o a la página de pago.

No puedo encontrar el método correcto para llamar que podría activar la llamada ajax para actualizar el envío. Cualquier idea sería útil.

Saludos

Hilo similar en Stackoverflow

Use $(body).trigger('update_checkout'); en tu JS. Esto activará una solicitud a WC_AJAX->update_order_review , que luego recogerá todos los datos del formulario en el área de pago. Si necesita pasar algún dato personalizado, agregue una entrada oculta al proceso de pago y debería permitirle pasar un valor a través de los datos de $_POST .

A partir de ahí, si necesita meterse con los métodos disponibles y la configuración de la sesión, puede hacer lo que hice y sobrescribir la función shipping_html en cart-shipping.php, así.

 function woo_new_cart_shipping_html() { global $woocommerce; $data_stream = extract_data_from_str( $_POST['post_data'] ); $packages = $woocommerce->shipping->get_packages(); $chosen_method = isset( $woocommerce->session->chosen_shipping_methods[0] ) ? $woocommerce->session->chosen_shipping_methods[0] : ''; foreach ( $packages as $i => $package ) { $methods = apply_filters( 'woo_filter_available_methods_by_date', $package['rates'], $data_stream ); wc_get_template( 'cart/cart-shipping.php', array('package' => $package, 'available_methods' => apply_filters( 'woo_sort_shipping_methods_by_cost', $methods ), 'show_package_details' => ( sizeof( $packages ) > 1 ), 'index' => $i, 'chosen_method' => apply_filters( 'woo_set_lowest_shipping_method', $chosen_method, $methods, $data_stream ) ) ); } } 

Esta es una prueba de actualización y le permitirá personalizar esa plantilla agregando filtros.

En cuanto a restablecer la sesión para que se corresponda con el método seleccionado, no tengo una respuesta para usted, desafortunadamente, ya que todavía estoy luchando con ese problema exacto.