正在将数据保存到WooCommerce会话


Saving data to WooCommerce session

我正试图将一个简单的文本输入保存到WooCommerce会话中。会话是在用户向购物车添加内容时创建的。

我的输入字段存在于自定义页面模板中,该模板将在购物车之后但在结账之前放置在用户流中:购物车>我的模板>结账。

到目前为止

捕获数据的简单表单(自定义模板文件)

<form name="group" method="post" class="checkout woocommerce-checkout" action="http://localhost:/site.dev/my-template">
    <div class="group-order">
        <p class="form-row form-row woocommerce-validated" id="create_new_group_field">
            <label for="create_new_group" class="">Join an existing group</label>
            <input type="text" class="input-text " name="create_new_group" id="create_new_group">
        </p>
    </div>
</form>

接收和设置数据(我很难弄清楚何时/如何运行这个。在我的自定义页面

更新我已经将下面的代码添加到页面模板的顶部,这样页面就可以自行处理,然后重新指向签出。

函数set_and_save_input_to_session(){

if( !is_admin( ) ) {
    // User input
    if( ! empty( $_POST['create_new_group'] ) ) {
        $group_input_value =  $_POST['create_new_group']; 
        // Set session and save data
        WC()->session->set( 'group_order_data', $group_input_value );
        wp_redirect( 'http://localhost:28/site.dev/checkout' );
        exit();
    }
}
get_header();

add_action('wocommerce_checkout_process','set_and_save_input_to_session')

检索和保存数据

function retrieve_and_save_group_input_value_to_order_meta() {
    $retrived_group_input_value = WC()->session->get( 'group_order_data' );
    update_post_meta( $order_id, '_create_new_group', $retrived_group_input_value );
}
add_action('woocommerce_checkout_update_order_meta', 'retrieve_and_save_group_input_value_to_order_meta');

我目前正在研究对我来说更复杂的解决方案,因此,如果有人能指出我迄今为止流程中的任何重大缺陷,我将不胜感激。

更新

我可以确认表单正在接收数据,并且WC()->session->set正在设置数据。(感谢@Firefog建议使用$_SESSION全局)

在进一步调查并找到var_dump会话数据的正确位置后,我发现数据是用我原来的方法设置到会话的。

数据已设置,但我不明白为什么数据不会保存到订单中。

更重要的是谢谢你解决了我的问题。但这里也有一个答案:

由于回调函数中没有$order_id参数,因此无法更新post-meta。这应该会奏效:

function retrieve_and_save_group_input_value_to_order_meta( $order_id ) {
    $retrived_group_input_value = WC()->session->get( 'group_order_data' );
    update_post_meta( $order_id, '_create_new_group', $retrived_group_input_value );
}
add_action('woocommerce_checkout_update_order_meta', 'retrieve_and_save_group_input_value_to_order_meta');

这里是另一种方法。

第1页:

 session_start();//place this at the top of all code
 $data = $_POST['create_new_group'];
 $_SESSION['custom_create_new_group']=$data;

现在在另一个页面中写入以下内容以接收值:

session_start(); //optional     
$retrive_price =  $_SESSION['custom_create_new_group'];