Как я могу заставить свой ajax add_to_cart работать в вложенной асинхронной функцииJavascript

Форум по Javascript
Ответить
Anonymous
 Как я могу заставить свой ajax add_to_cart работать в вложенной асинхронной функции

Сообщение 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



";


Подробнее здесь: https://stackoverflow.com/questions/797 ... c-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»