基于“ Update fee dynamically based on radio buttons in Woocommerce checkout”应答代码,我已经能够添加应用于客户交货选择(具有自定义交货选项选择)的自定义动态费用。
这是我根据自己的需要修改的工作代码:
add_action( 'woocommerce_cart_calculate_fees', 'add_delivery_fee', 20, 1 );
function add_delivery_fee( $cart ) {
$domain = 'woocommerce';
$NipostFST = '2000';
$NIPOSTSUB = '250';
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
$packing_fee = WC()->session->get( 'chosen_delivery_option' ); // Dynamic delivery fee
$Dlabel = $packing_fee == 'home_delivery' ? __('To Your Doorstep', $domain) : __('Local Pickup', $domain);
$weight_of_item = WC()->cart->cart_contents_weight;
if ( $weight_of_item > 1 ) {
$nipostFee = $NipostFST + ( ($weight_of_item - 1)*$NIPOSTSUB );
}elseif ( $weight_of_item == 1 ) {
$nipostFee = $NipostFST;
}
$fee = (isset($weight_of_item)) ? $packing_fee == 'home_delivery' ? $nipostFee : 0.00 : 'Not Available';
$cart->add_fee( !is_cart() ? __( 'Delivery Fee [ '.$Dlabel.' ]', $domain ) : __( 'Delivery Fee', $domain ), $fee );
}
// Add a custom radio fields for Delivery Option selection
add_action( 'woocommerce_checkout_before_order_review', 'checkout_delivery_fee_addition', 20 );
function checkout_delivery_fee_addition(){
$domain = 'woocommerce';
$weight_of_item = WC()->cart->cart_contents_weight;
$NipostFST = '2000';
$NIPOSTSUB = '250';
if ( $weight_of_item > 1 ) {
$nipostFee = $NipostFST + ( ($weight_of_item - 1)*$NIPOSTSUB );
}elseif ( $weight_of_item == 1 ) {
$nipostFee = $NipostFST;
}
echo '<div id="izzycart_checkout_addons"><tr class="deliveryOption-select"><th>' . __('Delivery Method', $domain) . '</th><td>';
$chosen = WC()->session->get('chosen_delivery_option');
$chosen = empty($chosen) ? WC()->checkout->get_value('radio_delivery_option') : $chosen;
$chosen = empty($chosen) ? 'local_pickup' : $chosen;
// Add a custom checkbox field
woocommerce_form_field( 'radio_delivery_option', array(
'type' => 'radio',
'class' => array( 'form-row-wide delivery_option' ),
'options' => array(
'local_pickup' => __('Local Pickup '.wc_price(0.00), $domain),
'home_delivery' => (!isset($weight_of_item)) ? __('To Your Doorstep <br><span style="color:red">Not Available</span>', $domain) : __('To Your Doorstep '.wc_price($nipostFee), $domain),
),
'default' => $chosen,
), $chosen );
echo '</td></tr></div>';
}
// Display fees with zero amount
add_filter( 'woocommerce_get_order_item_totals_excl_free_fees', '__return_false' );
我的问题:在Woocommerce中,如何在订单明细表上显示已接收订单页面,我的帐户查看订单页面以及所有电子邮件通知中的所选交付方式。
所以我希望结果看起来像这样:
继续:Make appear a zero fee in Woocommerce Orders and email notifications
答案 0 :(得分:1)
已更新:我添加了2个功能,这些功能将为订单获取所选的交付选项,并将其显示在订单详细信息表中的订单接收页面,“我的帐户查看订单”页面以及所有电子邮件通知中:
// Save chosen delivery as order custom meta data
add_action('woocommerce_checkout_create_order', 'save_order_delivery_option', 10, 2 );
function save_order_delivery_option( $order, $data ) {
if ( isset($_POST['radio_delivery_option']) ) {
$order->update_meta_data( '_chosen_delivery_method', esc_attr($_POST['radio_delivery_option']) );
}
}
// Display the chosen delivery information
add_filter( 'woocommerce_get_order_item_totals', 'chosen_delivery_item_order_totals', 10, 3 );
function chosen_delivery_item_order_totals( $total_rows, $order, $tax_display ) {;
$new_total_rows = [];
// Loop through Order total lines
foreach($total_rows as $key => $total ){
// Get the chosen delivery
$chosen_delivery = $order->get_meta('_chosen_delivery_method');
if( ! empty($chosen_delivery) && 'payment_method' === $key ){
$domain = 'woocommerce';
$label = __('Delivery method:', 'woocommerce');
$value = 'local_pickup' === $chosen_delivery ? __('Local Pickup', $domain) : __('To Your Doorstep', $domain);
// Display 'Delivery method' line
$new_total_rows['chosen_delivery'] = array( 'label' => $label,'value' => $value );
}
$new_total_rows[$key] = $total;
}
return $new_total_rows;
}
代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试,可以正常工作。