WPML

การส่งอีเมลไปยังผู้ใช้เว็บไซต์ในภาษาที่พวกเขาต้องการนั้นเป็นสิ่งสำคัญ สำหรับจุดประสงค์นี้ WPML นำเสนอ API เพื่อจัดเก็บภาษาที่ผู้ใช้ต้องการในขณะที่ใช้งานเว็บไซต์ จากนั้นจึงนำการตั้งค่านี้ไปใช้เมื่อส่งอีเมลถึงพวกเขา

เอกสารนี้อธิบายให้ผู้พัฒนาปลั๊กอินและธีมทราบถึงวิธีผสานรวมผลิตภัณฑ์ของตนเข้ากับฟังก์ชัน wp_mail() มาตรฐานของ WordPress ในบริบทของภาษาที่ต้องการ

คุณจำเป็นต้องส่งอีเมลที่แปลตามผู้ใช้แต่ละรายเมื่อใด


ต่อไปนี้คือตัวอย่างที่แสดงให้เห็นถึงกรณีทั่วไปบางประการที่คุณจำเป็นต้องส่งอีเมลในภาษาที่ผู้ใช้ต้องการ:

  • คุณเป็นผู้ดูแลเว็บไซต์ที่ส่งจดหมายข่าวไปยังสมาชิก: ผู้ดูแลเว็บไซต์เป็นชาวฝรั่งเศสและเขาแสดงอินเทอร์เฟซจดหมายข่าวในภาษาฝรั่งเศส ผลลัพธ์: อีเมลทั้งหมดจะถูกส่งเป็นภาษาฝรั่งเศส เนื่องจากสมาชิกของคุณมาจากทั่วทุกมุมโลก หลายคนจะไม่เข้าใจอีเมลฉบับนี้

  • คุณกำลังใช้งานเว็บไซต์เครือข่ายสังคม: สมาชิกของเว็บไซต์นี้สามารถเผยแพร่รูปภาพของตนได้ สมาชิกคนอื่น ๆ สามารถกดถูกใจและให้ดาวรูปภาพเหล่านั้น เมื่อพวกเขากดถูกใจ ผู้เขียนรูปภาพจะได้รับแจ้งทางอีเมล ทีนี้ลองพิจารณาสถานการณ์นี้:

    1. Mathias ซึ่งเป็นชาวเยอรมัน ได้เผยแพร่รูปภาพของเขา

    2. Pierre เพื่อนของเขาซึ่งเป็นชาวฝรั่งเศส บังเอิญเห็นรูปภาพของ Mathias และคลิกปุ่ม Like

    3. เนื่องจากในระหว่างการดำเนินการนี้ Pierre แสดงหน้าเว็บเป็นภาษาฝรั่งเศส Mathias จะได้รับการแจ้งเตือนทางอีเมลเป็นภาษาฝรั่งเศส

  • คุณกำลังใช้งานเว็บไซต์อีคอมเมิร์ซ: หากสินค้าบางรายการไม่พร้อมจำหน่ายชั่วคราว ผู้ใช้สามารถทิ้งอีเมลไว้เพื่อรับแจ้งเมื่อสินค้ากลับมามีในสต็อกอีกครั้ง ผู้เยี่ยมชมชาวญี่ปุ่นทิ้งอีเมลไว้ใต้สินค้าบางรายการ จากนั้นผู้ดูแลเว็บไซต์ซึ่งเป็นชาวสเปนจะอัปเดตความพร้อมจำหน่ายสินค้า ผลลัพธ์: ลูกค้าชาวญี่ปุ่นจะได้รับอีเมลอัตโนมัติ "Product x is available again" เป็นภาษาสเปน ไม่ใช่ภาษาญี่ปุ่น

มีตัวอย่างที่คล้ายกันอีกมากมาย และคุณคือบุคคลที่เหมาะสมที่สุดที่จะรู้ว่าสิ่งนี้จะก่อให้เกิดปัญหากับปลั๊กอินหรือธีมของคุณหรือไม่

ในกรณีทั้งหมดนี้ เราจำเป็นต้องจัดเก็บภาษาที่ผู้รับต้องการด้วยวิธีใดวิธีหนึ่ง จากนั้นจึงสลับไปใช้ภาษานี้ชั่วคราวในขณะที่ส่งอีเมล

การครอบฟังก์ชัน wp_mail() ด้วยโค้ดเฉพาะของ WPML


เมื่อคุณส่งอีเมล คุณต้องเพิ่มขั้นตอนเพิ่มเติมสามขั้นตอนลงในโค้ดปลั๊กอินหรือธีมของคุณ:

  1. สลับบริบทภาษาไปยังภาษาที่ผู้รับอีเมลต้องการ

  2. จากนั้นเรียกใช้โค้ดทั้งหมดของคุณเพื่อส่งอีเมลจริง

  3. สลับภาษากลับไปเป็นภาษาของเว็บไซต์

ขั้นตอนที่สองน่าจะพร้อมแล้วในขั้นตอนนี้ สิ่งเดียวที่ต้องทำคือเพิ่มบรรทัดเพิ่มเติมสองบรรทัดเฉพาะสำหรับ WPML – คุณต้องเพิ่มเฉพาะบรรทัดที่เป็นตัวหนาเท่านั้น
$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');

อย่างที่คุณเห็น การเปลี่ยนแปลงมีเพียงเล็กน้อย แต่คุณต้องจำประเด็นสำคัญสองประการต่อไปนี้

1. สลับภาษาก่อนที่จะดึงเนื้อหาอีเมลแรกสุด


โปรดจำไว้ว่าคุณกำลังสลับภาษาเพื่อแปลเนื้อหาอีเมล นี่คือเหตุผลที่คุณต้องจำไว้ว่าต้องตั้งค่าภาษาที่ถูกต้องก่อนที่คุณจะดึงเนื้อหาอีเมลใด ๆ ไม่ว่าจะเป็นหัวเรื่องหรือเนื้อหาข้อความ

โค้ดต่อไปนี้จะไม่ทำงาน:

$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');

คุณควรใช้โค้ดนี้แทน:

$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. อย่าส่งอีเมลไปยังอาร์เรย์ของผู้รับ


ฟังก์ชัน wp_mail() อนุญาตให้ส่ง $email เป็นอาร์เรย์พารามิเตอร์ของอีเมลได้ น่าเสียดายที่สิ่งนี้เป็นข้อห้ามหากคุณต้องการทำให้เนื้อหาอีเมลสามารถแปลได้

ดังนั้นหากคุณมีโค้ดที่ไม่ทำงาน เช่นนี้:

$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');

คุณควรเขียนใหม่เป็น:

$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;

จัดเก็บภาษาของผู้รับ

ข้อมูลภาษาสำหรับผู้ใช้ WP


หากผู้รับของคุณลงทะเบียนเป็นผู้ใช้ WordPress มาตรฐาน คุณไม่จำเป็นต้องบันทึกข้อมูลภาษาและสร้างฮุก คุณสามารถแจ้งให้ผู้ใช้ของคุณทราบว่าพวกเขาสามารถตั้งค่าภาษาที่ต้องการได้ในหน้าจัดการเว็บไซต์ WordPress ภายใต้ โปรไฟล์->โปรไฟล์ของคุณ

ข้อมูลนี้ถูกจัดเก็บไว้ในฟิลด์ meta ของผู้ใช้ทั่วไป ดังนั้นหากคุณต้องการดึงข้อมูลด้วยเหตุผลบางประการ คุณสามารถใช้ข้อมูลโค้ดที่มีประโยชน์นี้ได้:

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

เมื่อผู้รับไม่ใช่ผู้ใช้ WP ทั่วไป


ทุกครั้งที่ปลั๊กอินหรือธีมของคุณลงทะเบียนที่อยู่อีเมล คุณควรบันทึกภาษาที่ผู้รับต้องการด้วย คุณไม่จำเป็นต้องมีสถานที่หรือประเภทข้อมูลพิเศษสำหรับสิ่งนี้ สิ่งเดียวที่คุณต้องทำคือเพิ่มตัวกรองซึ่งจะส่งคืนข้อมูลภาษา ชื่อของตัวกรองคือ wpml_user_language

ตัวอย่างโค้ดที่คุณต้องนำไปใช้มีลักษณะดังนี้:

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
}

วิดเจ็ตภาษา


หากคุณมีอินเทอร์เฟซผู้ใช้ส่วนหน้าเว็บไซต์พร้อมแผงการกำหนดค่าสำหรับสมาชิกของคุณ คุณสามารถสอบถามภาษาของพวกเขาได้ด้วยแอ็กชันฮุกต่อไปนี้:
do_action('wpml_user_language_switcher', array('mail'=>'mail@example.com') );

โปรดทราบว่าคุณต้องแทนที่ mail@example.com ด้วยอีเมลจริงของสมาชิกปัจจุบัน

โค้ดนี้จะแสดงกล่องตัวเลือกพร้อมภาษาที่ใช้งานได้ เมื่อสมาชิกเลือกภาษาใดภาษาหนึ่ง ค่านี้จะถูกส่งผ่านการเรียก AJAX ไปยังเซิร์ฟเวอร์

จากนั้น คุณต้องบันทึกข้อมูลนี้ในตารางฐานข้อมูลของคุณ ในการทำเช่นนี้ ให้เพิ่มฮุกสำหรับตัวกรอง wpml_user_language_switcher_save ดังนี้:

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

หากตัวกรองของคุณไม่ส่งคืนค่าเป็น true หรือคุณไม่มีตัวกรองสำหรับสิ่งนั้นเลย WPML จะพยายามบันทึกข้อมูลภาษาในตาราง meta ของผู้ใช้ (ดูบทถัดไป)

การส่งอีเมลไปยังที่อยู่ที่ไม่ได้จัดเก็บไว้


ในบางครั้งคุณจำเป็นต้องส่งอีเมลไปยังที่อยู่ที่ไม่ได้อยู่ในตารางฐานข้อมูลใด ๆ เนื่องจากผู้รับไม่ได้อยู่ในฐานข้อมูลของคุณ คุณจึงไม่ได้จัดเก็บการตั้งค่าภาษาของผู้รับไว้ด้วยเช่นกัน

สำหรับกรณีเหล่านั้น WPML คาดหวังว่ารหัสภาษาจะพร้อมใช้งานในหนึ่งในสามตัวแปรโกลบอลเหล่านี้:


  • $_POST['wpml_user_email_language']

  • $_GET['wpml_user_email_language']

  • $GLOBALS['wpml_user_email_language']

วิธีแปลอีเมล


การแปลเนื้อหาอีเมลนั้นเหมือนกับการแปลสตริงอื่น ๆ ในเว็บไซต์ของคุณ สำหรับข้อมูลโดยละเอียดเพิ่มเติมเกี่ยวกับหัวข้อนี้ โปรดไปที่หน้าเอกสารประกอบการแปลสตริงของเรา

กล่าวโดยย่อคือ ตรวจสอบให้แน่ใจว่าได้นำสิ่งต่อไปนี้ไปใช้กับสตริงทั้งหมดที่ใช้เป็นเนื้อหาอีเมล (หัวเรื่องหรือเนื้อหาจดหมาย):


  • หากเป็นสตริงแบบคงที่ ตรวจสอบให้แน่ใจว่าได้รับการแปลเป็นภาษาท้องถิ่นด้วยฟังก์ชัน gettext ได้แก่ _e() หรือ __())

  • หากบันทึกไว้ในตารางตัวเลือกของ WordPress และดึงข้อมูลโดยใช้ฟังก์ชัน get_option() คุณต้อง "แจ้ง" ให้ WPML ทราบว่าสามารถแปลได้เช่นกัน ซึ่งทำได้โดยใช้ไฟล์การกำหนดค่าภาษา

หากตรงตามเงื่อนไขเหล่านั้นในปลั๊กอินหรือธีมของคุณ ผู้ใช้จะสามารถแปลสตริงเหล่านั้นได้ในหน้า WPML->การแปลสตริง

ตัวอย่างในทางปฏิบัติ


หากต้องการดูตัวอย่างในทางปฏิบัติเพิ่มเติมของข้อมูลที่นำเสนอในหน้านี้ โปรดไปที่โพสต์บล็อกของเราเกี่ยวกับการใช้การผสานรวม WPML Mail API กับปลั๊กอิน Sensei

เขียนโดย Amir · อัปเดตล่าสุด 18 ตุลาคม 2024