将 WooCommerce 自定义会话变量保存为订单元数据

083*_*83N 4 php wordpress session-variables orders woocommerce

我正在尝试将自定义会话变量存储在数据库中。然后,在 WooCommerce 管理员中的新订单电子邮件和订单详细信息中显示它们。

\n

我在会话中有自定义变量:

\n
add_action( 'init', 'oturum_degiskeni_olustur' );\nfunction oturum_degiskeni_olustur () {\n  // Early initialize customer session\n  if ( isset(WC()->session) && ! WC()->session->has_session() ) {\n      WC()->session->set_customer_session_cookie( true );\n  }\n\n  if ( isset( $_GET['konumu'] ) || isset( $_GET['masa_no'] ) ) {\n      $konum = isset( $_GET['konumu'] )  ? esc_attr( $_GET['konumu'] )  : '';\n      $masa  = isset( $_GET['masa_no'] ) ? esc_attr( $_GET['masa_no'] ) : '';\n\n      // Set the session data\n      WC()->session->set( 'custom_data', array( 'konum' => $konum, 'masa' => $masa ) );\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

首先,我使用此代码将自定义变量添加到数据库;

\n
// Storing session variables for using them in order notifications\nadd_action( 'woocommerce_checkout_create_order', 'oturum_degiskeni_kaydet' );\n\nfunction oturum_degiskeni_kaydet( $order, $data ) { \n  if ( $_POST['konumu'] ) update_meta_data( $order_id, '_konum', esc_attr( $_POST['konumu'] ) );\n  if ( $_POST['masa_no'] ) update_meta_data( $order_id, '_masa', esc_attr( $_POST['masa_no'] ) );\n}\n
Run Code Online (Sandbox Code Playgroud)\n

其次,我将此变量的数据添加到管理员的新订单电子邮件中。

\n
// Show this session variables in new order email for admin \nadd_action( 'woocommerce_email_after_order_table', 'konumu_emaile_ekle', 20, 4 );\n\nfunction konumu_emaile_ekle( $order, $sent_to_admin, $plain_text, $email ) {\n  if ( get_post_meta( $order->get_id(), '_konum', true ) ) echo '<p><strong>Konum :</strong> ' . get_post_meta( $order->get_id(), '_konum', true ) . '</p>';\n  if ( get_post_meta( $order->get_id(), '_masa', true ) ) echo '<p><strong>Masa Numaras\xc4\xb1 :</strong> ' . get_post_meta( $order->get_id(), '_masa', true ) . '</p>';\n}\n
Run Code Online (Sandbox Code Playgroud)\n

代码的最后一部分在 WooCommerce 订单页面中显示会话变量数据;

\n
// Show session variable in woocommerce order page\nadd_action( 'woocommerce_admin_order_data_after_billing_address', 'konumu_admine_ekle', 10, 1 );\n\nfunction konumu_admine_ekle( $order ) {\n\n $order_id = $order->get_id();\n if ( get_post_meta( $order_id, '_konum', true ) ) echo '<p><strong>Konum :</strong> ' . get_post_meta( $order_id, '_konum', true ) . '</p>';\n if ( get_post_meta( $order_id, '_masa', true ) ) echo '<p><strong>Masa Numaras\xc4\xb1 :</strong> ' . get_post_meta( $order_id, '_masa', true ) . '</p>';\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,它不起作用。当客户下订单时,出现错误“我们无法处理您的订单,请重试。”

\n

Loi*_*tec 8

更新:当您尝试将会话中的自定义数据保存为订单元数据并将其显示在电子邮件和管理订单页面\xe2\x80\xa6 上时,代码中存在一些错误

\n

您的第一个函数是正确的 (oturum_degiskeni_olustur)\xe2\x80\xa6

\n

假设数据通过 URL 传递,如下所示:website.com/?konumu=newyork&masa_no=12

\n

这是重新审视的代码:

\n
// Unchanged\nadd_action( \'init\', \'oturum_degiskeni_olustur\' );\nfunction oturum_degiskeni_olustur () {\n    // Early initialize customer session\n    if ( isset(WC()->session) && ! WC()->session->has_session() ) {\n        WC()->session->set_customer_session_cookie( true );\n    }\n\n    if ( isset( $_GET[\'konumu\'] ) || isset( $_GET[\'masa_no\'] ) ) {\n        $konum = isset( $_GET[\'konumu\'] )  ? esc_attr( $_GET[\'konumu\'] )  : \'\';\n        $masa  = isset( $_GET[\'masa_no\'] ) ? esc_attr( $_GET[\'masa_no\'] ) : \'\';\n\n        // Set the session data\n        WC()->session->set( \'custom_data\', array( \'konum\' => $konum, \'masa\' => $masa ) );\n    }\n}\n\n// Save custom session data as order meta data\nadd_action( \'woocommerce_checkout_create_order\', \'oturum_degiskeni_kaydet\' );\nfunction oturum_degiskeni_kaydet( $order ) {\n    $data = WC()->session->get( \'custom_data\' ); // Get custom data from session\n\n    if ( isset($data[\'konum\']) ) {\n        $order->update_meta_data( \'_konum\', $data[\'konum\'] );\n    }\n    \n    if ( isset($data[\'masa\']) ) {\n        $order->update_meta_data( \'_masa\', $data[\'masa\'] );\n    }\n    \n    WC()->session->__unset( \'custom_data\' ); // Remove session variable\n}\n\n// Show this session variables in new order email for admin and in woocommerce order page\nadd_action( \'woocommerce_email_after_order_table\', \'konumu_emaile_admine_ekle\', 20 );\nadd_action( \'woocommerce_admin_order_data_after_billing_address\', \'konumu_emaile_admine_ekle\' );\nfunction konumu_emaile_admine_ekle( $order ) {\n\n    if ( $konum = $order->get_meta( \'_konum\' ) )\n        echo \'<p><strong>Masa Numaras\xc4\xb1 :</strong> \' . $konum . \'</p>\';\n\n    if ( $masa = $order->get_meta( \'_masa\' ) )\n        echo \'<p><strong>Konum :</strong> \' . $masa . \'</p>\';\n}\n
Run Code Online (Sandbox Code Playgroud)\n

代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并有效。

\n

在客户详细信息之前的电子邮件通知中:

\n

在此输入图像描述

\n

在管理订单编辑页面(在计费电话下)

\n

在此输入图像描述

\n

在店面主题下的 WooCommerce 4.2+ 上进行了测试

\n