Как передать пользовательские параметры, такие как пользовательская цена, в корзину WooCommerce - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь передать пользовательскую цену / пользовательские атрибуты в корзину woocommerce со обычной страницы WordPress с использованием PHP и Ajax, но не могу выполнить работу динамически.

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

Я работал с неким PHP, представленным здесь с очень похожими обстоятельствами, но я думаю, что чего-то не хватает: Добавление товара в корзину с пользовательской информацией и ценой

Я могу установить статическую цену, используя хук 'woocommerce_before_calculate_totals', но, используя код, указанный в приведенной выше ссылке, я не могу "передать" пользовательскую цену в корзину с помощью кнопки AJAX. Данные POST никогда не достигают функции PHP. Я пытаюсь сделать это прямо сейчас, используя кнопку с кодом AJAX для создания поста, но я продолжаю бить по стенам. Я думаю, что у меня неправильное представление о чем-то здесь. Я использую статическую цену в ajax ниже.

jQuery(function(){
jQuery('#newQuoteBtn').on('click', function(e){
    e.preventDefault();

    jQuery.ajax({
        url: '/wp-content/plugins/override_price.php',
        type: 'post',
        data: { 'custom_options': {'action': 'newquote', 'newprice': '555.55', 'quotenum': '1234567890'}},
        success: function(data, status) {
            /* Product added and redirect to cart */
            console.log('success');
        },
        error: function(xhr, desc, err) {
            console.log(xhr);
            console.log("Details: " + desc + "\nError:" + err);
        }
    }); // end ajax call
});
});

Я ожидал, что данные будут переданы в PHP, который позаботится о переопределении цены оттуда, но я не могу получить переменные в PHP. В комментариях авторов указывалось, что этот код помещается в файл functions.php, но как мне разместить там данные? Где-то здесь есть разъединение, и мне нужна помощь, чтобы осветить правильный способ решения этой проблемы.

1 Ответ

0 голосов
/ 06 января 2019

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

Форма HTML

<form method="POST" enctype="multipart/form-data" id="outer-quote-form">
    <label class="quote_number">Quote Number: 
        <input type="text" id="quote_number" name="quote_number" value="">
    </label>
    <label class="custom_price">price:
        <input type="text" id="custom_price" name="custom_price" value="">
    </label>
    <button type="submit" class="btn btn-primary" name="ws-add-to-cart">Add to Cart</button>
</form>

Тогда у меня есть несколько функций PHP. Этот слушает форму сообщения и добавляет продукт в корзину.

if (isset($_REQUEST['ws-add-to-cart'])) {
    add_action( 'init', 'add_product_to_cart' );
    function add_product_to_cart() {
        global $woocommerce;
        global $product;
        $product_id = 138;
        $woocommerce->cart->add_to_cart($product_id);
    }
    header("Location:https://www.devsite.com/checkout/");
}

Эта функция подключается к 'woocommerce_add_cart_item_data', чтобы получить пользовательскую цену и добавить это значение к данным продукта.

add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_data', 10, 3 );
function add_cart_item_data( $cart_item_data, $product_id ) {
    if( ! empty( $_POST['custom_price'] ) ) {
        $product = wc_get_product( $product_id );
        $price = $product->get_price();
        $newprice = $_POST['custom_price'];
        $cart_item_data['custom_price'] = $newprice;
    }
    return $cart_item_data;
}

Наконец, мы используем крючок 'woocommerce_before_calculate_totals', чтобы фактически переопределить цену товара в корзине.

add_action( 'woocommerce_before_calculate_totals', 'before_calculate_totals', 10, 1 );
function before_calculate_totals( $cart_object ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }
    foreach( $cart_object->get_cart() as $key=>$value ) {
        if( isset( $value['custom_price'] ) ) {
            $price = $value['custom_price'];
            $value['data']->set_price( ( $price ) );
        }
    }
}

Стоит отметить, что пока эта установка работает только с одним продуктом в корзине, и это все, что мне нужно на данный момент.

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