Добавьте флажок на страницах с одним продуктом, который добавляет дополнительную стоимость в Woocommerce

В woocommerce я использую следующий код для отображения текстового поля ввода на страницах редактирования продукта администратора, что позволяет мне добавить дополнительную опцию ценообразования к продукту:

add_action( 'woocommerce_product_options_pricing', 'wc_cost_product_field' );
function wc_cost_product_field() {
    woocommerce_wp_text_input( array( 'id' => 'repair_price', 'class' => 'wc_input_price short', 'label' => __( 'Repair Cost', 'woocommerce' ) . ' (' . get_woocommerce_currency_symbol() . ')' ) );
}

add_action( 'save_post', 'wc_cost_save_product' );
function wc_cost_save_product( $product_id ) {

     // stop the quick edit interferring as this will stop it saving properly, when a user uses quick edit feature
     if (wp_verify_nonce($_POST['_inline_edit'], 'inlineeditnonce'))
        return;

    // If this is a auto save do nothing, we only save when update button is clicked
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return;
    if ( isset( $_POST['repair_price'] ) ) {
        if ( is_numeric( $_POST['repair_price'] ) )
            update_post_meta( $product_id, 'repair_price', $_POST['repair_price'] );
    } else delete_post_meta( $product_id, 'repair_price' );
}

Теперь на странице продукта (во внешнем интерфейсе) мне нужен флажок «Ремонт стоил 20 долларов», который появится, когда опция ценообразования в настраиваемом поле продукта будет заполнена некоторой ценой.

Если покупатель добавит эту опцию, это добавит дополнительную стоимость продукта в размере 20 долларов США, и это также должно быть отражено на страницах корзины и оформления заказа.

Любая помощь будет оценена по достоинству.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
5 171
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В следующем коде я немного пересмотрел ваш фактический код и добавил весь необходимый код, чтобы включить опцию флажка на отдельной странице продукта, если опция ценообразования в продукте заполнена (для неизменяемого типа товаров, которых нет в продаже).

Когда опция выбирается покупателем, цена продукта увеличивается, а при добавлении в корзину изменение цены отражается на страницах корзины и оформления заказа (см. скриншоты в конце).

Код:

// Backend: Additional pricing option custom field
add_action( 'woocommerce_product_options_pricing', 'wc_cost_product_field' );
function wc_cost_product_field() {
    woocommerce_wp_text_input( array(
        'id'        => '_repair_price',
        'class'     => 'wc_input_price short',
        'label'     => __( 'Repair Cost', 'woocommerce' ) . ' (' . get_woocommerce_currency_symbol() . ')'
    ));
}

// Backend: Saving product pricing option custom field value
add_action( 'woocommerce_admin_process_product_object', 'save_product_custom_meta_data', 100, 1 );
function save_product_custom_meta_data( $product ){
    if ( isset( $_POST['_repair_price'] ) )
        $product->update_meta_data( '_repair_price', sanitize_text_field($_POST['_repair_price']) );
}

// Front: Add a text input field inside the add to cart form on single product page
add_action('woocommerce_single_product_summary','add_repair_price_option_to_single_product', 2 );
function add_repair_price_option_to_single_product(){
    global $product;

    if ( $product->is_type('variable') || ! $product->get_meta( '_repair_price' ) ) return;

    add_action('woocommerce_before_add_to_cart_button', 'product_option_custom_field', 30 );
}

function product_option_custom_field(){
    global $product;

    $active_price = (float) $product->get_price();
    $repair_price = (float) $product->get_meta( '_repair_price' );
    $repair_price_html   = strip_tags( wc_price( wc_get_price_to_display( $product, array('price' => $repair_price ) ) ) );
    $active_price_html   = wc_price( wc_get_price_to_display( $product ) );
    $disp_price_sum_html = wc_price( wc_get_price_to_display( $product, array('price' => $active_price + $repair_price ) ) );

    echo '<div class = "hidden-field">
    <p class = "form-row form-row-wide" id = "repair_option_field" data-priority = "">
    <span class = "woocommerce-input-wrapper"><label class = "checkbox"> ' . __("Repair Option:", "Woocommerce") .
    ' <input type = "checkbox" class = "input-checkbox " name = "repair_option" id = "repair_option" value = "1"> + ' . $repair_price_html .
    '</label></span></p>
    <input type = "hidden" name = "repair_price" value = "' . $repair_price . '">
    <input type = "hidden" name = "active_price" value = "' . $active_price . '"></div>';

    // Jquery: Update displayed price
    ?>
    <script type = "text/javascript">
    jQuery(function($) {
        var cb = 'input[name = "repair_option"]'
            pp = 'p.price';

        // On change / select a variation
        $('form.cart').on( 'change', cb, function(){
            if ( $(cb).prop('checked') === true )
                $(pp).html('<?php echo $disp_price_sum_html; ?>');
            else
                $(pp).html('<?php echo $active_price_html; ?>');
        })

    });
    </script>
    <?php
}

// Front: Calculate new item price and add it as custom cart item data
add_filter('woocommerce_add_cart_item_data', 'add_custom_product_data', 10, 3);
function add_custom_product_data( $cart_item_data, $product_id, $variation_id ) {
    if (isset($_POST['repair_option']) && !empty($_POST['repair_option'])) {
        $cart_item_data['new_price'] = (float) ($_POST['active_price'] + $_POST['repair_price']);
        $cart_item_data['repair_price'] = (float) $_POST['repair_price'];
        $cart_item_data['active_price'] = (float) $_POST['active_price'];
        $cart_item_data['unique_key'] = md5(microtime().rand());
    }

    return $cart_item_data;
}

// Front: Set the new calculated cart item price
add_action('woocommerce_before_calculate_totals', 'extra_price_add_custom_price', 20, 1);

function extra_price_add_custom_price($cart) {
    if (is_admin() && !defined('DOING_AJAX'))
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    foreach($cart->get_cart() as $cart_item) {
        if (isset($cart_item['new_price']))
            $cart_item['data']->set_price((float) $cart_item['new_price']);
    }
}

// Front: Display option in cart item
add_filter('woocommerce_get_item_data', 'display_custom_item_data', 10, 2);

function display_custom_item_data($cart_item_data, $cart_item) {
    if (isset($cart_item['repair_price'])) {
        $cart_item_data[] = array(
            'name' => __("Repair option", "woocommerce"),
            'value' => strip_tags( '+ ' . wc_price( wc_get_price_to_display( $cart_item['data'], array('price' => $cart_item['repair_price'] ) ) ) )
        );
    }

    return $cart_item_data;
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы). протестировал и работает.


Addition based on this answer:Display product optional cost in Woocommerce in order details

Разрешить сэкономить на стоимости ремонта как метаданные позиции заказа и показывать его повсюду по заказам и уведомлениям по электронной почте:

// Save chosen seats to each order item as custom meta data and display order items Warrenty everywhere
add_action('woocommerce_checkout_create_order_line_item', 'save_order_item_product_waranty', 10, 4 );
function save_order_item_product_waranty( $item, $cart_item_key, $values, $order ) {
    if ( isset($values['repair_price']) && $values['repair_price'] > 0 ) {
        $key = __("Repair option", "woocommerce");
        $value = strip_tags( '+ '. wc_price( wc_get_price_to_display( $values['data'], array('price' => $values['repair_price']) ) ) );
        $item->update_meta_data( $key, $value );
    }
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы). протестировал и работает.

Большое спасибо @LoicTheAztec :-)

Francis Alvin Tan 27.11.2018 23:50

Только одно: как я могу переместить поля где-нибудь, например, над изображением или под описанием? Я пробовал этот product_option_custom_field (); но когда я добавляю в корзину, он не работает

Francis Alvin Tan 28.11.2018 00:56

Теперь у вас может быть флажок где угодно, но с другим значением атрибута name и с jQuery вам нужно будет обновить дополнительное скрытое поле, которое будет иметь поведение флажка внутри формы, но для этого потребуются некоторые изменения в jquery. сценарий.

LoicTheAztec 28.11.2018 01:09

@LoicTheAztec Вау, это почти именно то, что я искал, только мне это действительно нужно с вариациями продукта. Возможно ли это также с вариациями продуктов и продуктами в продаже? Это было бы прекрасно:)

user2812779 10.01.2019 17:06

Что делать, если мы используем параметры переменных, а затем нам нужно добавить эту дополнительную цену с помощью флажка. какие изменения мы должны внести.

somethingnow 21.09.2019 12:00

До какой версии woocommerce это работает? Я пытаюсь использовать его в версии 4.0.1, но безуспешно ... на одной странице продукта ничего не отображается.

DadaB 19.05.2021 17:40

Другие вопросы по теме