php: correo electrónico personalizado de WooCommerce solo para procesar y completar pedidos

CorePress2024-01-24  10

Estoy usando un complemento para enviar códigos de referencia personalizados en los pedidos por correo electrónico, pero ahora descubrí que cada correo electrónico de pedido tiene el código insertado.

function gens_raf_customer_email( $order, $sent_to_admin, $plain_text ) {
$user_id = ( version_compare( WC_VERSION, '2.7', '<' ) ) ? $order->customer_user : $order->get_customer_id();
if( ! empty( $user_id ) && ( get_user_meta($user_id, "gens_referral_id", true) ) != '' ){
    $code = get_user_meta($user_id, "gens_referral_id", true);
} else {
    $code = ( version_compare( WC_VERSION, '2.7', '<' ) ) ? $order->billing_email : $order->get_billing_email();
}

if( $plain_text ){
    _e('Your referral code is: ','gens-raf') . $code;
} else {
    echo '<p style="text-align:center;margin-top:10px;">Your referral code is: ' .get_home_url() .'?raf='. $code . '</p>';
}  

} add_action('woocommerce_email_customer_details', 'gens_raf_customer_email', 30, 3);

Estaba jugando con

if ( $email->id == 'customer_completed_order' )

Pero me dio un error del generador de código php. El problema principal es enviar ese correo electrónico solo a los pedidos completados y/o en procesamiento en lugar de reembolsados, cancelados, etc.

¡Gracias!



------------------------------------

Estás recibiendo el error porque no agregaste el cuarto argumento $email disponible para woocommerce_email_customer_details gancho.

El contenido sólo se mostrará en el orden Completado y Procesando plantillas de pedidos.

Prueba esto:

add_action('woocommerce_email_customer_details', 'gens_raf_customer_email', 30, 4 );
function gens_raf_customer_email( $order, $sent_to_admin, $plain_text, $email ) {

    if ( $email->id == 'customer_completed_order' || $email->id == 'customer_processing_order' ) {
        $user_id = ( version_compare( WC_VERSION, '2.7', '<' ) ) ? $order->customer_user : $order->get_customer_id();
        if( ! empty( $user_id ) && ( get_user_meta($user_id, "gens_referral_id", true) ) != '' ){
            $code = get_user_meta($user_id, "gens_referral_id", true);
        } else {
            $code = ( version_compare( WC_VERSION, '2.7', '<' ) ) ? $order->billing_email : $order->get_billing_email();
        }
    
        if( $plain_text ){
            _e('Your referral code is: ','gens-raf') . $code;
        } else {
            echo '<p style="text-align:center;margin-top:10px;">Your referral code is: ' .get_home_url() .'?raf='. $code . '</p>';
        }  
    }
    
}

El código ha sido probado y funciona.

1

Vincenzo, funcionó... ¡Muchas gracias!

- Aleksei

26/03/2021 a las 21:08



------------------------------------

La variable $email es el cuarto argumento que falta en su función enlazada, elDebes dirigirte a notificaciones de correo electrónico específicas.

Utilice en su lugar (para woocommerce 3 y superior):

add_action('woocommerce_email_customer_details', 'gens_raf_customer_email', 100, 4 );
function gens_raf_customer_email( $order, $sent_to_admin, $plain_text, $email ) {
    // Target specific notifications: Customer processing and completed orders
    if ( in_array( $email->id, ['customer_processing_order', 'customer_completed_order'] ) ) {
        $gens_raf = get_user_meta( $order->get_user_id(), "gens_referral_id", true );
        $code     = empty( $gens_raf ) ? $order->get_billing_email() : $gens_raf;

        if( $plain_text ){
            printf( __('Your referral code is: %s', 'gens-raf'), $code );
        } else {
            $output = sprintf( __("Your referral code is: %s", "gens-raf"), get_home_url() .'?raf='. $code );
            echo '<p style="text-align:center;margin-top:10px;">' . $output . '</p>';
        }  
    }  
}

El código va en el archivo funciones.php del tema secundario activo (o tema activo). Debería funcionar.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare