Добавление нескольких товаров в корзину Woocommerce

Главная » Блог » Добавление нескольких товаров в корзину Woocommerce

Обыскав весь интернет и не найдя решение, пришлось придумать своё.

В моей задаче, необходимо было добавлять в корзину рационы питания на несколько дней и человек сразу. Каждый из дней у меня сделан как отдельный товар вида Product Bundles (через плагин
YITH WooCommerce Product Bundles — это товары внутри товара с возможностью добавления в корзину).

ыыыыы

Итак начнем. Есть два селекта вида:

<select name="" id="days">
        <option value="1" selected="">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
        <option value="6">6</option>
        <option value="7">7</option>
        <option value="8">8</option>
        <option value="9">9</option>
        <option value="10">10</option>
        <option value="11">11</option>
        <option value="12">12</option>
        <option value="13">13</option>
        <option value="14">14</option>
    </select>

<select name="" id="qua">
            <option value="1" selected="">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            <option value="5">5</option>
            <option value="6">6</option>
            <option value="7">7</option>
</select>

Первый селект отвечает за количество дней, второй за количество человек.

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

<input type="hidden" id='day' value="1">
<input type="hidden" id='quant' value="1">
<button id='but'>Отправить</button>

Теперь самое интересное. Ajax

Для начала создаем события change

$("#days").change(function() {
  $("#day").val($(this).val());
});

$("#qua").change(function() {
  $("#quant").val($(this).val());
});

Это то, о чем я писал выше. При выборе options в селектах их значения вписываются в инпуты. Так потом проще выдирать значения.

Теперь собственно создаем ajax запрос.

jQuery(function($){
  $('#but').click(function(){
    var days = $('#day').val();
    var quant = $('#quant').val();
    var ids = $('#ids').val();
    $.ajax({
      type: 'POST',
      url: 'http://ИМЯ_ДОМЕНА/wp-admin/admin-ajax.php',
      data: 'action=day&days='+days+'&quant='+quant+'&ids='+ids,
      beforeSend: function(xhr) {
        $('#but').text('Загрузка, 5 сек...');  
      },
      success: function( data ) {
        $('#but').text('Отправить'); 
        alert( data );
      }
    });
  })
});
Вешаем событие click на кнопку с id #but. Создаем 3 переменных.
1 - день, 2 - количество (человек), 3 - id товара.
id товара получаем в цикле. Они должны быть одной строкой. Типа: 234235237 (т.е. 234 235 237 только без пробелов). Id я получал стандартным циклом WC и засунул этот цикл в инпут:
<input id="ids" value='<?php if ( wc_get_loop_prop( 'total' ) ) {
            while ( have_posts() ) {
             the_post();
             global $product;
             if ( empty( $product ) || ! $product->is_visible() ) {
              return;
             }
            echo $product->id;
            }}?>'>

Может быть способ и не очень правильный, но другого я пока не нашел.

Вернемся к Ajax. записываем в data наши значения. Обязательно ставим action=название_функции и дальше названия и значения переменных. Остальное так же как в моём коде.

Теперь нужно прописать функцию, в которую будут передаваться значения. Идём в файл functions.php и в конец файла дописываем:

add_action( 'wp_ajax_day', 'test_function' ); // wp_ajax_{ЗНАЧЕНИЕ ПАРАМЕТРА ACTION!!}
add_action( 'wp_ajax_nopriv_day', 'test_function' );  // wp_ajax_nopriv_{ЗНАЧЕНИЕ ACTION!!}
// первый хук для авторизованных, второй для не авторизованных пользователей
 
function test_function(){

    global $post, $woocommerce;
                
    $quant = $_POST['quant'];
    $ids = $_POST['ids'];
    $arr2 = str_split($ids, 3);
    print_r($arr2);
    $i = 0;
    foreach ($arr2 as $key => $value) {
        $woocommerce->cart->add_to_cart($value,$quant);
     $i++;
     if($i==$_POST['days'])break;
    }
 
    die;
}

Записываем в переменные значения POST

$quant - в этой переменной хранится количество, в переменнной $ids - строка в которой id товаров без пробелов.

Теперь строку с id первращаем в массив и ставим обработку до 3го символа (Потом конечно придумаю другое решение, потому что не всегда id будут трехзначными. Но пока что так.)

И просто обрабатываем массив, в котором идет добавление в корзину $value (id товара) до количества дней.

Т.е. если у нас количество дней 5 — цикл добавит 5 первых дней (товаров), как мне и нужно. Вот собственно и всё.

Подробнее про ajax и WP можете прочитать в блоге Миша Рудрастрых. Оттуда и я черпал эти знания.

Конечно возможно приведенный выше способ кому-то покажется косячным или не правильным, но пока что иного способа я не придумал. Если вы знаете способ лучше или какой-то способ оптимизации этого кода, дайте знать 😉