Woocommerce — funkcja Dodaj do koszyka
![Woocommerce — funkcja Dodaj do koszyka](https://oen.pl/wp-content/uploads/2023/01/apple-touch-icon@2.png)
Stworzyłem niestandardowy motyw, w którym ludzie mogą zarezerwować wydarzenie. 95% ludzi nie miało żadnych problemów. 5% miało problemy, gdy dodawali je do swojego koszyka.
Kiedy klikną rezerwację, wykonywane jest wywołanie ajax, w którym tworzony jest nowy produkt i dodawany do koszyka. Po wykonaniu tej czynności wywołanie ajax otrzymuje odpowiedź sukcesu: prawda. 5% wyświetla wyskakujące okienko, ale koszyk jest pusty.
Co próbowałem:
- Zainicjuj sesję woocommerce, gdy użytkownik nie jest zarejestrowany
- Debugowanie w wielu miejscach w kodzie, bez powodzenia.
- Pliki cookies są włączone u klientów
Podczas debugowania produkt jest tworzony i dodawany do koszyka, otrzymuję odpowiedź mieszającą z funkcji add_to_cart.
To jest moja funkcja dodawania do koszyka:
public function add_to_cart_virtuagym() {
error_log("Trying to add product with ID: " . $_POST['id'] . ' dienst: ' . $_POST['dienst']);
if(isset($_POST['id']) && isset($_POST['dienst'])) :
$events = get_transient('virtuagym');
$title = "Reservering";
$title_to_check = "";
$max = 1;
$total_max_places = 1;
$attendees = 0;
$start = "";
$end = "";
foreach($events as $event) {
if($event->event_id == $_POST['id']) {
$total_max_places = $event->max_places;
$attendees = $event->attendees;
$max = $event->max_places - $event->attendees;
$start = $event->start;
$end = $event->end;
$title = $event->title . ' ' . date("d-m-Y H:i", strtotime($start));
$title_to_check = $event->title;
}
}
if(!$this->is_event_reservated($_POST['id'], $total_max_places, $attendees) && $start != "") {
$product = new WC_Product_Simple();
$product->set_name( $title );
$product->set_slug( 'reservering' );
$product->set_catalog_visibility("hidden");
$price = 0;
if(get_field( 'virtuagym_price', $_POST['dienst'] )) {
$price = get_field( 'virtuagym_price', $_POST['dienst'] );
}
if ( have_rows( 'virtuagym_evenementen', $_POST['dienst'] ) ) :
while ( have_rows( 'virtuagym_evenementen', $_POST['dienst'] ) ) : the_row();
if($title_to_check == get_sub_field( 'titel' )) {
$price = get_sub_field( 'prijs' );
}
endwhile;
endif;
error_log("Item price: " . $price);
if($price == 0) {
wp_send_json_error(["message" => "Er is iets mis gegaan met het ophalen van de prijs. Probeer het nog een keer."]);
}
$product->set_regular_price( floatval($price) );
$product->set_manage_stock(true);
$product->set_stock_quantity(1);
$product->save();
update_post_meta($product->get_id(), 'virtuagym_id', $_POST['id']);
update_post_meta($product->get_id(), 'expiration', date("Y-m-d H:i", strtotime("+10 minutes")));
update_post_meta($product->get_id(), 'start', $start);
update_post_meta($product->get_id(), 'end', $end);
update_post_meta($product->get_id(), 'max_places', $max);
error_log("Creating product: " . $start . ' Title: ' . $title . ' And ID: ' . $_POST['id']);
$result = WC()->cart->add_to_cart( $product->get_id(), 1 );
error_log("Cart result: " . $result);
error_log("Cart count: " . WC()->cart->get_cart_contents_count());
if(get_transient($_POST['id'])) {
$combined = array_merge(get_transient($_POST['id']), [$product->get_id()]);
set_transient($_POST['id'], $combined, 600);
} else {
set_transient($_POST['id'], [$product->get_id()], 600);
}
wp_send_json_success();
} else {
wp_send_json_error(["message" => "Alle plekken zijn helaas al gereserveerd."]);
}
endif;
wp_send_json_error(["message" => "No ID provided."]);
die;
}
Mój kod JS:
$(document).on('click', '.reserve_event', function(e) {
var button = $(this);
var allbuttons = $('.reserve_event');
if($('.reserve_event').attr('data-clicked') === 'false') {
$('.reserve_event').attr('data-clicked', 'true');
var data = {
'action': 'add_to_cart_virtuagym',
'id': $(this).data('id'),
'dienst': params.page_id
};
button.html('Laden...');
$.ajax({ // you can also use $.post here
url : params.ajax_url, // AJAX handler
data : data,
type : 'POST',
success : function( data ) {
console.log(data);
if(data.success) {
renew_cart();
}
if(!data.success) {
button.parent().find('.occupied').html(data.data.message);
button.html('reserveren');
}
allbuttons.attr('data-clicked', 'false');
}
});
}
});
Mam nadzieję, że ktoś rozpoznaje ten problem i ma rozwiązanie!