Форум программистов, компьютерный форум, киберфорум
WordPress
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/40: Рейтинг темы: голосов - 40, средняя оценка - 4.75
 Аватар для avens
0 / 0 / 2
Регистрация: 07.01.2015
Сообщений: 79

WooCommerce Ajax при быстром добавлении товаров не все они попадают в корзину

30.09.2018, 17:03. Показов 8139. Ответов 10

Студворк — интернет-сервис помощи студентам
Ситуация следующая, товары в корзину добавляются по ajax, всё работает отлично, но при быстром нажатии кнопки добавить в корзину на разных продуктах, идут одновременные ajax запросы и при этом не все эти товары добавляются в корзину..
Обычно последний добавляемый товар, иногда два из трех.

При том в ajax ответе видно, что всё ОК, id продуктов и id вариаций возвращаются правильные, именно тех продуктов, что добавляли в корзину. Также и в php функции всё принимается правильно, но вот почему WooCommerce не добавляет все эти продукты?

Сайт находится на локальном сервере.

В чем может быть дело?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.09.2018, 17:03
Ответы с готовыми решениями:

При добавлении товара в корзину не отображаются кнопки для увеличения количества добавляемых товаров
Пожалуйста помогите При добавлении товара в корзину не отображаются кнопки для увеличения количества добавляемых товаров в гугл хром,...

Ajax для добавления товаров в корзину
Здравствуйте. Решил сделать авторизацию на сайте без перезагрузки. Вот исходный код перед изменением: <form method="post"...

Убрать надпись "Показаны все товары. Всего товаров: " с каталога товаров woocommerce
Привет, как можно Убрать надпись "Показаны все товары. Всего товаров: " с каталога товаров woocommerce

10
 Аватар для HectorPrima
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
02.10.2018, 03:00
Вы в php разбираетесь?
0
 Аватар для avens
0 / 0 / 2
Регистрация: 07.01.2015
Сообщений: 79
02.10.2018, 14:45  [ТС]
HectorPrima, не по канонам изложил суть вопроса? Или какая то деталь в тексте стала быть преткновением, что бы суть вошла и стала понятной?
Давайте посмотрим с другой стороны, я задал вопрос прописав тексты и заголовок с ключами, от чего польза форуму и если будет ответ то и другим пользователям. Ясно что вопросы задают те кто в чем то не разбирается, иначе вопроса бы не было.
Вы же видимо гуру PHP кроме упрека больше ничего не сделали. Тут или мимо шли бы если вопрос не нравится, или ответьте по делу, показав что вы в чем то сами разбираетесь.
0
 Аватар для HectorPrima
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
02.10.2018, 15:45

Не по теме:

Не нужно в вопросе искать того чего там нет.


Цитата Сообщение от avens Посмотреть сообщение
в php функции всё принимается правильно
В функции, которая принимает параметры от Ajax можно после добавления товара проверить,
добавился ли он реально или нет? Вы сможете сделать?
Отладочную инфу куда нибудь в файл записать.
1
 Аватар для avens
0 / 0 / 2
Регистрация: 07.01.2015
Сообщений: 79
02.10.2018, 23:15  [ТС]
Цитата Сообщение от HectorPrima Посмотреть сообщение
в php функции всё принимается правильно
В функции, которая принимает параметры от Ajax можно после добавления товара проверить,
добавился ли он реально или нет? Вы сможете сделать?
Отладочную инфу куда нибудь в файл записать.
В том то и дело, что проверял записывая с помощью file_put_contents ID продуктов и их ID вариаций в текстовый файл.
И там всё верно, все те продукты что добавляю все есть.

Вставлял file_put_contents перед функцией ...add_to_cart... добавления в корзину, все ID ОК те что надо.

Также подставлял file_put_contents после функции ...add_to_cart... перед выполнением get_refreshed_fragments
...add_to_cart..
тут проверяю добавлены продукты с принимаемыми id в корзину, и тоже всё ок, все добавляемые продукты с их id и id вариаций есть в корзине и прописываются в отладочный файл.
WC_AJAX::get_refreshed_fragments();

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

Добавлено через 2 часа 22 минуты
То есть если проверять в PHP коде, то в отладочный файл всё пишется, вроде как все добавляемые продукты добавляются в корзину, но по факту попадают не все, обычно последний добавляемый.

Добавлено через 2 часа 37 минут
Возможно как то последние добавляемые продукты перезаписывают/перетирают предыдущие.
0
 Аватар для HectorPrima
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
03.10.2018, 05:14
Нужно в конце функции после того как она отработала и якобы все добавила получить всю корзину в массив.
Массив добавить в файл как то так
PHP
1
fwrite($file, print_r($cart, true));
Ну и в конце сравнить что получается после каждой операции.

Добавлено через 2 часа 0 минут
Попробуйте что то такое:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
add_action( 'woocommerce_add_to_cart', 'out_cart_to_file' );
function out_cart_to_file()
{
    $file = fopen('c:\wp_log.txt', 'a');
    $cart_items = WC()->cart->get_cart();
    fwrite($file, "==================================================\n");
    foreach ($cart_items as $item) {
        fwrite($file, "Id:       " . $item['product_id'] . "\n");
        fwrite($file, "Vid:      " . $item['variation_id'] . "\n");
        fwrite($file, "Qty:      " . $item['quantity'] . "\n");
        fwrite($file, "Subtotal: " . $item['line_subtotal'] . "\n");
        fwrite($file, "Name:     " . $item['data']->name . "\n");
        fwrite($file, "Hash:     " . $item['data_hash'] . "\n");
        fwrite($file, "----------\n");
    }
    fclose($file);
}
Добавлено через 1 час 1 минуту
Я вот только не уверен что после добавления в корзину товара, когда мы читаем корзину она полностью с бд читается.
Может текущий объект возвращает а он отличается от бд.

Еще. Сомневаюсь в такой ошибке в woocommerce. Думается уже многие бы на нее нарвались. Только вот как понять что ее может влиять. Браузеры другие пробовали, версию php менять до последней к примеру (или наоборот пораньше).
0
 Аватар для avens
0 / 0 / 2
Регистрация: 07.01.2015
Сообщений: 79
03.10.2018, 22:18  [ТС]
PHP пробовал разные и 5.4+ и 7+, браузеры тоже разные пробовал.
Если сервер по быстрей, то это только уменьшает количестово багов, но не решает проблему.

Я так делал после выполнения функции:
PHP
1
2
global $woocommerce;
$result = print_r($woocommerce->cart->get_cart(), true);
Вот результат:

Это продукты которые должны добавится и в такой последовательности:
Code
1
2
3
4
ID продукта  ID вариации   Количество
150 356 1
150 357 1
150 358 1
Это лог вашего кода после функции добавления:
Попытка №1 (2 из 3 попало в корзину):
Кликните здесь для просмотра всего текста
======================================== ==========
Id: 150
Vid: 356
Qty: 1
Subtotal:
Name: Product Test
----------
======================================== ==========
Id: 150
Vid: 357
Qty: 1
Subtotal:
Name: Product Test
----------
======================================== ==========
Id: 150
Vid: 356
Qty: 1
Subtotal: 15.99
Name: Product Test
----------
Id: 150
Vid: 358
Qty: 1
Subtotal:
Name: Product Test
----------

И в результате по факту в корзине только два продукта:
ID продукта ID вариации Количество
150 356 1
// 150 357 1 --> этого нету
150 358 1




Попытка №2 (1 из 3 попал в корзину):
Кликните здесь для просмотра всего текста
======================================== ==========
Id: 150
Vid: 357
Qty: 1
Subtotal:
Name: Product Test
----------
======================================== ==========
Id: 150
Vid: 356
Qty: 1
Subtotal:
Name: Product Test
----------
======================================== ==========
Id: 150
Vid: 358
Qty: 1
Subtotal:
Name: Product Test
----------

И в результате по факту в корзине только один продукт:
ID продукта ID вариации Количество
// 150 356 1 --> этого нету
// 150 357 1 --> этого нету
150 358 1
0
 Аватар для HectorPrima
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
04.10.2018, 02:43
Цитата Сообщение от avens Посмотреть сообщение
при быстром нажатии кнопки добавить в корзину на разных продуктах
Вот тут кстати немного не понял. У меня добавление в корзину через Ajax работает только в списках товара. Внутри товара это не работает. Судя по логу вы как то вариативный товар через Ajax добавляете. Но на вариативном же вначале кидает внутрь товара для выбора опций. А внутри уже нет Ajax. Непонятно.

Корзина хранится в одном мета поле в базе. Т.е. при добавлении одного товара корзина по сути переписывается. Т.к. wordpress по моему не использует транзакции (я этого по логам не вижу), соответственно при быстрых операциях с одной и той же записью она может перезаписаться.

Может в сопровождение разработчика обратиться. У меня не получается добиться того что бы товар переписывался. Может компьютер сильно быстрый.
1
 Аватар для avens
0 / 0 / 2
Регистрация: 07.01.2015
Сообщений: 79
04.10.2018, 10:36  [ТС]
Там сделана таблица товаров для быстрого заказа с ячейками и полем ввода количества товаров для каждой вариации.
При изменении поля ввода отправляется ajax запрос на добавление товара в корзину.
Цитата Сообщение от HectorPrima Посмотреть сообщение
соответственно при быстрых операциях с одной и той же записью она может перезаписаться
Имеете ввиду то что продукт один с одним ID тока вариации разные?
Пробовал и если добавлять совсем разные продукты с разными ID то ситуация такая же.
0
 Аватар для HectorPrima
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
04.10.2018, 12:48
Лучший ответ Сообщение было отмечено avens как решение

Решение

в бд в одном поле все хранится!
к примеру три процесса. у каждого процесса своя перемнная $data но запись в бд конечно же общая
следите за номерками

1. получили поле в переменную $data внутри {}
1. дабавили в $data[] = 1
1. записали. в бд в поле рельно находится {1}
2. получили поле в переменную $data внутри {1}
3. получили поле в переменную $data внутри {1}
2. дабавили в $data[] = 2
3. дабавили в $data[] = 3
2. записали. в бд в поле рельно находится {1,2}
3. записали. в бд в поле рельно находится {1,3}

2 потеряли. процесс 2-3 могут в процессе работы друг друга обгонять
это просто один из примеров.

реально. нужно разрабам на саппорт писать. может известная траба и решается как то просто
1
 Аватар для avens
0 / 0 / 2
Регистрация: 07.01.2015
Сообщений: 79
04.10.2018, 18:44  [ТС]
Странно всё это, как то же добавляются все товары на других WC сайтах если пробовать быстро кликать на кнопки "Add to Cart" на страницах продуктов.. или там быстрые сервера которые быстрей обрабатывают запросы.
Надо тут им наверное вопрос задавать, ток растолковать на английском.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.10.2018, 18:44
Помогаю со студенческими работами здесь

Ошибка при добавлении в корзину
Всем доброе утро. Появилась вот такая ошибка ...

SEO URL - ошибка в при добавлении товара в корзину
Здравствуйте! Может тут мне поможет кто-то. По инструкциями включил возможность использования SEO URL (настройки - система - сервер -...

Настраиваемые поля во всплывающем окне при добавлении в корзину VirtueMart 2
Здравствуйте! Попробую задать вам вопрос, уважаемые специалисты по Joomla. Задача: вывести во всплывающем окне VirtueMart 2 (которое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru