У меня нет запасов, для которых клиент может разместить предварительный заказ. INITIALY Я делаю это, создав дубликат продукта по запросу AJAX, отправив идентификатор продукта. Затем я добавляю этот дублированный продукт (используя его идентификатор) после того, как ответ получен путем изменения кнопки add_to_cart href (старый путь). Это работает правильно. Однако я хотел добавить уведомление, которое показывает после проверки, находится ли продукт в корзине. Не мог сделать это, используя этот метод в качестве перезагрузки страницы в этом случае. Вот первый метод работы: < /p>
if(e.target.closest("button[name='pre-order-confirmation-btn']")){
e.preventDefault()
e.target.setAttribute('disabled', '')
const notif_wrapper_in_use = document.querySelector('.stock-notif- wrapper.in-use')
let btn_clicked = e.target.closest("button[name='pre-order-confirmation-btn']")
let value = btn_clicked.value
let a_add_to_cart = notif_wrapper_in_use.querySelector(`a[data-type = ${value}]`)
let product_id = btn_clicked.dataset.productId
send_request_create_preorder_product(make_duplicate_preorder_object.ajax_url,'post', product_id, a_add_to_cart, btn_clicked )
}
async function send_request_create_preorder_product(url, post, product_id, add_to_cart_btn, btn_clicked){
let formData = new FormData()
formData.append('action','send_product_id_for_preorder');
formData.append('product_id', product_id);
const options = {
method : post,
body : formData
}
const response = await fetch(url, options)
const result = await response.text()
console.log(result)
add_to_cart_btn.href = `?add-to-cart=${result}`
add_to_cart_btn.classList.remove('hide')
btn_clicked.style.display = 'none'
/* Here I wanted to add the notification if product is indeed added to cart*/
if(document.body.classList.contains('home') /*and product in cart*/){
/*show successful notification*/
}
< /code>
/* ajax function using using hooks wp_ajax and wp_ajax_nopriv*/
function ajax_create_duplicate_product_preorder(){
if(isset($_POST['action']) && $_POST['action'] === 'send_product_id_for_preorder'){
$original_product_id = $_POST['product_id'];
$duplicate_product_id = add_notif_duplicate_wc_product($original_product_id);
echo $duplicate_product_id;
}
wp_die();
}
function add_notif_duplicate_wc_product($product_id){
$original_product = wc_get_product($product_id);
if(!$original_product){
return new WP_Error('invalid_product', 'Invalid product ID.');
}
$duplicate_product = new WC_Product_Simple();
$duplicate_product->set_name($original_product->get_name().'-precommande');
$duplicate_product->set_status('publish');
$duplicate_product->set_description($original_product->get_description());
$duplicate_product->set_short_description($original_product->get_short_description());
$duplicate_product->set_price($original_product->get_price());
$duplicate_product->set_regular_price($original_product->get_regular_price());
$duplicate_product->set_sale_price($original_product->get_sale_price());
$duplicate_product->set_catalog_visibility('hidden');
$duplicate_product->set_manage_stock(false);
$duplicate_product->set_stock_status('instock');
$duplicate_product->set_virtual(true);
$duplicate_product_id = $duplicate_product->save();
$duplicate_product->set_name($duplicate_product->get_name() . '-' . $duplicate_product_id);
$duplicate_product->save();
wp_set_object_terms($duplicate_product_id,'preorders', 'product_cat', false);
$thumbnail_id = get_post_thumbnail_id($product_id);
if($thumbnail_id){
set_post_thumbnail($duplicate_product_id, $thumbnail_id);
}
// echo $duplicate_product_id;
return $duplicate_product_id;
}
< /code>
Таким образом, в качестве альтернативы я попытался использовать эту модифицированную функцию Async и woocommerce woocommerce_ajax_add_to_cart (я также удалил параметр «post» в вышеупомянутой функции Async, когда вы вызываете) < /p>
{
e.preventDefault(); // prevent page reload
const addFormData = new FormData();
addFormData.append('action', 'woocommerce_ajax_add_to_cart');
addFormData.append('product_id', duplicateProductId);
addFormData.append('quantity', 1);
const addResponse = await fetch(url, { method: 'POST', body: addFormData });
const addResult = await addResponse.json();
console.log(addResult)
if (addResult && addResult.added) {
// Show notification
let notifDiv = document.createElement('div');
notifDiv.className = 'preorder-notif-div-homepage';
notifDiv.textContent = 'Le produit précommandé a été ajouté au panier';
document.body.appendChild(notifDiv);
}
}, { once: true });
}
< /code>
Duplicate Product_ID правильно зарегистрирован консоль, но затем у меня есть ошибка 400 (плохой запрос) на этой строке const addresponse = await (url, {метод: 'post', тело: AddformData});
Я поворачивал, чтобы решить его в течение 2 дней, но не нашел какое -либо рабочее решение. Используется < /p>
Pre-commander 24h
Voulez vous savoir quand le produit sera en stock?
Voulez-vous payer et pre commander directement?
get_id() ."'>
Envoyer
Fermer
Vous recevrez un email ou SMS vous informant de la date de disponibilité sous 48h
Vous Allez payer la totalité du produit et nous vous enverrons votre code sous 24h par email si paiement en ligne ou sous 48h si paiement à la livraison
Confirmer
Pré-commander 24h"."
Fermer
";
Подробнее здесь: https://stackoverflow.com/questions/797 ... c-function
Как я могу заставить свой ajax add_to_cart работать в вложенной асинхронной функции ⇐ Javascript
Форум по Javascript
1756556071
Anonymous
У меня нет запасов, для которых клиент может разместить предварительный заказ. INITIALY Я делаю это, создав дубликат продукта по запросу AJAX, отправив идентификатор продукта. Затем я добавляю этот дублированный продукт (используя его идентификатор) после того, как ответ получен путем изменения кнопки add_to_cart href (старый путь). Это работает правильно. Однако я хотел добавить уведомление, которое показывает после проверки, находится ли продукт в корзине. Не мог сделать это, используя этот метод в качестве перезагрузки страницы в этом случае. Вот первый метод работы: < /p>
if(e.target.closest("button[name='pre-order-confirmation-btn']")){
e.preventDefault()
e.target.setAttribute('disabled', '')
const notif_wrapper_in_use = document.querySelector('.stock-notif- wrapper.in-use')
let btn_clicked = e.target.closest("button[name='pre-order-confirmation-btn']")
let value = btn_clicked.value
let a_add_to_cart = notif_wrapper_in_use.querySelector(`a[data-type = ${value}]`)
let product_id = btn_clicked.dataset.productId
send_request_create_preorder_product(make_duplicate_preorder_object.ajax_url,'post', product_id, a_add_to_cart, btn_clicked )
}
async function send_request_create_preorder_product(url, post, product_id, add_to_cart_btn, btn_clicked){
let formData = new FormData()
formData.append('action','send_product_id_for_preorder');
formData.append('product_id', product_id);
const options = {
method : post,
body : formData
}
const response = await fetch(url, options)
const result = await response.text()
console.log(result)
add_to_cart_btn.href = `?add-to-cart=${result}`
add_to_cart_btn.classList.remove('hide')
btn_clicked.style.display = 'none'
/* Here I wanted to add the notification if product is indeed added to cart*/
if(document.body.classList.contains('home') /*and product in cart*/){
/*show successful notification*/
}
< /code>
/* ajax function using using hooks wp_ajax and wp_ajax_nopriv*/
function ajax_create_duplicate_product_preorder(){
if(isset($_POST['action']) && $_POST['action'] === 'send_product_id_for_preorder'){
$original_product_id = $_POST['product_id'];
$duplicate_product_id = add_notif_duplicate_wc_product($original_product_id);
echo $duplicate_product_id;
}
wp_die();
}
function add_notif_duplicate_wc_product($product_id){
$original_product = wc_get_product($product_id);
if(!$original_product){
return new WP_Error('invalid_product', 'Invalid product ID.');
}
$duplicate_product = new WC_Product_Simple();
$duplicate_product->set_name($original_product->get_name().'-precommande');
$duplicate_product->set_status('publish');
$duplicate_product->set_description($original_product->get_description());
$duplicate_product->set_short_description($original_product->get_short_description());
$duplicate_product->set_price($original_product->get_price());
$duplicate_product->set_regular_price($original_product->get_regular_price());
$duplicate_product->set_sale_price($original_product->get_sale_price());
$duplicate_product->set_catalog_visibility('hidden');
$duplicate_product->set_manage_stock(false);
$duplicate_product->set_stock_status('instock');
$duplicate_product->set_virtual(true);
$duplicate_product_id = $duplicate_product->save();
$duplicate_product->set_name($duplicate_product->get_name() . '-' . $duplicate_product_id);
$duplicate_product->save();
wp_set_object_terms($duplicate_product_id,'preorders', 'product_cat', false);
$thumbnail_id = get_post_thumbnail_id($product_id);
if($thumbnail_id){
set_post_thumbnail($duplicate_product_id, $thumbnail_id);
}
// echo $duplicate_product_id;
return $duplicate_product_id;
}
< /code>
Таким образом, в качестве альтернативы я попытался использовать эту модифицированную функцию Async и woocommerce woocommerce_ajax_add_to_cart (я также удалил параметр «post» в вышеупомянутой функции Async, когда вы вызываете) < /p>
{
e.preventDefault(); // prevent page reload
const addFormData = new FormData();
addFormData.append('action', 'woocommerce_ajax_add_to_cart');
addFormData.append('product_id', duplicateProductId);
addFormData.append('quantity', 1);
const addResponse = await fetch(url, { method: 'POST', body: addFormData });
const addResult = await addResponse.json();
console.log(addResult)
if (addResult && addResult.added) {
// Show notification
let notifDiv = document.createElement('div');
notifDiv.className = 'preorder-notif-div-homepage';
notifDiv.textContent = 'Le produit précommandé a été ajouté au panier';
document.body.appendChild(notifDiv);
}
}, { once: true });
}
< /code>
Duplicate Product_ID правильно зарегистрирован консоль, но затем у меня есть ошибка 400 (плохой запрос) на этой строке const addresponse = await (url, {метод: 'post', тело: AddformData});
Я поворачивал, чтобы решить его в течение 2 дней, но не нашел какое -либо рабочее решение. Используется < /p>
Pre-commander 24h
Voulez vous savoir quand le produit sera en stock?
Voulez-vous payer et pre commander directement?
get_id() ."'>
Envoyer
Fermer
Vous recevrez un email ou SMS vous informant de la date de disponibilité sous 48h
Vous Allez payer la totalité du produit et nous vous enverrons votre code sous 24h par email si paiement en ligne ou sous 48h si paiement à la livraison
Confirmer
Pré-commander 24h"."
Fermer
";
Подробнее здесь: [url]https://stackoverflow.com/questions/79751136/how-can-i-make-my-ajax-add-to-cart-work-in-nested-async-function[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия