WPML

Enviar correos electrónicos a los usuarios de su sitio en su idioma preferido es importante. Para este propósito, WPML ofrece una API para almacenar el idioma preferido del usuario mientras usa el sitio y luego aplicar esta preferencia al enviarle correos electrónicos.

Este documento explica a los autores de temas y plugins cómo integrar sus productos con la función estándar wp_mail() de WordPress en el contexto del idioma preferido.

¿Cuándo necesita enviar correos electrónicos localizados por usuario?


A continuación, se muestran ejemplos que ilustran algunos casos típicos en los que necesita enviar correos electrónicos en el idioma preferido del usuario:

  • Es un administrador del sitio que envía un boletín a los suscriptores: el administrador del sitio es francés y muestra una interfaz de boletín en francés. Resultado: todos los correos electrónicos se enviarán en francés. Como sus suscriptores provienen de todo el mundo, muchos no entenderán este correo electrónico.

  • Administra un sitio de redes sociales: los miembros de este sitio pueden publicar sus fotos. Otros miembros pueden indicar que les gustan esas fotos o destacarlas; cuando lo hacen, el autor de la imagen será informado por correo electrónico. Ahora considere este escenario:

    1. Mathias, que es alemán, publicó su foto.

    2. Su amigo Pierre, que es francés, se encuentra con la foto de Mathias y hace clic en el botón Me gusta.

    3. Dado que, durante esta acción, Pierre ha estado viendo la página en francés, Mathias recibirá una notificación por correo electrónico en francés.

  • Administra un sitio de comercio electrónico: si algún producto no está disponible temporalmente, los usuarios pueden dejar su correo electrónico para que se les informe cuando el producto vuelva a estar en stock. Un visitante japonés deja su correo electrónico en algunos de los productos. Luego, el administrador del sitio, que es español, actualiza la disponibilidad. Resultado: el cliente japonés recibe un correo electrónico automático de «El producto x vuelve a estar disponible» en español, no en japonés.

Hay muchos más ejemplos similares y usted es la persona perfecta para saber si esto representará un problema para su plugin o tema.

En todos estos casos, necesitamos almacenar de alguna manera el idioma preferido del destinatario y luego, cambiar por un momento a este idioma mientras se envían los correos electrónicos.

Envolver la función wp_mail() con código específico de WPML


Al enviar correos electrónicos, necesita añadir tres pasos adicionales al código de su plugin o tema:

  1. Cambiar el contexto del idioma al preferido por el destinatario del correo electrónico.

  2. Luego, ejecutar todo su código para enviar realmente el correo electrónico.

  3. Volver a cambiar el idioma al idioma del sitio.

El segundo paso probablemente ya esté listo en este punto. Lo único que debe hacer es añadir dos líneas adicionales, específicas de WPML: solo necesita añadir las líneas en negrita.
$email = get_option('receiver-email');

// Switch language context…
do_action('wpml_switch_language_for_email', $email);

// your code for sending email:
$subject = __('Hello, World!', 'text-domain');

$message = __('This is our newsletter', 'text-domain');

wp_mail($email, $subject, $message);

// switch language back
do_action('wpml_restore_language_from_email');

Como puede ver, los cambios son pequeños, pero debe recordar los siguientes dos puntos importantes.

1. Cambie el idioma antes de recuperar el primer contenido del correo electrónico


Recuerde que está cambiando el idioma para traducir el contenido del correo electrónico. Es por esto que debe recordar configurar el idioma correcto antes de recuperar cualquier contenido del correo electrónico (el asunto o el contenido del mensaje).

El siguiente código no funcionará:

$email = my_func_to_get_receiver_email();
$subject = my_func_to_get_title(); // will come in site’s lang
$message = my_func_to_get_msg_body(); // will come in site’s lang

do_action('wpml_switch_language_for_email', $email);
wp_mail($email, $subject, $message);
do_action('wpml_restore_language_from_email');

En su lugar, debería usar:

$email = my_func_to_get_receiver_email();
do_action('wpml_switch_language_for_email', $email);
$subject = my_func_to_get_title(); // will come in receiver’s lang

$message = my_func_to_get_msg_body(); // will come in receiver’s lang
wp_mail($email, $subject, $message);
do_action('wpml_reset_language_after_mailing');

2. No envíe correos electrónicos a un array de destinatarios


La función wp_mail() permite pasar $email como un parámetro de array de correos electrónicos. Desafortunadamente, esto está prohibido si desea que el contenido del correo electrónico sea traducible.

Por lo tanto, si tiene un código que no funciona, como este:

$emails = my_func_get_emails_array(); // array(email1, email2...)
do_action('wpml_switch_language_for_email', $emails); // will not work

$subject = my_func_to_get_title();
$message = my_func_to_get_msg_body();
do_action('wpml_restore_language_from_email');

Debería reescribirlo así:

$emails = my_func_get_emails_array(); // array(email1, email2...)

foreach($emails as $email) :
do_action('wpml_switch_language_for_email', $email); // now is ok
$subject = my_func_to_get_title();
$message = my_func_to_get_msg_body();
do_action('wpml_restore_language_from_email');
endforeach;

Almacenar el idioma del destinatario

Información de idioma para usuarios de WP


Si sus destinatarios están registrados como usuarios estándar de WordPress, no necesita guardar la información del idioma y crear un hook. Simplemente puede informar a sus usuarios que pueden configurar su idioma preferido en el panel de administración de WordPress en Profiles->Your profile.

Esta información se almacena en un campo meta de usuario normal, por lo que si por alguna razón desea recuperarla, puede usar este práctico fragmento de código:

$user = get_user_by( 'email', $email );
if ( $user && isset( $user->ID ) ) {
 $lang = get_user_meta( $user->ID, 'icl_admin_language', true );
}

Cuando los destinatarios no son usuarios normales de WP


Cada vez que su plugin o tema registre una dirección de correo electrónico, también debe guardar el idioma preferido del destinatario. No requiere ningún lugar o tipo de datos especial para esto. Lo único que debe hacer es añadir un filtro que devolverá la información del idioma. El nombre del filtro es wpml_user_language.

El código de ejemplo que necesita implementar podría verse así:

add_filter(‘wpml_user_language’, ‘my_recipients_language’, 10, 2);

function my_recipient_language($lang, $email) {
return get_language_from_my_database($email); // implement it in  your plugin/theme
}

Widget de idioma


Si proporciona alguna interfaz de usuario en el front-end con un panel de configuración para sus suscriptores, puede preguntarles su idioma con el siguiente hook de acción:
do_action('wpml_user_language_switcher', array('mail'=>'mail@example.com') );

Tenga en cuenta que debe reemplazar mail@example.com con el correo electrónico real de un suscriptor actual.

Este código mostrará un cuadro de selección con los idiomas disponibles. Cuando un suscriptor seleccione uno, este valor se enviará a través de una llamada AJAX al servidor.

Luego, debe guardar estos datos en las tablas de su base de datos. Para hacer esto, añada un hook para el filtro wpml_user_language_switcher_save, así:

add_filter('wpml_user_language_switcher_save', 'my_func', 10, 3);

function my_func($saved, $email, $language) { // your code to save email - language pair, i.e.:
save_language_in_my_database($email, $language);
// if you saved data correctly, return true
return true;
}

Si su filtro no devuelve un valor de true, o si no tiene ningún filtro para eso, WPML intentará guardar la información del idioma en la tabla meta de usuario (consulte el siguiente capítulo).

Enviar correos electrónicos a direcciones que no están almacenadas


A veces necesita enviar correos electrónicos a direcciones que no están en ninguna tabla de la base de datos. Debido a que los destinatarios no están en su base de datos, tampoco está almacenando las preferencias de idioma de ningún destinatario.

Para esos casos, WPML espera que el código de idioma esté disponible en una de estas tres variables globales:


  • $_POST['wpml_user_email_language']

  • $_GET['wpml_user_email_language']

  • $GLOBALS['wpml_user_email_language']

Cómo traducir correos electrónicos


Traducir el contenido del correo electrónico es lo mismo que traducir cualquier otra cadena en su sitio. Para obtener información más detallada sobre este tema, visite nuestra página de documentación de Traducción de cadenas.

En resumen, asegúrese de que lo siguiente se aplique a todas las cadenas que se utilizan como contenido del correo electrónico (el asunto o el cuerpo del correo):


  • Si son cadenas estáticas, asegúrese de que estén localizadas con las funciones gettext _e() o __()).

  • Si se guardan en la tabla de opciones de WordPress y se recuperan mediante la función get_option(), también necesita «informar» a WPML de que son traducibles. Esto se hace usando el archivo de configuración de idioma.

Si se cumplen esas condiciones en su plugin o tema, los usuarios podrán traducirlas en la página WPML->Traducción de cadenas.

Ejemplo práctico


Para ver un ejemplo más práctico de la información presentada en esta página, visite nuestra entrada de blog sobre el uso de la integración de la API de correo de WPML con el plugin Sensei.

Escrito por Amir · Última actualización 18 de octubre de 2024