wordpresssessionwoocommercecontact-form-7

WooCommerce WC()->session->set not working


I want to add some of the fields from a form into custom fields on a product so I can use them into an API call after payment is made. I have a redirection on my form that gets to the checkout page and add the product in the basket, code below:

<script>
document.addEventListener( 'wpcf7mailsent', function( event ) {
    if (jQuery("input[type='checkbox'][name='try[]']").is(':checked')) {
        location = 'http://www.thelittlegym.co.za/checkout/?add-to-cart=2506';
    } 
}, false );
</script>

Then, I have some code in my function.php to save the form data in the WC session. I had to add declare the new session otherwise the set function didn't work. If I do the init then I get an error saying "wc_empty_cart();" isn't defined (this function is from the WooCommerce plugin.

add_action('wpcf7_before_send_mail', 'send_form_data_to_wc_session', 5, 1);
function send_form_data_to_wc_session($contact_form) {
    $submission = WPCF7_Submission::get_instance();
    if($submission) {
        $posted_data = $submission->get_posted_data();
        if (!empty($posted_data['try'][0])) {
            // Set data to WooCommerce session
            WC()->session = new WC_Session_Handler();
            // WC()->session->init();
            WC()->session->set('cf7_posted_data', $posted_data);
        }
    }
}

Finally, I'm trying to retrieve the session data with the code below. The var dump just returns NULL.

add_action('woocommerce_checkout_before_customer_details', 'wc_save_cf7_data_to_order', 10, 1);
function wc_save_cf7_data_to_order($order_id) {
    
    $posted_data = WC()->session->get('cf7_posted_data');
    var_dump($posted_data);
    
    if(!empty($posted_data)) {
        foreach($posted_data as $key => $data) {
            echo '<b>', $key, ' : </b> ', $data, '<br />';
        }

        WC()->session->__unset('cf7_posted_data');
    }
}

I believe the WC session set isn't working. I'm looking in the console for the Session Storage and can only see "wc_cart_hash_xxxxxxx", "wc_fragment_xxxxxxx" and "wc_cart_created".

Any idea how I can go ahead to debug this?


Solution

  • I've found an alternative solution on another topic, which solved my problem even if it doesn't explain why the code above didn't work.

    add_action('wpcf7_before_send_mail', 'send_form_data_to_wc_session', 5, 1);
    function send_form_data_to_wc_session($contact_form) {
        $submission = WPCF7_Submission::get_instance();
        if($submission) {
            $posted_data = $submission->get_posted_data();
            if (!empty($posted_data['try'][0])) {
                // Set data to Session
                session_start();//place this at the top of all code
                $_SESSION['cf7_posted_data']=$posted_data;
            }
        }
    }
    

    and to retrieve:

    add_action('woocommerce_checkout_before_customer_details', 'wc_save_cf7_data_to_order', 10, 1);
    
    function wc_save_cf7_data_to_order($order_id) {
    
        session_start();
        $posted_data =  $_SESSION['cf7_posted_data'];
        
        var_dump($posted_data);
    
    }