提问者:小点点

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


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

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

add_action( 'init', 'oturum_degiskeni_olustur' );
function oturum_degiskeni_olustur () {
  // Early initialize customer session
  if ( isset(WC()->session) && ! WC()->session->has_session() ) {
      WC()->session->set_customer_session_cookie( true );
  }

  if ( isset( $_GET['konumu'] ) || isset( $_GET['masa_no'] ) ) {
      $konum = isset( $_GET['konumu'] )  ? esc_attr( $_GET['konumu'] )  : '';
      $masa  = isset( $_GET['masa_no'] ) ? esc_attr( $_GET['masa_no'] ) : '';

      // Set the session data
      WC()->session->set( 'custom_data', array( 'konum' => $konum, 'masa' => $masa ) );
  }
}

首先,我用这段代码为数据库添加了自定义变量;

// Storing session variables for using them in order notifications
add_action( 'woocommerce_checkout_create_order', 'oturum_degiskeni_kaydet' );

function oturum_degiskeni_kaydet( $order, $data ) { 
  if ( $_POST['konumu'] ) update_meta_data( $order_id, '_konum', esc_attr( $_POST['konumu'] ) );
  if ( $_POST['masa_no'] ) update_meta_data( $order_id, '_masa', esc_attr( $_POST['masa_no'] ) );
}

其次,我将这个变量的数据添加到一个新的订单电子邮件中。

// Show this session variables in new order email for admin 
add_action( 'woocommerce_email_after_order_table', 'konumu_emaile_ekle', 20, 4 );

function konumu_emaile_ekle( $order, $sent_to_admin, $plain_text, $email ) {
  if ( get_post_meta( $order->get_id(), '_konum', true ) ) echo '<p><strong>Konum :</strong> ' . get_post_meta( $order->get_id(), '_konum', true ) . '</p>';
  if ( get_post_meta( $order->get_id(), '_masa', true ) ) echo '<p><strong>Masa Numarası :</strong> ' . get_post_meta( $order->get_id(), '_masa', true ) . '</p>';
}

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

// Show session variable in woocommerce order page
add_action( 'woocommerce_admin_order_data_after_billing_address', 'konumu_admine_ekle', 10, 1 );

function konumu_admine_ekle( $order ) {

 $order_id = $order->get_id();
 if ( get_post_meta( $order_id, '_konum', true ) ) echo '<p><strong>Konum :</strong> ' . get_post_meta( $order_id, '_konum', true ) . '</p>';
 if ( get_post_meta( $order_id, '_masa', true ) ) echo '<p><strong>Masa Numarası :</strong> ' . get_post_meta( $order_id, '_masa', true ) . '</p>';
}

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


共1个答案

匿名用户

在您的代码中有一些错误,当您试图保存您的自定义数据从会话作为订单元数据和显示它在电子邮件和管理订单页…

您的第一个函数是正确的(oturum_degiskeni_olustur)…

以下是所有其他函数的重温代码:

// Save custom session data as order meta data
add_action( 'woocommerce_checkout_create_order', 'oturum_degiskeni_kaydet' );
function oturum_degiskeni_kaydet( $order ) { 
    $data = WC()->session->get( 'custom_data' ); // Get custom data from session
    
    if ( isset($data['konumu']) ) 
        $order->update_meta_data( '_konum', $data['konumu'] );
        
    if ( isset($data['masa_no']) ) 
        $order->update_meta_data( '_masa', $data['masa_no'] );
}

// Show custom order meta data in new order email and in admin woocommerce order page
add_action( 'woocommerce_email_after_order_table', 'konumu_emaile_admine_ekle', 20 );
add_action( 'woocommerce_admin_order_data_after_billing_address', 'konumu_emaile_admine_ekle', 10 );
function konumu_emaile_admine_ekle( $order ) {
    if ( $konum = $order->get_meta( '_konum' ) ) 
        echo '<p><strong>Masa Numarası :</strong> ' . $konum . '</p>';
        
    if ( $masa = $order->get_meta( '_masa' ) ) 
        echo '<p><strong>Konum :</strong> ' . $masa . '</p>';
}

代码放在活动子主题(或活动主题)的functions.php文件中。 现在应该能奏效了。