如何更改购物车页面(woocommerce)上的自定义费用顺序(升序/降序)

时间:2018-07-30 20:16:47

标签: php wordpress woocommerce hook-woocommerce

在woocommerce中,我使用以下代码添加了自定义费用:

add_action( 'woocommerce_cart_calculate_fees', 'custom_fee_based_on_cart_total', 10, 1 );
function custom_fee_based_on_cart_total( $cart_object ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;

    // The percetage
    $percent = 10; // 15%
    // The cart total
    $cart_total = $cart_object->cart_contents_total; 

    // The conditional Calculation
    $fee = $cart_total >= 25 ? $cart_total * $percent / 100 : 0;

    if ( $fee != 0 ) 
        $cart_object->add_fee( __( "Gratuity", "woocommerce" ), $fee, false );
}

我只想刷一下费用顺序,就像我希望在小计之后是“每人费用”,在“每人费用”之后是“小费”。

here is the screenshot Attached

2 个答案:

答案 0 :(得分:1)

默认情况下,WooCommerce类WC_Cart_Fees会按金额对费用进行排序。

参考WC_Cart_Fees

,并且为了修改WooCommerce的默认行为,您需要覆盖 cart-totals.php

可以在woocommerce插件目录woocommerce / templates / cart / cart-totals.php下找到

在您的子主题名称woocommerce / cart下创建目录,然后将该文件复制到该目录

转到第61行,您可以找到以下代码:

    <?php foreach ( WC()->cart->get_fees() as $fee ) : ?>
        <tr class="fee">
            <th><?php echo esc_html( $fee->name ); ?></th>
            <td data-title="<?php echo esc_attr( $fee->name ); ?>"><?php wc_cart_totals_fee_html( $fee ); ?></td>
        </tr>
    <?php endforeach; ?>

将该代码更改为以下内容:

<?php
  $array = json_decode(json_encode(WC()->cart->get_fees()), true);
  ksort($array); // 

  foreach ($array as $fee): ?>
        <tr class="fee">
            <th><?php echo esc_html($fee['name']); ?></th>
            <td data-title="<?php echo esc_attr($fee['name']); ?>"><?php echo 
  $fee['total']; ?></td>
        </tr>
    <?php endforeach;?>

代码说明:

基本上,我们在这里所做的就是从WC类中获取所有费用,并使用内置函数json_encode()的php将其转换为数组,以便无论如何我们都可以对数组进行排序,我使用了ksort()函数根据键以升序对数组进行排序, 然后打印出费用:

这是输出的屏幕截图:

enter image description here

答案 1 :(得分:0)

您可以按照kashalo的说明复制 cart-fee.php 模板。

但是,如果您唯一需要更改的是费用单,则可以使用checkout_sort_fees过滤器覆盖排序功能。

第一个示例:颠倒顺序。

add_action( 'woocommerce_sort_fees_callback', 'reverse_sort_fees' );
function reverse_sort_fees( $order )
{
    return -$order;
}

您可以使用更复杂的排序方式,例如按费用名称排序。

add_action( 'woocommerce_sort_fees_callback', 'alpha_sort_fees', 10, 3 );
function alpha_sort_fees( $order, $a, $b )
{
    return $a->name > $b->name ? 1 : -1;
}