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”.
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:
En la página de edición de pedidos de administrador (bajo el teléfono de facturación):
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