WooCommerce: изменение цены корзины с текстом

У нас есть несколько продуктов с:

Нет ценыНулевая цена

Мы сделали их покупаемыми с помощью встроенного крючка, но корзина по-прежнему отображает их как0 price во время оформления заказа.

Нам бы хотелось, чтобы в сводке корзины и заказа отображался «Специальный заказ» или любой другой текст, но, похоже, WooCommerce делает недействительными текстовые цены.

Пробовал это:WooCommerce: добавить товар в корзину с переопределением цены?

Вышеприведенное прекрасно работает с переопределением числа, но при попытке переопределения текста по умолчанию возвращается к отображению0 price.

Зачем? Эти продукты создаются на заказ, и администратор магазина обновит цену после разговора с клиентом / поставщиком.

Ответы на вопрос(2)

более подробно об ответе Хельги, вот полный код, который меняет цены на «подлежит определению» на страницах корзины, страницах оформления заказа и электронных письмах с подтверждением заказа. Текст остается разным, поэтому люди могут определить, куда идет каждый фильтр.

    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; 
}; 
Решение Вопроса

Вам необходимо отфильтровать строки, которые отображают цену и промежуточный итог в корзине. Ссылка, которую вы упомянули, обсуждала изменение фактической цены. В вашем случае ценаявляется $ 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' ); 

Обновленный скриншот:

 helgatheviking28 июн. 2016 г., 01:55
Проверьте мои изменения. Похоже на ошибку в вашем вопросеwoocommerce_order_amount_total не должен быть строкой html.
 radug27 июн. 2016 г., 23:25
Огромное спасибо Хельге, это именно то, что было нужно. Расширена на вашем примере, чтобы охватить страницы корзины и оформления заказа тоже!

Ваш ответ на вопрос