我需要 wp 日期选择器的帮助。我想要的是 - 结账页面的客户可以选择取货和送货日期。选择日期后,然后在购物车摘要中显示计算结果 - 例如,我选择 24.07 - 26.07,然后在计算中显示 2 天并乘以产品价格 x2。我会添加我需要的屏幕截图。
现在我有这个(functions.php)-
// Add custom checkout datepicker fields
add_action( 'woocommerce_before_order_notes', 'datepicker_custom_fields' );
function datepicker_custom_fields( $checkout ) {
$pickup_datepicker_slug = 'pickup_datepicker';
$delivery_datepicker_slug = 'delivery_datepicker';
echo '<div id="datepicker-wrapper">';
woocommerce_form_field( $pickup_datepicker_slug, array(
'type' => 'text',
'class'=> array( 'form-row-first my-datepicker'),
'label' => __('Pickup date'),
'required' => true,
), '' );
woocommerce_form_field( $delivery_datepicker_slug, array(
'type' => 'text',
'class'=> array( 'form-row-first my-datepicker'),
'label' => __('Delivery date'),
'required' => true,
), '' );
echo '<br clear="all"></div>';
// Jquery: Enable the Datepicker
?>
<script language="javascript">
jQuery( function($){
var pickup = '#<?php echo $pickup_datepicker_slug ?>';
var delivery = '#<?php echo $delivery_datepicker_slug ?>';
$(pickup).datepicker({
dateFormat: 'dd.mm.yy', // ISO formatting date
});
$(delivery).datepicker({
dateFormat: 'dd.mm.yy', // ISO formatting date
});
});
</script>
<?php
}
// Display additional information after order total in checkout
add_action( 'woocommerce_review_order_after_order_total', 'display_additional_info_after_total' );
function display_additional_info_after_total() {
// Get the pickup and delivery dates from the POST request (checkout page)
$pickup_date = isset( $_POST['pickup_datepicker'] ) ? sanitize_text_field( $_POST['pickup_datepicker'] ) : '';
$delivery_date = isset( $_POST['delivery_datepicker'] ) ? sanitize_text_field( $_POST['delivery_datepicker'] ) : '';
// Calculate the difference in days between pickup and delivery dates
$pickup_timestamp = strtotime( $pickup_date );
$delivery_timestamp = strtotime( $delivery_date );
$days_difference = ceil( ( $delivery_timestamp - $pickup_timestamp ) / ( 60 * 60 * 24 ) );
// Calculate the fee based on the cart subtotal and days difference
$cart = WC()->cart;
$fee = $cart->subtotal * $days_difference; // Modify this formula if needed
// Display the additional information
if ( $days_difference > 0 ) {
echo '<p>Total ' . wc_price( $cart->subtotal + $fee ) . ' ( ' . wc_price( $fee ) . ' x ' . $days_difference . ' dienas )</p>';
}
}
我不确定你正在使用哪个主题,但你可以做这样的事情。
在日期选择器
onSelect
事件上,您可以通过这个名为 update_checkout
的 woocommerce 触发
woocommerce_before_calculate_totals
// Add custom checkout datepicker fields
function datepicker_custom_fields( $checkout ) {
$pickup_datepicker_slug = 'pickup_datepicker';
$delivery_datepicker_slug = 'delivery_datepicker';
echo '<div id="datepicker-wrapper">';
woocommerce_form_field( $pickup_datepicker_slug, array(
'type' => 'text',
'class'=> array( 'form-row-first my-datepicker'),
'label' => __('Pickup date'),
'required' => true,
), WC()->session->get( 'pickup_datepicker' ) );
woocommerce_form_field( $delivery_datepicker_slug, array(
'type' => 'text',
'class'=> array( 'form-row-first my-datepicker'),
'label' => __('Delivery date'),
'required' => true,
), WC()->session->get( 'delivery_datepicker' ) );
echo '<br clear="all"></div>';
?>
<script type="text/javascript">
jQuery(document).ready(function($) {
var pickup = '#pickup_datepicker';
var delivery = '#delivery_datepicker';
$(pickup).datepicker({
dateFormat: 'dd.mm.yy', // ISO formatting date
onSelect: function(selected) {
var selectedDate = selected.split('.').reverse().join('-'); // Convert to 'yy-mm-dd' format
var minDate = new Date(selectedDate);
minDate.setDate(minDate.getDate() + 1);
$(delivery).datepicker("option", "minDate", minDate);
calculateDays();
}
});
$(delivery).datepicker({
dateFormat: 'dd.mm.yy', // ISO formatting date
onSelect: function(selected) {
calculateDays();
}
});
// Function to calculate the days between two dates
function calculateDays() {
$( document.body ).trigger( 'update_checkout' );
}
});
</script>
<?php
}
add_action( 'woocommerce_before_order_notes', 'datepicker_custom_fields' );
在此过滤器中,您可以捕获
pickup_datepicker
和 delivery_datepicker
值,并使用 DateTime
类和 diff
函数计算天数。并使用 set_price
功能设置购物车商品价格。
function override_cart_item_price( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ){
return;
}
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ){
return;
}
parse_str($_POST['post_data'], $post_data);
if (isset($post_data['pickup_datepicker']) && $post_data['pickup_datepicker'] != '' && isset($post_data['delivery_datepicker']) && $post_data['delivery_datepicker'] != '') {
WC()->session->set('pickup_datepicker', sanitize_text_field($post_data['pickup_datepicker']));
WC()->session->set('delivery_datepicker', sanitize_text_field($post_data['delivery_datepicker']));
$pickup_datepicker = sanitize_text_field($post_data['pickup_datepicker']);
$delivery_datepicker = sanitize_text_field($post_data['delivery_datepicker']);
$pickup_date_obj = new DateTime($pickup_datepicker);
$delivery_date_obj = new DateTime($delivery_datepicker);
$interval = $pickup_date_obj->diff($delivery_date_obj);
$days = $interval->days;
$days = ( $days > 1 ) ? $days : 1 ;
WC()->session->set('delivery_days', $days );
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
// Calculate the new subtotal and total based on the number of days
$new_price = $cart_item['data']->get_price() * $days;
$cart_item['data']->set_price( $new_price );
$cart_item['days'] = $days;
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'override_cart_item_price', 99, 1 );
通过使用此过滤器,您可以在价格旁边显示天数。
function add_days_woocommerce_cart_item_subtotal( $total, $cart_item, $cart_item_key ){
$delivery_days = WC()->session->get( 'delivery_days' );
if( $delivery_days ){
$day_label = 'day';
$product = wc_get_product( $cart_item['product_id'] );
if( $delivery_days > 1 ){
$day_label = 'days';
}
$total = wc_price( $product->get_price() ) . ' x '. $delivery_days. '('.$day_label.')' . ' = '. $total;
}
return $total;
}
add_filter( 'woocommerce_cart_item_subtotal', 'add_days_woocommerce_cart_item_subtotal', 10, 3 );
参考资料:
已测试并工作。
更新根据OP的评论。
您可以将
plugins/woocommerce/templates/checkout/review-order.php
覆盖到您的主题 yourthemename/woocommerce/checkout/review-order.php
参考
您将在下面的代码中找到它。并根据您的要求进行更改。
<tr class="order-total">
<th><?php esc_html_e( 'Total', 'woocommerce' ); ?></th>
<td><?php wc_cart_totals_order_total_html(); ?></td>
</tr>