• Resolved Khandaker Shahi

    (@khandakershahi)


    Hi,

    I am trying to show products in a page using WSForm Lite and allow user to select and pass that to cart page. I am able to generate a code using ChatGPT, but the issue is it only able to send the one selection, but there is two radio option and one checkbox. So if customers select them all, it supposes to send the 3 products to cart.

    Here is the code for functions.php

    add_action('wp_enqueue_scripts', function () {
    if (is_page('booking')) { // Replace 'booking' with the slug of your page
    wp_enqueue_script('wc-add-to-cart');
    wp_localize_script('wc-add-to-cart', 'wc_add_to_cart_params', array(
    'ajax_url' => admin_url('admin-ajax.php'),
    '_wpnonce' => wp_create_nonce('woocommerce-add-to-cart'),
    ));
    }
    });

    Here is the enqueue JS code

    (function ($) {
    // Store selected product URLs
    let selectedProductURLs = [];

    // Helper function to add product URL
    function addProductURL(url) {
    if (!selectedProductURLs.includes(url)) {
    selectedProductURLs.push(url);
    }
    }

    // Helper function to remove product URL
    function removeProductURL(url) {
    selectedProductURLs = selectedProductURLs.filter(item => item !== url);
    }

    // Event handler for WSForm rendering
    $(document).on('wsf-rendered', function (e, form, form_id, instance_id) {
    // Ensure the script runs only for the specific form ID (1 in this case)
    const my_form_id = 1;
    if (form_id != my_form_id) return;

    // Gearbox radio button logic
    const gearboxButtons = document.querySelectorAll(".gearbox .gearbox-child");
    const radios = document.querySelectorAll(".course-radio [role='radiogroup']");
    gearboxButtons.forEach((button) => {
    if (button.checked) {
    radios[1].style.display = "none";
    }

    button.addEventListener('click', () => {
    if (button.value === "Automatic") {
    radios[1].style.display = "flex";
    radios[0].style.display = "none";
    } else {
    radios[0].style.display = "flex";
    radios[1].style.display = "none";
    }
    });
    });

    // Handle course radio buttons
    const courseRadios = document.querySelectorAll(".course-radio input[type='radio']");
    courseRadios.forEach((radio) => {
    radio.addEventListener('change', (e) => {
    const linkTagMatch = radio.value.match(/href="([^"]+)"/);
    if (linkTagMatch && linkTagMatch[1]) {
    // Remove previously selected course from the same group
    courseRadios.forEach(r => {
    const valueMatch = r.value.match(/href="([^"]+)"/);
    if (valueMatch && valueMatch[1]) removeProductURL(valueMatch[1]);
    });

    // Add the selected course
    addProductURL(linkTagMatch[1]);
    }
    });
    });

    // Handle practical test checkbox
    const practicalTestCheckbox = document.querySelector(".p-test input[type='checkbox']");
    practicalTestCheckbox.addEventListener('change', (e) => {
    const linkTagMatch = e.target.value.match(/href="([^"]+)"/);
    if (linkTagMatch && linkTagMatch[1]) {
    if (e.target.checked) {
    addProductURL(linkTagMatch[1]);
    } else {
    removeProductURL(linkTagMatch[1]);
    }
    }
    });

    // Handle theory test radio buttons
    const theoryTestRadios = document.querySelectorAll(".t-test input[type='radio']");
    theoryTestRadios.forEach((radio) => {
    radio.addEventListener('change', (e) => {
    const linkTagMatch = radio.value.match(/href="([^"]+)"/);
    if (linkTagMatch && linkTagMatch[1]) {
    // Remove previously selected theory test
    theoryTestRadios.forEach(r => {
    const valueMatch = r.value.match(/href="([^"]+)"/);
    if (valueMatch && valueMatch[1]) removeProductURL(valueMatch[1]);
    });

    // Add the selected theory test
    addProductURL(linkTagMatch[1]);
    }
    });
    });

    // Form submission handling
    $('#wsf-1-field-2').closest('form').on('submit', function (e) {
    e.preventDefault();

    // Debugging: Log selected URLs before proceeding
    console.log("Selected product URLs: ", selectedProductURLs);

    if (selectedProductURLs.length > 0) {
    const addToCartPromises = selectedProductURLs.map(url => {
    // Ensure correct product ID extraction
    const productId = url.split('add-to-cart=')[1];
    console.log('Adding Product ID:', productId);


    return $.ajax({
    url: wc_add_to_cart_params.ajax_url, // WooCommerce's AJAX URL
    type: 'POST',
    data: {
    action: 'woocommerce_add_to_cart',
    product_id: productId,
    quantity: 1,
    _wpnonce: wc_add_to_cart_params._wpnonce // WooCommerce nonce
    }
    });
    });

    Promise.all(addToCartPromises)
    .then(() => {
    // Redirect to cart after adding all items
    // window.location.href = '/cart';
    })
    .catch(error => {
    console.error('Error adding to cart:', error);
    });
    } else {
    console.log("No products selected.");
    }
    });
    });
    })(jQuery);

    In wplocal it sometimes works but in staging site it sends last product or the middle product to cart not 3 product every time.

    Can you help to fix this issue?
    TIA

    The page I need help with: [log in to see the link]

Viewing 1 replies (of 1 total)
Viewing 1 replies (of 1 total)
  • You must be logged in to reply to this topic.