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

Php 将自定义会话变量另存为订单元数据,php,wordpress,woocommerce,session-variables,orders,Php,Wordpress,Woocommerce,Session Variables,Orders,我试图在数据库中存储自定义会话变量。然后,在WooCommerce Admin的新订单电子邮件和订单详细信息中显示它们 我在会话中有自定义变量: add_action( 'init', 'oturum_degiskeni_olustur' ); function oturum_degiskeni_olustur () { // Early initialize customer session if ( isset(WC()->session) && ! WC()-

我试图在数据库中存储自定义会话变量。然后,在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”和“电子邮件”,20,4);
函数konumu_email_ekle($order,$sent_to_admin,$plain_text,$email){
如果(get_post_meta($order->get_id(),'u konum',true))回显“konum:”。get_post_meta($order->get_id(),'u konum',true)。“

”; 如果(get_post_meta($order->get_id(),'u masa',true))回显“masa Numaras:”。get_post_meta($order->get_id(),'u masa',true)。“

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

// 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>';
}
//在订单页面中显示会话变量
添加行动('woocommerce\u admin\u order\u data\u在账单地址之后,'konumu\u admine\u ekle',10,1);
功能konumu_admine_ekle($order){
$order\u id=$order->get\u id();
if(get_post_meta($order_id,'u konum',true))回显“konum:”。get_post_meta($order_id,'u konum',true)。”

; 如果(获取帖子元($order_id,''u masa',true))回显“masa Numaras:”。获取帖子元($order_id,''u masa',true)。”

; }

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

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

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

假设数据通过URL传递,如:
website.com/?konumu=newyork&masa\u no=12

以下是重新访问的代码:

// Unchanged
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 ) );
    }
}

// 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['konum']) ) {
        $order->update_meta_data( '_konum', $data['konum'] );
    }
    
    if ( isset($data['masa']) ) {
        $order->update_meta_data( '_masa', $data['masa'] );
    }
    
    WC()->session->__unset( 'custom_data' ); // Remove session variable
}

// Show this session variables in new order email for admin and in 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' );
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>';
}
//未更改
添加动作('init','oturum_degiskeni_olustur');
函数oturum_degiskeni_olustur(){
//提前初始化客户会话
如果(isset(WC()->会话)和&!WC()->会话->有会话()){
WC()->session->set_customer_session_cookie(true);
}
如果(isset($_GET['konumu'])| | isset($_GET['masa_no'])){
$konum=isset($_-GET['konumu'])?esc_-attr($_-GET['konumu']):“”;
$masa=isset($获取['masa获取编号])?esc\U属性($获取['masa获取编号]):'';
//设置会话数据
WC()->session->set('custom_data',array('konum'=>$konum,'masa'=>$masa));
}
}
//将自定义会话数据另存为订单元数据
添加操作(“woocommerce\u checkout\u create\u order”、“oturum\u degiskeni\u kaydet”);
功能oturum_degiskeni_kaydet($order){
$data=WC()->session->get('custom_data');//从session获取自定义数据
如果(isset($data['konum'])){
$order->update_meta_data('u konum',$data['konum');
}
如果(isset($data['masa'])){
$order->update_meta_data('u masa',$data['masa']);
}
WC()->session->unset('custom_data');//删除session变量
}
//在管理员的新订单电子邮件和订单页面中显示此会话变量
添加操作(“订单表后的woocommerce\u email”、“konumu email\u admine\u ekle”,20);
添加行动('woocommerce\u admin\u order\u data\u在帐单地址之后,'konumu\u Email\u admine\u ekle');
功能konumu_email_admine_ekle($order){
如果($konum=$order->get_meta('u konum'))
回声“Masa Numarası:”.$konum.

”; 如果($masa=$order->get_meta(''u masa')) 回音“科纳姆:”.$masa.

”; }
代码进入活动子主题(或活动主题)的functions.php文件。测试和工作

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

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


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

@083N抱歉有点混乱和错误(它是
$data['konum']
$data['masa']
而不是
$data['konumu']
$data['masa_no']
…我已经更新了代码…它现在可以工作了。@083N我已经在两个不同的安装上测试过了,每次都很好地工作了…用我的代码替换所有相关的现有代码,然后再试一次。如果它不工作,可能是其他自定义代码、主题或第三个prty插件造成了麻烦。它工作得很好。t非常感谢您的时间。还有其他方式捐款吗?由于限制,我不能使用贝宝。