WooCommerce:购物车价格覆盖文字

时间:2016-06-27 15:04:09

标签: php wordpress wordpress-plugin woocommerce cart

我们有很多产品都有:

  • 没有价格
  • 零价格

我们使用内置挂钩购买它们,但购物车在结帐时仍然显示为 0 price

我们喜欢购物车和购物车结帐摘要显示“特殊订单”或任何其他文本,但似乎WooCommerce使基于文本的价格无效。

试过这个: WooCommerce: Add product to cart with price override?

上述方法可以正常使用数字覆盖,但尝试使用文字覆盖时,默认情况下会返回显示 0 price

为什么呢?这些产品是按订单生产的,商店管理员将在与客户/供应商交谈后更新价格。

2 个答案:

答案 0 :(得分:4)

您需要过滤显示购物车中的价格和小计的字符串。您提到的链接讨论了更改实际价格。在您的情况下,价格 $ 0,直到您稍后设置实际价格为止。可能还有购物车总数的过滤器,但这应该是一个开始:

add_filter( 'woocommerce_cart_item_price', 'so_38057349_cart_item_price', 10, 3 );
function so_38057349_cart_item_price( $price, $cart_item, $cart_item_key ) {

    if ( $cart_item[ 'data' ]->price == 0 ) {
        $price = __( 'Special Order', 'yourtheme' );
    }

    return $price;
}


add_filter( 'woocommerce_cart_item_subtotal', 'so_38057349_cart_item_subtotal', 10, 3 );
function so_38057349_cart_item_subtotal( $subtotal, $cart_item, $cart_item_key ) {

    if ( $cart_item[ 'data' ]->price == 0 ) {
        $subtotal = __( 'To be determined', 'yourtheme' );
    }

    return $subtotal;
}


add_filter( 'woocommerce_order_formatted_line_subtotal', 'so_38057349_order_item_subtotal', 10, 3 );
function so_38057349_order_item_subtotal( $subtotal, $item, $order ) {

    if ( isset( $item[ 'line_subtotal' ] ) && $item[ 'line_subtotal' ] == 0 ) {
        $subtotal = __( 'To be determined', 'yourtheme' );
    }

    return $subtotal;
}

当然,这也适用于价格为0的任何产品,可能不仅仅是您配置为自定义的产品,因此您可能需要比我在此处提供的条件逻辑更多的条件逻辑。

要跟进您的评论.... woocommerce_order_amount_total是数字总数,而不是显示的html。您可以在cart-totals.php模板中看到正在调用的函数。

function so_38057349_woocommerce_cart_subtotal( $cart_subtotal, $compound, $cart ) { 
    if( $cart->subtotal == 0 ){
        $cart_subtotal = __( 'Order subtotal to be determined', 'yourtheme' ); 
    }
    return $cart_subtotal; 
}; 
add_filter( 'woocommerce_cart_subtotal', 'so_38057349_woocommerce_cart_subtotal', 10, 3 ); 


// define the woocommerce_order_amount_total callback 
function so_38057349_woocommerce_order_amount_total( $order_total ) { 
    if( WC()->cart->get_total() == 0 ){
        $order_total = __( 'Order total to be determined', 'yourtheme' ); 
    }
    return $order_total; 
}; 
add_filter( 'woocommerce_cart_totals_order_total_html', 'so_38057349_woocommerce_order_amount_total' ); 

更新截图: cart

答案 1 :(得分:1)

扩展赫尔加的答案,这里有完整的代码,可以将价格更改为“待定”的答案。'在购物车页面,结帐页面和订单确认电子邮件上也是如此。文本保持不同,以便人们可以发现每个过滤器的位置。

    add_filter( 'woocommerce_cart_item_price', 'filter_cart_item_price', 10, 3 );
function filter_cart_item_price( $price, $cart_item, $cart_item_key ) {
    if ( $cart_item[ 'data' ]->price == 0 ) {
        $price = __( 'Special Order', 'yourtheme' );
    }
    return $price;
}

add_filter( 'woocommerce_cart_item_subtotal', 'filter_cart_item_subtotal', 10, 3 );
function filter_cart_item_subtotal( $subtotal, $cart_item, $cart_item_key ) {
    if ( $cart_item[ 'data' ]->price == 0 ) {
        $subtotal = __( 'To be determined', 'yourtheme' );
    }
    return $subtotal;
}

add_filter( 'woocommerce_cart_subtotal', 'filter_woocommerce_cart_subtotal', 10, 3 ); 
function filter_woocommerce_cart_subtotal( $cart_subtotal, $compound, $instance ) { 
    $cart_subtotal = __( 'To be determined 4', 'yourtheme' ); 
    return $cart_subtotal; 
}; 


add_filter( 'woocommerce_order_formatted_line_subtotal', 'filter_order_item_subtotal', 10, 3 );
function filter_order_item_subtotal( $subtotal, $item, $order ) {
    if ( isset( $item[ 'line_subtotal' ] ) && $item[ 'line_subtotal' ] == 0 ) {
        $subtotal = __( 'To be determined 2', 'yourtheme' );
    }
    return $subtotal;
}

add_filter( 'woocommerce_order_subtotal_to_display', 'filter_woocommerce_order_subtotal_to_display', 10, 3 ); 
function filter_woocommerce_order_subtotal_to_display( $subtotal, $compound, $instance ) { 
        $subtotal = __( 'To be determined 6', 'yourtheme' );
    return $subtotal; 
};

add_filter( 'woocommerce_get_formatted_order_total', 'filter_woocommerce_get_formatted_order_total', 10, 2 ); 
function filter_woocommerce_get_formatted_order_total( $formatted_total, $instance ) { 
        $formatted_total = __( 'To be determined 8', 'yourtheme' );
    return $formatted_total; 
};