php 运费,php – 在产品页面显示运费 – WooCommerce

这个问题太宽泛了.所以我可以部分回答,因为你应该自己做一些工作,然后再问更具体的问题……

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)客户位置(用于运输区域):

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

然后,您需要在WC() – >会话和WC() – >客户对象中更新客户所在国家/地区.这可以通过以下方式完成:

## 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中,只有当客户将产品添加到购物车时,才能使用送货区的送货方式…

以下代码更加完整,包括运费方式费用:

// 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 '
';

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地理位置设置位置.

送货方式:

定义装运区后,您可以获得相应的装运方法和费率(成本),在此产品页面上显示装运方法的单选按钮.

为此,您需要更改单个产品页面:

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

获取选择的送货方式:

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

设置/更新Chosen Shipping方法(通过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 );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值