简体   繁体   English

在产品页面上显示运费 - WooCommerce

[英]Display shipping cost on product page - WooCommerce

I'm trying to make a custom page on Wordpress that display 2 subscription types in a form with 3 variations each (monthly, 6 month, 12 month).我正在尝试在 Wordpress 上制作一个自定义页面,该页面以一种形式显示 2 种订阅类型,每种类型有 3 种变体(每月、6 个月、12 个月)。 Each variation gets a radio button and I have a total price that is live updated when user clicks on the radio buttons.每个变体都有一个单选按钮,当用户点击单选按钮时,我有一个实时更新的总价格。 This part is working.这部分正在工作。

But now, I want to add 3 other radio buttons to choose the shipment method.但是现在,我想添加 3 个其他单选按钮来选择发货方式。 (When user select one, it'll live update the total price too). (当用户选择一个时,它也会实时更新总价)。

I've been searching a long time how to get shipping cost for a product but nothing has worked.我一直在寻找如何获得产品的运费很长时间,但没有任何效果。

Anyone knows :) ?有谁知道:)?

This question is too broad.这个问题太宽泛了。 So I can answer partially as you should need to make some work yourself, and ask later more specific questions…所以我可以部分回答,因为你应该自己做一些工作,然后再问更具体的问题......

Now the correct way to set shipping data on product page , is to use Ajax to update the data , as the action is made by the customer on client side (browser) , avoiding 'post' and reload the page.现在在产品页面上设置运输数据的正确方法是使用Ajax更新数据,因为操作是由客户在客户端(浏览器)进行的,避免“发布”并重新加载页面。 But this should be your work...但这应该是你的工作......

1) Customer location (for shipping Zones) : 1) 客户位置(适用于运输区)

You should need to get the customer location or shipping zone first.您应该首先需要获取客户位置或送货区域。

Then you will need to update the customer country in WC()->session and in WC()->customer objects.然后您需要在WC()->sessionWC()->customer对象中更新客户国家/地区。 This can be done with the following:这可以通过以下方式完成:

## 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) The shipping methods (by Shipping Zone, with costs) : 2)运输方式(按运输区,含费用)

In Woocommerce the Shipping methods for a Shipping Zone are only available when customer add a product to cart…在 Woocommerce 中,运输区的运输方式仅在客户将产品添加到购物车时才可用……

Based on this answer code: Display shipping methods to frontend as in the admin panel?基于此答案代码: 在管理面板中显示前端的运输方式?
we can make a custom array of the necessary data to be used to get the shipping methods by shipping Zones, with costs and everything needed.我们可以制作一个必要数据的自定义数组,用于通过运输区域获取运输方式,以及成本和所需的一切。

The code below is much more complete and include the shipping methods costs:下面的代码更完整,包括运输方式成本:

// 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 '<pre>'; print_r($data); echo '</pre>';

custom shipping methods自定义运输方式
Now if you are using custom shipping methods (enabled sometimes by 3rd party shipping plugins) you will need to make some changes in the code…现在,如果您使用自定义运输方式(有时由 3rd 方运输插件启用),您将需要对代码进行一些更改……

Costs and taxes calculation成本和税收计算
You should need to make the taxes calculations , as the costs are displayed just as they are set in shipping settings…您应该需要进行税费计算,因为成本的显示方式与运输设置中的设置相同……


3) Product page 3) 产品页面

Customer location:客户所在地:
You will need first to have a location selector (to define the Shipping Zone ) or to set the location based on Woocommerce geolocation.您首先需要有一个位置选择器(以定义Shipping Zone )或根据 Woocommerce 地理位置设置位置。

Shipping Methods:运送方式:
Once the Shipping Zone is defined, you can get the corresponding Shipping Methods and rates (costs) , displaying on this product page your radio buttons for Shipping methods.定义运输区域后,您可以获得相应的运输方式和费率(成本) ,在此产品页面上显示您的运输方式单选按钮。

To get this, you should need to alter the single product pages:为此,您需要更改单个产品页面:

You should need to get/set/update the "chosen_shipping_methods" with the following code (Ajax) .您应该需要使用以下代码(Ajax)获取/设置/更新“chosen_shipping_methods”

Get the Chosen Shipping method:获取选择的运输方式:

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

Set/Update the Chosen Shipping method (through Javascript/Ajax and admin-ajax.php ):设置/更新选择的运输方法(通过 Javascript/Ajax 和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 );

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM