在WooCommerce中显示免费送货前还剩多少金额以及交付信息。

3
根据这个答案:在WooCommerce中基于时间和日期的条件交货通知,我正在基于特定的运输条件获取一条运输信息。
现在我意识到我需要在WooCommerce中设置免费运输方式,并且为此,我需要告知客户还需要多少金额才能获得免费运输。
因此,我找到了这段代码:
$total_cart = WC()->cart->total;
$limit_for_free_shipping = 99;

    if ($total_cart != 0 && $total_cart < $limit_free_shipping ) { 
        $difference = wc_price( round($limit_for_free_shipping - $total_cart, 2) );
        ?>
   
    <p class="spend_message" >
        <img src="<?php echo get_stylesheet_directory_uri(); ?>/images/shipping-icon.png"> <?php _e('If you spend another '); ?> <?php echo $diff; ?> <?php _e(', you will get '); ?> <strong><?php _e('FREE SHIPPING!'); ?></strong>
    </p>

<?php
    }

但我在将此消息与其他消息合并并将其转换为<p>标签而不是wc-notice方面遇到了麻烦。
1个回答

1
以下将合并两个功能:
add_action( 'woocommerce_before_customer_login_form', 'next_day_delivery' );
add_action( 'woocommerce_before_customer_login_form', 'next_day_delivery' );
add_action( 'woocommerce_before_checkout_form', 'next_day_delivery' );
add_action( 'woocommerce_before_shop_loop', 'next_day_delivery' );
add_action( 'woocommerce_before_single_product_summary', 'next_day_delivery' );
add_action( 'woocommerce_before_cart', 'next_day_delivery' );

function next_day_delivery() {
    if( WC()->cart->is_empty() )
        return; // Exit

    // Set the time zone
    date_default_timezone_set('Europe/Stockholm');

    // From Monday to Thursday
    $is_week_days  = in_array( date('w'), array( 1, 2, 3, 4 ) ) ? true : false;
    $end_time      = mktime('12', '00', '00', date('m'), date('d'), date('Y'));
    $now_time      = time();
    $after_tomorow = date('l', strtotime('+2 days'));

    $dateDiff      = intval(($end_time - $now_time)/60);
    $diff_hours    = intval($dateDiff/60);
    $diff_minutes  = $dateDiff%60;
    $hours_label   = _n( 'hour', 'hours', $diff_hours, 'wooocommerce' );
    $minutes_label = _n( 'minute', 'minutes', $diff_minutes, 'wooocommerce' );
    $minutes_displ = $diff_minutes.' '.$minutes_label;
    $hours_display = $diff_hours.' '.$hours_label.' and ';
    $remain_time   = $diff_hours > 0 ? $hours_display . $minutes_displ : $minutes_displ;

    $cart_total    = WC()->cart->total;
    $limit_free    = 100; // Starting freee shipping amount
    $free_shipping = '';  // Initialising

    if ( $cart_total < $limit_free ) {
        $free_shipping =  sprintf(
            __('%s If you spend another %s you will get %s', 'woocommerce' ),
            '', // ' <img src="' . get_stylesheet_directory_uri() . '/images/shipping-icon.png"> ',
            strip_tags( wc_price( round( $limit_free - $cart_total, 2 ) ) ),
            '<strong>' . __( 'FREE SHIPPING!', 'woocommerce' ) . '</strong>'
        );
    } elseif ( $cart_total >= $limit_free ) {
        $free_shipping = '<strong>' . __( ' You get FREE SHIPPING!', 'woocommerce' ) . '</strong>';
    }

    if ( $end_time > $now_time && $is_week_days ) {
        // print the information notice
        $message = sprintf( __( '%s left to be delivered tomorrow! %s', 'woocommerce' ), $remain_time, $free_shipping );
    }
    elseif ( $end_time <= $now_time && $is_week_days ) {
        $message = sprintf( __( 'Your order will be delivered this %s. %s', 'woocommerce' ), $after_tomorow, $free_shipping );
    } else {
        $message = __( 'Your order will be prepared and shipped next upcoming monday and delivered on tuesday.', 'woocommerce' ) . $free_shipping;
    }
    wc_print_notice( $message, 'success' );
}

代码放在您的活动子主题(或活动主题)的function.php文件中。经过测试,可行。

enter image description here

enter image description here

更新: 当时间等于零时,已移除小时数:

enter image description here

To use a <p class="my-custom> html tag instead of using the Woocommerce notice structure, replace:

wc_print_notice( $message, 'success' );

by:

echo '<p class="my-custom>' . $message . '</p>';

You are done…


很酷,我会尝试使用<p class="">来查看它的效果,并尝试将其从通知(如我上面的问题中提到的)合并到<p>中。再次感谢!如果只剩下几分钟,我想知道如何从通知中删除“0小时”?你知道怎么做吗? - user10551357
谢谢。非常好。只需要弄清楚如何将其变成<p>即可 :) - user10551357
@WooDevil 如果你使用 wc_print_notice(),那是不行的。你需要构建自己的通知自定义功能。 - LoicTheAztec
@WooDevil 添加了一个附加功能,可以在最后执行该操作。 - LoicTheAztec
@WooDevil 你应该提出一个新问题,因为计时器涉及到 JavaScript / jQuery 代码。但是在此之前,请尝试自己找出解决方法,或者重新思考一下问题。 - LoicTheAztec
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接