Mostrar el costo de envío en la página del producto – WooCommerce

Estoy tratando de crear una página personalizada en WordPress que muestre 2 tipos de suscripción en un formulario con 3 variaciones cada uno (mensual, 6 meses, 12 meses). Cada variación recibe un botón de opción y tengo un precio total que se actualiza en vivo cuando el usuario hace clic en los botones de opción. Esta parte está funcionando.

Pero ahora, quiero agregar otros 3 botones de opción para elegir el método de envío. (Cuando el usuario seleccione uno, actualizará también el precio total).

He estado buscando durante mucho tiempo cómo obtener el costo de envío de un producto, pero nada ha funcionado.

Alguien sabe 🙂 ?

Esta pregunta es demasiado amplia. De modo que puedo responderle parcialmente, ya que debería hacer algún trabajo usted mismo, y luego formular preguntas más específicas …

Ahora, la forma correcta de configurar los datos de envío en la página del producto es utilizar Ajax para actualizar los datos , ya que el cliente actúa como intermediario en el lado del cliente (navegador) , evitando “publicar” y volver a cargar la página. Pero este debería ser tu trabajo …

1) Ubicación del cliente (para zonas de envío) :

Primero debe obtener la ubicación del cliente o la zona de envío.

Luego deberá actualizar el país del cliente en WC()->session y en WC()->customer objetos del WC()->customer . Esto se puede hacer con lo siguiente:

 ## Get the geolocated customer country code *(if enabled)*: $country_code = WC()->customer->get_billing_country(); // or // $country_code = WC()->customer->get_shipping_country(); ## Set a new country code $new_country_code = 'FR'; ## 1. WC_session: set customer billing and shipping country // Get the data $customer_session = WC()->session->get( 'customer' ); // Change some data $customer_session['country'] = $new_country_code; // Billing $customer_session['shipping_country'] = $new_country_code; // Shipping // Set the changed data $customer_session = WC()->session->set( 'customer', $customer_session ); ## 2. WC_Customer: set customer billing and shipping country WC()->customer->set_billing_country( $new_country_code ); WC()->customer->set_shipping_country( $new_country_code ); 

2) Los métodos de envío (por zona de envío, con costos) :

En Woocommerce, los métodos de envío para una zona de envío solo están disponibles cuando el cliente agrega un producto al carrito …

Basado en este código de respuesta: ¿ muestra los métodos de envío en frontend como en el panel de administración?
podemos hacer una matriz personalizada de los datos necesarios para usar los métodos de envío al enviar Zonas, con los costos y todo lo que se necesita.

El código a continuación es mucho más completo e incluye los costos de los métodos de envío:

 // Initializing variable $zones = $data = $classes_keys = array(); // Rest of the World zone $zone = new \WC_Shipping_Zone(0); $zones[$zone->get_id()] = $zone->get_data(); $zones[$zone->get_id()]['formatted_zone_location'] = $zone->get_formatted_location(); $zones[$zone->get_id()]['shipping_methods'] = $zone->get_shipping_methods(); // Merging shipping zones $shipping_zones = array_merge( $zones, WC_Shipping_Zones::get_zones() ); // Shipping Classes $shipping = new \WC_Shipping(); $shipping_classes = $shipping->get_shipping_classes(); // The Shipping Classes for costs in "Flat rate" Shipping Method foreach($shipping_classes as $shipping_class) { // $key_class_cost = 'class_cost_'.$shipping_class->term_id; // The shipping classes $classes_keys[$shipping_class->term_id] = array( 'term_id' => $shipping_class->term_id, 'name' => $shipping_class->name, 'slug' => $shipping_class->slug, 'count' => $shipping_class->count, 'key_cost' => $key_class_cost ); } // For 'No class" cost $classes_keys[0] = array( 'term_id' => '', 'name' => 'No shipping class', 'slug' => 'no_class', 'count' => '', 'key_cost' => 'no_class_cost' ); foreach ( $shipping_zones as $shipping_zone ) { $zone_id = $shipping_zone['id']; $zone_name = $zone_id == '0' ? __('Rest of the word', 'woocommerce') : $shipping_zone['zone_name']; $zone_locations = $shipping_zone['zone_locations']; // array $zone_location_name = $shipping_zone['formatted_zone_location']; // Set the data in an array: $data[$zone_id]= array( 'zone_id' => $zone_id, 'zone_name' => $zone_name, 'zone_location_name' => $zone_location_name, 'zone_locations' => $zone_locations, 'shipping_methods' => array() ); foreach ( $shipping_zone['shipping_methods'] as $sm_obj ) { $method_id = $sm_obj->id; $instance_id = $sm_obj->get_instance_id(); $enabled = $sm_obj->is_enabled() ? true : 0; // Settings specific to each shipping method $instance_settings = $sm_obj->instance_settings; if( $enabled ){ $data[$zone_id]['shipping_methods'][$instance_id] = array( '$method_id' => $sm_obj->id, 'instance_id' => $instance_id, 'rate_id' => $sm_obj->get_rate_id(), 'default_name' => $sm_obj->get_method_title(), 'custom_name' => $sm_obj->get_title(), ); if( $method_id == 'free_shipping' ){ $data[$zone_id]['shipping_methods'][$instance_id]['requires'] = $instance_settings['requires']; $data[$zone_id]['shipping_methods'][$instance_id]['min_amount'] = $instance_settings['min_amount']; } if( $method_id == 'flat_rate' || $method_id == 'local_pickup' ){ $data[$zone_id]['shipping_methods'][$instance_id]['tax_status'] = $instance_settings['tax_status']; $data[$zone_id]['shipping_methods'][$instance_id]['cost'] = $sm_obj->cost; } if( $method_id == 'flat_rate' ){ $data[$zone_id]['shipping_methods'][$instance_id]['class_costs'] = $instance_settings['class_costs']; $data[$zone_id]['shipping_methods'][$instance_id]['calculation_type'] = $instance_settings['type']; $classes_keys[0]['cost'] = $instance_settings['no_class_cost']; foreach( $instance_settings as $key => $setting ) if ( strpos( $key, 'class_cost_') !== false ){ $class_id = str_replace('class_cost_', '', $key ); $classes_keys[$class_id]['cost'] = $setting; } $data[$zone_id]['shipping_methods'][$instance_id]['classes_&_costs'] = $classes_keys; } } } } // Row output (for testing) echo '
'; print_r($data); echo '

';

métodos de envío personalizados
Ahora, si usa métodos de envío personalizados (habilitados a veces por complementos de envío de terceros) , deberá realizar algunos cambios en el código …

Cálculo de costos e impuestos
Debería realizar los cálculos de impuestos , ya que los costos se muestran tal como se configuran en la configuración de envío …


3) página del producto

Ubicación del cliente:
Primero tendrá que tener un selector de ubicación (para definir la Zona de envío ) o establecer la ubicación en función de la geolocalización de WooCommerce.

Métodos de envío:
Una vez que se define la Zona de envío, puede obtener los Métodos y tarifas (costos) de envío correspondientes, mostrando en esta página de productos sus botones de opción para los métodos de Envío.

Para obtener esto, debe modificar las páginas de productos individuales:

  • Anulando las plantillas de Woocommerce a través de su tema (y las plantillas de suscripciones de WC también)
  • Usando los filtros disponibles y los ganchos de acción
  • Utilice Javascript , jQuery para modificar los precios y Ajax para actualizar los datos del cliente ( WC_Session y WC_Customer ).

Debería obtener / configurar / actualizar los “métodos de envío_eleccionados” con el siguiente código (Ajax) .

Obtenga el método de envío elegido:

 $chosen_shipping = WC()->session->get('chosen_shipping_methods')[0]; 

Establezca / actualice el método de envío elegido (a través de Javascript / Ajax y admin-ajax.php ):

 // HERE the new method ID $method_rate_id = array('free_shipping:10'); // Set/Update the Chosen Shipping method WC()->session->set( 'chosen_shipping_methods', $method_rate_id );