Задайте цену товара из скрытого поля ввода в Woocommerce 3 - PullRequest
0 голосов
/ 13 сентября 2018

В Woocommerce я использовал jQuery для вычисления пользовательской цены на страницах одного товара, и теперь мне нужно передать это значение в корзину.

Желаемое поведение - передать новую цену, извлеченную из скрытого поля, в цену товара в корзине.

Вот мой фактический код:

// Hidden input field in single product page
add_action( 'woocommerce_before_add_to_cart_button', 'custom_hidden_product_field', 11, 0 );
function custom_hidden_product_field() {
    echo '<input type="hidden" id="hidden_field" name="custom_price" class="custom_price" value="">';
}


// The code to pass this data to the cart:
add_action( 'woocommerce_add_cart_item_data', 'save_custom_fields_data_to_cart', 10, 2 );
function save_custom_fields_data_to_cart( $cart_item_data, $product_id ) {

    if( ! empty( $_REQUEST['custom_price'] ) ) {
        // Set the custom data in the cart item
        $cart_item_data['custom_data']['custom_price'] = $_REQUEST['custom_price'];
        $data = array( 'custom_price' => $_REQUEST['custom_price'] );

        // below statement make sure every add to cart action as unique line item
        $cart_item_data['custom_data']['unique_key'] = md5( microtime().rand() );
        WC()->session->set( 'custom_data', $data );
    }
    return $cart_item_data;
}

И проверьте оба параметра $data и $cart_item_data, чтобы убедиться, что они оба возвращают данные custom_price, рассчитанные на странице.

Тем не менее, я иду к корзине, и значение позиции по-прежнему равно 0.

Я установил var равным WC()->session->set( 'custom_data', $data );, а затем var_dump, чтобы проверить его, но это возвращает NULL, что может быть просто тем, что он возвращает, я не совсем уверен, потому что я никогда не использовал это.

Я также должен добавить, что у меня regular_price в бэкэнде продукта установлено в 0. Когда я стираю это (и оставляю это поле пустым), я получаю сообщение об ошибке:

Предупреждение: нечисловое значение встречается в C: \ xampp \ htdocs \ my-Transfer-source \ wp-content \ plugins \ woocommerce \ includes \ class-wc-discount.php в строке 85

Мне интересно, пропустил ли я что-то здесь, и мог бы кто-нибудь пролить свет на это? Спасибо

1 Ответ

0 голосов
/ 13 сентября 2018

Сначала для целей тестирования мы добавляем цену в скрытое поле ввода, поскольку вы не даете код, который рассчитывает цену:

// Add a hidden input field (With a value of 20 for testing purpose)
add_action( 'woocommerce_before_add_to_cart_button', 'custom_hidden_product_field', 11 );
function custom_hidden_product_field() {
    echo '<input type="hidden" id="hidden_field" name="custom_price" class="custom_price" value="20">'; // Price is 20 for testing
}

Затем вы будете использовать следующее для изменения цены товара в корзине. (WC_Session не требуется) :

// Save custom calculated price as custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'save_custom_fields_data_to_cart', 10, 2 );
function save_custom_fields_data_to_cart( $cart_item_data, $product_id ) {

    if( isset( $_POST['custom_price'] ) && ! empty( $_POST['custom_price'] )  ) {
        // Set the custom data in the cart item
        $cart_item_data['custom_price'] = (float) sanitize_text_field( $_POST['custom_price'] );

        // Make each item as a unique separated cart item
        $cart_item_data['unique_key'] = md5( microtime().rand() );
    }
    return $cart_item_data;
}

// Updating cart item price
add_action( 'woocommerce_before_calculate_totals', 'change_cart_item_price', 30, 1 );
function change_cart_item_price( $cart ) {
    if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) )
        return;

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

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item ) {
        // Set the new price
        if( isset($cart_item['custom_price']) ){
            $cart_item['data']->set_price($cart_item['custom_price']);
        }
    }
}

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

Похожие: Woocommerce set_quantity аварийно завершает работу сайта при добавлении товаров в корзину

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...