WPML

ทำตามคำแนะนำทีละขั้นตอนของเราเพื่อทำให้ปลั๊กอินและธีมของคุณเข้ากันได้กับ WPML

คำแนะนำนี้มีไว้สำหรับผู้พัฒนาธีมและปลั๊กอินที่ได้เข้าร่วมโปรแกรมความเข้ากันได้ของเราแล้ว ซึ่งก็คือ Go Global หากคุณยังไม่ได้เข้าร่วม โปรดส่งใบสมัครของคุณก่อนที่จะทำตามคำแนะนำนี้

วิธีทำให้เข้ากันได้กับ WPML

1. สร้างไฟล์การกำหนดค่าภาษา

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

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

ทดสอบการตั้งค่า
1. สร้างโพสต์และอนุกรมวิธานสองสามรายการ
2. ส่งรายการเหล่านั้นเพื่อรับการแปล
3. ตรวจสอบว่ารายการเหล่านั้นปรากฏเป็นภาษาที่แปลแล้วบนส่วนหน้าเว็บไซต์

2. เตรียมสตริงสำหรับการแปล

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

ในขณะที่คุณกำหนดค่าสตริงของคุณ ให้ใช้ปลั๊กอิน Multilingual Tools เพื่อตรวจสอบว่าสตริงใดสามารถแปลได้ และสตริงใดจำเป็นต้องมีการกำหนดค่าเพิ่มเติม

สตริงที่ฮาร์ดโค้ดไว้

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

สตริงใน wp_options

หากปลั๊กอินหรือธีมของคุณใช้สตริงจากตาราง wp_options ให้ลงทะเบียนสตริงเหล่านั้นในไฟล์ wpml-config.xml

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

สตริงแบบไดนามิก

หากวิธีการก่อนหน้านี้ไม่สามารถใช้กับสตริงของคุณได้ ให้ทำตามคำแนะนำเหล่านี้เพื่อเตรียมสตริงสำหรับการแปล:

ทดสอบการตั้งค่า
1. สแกนปลั๊กอิน / ธีมของคุณเพื่อค้นหาสตริงใน WPMLการแปลธีมและปลั๊กอิน 
2. สร้างหน้าที่มีสตริง
3. ตรวจสอบว่าสตริงปรากฏในการแปลสตริงหรือไม่
4. แปลสตริงสองสามรายการและตรวจสอบว่าปรากฏเป็นภาษาที่แปลแล้วบนส่วนหน้าเว็บไซต์

3. ลงทะเบียนวิดเจ็ตและบล็อกที่กำหนดเองสำหรับการแปล

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

ดูคำแนะนำต่อไปนี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการลงทะเบียนเนื้อหาของปลั๊กอินสร้างหน้าเว็บ:

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

4. ดึง ID จากภาษาต่าง ๆ โดยอัตโนมัติ

หากธีมหรือปลั๊กอินของคุณมีฟีเจอร์หรือตัวเลือกที่โหลด ID โพสต์ที่แตกต่างกันในแต่ละภาษา ให้ใช้ฟิลเตอร์ wpml_object_id เพื่อดึง ID โพสต์ที่แปลแล้วโดยอัตโนมัติ

ตัวอย่างเช่น ลองพิจารณาสไลเดอร์ที่มีสไลด์ในภาษาต่าง ๆ ซึ่งแต่ละสไลด์มี ID ที่ไม่ซ้ำกัน หากต้องการโหลด ID สไลด์ที่ถูกต้องในแต่ละภาษาโดยอัตโนมัติ เราสามารถใช้ฟิลเตอร์ wpml_object_id ได้:

// Loop posts
while (have_posts()): the_post();
$post = get_post( apply_filters( 'wpml_object_id', $post->ID, 'slide' ) );

ทดสอบการตั้งค่า
1. สร้างโพสต์ / เทมเพลต ฯลฯ ที่เกี่ยวข้อง และเพิ่มสตริงข้อความ
2. ตั้งค่าฟีเจอร์ของคุณให้ใช้โพสต์นั้น
3. แปลโพสต์และตั้งค่าที่แตกต่างกันในสตริงข้อความ
4. ตรวจสอบว่าฟีเจอร์โหลด ID ที่แปลแล้วบนส่วนหน้าเว็บไซต์

5. ทำให้เข้ากันได้กับ WooCommerce

WPML สามารถแปลเนื้อหา WooCommerce ได้ด้วยส่วนเสริม WPML Multilingual & Multicurrency for WooCommerce หากธีมหรือปลั๊กอินของคุณมีองค์ประกอบของ WooCommerce ให้ทำตามคู่มือความเข้ากันได้ของ WPML Multilingual & Multicurrency for WooCommerce ของเราเพื่อทำให้เข้ากันได้กับ WPML

6. แสดงหรือซ่อนตัวสลับภาษาของผู้ดูแลระบบ

ตามค่าเริ่มต้น WPML จะเพิ่มตัวสลับภาษาลงในแถบผู้ดูแลระบบของ WordPress ตัวสลับภาษานี้จะมองเห็นได้สำหรับผู้ใช้ที่เข้าสู่ระบบ ทั้งบนส่วนหน้าเว็บไซต์และส่วนหลังเว็บไซต์

ตัวสลับภาษาในแถบผู้ดูแลระบบด้านบน
ตัวสลับภาษาในแถบผู้ดูแลระบบด้านบน

ในบางกรณี คุณอาจต้องการซ่อนตัวสลับภาษาบนหน้าที่ละเอียดอ่อน เช่น พื้นที่การตั้งค่าของคุณ ในการดำเนินการนี้ ให้เพิ่มโค้ดต่อไปนี้ลงในไฟล์ functions.php ของคุณ:

//Make sure to rename the function before adding to your plugin
add_filter( 'wpml_show_admin_language_switcher', 'compsupp_disable_wpml_admin_lang_switcher' );
 
function compsupp_disable_wpml_admin_lang_switcher( $state ) {
    global $pagenow;
 
    // Add the admin pages that we need to hide the language switcher
    $admin_pages_to_hide_ls = array(
        'admin-page-slug', 'another-admin-page-slug', 'one-more-admin-page-slug'
    );
 
    // We can also have a filter here in case we need to add/remove pages later
    $admin_pages_to_hide_ls = apply_filters( 'compsupp_filter_disable_wpml_lang_switcher_in_admin', $admin_pages_to_hide_ls);
     
    if (
        $pagenow == 'admin.php'
        && isset( $_GET['page'] )
        && in_array( $_GET['page'], $admin_pages_to_hide_ls)
    ) {
        $state = false;
    }
    return $state;
}

การทำให้ฟีเจอร์พิเศษเข้ากันได้

หากธีมหรือปลั๊กอินของคุณมีฟีเจอร์พิเศษ (เช่น การใช้ตารางที่กำหนดเอง) คุณจะต้องใช้โค้ดที่กำหนดเองเพื่อทำให้เข้ากันได้กับ WPML

ดูแหล่งข้อมูลสำหรับนักพัฒนาของเราสำหรับข้อมูลเกี่ยวกับการพัฒนาที่กำหนดเอง

ปัญหาที่พบบ่อยและวิธีแก้ปัญหา

ป้ายกำกับฟอร์มไม่สามารถแปลได้เนื่องจากมาจากฐานข้อมูล

วิธีแก้ปัญหา:

$label = esc_html( apply_filters('wpml_translate_single_string', $this->checkout_item->name, 'wpsc', '$this->checkout_item->name .'_checkout_form_label'' ) );
wp_query($args) หรือ get_posts($args) ไม่กรอง ID โพสต์ที่ถูกต้องสำหรับภาษาปัจจุบัน

วิธีแก้ปัญหา:

หากคุณใช้ wp_query($args) หรือ get_posts($args) คุณต้องเพิ่ม "suppress_filters=0" ลงในอาร์กิวเมนต์

สไลด์ทั้งหมดแสดงในภาษาเดียว

วิธีแก้ปัญหา:

// Unset not translated slides
foreach( $slides as $k => $slide ) {
	$check = apply_filters( 'wpml_post_language_details', NULL, $slide->ID )
	$slide_language_code = substr( $check['locale'], 0, 2 );

	if( $check['different_language'] ) {
		unset( $slides[$k] );
	}
}
ID สไลด์แตกต่างกันในภาษาที่สอง

วิธีแก้ปัญหา:

// Loop posts
while (have_posts()): the_post();
$post = get_post( apply_filters( 'wpml_object_id', $post->ID, 'slide' ) );
สไลเดอร์ใช้หน้าผู้ดูแลระบบที่กำหนดเองและฉันจำเป็นต้องลงทะเบียนค่าฟิลด์ที่กำหนดเองเพื่อรับการแปล

วิธีแก้ปัญหา:

// Adding a new slide code
$slide_id = $this->slide->ID;
$url = $fields['url'];

// Register slide URL to translations
do_action( 'wpml_register_single_string', 'Slider', 'Slide_ID_' . $this->slide->ID, $url);

$this->add_or_update_or_delete_meta($this->slide->ID, 'url', $url);
ID อนุกรมวิธานที่กำหนดเองแตกต่างกันในภาษาที่สอง

วิธีแก้ปัญหา:

$taxonomy_id = apply_filters( 'wpml_object_id', $taxonomy_id, 'my_custom_taxonomy' );
คำขอ AJAX ที่กำหนดเอง (ไม่ใช่มาตรฐานของ WordPress) จะส่งคืนเนื้อหาในภาษาเริ่มต้นเสมอ

วิธีแก้ปัญหา:

เมื่อสร้าง URL ของ AJAX ที่กำหนดเอง ให้ใช้ฮุก wpml_current_language และเพิ่มภาษาปัจจุบันเป็นพารามิเตอร์สำหรับ URL ของ AJAX

$ajax_url = 'http://my-site.com/wp-content/plugins/my-plugin/handle-ajax.php';
$my_current_lang = apply_filters( 'wpml_current_language', NULL ); 
if ( $my_current_lang ) {
	$ajax_url = add_query_arg( 'wpml_lang', $my_current_lang, $ajax_url );
	// $ajax_url will be something like 'http://my-site.com/wp-content/plugins/my-plugin/handle-ajax.php?wpml_lang=es'
}

เมื่อจัดการกับคำขอ AJAX ที่ไฟล์ handle-ajax.php ก่อนที่จะสร้างผลลัพธ์ของเนื้อหา ให้ใช้ฮุก wpml_switch_language เพื่อสลับภาษาของเนื้อหา ปิดขอบเขตภาษาเมื่อคุณทำเสร็จแล้ว ตั้งแต่ WPML 5.0 การสลับภาษาจะซ้อนทับกัน ดังนั้นทุกการสลับจึงจำเป็นต้องมีการกู้คืนของตัวเอง

if ( ! empty( $_GET[ 'wpml_lang' ] ) ) {
    // Opens a language scope. Only a non-empty language code switches the language.
    do_action( 'wpml_switch_language', sanitize_text_field( $_GET[ 'wpml_lang' ] ) );

    try {
        // Run other content queries.
    } finally {
        // Closes the scope that the call above opened.
        do_action( 'wpml_switch_language', null );
    }
}
การใช้ค่า "id" ผิดในอาร์กิวเมนต์ WP_Query $args[ 'tax_query' ][ 'field' ]

วิธีแก้ปัญหา:

การใช้อาร์กิวเมนต์ "id" สำหรับพารามิเตอร์ "field" จะใช้ได้กับภาษาเริ่มต้น แต่จะใช้ไม่ได้กับภาษาที่สอง ต่อไปนี้คือตัวอย่างของคิวรีที่ไม่ถูกต้อง:

$args = array(
    'post_type' => 'post',
    'tax_query' => array(
        array(
            'taxonomy' => 'people',
            'field'    => 'id',
            'terms'    => 'bob',
        ),
    ),
);
$query = new WP_Query( $args );

นักพัฒนาควรแก้ไขพารามิเตอร์ "field"

'field'    => 'id',

เป็น:

'field'    => 'term_id',

อ้างอิง: https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters (เปิดในแท็บใหม่) ไม่มีค่า "id" สำหรับพารามิเตอร์ "field" ค่าเริ่มต้นของพารามิเตอร์นี้คือ "term_id"

เขียนโดยAmir