Обыскав весь интернет и не найдя решение, пришлось придумать своё.
В моей задаче, необходимо было добавлять в корзину рационы питания на несколько дней и человек сразу. Каждый из дней у меня сделан как отдельный товар вида 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 можете прочитать в блоге Миша Рудрастрых. Оттуда и я черпал эти знания.
Конечно возможно приведенный выше способ кому-то покажется косячным или не правильным, но пока что иного способа я не придумал. Если вы знаете способ лучше или какой-то способ оптимизации этого кода, дайте знать 😉