WordPress

Woocommerce — funkcja Dodaj do koszyka

  • 2 lutego, 2023
  • 4 min read
Woocommerce — funkcja Dodaj do koszyka


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!

Warto przeczytać!  Miesiąc w WordPress – luty 2023 – Wiadomości WordPress


Źródło