在产品页面上显示运输成本-WooCommerce [英] Display shipping cost on product page - WooCommerce

查看:124
本文介绍了在产品页面上显示运输成本-WooCommerce的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Wordpress上创建一个自定义页面,该页面以两种形式(每月,6个月,12个月)显示2种订阅类型.每个变体都有一个单选按钮,当用户单击单选按钮时,我会实时更新总价.这部分正在工作.

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). 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.

但是现在,我想添加其他3个单选按钮来选择运送方式. (当用户选择一个时,它也会实时更新总价.)

But now, I want to add 3 other radio buttons to choose the shipment method. (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.

任何人都知道:)吗?

推荐答案

这个问题太广泛了.因此,我可以部分回答,因为您需要自己做一些工作,然后再问更具体的问题……

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…

现在,在产品页面上设置送货数据的正确方法是使用 Ajax 更新数据,因为该操作是女仆由客户在客户端(浏览器)上进行,避免了发布"并重新加载页面.但这应该是你的工作...

Now the correct way to set shipping data on product page, is to use Ajax to update the data, as the action is maid by the customer on client side (browser), avoiding 'post' and reload the page. But this should be your work...

1)客户位置 (用于运输区域):

您应该首先获取客户位置或运输区域.

You should need to get the customer location or shipping zone first.

然后,您将需要更新WC()->sessionWC()->customer对象中的客户国家/地区.这可以通过以下操作完成:

Then you will need to update the customer country in WC()->session and in WC()->customer objects. 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)运送方式 (按运送区域,含费用):

在Woocommerce中,仅当客户将产品添加到购物车时,才可以使用送货区域的送货方式...

In Woocommerce the Shipping methods for a Shipping Zone are only available when customer add a product to cart…

基于以下答案代码:是否可以在管理面板中将送货方式显示在前端?
我们可以对所需数据进行自定义排列,以用于按运送区域(包括成本和所需的一切)来获取送货方式.

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…

费用和税金计算
您需要进行税金计算,因为费用的显示方式与运输设置中设置的费用相同...

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)产品页面

客户位置:
您首先需要具有位置选择器(以定义运输区域)或根据Woocommerce地理位置设置位置.

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 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:

  • Overriding the Woocommerce templates via your theme (and WC Subscriptions templates too)
  • Using the available filters and action hooks
  • Use Javascript, jQuery to alter prices and Ajax to update the customer data (WC_Session and WC_Customer).

您应该使用以下代码(Ajax) 获取/设置/更新"chosen_shipping_methods" .

You should need to get/set/update the "chosen_shipping_methods" with the following code (Ajax).

获取选择的送货方式:

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

设置/更新选择的发送方法(通过Javascript/Ajax和admin-ajax.php):

Set/Update the Chosen Shipping method (through Javascript/Ajax and 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 );

这篇关于在产品页面上显示运输成本-WooCommerce的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆