Guarde las variables de sesión personalizadas de WooCommerce como metadatos de pedido

5 minutos de lectura

Avatar de usuario de 083N
083N

Estoy tratando de almacenar variables de sesión personalizadas en la base de datos. Luego, muéstrelos dentro del nuevo correo electrónico del pedido y los detalles del pedido en WooCommerce Admin.

Tengo variables personalizadas dentro de la sesión:

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

En primer lugar, agregué variables personalizadas a la base de datos con este código;

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

En segundo lugar, agregué los datos de esta variable a un nuevo correo electrónico de pedido para el administrador.

// 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>';
}

La última parte del código muestra datos de variables de sesión en la página de pedido de 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>';
}

Pero no funciona. Cuando el cliente hizo un pedido, dio un error “No pudimos procesar su pedido, inténtelo de nuevo”.

Avatar de usuario de LoicTheAztec
LoicTheAztec

Actualizado: Hay algunos errores en su código cuando intenta guardar sus datos personalizados de la sesión como metadatos de pedidos y mostrarlos en correos electrónicos y páginas de pedidos de administración…

Tu primera función es correcta (oturum_degiskeni_olustur)…

Suponiendo que los datos se pasan a través de URL como: website.com/?konumu=newyork&masa_no=12

Aquí está el código revisado:

// 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>';
}

El código va en el archivo functions.php de su tema secundario activo (o tema activo). Probado y Funciona.

En la notificación por correo electrónico antes de los detalles del cliente:

ingrese la descripción de la imagen aquí

En la página de edición de pedidos de administrador (bajo el teléfono de facturación):

ingrese la descripción de la imagen aquí

Probado en WooCommerce 4.2+ bajo el tema de escaparate

  • @083N Lo siento, un poco de confusión y error (fue $data['konum'] y $data['masa'] en lugar de $data['konumu'] y $data['masa_no']… He actualizado el código… Ahora funciona.

    – LoicTheAztec

    24 de junio de 2020 a las 19:08


  • @083N Lo he probado en 2 instalaciones diferentes y funciona perfectamente cada vez… Reemplace todo su código existente relacionado con el mío e inténtelo de nuevo. Si no funciona, podría ser algún otro código personalizado, su tema o un complemento de terceros que esté causando problemas.

    – LoicTheAztec

    25 de junio de 2020 a las 20:04


  • Funciona bien. Muchas gracias por tu tiempo. ¿Hay otra forma de hacer una donación? No puedo usar PayPal debido a la restricción.

    – 083N

    26 de junio de 2020 a las 7:13

  • ¡Gracias! ¡Por fin alguien aquí para sacarme! oh, gracias hombre, literalmente me quedé atrapado en esto. funciona como un encanto!

    – Naz

    22 oct 2021 a las 23:30

¿Ha sido útil esta solución?