#php #jquery #ajax #wordpress #woocommerce
Вопрос:
Я пытаюсь сделать вызов AJAX, чтобы обновить товар в корзине Woocommerce одним нажатием кнопки. На Mac в Chrome запрос всегда выполняется успешно и возвращает переменную даты из моего «предупреждения». В Windows в Chrome запрос завершается с ошибкой 400 каждый раз (и мое предупреждение «Обновление не удалось». показывает).
Скрипт AJAX и HTML для кнопки печатаются из функции PHP. Функция PHP вызывается условно на странице продукта.
Я не ставил в очередь скрипт AJAX, он объявлен встроенным в HTML.
Пожалуйста, помогите выяснить, почему этот запрос не выполняется в Windows в Chrome, но не на Mac в Chrome.
Есть 2 основные функции: одна, которая выводит HTML / JS на страницу для кнопки, другая, которая обновляет корзину.
Функция PHP, которая выводит HTML и JS на страницу:
function suggest_pickup_ship_date(){
//... PHP Code
$firstValidDateEpoch = '01-01-2022';
?>
<script type="text/javascript">
var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
</script>
<!-- jQuery CDN to run AJAX call -->
<script
src="https://code.jquery.com/jquery-3.6.0.min.js"
integrity="sha256-/xUj 3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
crossorigin="anonymous"
></script>
<script>
// AJAX POST to update weekly quantity product dates
$('.btn_suggested_date').click(function() {
loadingPopup.style.display = 'block';
$.ajax({
type: "POST",
url: ajaxurl,
cache: false,
data: {
date_week: <?php echo $firstValidDateEpoch; ?>,
action: "update_weekly_quantity_products_dates",
},
}).done(function( response ) {
alert('Response from server: ' response)
location.reload();
}).fail(() => {
loadingPopup.style.display = 'none';
alert('Update failed.');
});
});
</script>
<?php
}
}
}
}
Функция PHP, которая обновляет корзину
// Add action to ajax function that is created from ajax call
add_action('wp_ajax_update_weekly_quantity_products_dates', 'update_cart_product_weekly_quantity_date');
function update_cart_product_weekly_quantity_date () {
if (isset( $_POST['date_week'] )) {
// $_POST['date_week'] comes to us an an epoch number. We format it to d-m-Y below.
$newDate = date('d-m-Y', $_POST['date_week']);
// Loop through cart items,change date of each
$cart_items = [];
$cart = WC()->cart->get_cart();
foreach( $cart as $cart_item_key=>$cart_item ) {
array_push($cart_items, $cart_item_key);
// **********
// get cart_item_key of item you want to change
$cart_item_key_old = $cart_item_key;
// retrieve its information
$cart_item_old = WC()->cart->cart_contents[ $cart_item_key_old ];
$product_id_old = $cart_item_old['product_id'];
$quantity_old = $cart_item_old['quantity'];
$pickup_or_shipping_old = $cart_item_old['custom_data']['pickup_or_shipping'];
$variation_id = 0;
$variation_data = [];
$custom_data = [
'custom_data'=> [
'pickup_day_of_week' => $newDate,
'pickup_week'=>$newDate,
'pickup_or_shipping' => $pickup_or_shipping_old
],
];
// Add new item
WC()->cart->add_to_cart($product_id_old, $quantity_old, $variation_id, $variation_data, $custom_data);
// delete the old item
WC()->cart->remove_cart_item($cart_item_key_old);
}
wp_die('new date '. $newDate );
}
$formattedDate = date('D, M j Y', strtotime($newDate));
// Exit and return response message to frontend
echo 'hi';
die('Dates updated to '. $formattedDate. ' cart items:' . var_dump($cart_items));
}