WPML

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

has_category() และแท็กเงื่อนไขอื่น ๆ บนโพสต์ที่แปลแล้ว

has_category() ของตัวหลัก WordPress ไม่ได้ถูกกรองโดย WPML อย่างจงใจ ในการแปล หมวดหมู่คือข้อความที่แปลแล้วซึ่งมี slug เป็นของตัวเอง ดังนั้น has_category('news') จึงเป็นเท็จในโพสต์ภาษาฝรั่งเศส แม้ว่าโพสต์ภาษาฝรั่งเศสจะอยู่ในหมวดหมู่ "news" ของภาษาฝรั่งเศสก็ตาม กรณีเดียวกันนี้ใช้กับ has_term(), in_category() และโค้ดใด ๆ ที่เปรียบเทียบ slug ของภาษาเริ่มต้นหรือ ID ของข้อความ คุณควรเรียกใช้เงื่อนไขด้วย slug ที่แปลแล้ว หรือแก้ไข ID ของข้อความผ่านฟิลเตอร์ wpml_object_id ก่อน

สิ่งที่คุณพบ

ฟังก์ชันดั้งเดิมของ WordPress has_category ไม่ทำงานสำหรับโพสต์ที่แปลแล้ว

ตัวอย่างของปัญหานี้มีดังนี้:

  1. เรามีหมวดหมู่ที่มี slug ภาษาอังกฤษ "test" และคำแปลภาษาฝรั่งเศส "test-fr"
  2. หมวดหมู่นี้ถูกกำหนดให้กับโพสต์
  3. เมื่อคุณเรียกใช้ has_category("test") ภายในลูปในไฟล์ single.php ของธีมของคุณ ระบบจะส่งคืนค่า true สำหรับภาษาเริ่มต้น แต่ส่งคืนค่า false สำหรับการแปล

สิ่งที่ต้องทำ

กำหนดฟิลเตอร์ใหม่ในไฟล์ functions.php ของธีมของคุณ:

function wp_has_category ($category) {
$category = get_term_by('name', $category, 'category');
return has_category($category);
}
add_filter('wp_has_category', 'wp_has_category', 10, 1);

แทนที่ฟังก์ชัน has_category ด้วยฟิลเตอร์ใหม่นี้:
apply_filters( 'wp_has_category', 'test' )

ฟิลเตอร์นี้จะนำหมวดหมู่ที่แปลแล้วซึ่งอิงตามชื่อของหมวดหมู่ต้นฉบับมาใช้ และตรวจสอบว่าหมวดหมู่ที่แปลแล้วถูกกำหนดให้กับโพสต์หรือไม่

ข้อมูลอ้างอิง: wpmlcore-3024

คำต่อท้ายวันที่ (1st, 2nd, 3rd) ไม่สามารถแปลได้

นี่คือข้อจำกัดของตัวหลัก WordPress ไม่ใช่ของ WPML เนื่องจากคำต่อท้ายมาจากการจัดรูปแบบวันที่ของ PHP และไม่เคยผ่านฟังก์ชันการแปล

สิ่งที่คุณพบ

ธีมหรือปลั๊กอินบางตัวใช้ฟังก์ชัน wp_date() หรือ date_i18n() ของ WordPress เพื่อแสดงวันที่ วันที่เหล่านี้อาจใช้คำต่อท้ายเช่น 1st หรือ 26th ขึ้นอยู่กับพารามิเตอร์ที่เลือก

ปัจจุบันยังไม่สามารถแปลคำต่อท้ายวันที่ได้เนื่องจากข้อจำกัดที่ทราบกันมานานใน ตัวหลัก WordPress

สิ่งที่ต้องทำ

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


  • เพิ่มฟิลเตอร์ wp_date เล็ก ๆ ลงในไฟล์ functions.php ของธีมของคุณ ซึ่งจะลงทะเบียนคำต่อท้ายแต่ละคำเป็นสตริงข้อความ (icl_register_string) และส่งคืนคำแปล (icl_t) แทนที่คำต่อท้ายภาษาอังกฤษ:

  • เปิดหน้าที่แสดงวันที่ การดำเนินการนี้จะเรียกใช้ฟิลเตอร์ที่เพิ่มเข้ามา

  • ไปที่ WPMLการแปลสตริง แล้วแปลวันที่

  • คุณจะต้องแปลคำต่อท้ายแต่ละคำแยกกัน (เช่น 1st, 2nd…) เนื่องจากอาจมีการเปลี่ยนแปลงขึ้นอยู่กับภาษา

ข้อมูลอ้างอิง: compsupp-5773

ตัวแก้ไขการแปลขั้นสูงไม่ได้สร้าง slug ขึ้นเอง

ตัวแก้ไขจะแปลฟิลด์ slug เมื่อคุณกรอกข้อมูลลงไป และจะเก็บ slug ต้นฉบับไว้เมื่อคุณปล่อยว่างไว้ ตัวแก้ไขจะไม่สร้าง slug จากชื่อที่แปลแล้วด้วยตัวเอง

สิ่งที่คุณพบ

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

ข้อมูลอ้างอิง: wpmlsupp-8574

shortcode ของปลั๊กอินสร้างหน้าเว็บในคำอธิบายแบบย่อของผลิตภัณฑ์ WooCommerce

คำอธิบายแบบย่อคือส่วนตัดทอนของโพสต์ ซึ่งเป็นฟิลด์ข้อความธรรมดาตามคำจำกัดความของ WordPress ดังนั้น WPML จึงไม่แยกวิเคราะห์ shortcode ของปลั๊กอินสร้างหน้าเว็บในส่วนนี้เหมือนที่ทำในเนื้อหา แต่บังเอิญว่า WooCommerce สามารถแสดงผล shortcode เหล่านี้ได้ ซึ่งเป็นเหตุผลที่ความไม่สอดคล้องกันนี้ทำให้หลายคนประหลาดใจ

สิ่งที่คุณพบ

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

แต่ WC จัดการ "ส่วนตัดทอน" เหล่านี้แตกต่างออกไปเล็กน้อย และ shortcode สามารถทำงานได้ แต่ WPML ยังคงทำงานราวกับว่า shortcode ไม่ทำงาน และหาก shortcode มีแอตทริบิวต์ที่ต้องแปลหรือลิงก์ภายในที่ควรได้รับการจัดการโดยอัตโนมัติ สิ่งนั้นก็ไม่สามารถทำได้อย่างง่ายดาย

สิ่งที่ต้องทำ

เราได้เตรียมโค้ดที่สามารถเพิ่มเป็นปลั๊กอินเพื่อให้มีฟังก์ชันนี้ คัดลอกและวางโค้ดด้านล่างลงในไฟล์ที่คุณอาจตั้งชื่อว่า wpmlpb-excerpts.php และบันทึกไว้ในไดเรกทอรี wp-content/plugins/ ของคุณ จากนั้นเปิดใช้งานปลั๊กอิน

<?php
/**
 * Plugin Name: WPML Page Builders - Proces Excerpts
 * Description: Parses shortcode strings in exceprts.
 * Version: 1.0
 */
namespace WPMLPB686;

( new Excerpts() )->add_hooks();

class Excerpts {

	const SEPARATOR_START = '<!--WPML_EXCERPT_START-->';
	const SEPARATOR_END   = '<!--WPML_EXCERPT_END-->';

	public function add_hooks() {
		add_filter( 'wpml_pb_shortcode_content_for_translation', [ $this, 'joinWithContent' ], 10, 2 );
		add_filter( 'wpml_tm_translation_job_data', [ $this, 'excludeFromJob' ], 10, 2 );
		add_action( 'wpml_pro_translation_completed', [ $this, 'splitFromContent' ], 999 );
	}

	public function joinWithContent( $content, $id ) {
		$post = get_post( $id );
		if ( $post && $post->post_excerpt ) {
			$content .= self::SEPARATOR_START . $post->post_excerpt . self::SEPARATOR_END;
		}

		return $content;
	}

	public function excludeFromJob( $package, $post ) {
		if ( preg_match( '/[[^]]+]/', $post->post_excerpt ) ) {
			$package['contents']['excerpt']['translate'] = 0;
			$package['contents']['excerpt']['data']      = '';
		}

		return $package;
	}

	public function splitFromContent( $post_id ) {
		$post = get_post( $post_id );
		if ( $post && false !== strpos( $post->post_content, self::SEPARATOR_START ) ) {
			$start_pos = strpos( $post->post_content, self::SEPARATOR_START );
			$end_pos   = strpos( $post->post_content, self::SEPARATOR_END, $start_pos );

			if ( false !== $end_pos ) {
				$content = substr( $post->post_content, 0, $start_pos );
				$excerpt = substr( $post->post_content, $start_pos + strlen( self::SEPARATOR_START ), $end_pos - $start_pos - strlen( self::SEPARATOR_START ) );

				if ( $excerpt ) {
					wp_update_post(
						[
							'ID'           => $post_id,
							'post_content' => $content,
							'post_excerpt' => $excerpt,
						]
					);
				}
			}
		}
	}
}

ข้อมูลอ้างอิง: wpmlpb-686

โดเมนที่แตกต่างกันในแต่ละภาษาบนโฮสติ้งของ WordPress.com

WordPress.com จะจับคู่หนึ่งโดเมนเข้ากับหนึ่งเว็บไซต์ รูปแบบ URL "โดเมนที่แตกต่างกันในแต่ละภาษา" จำเป็นต้องให้โดเมนของทุกภาษาเข้าถึง WordPress เดียวกัน ซึ่งโฮสติ้งดังกล่าวไม่ได้ให้บริการ

สิ่งที่คุณพบ

เนื่องจากข้อจำกัดเกี่ยวกับวิธีการทำงานของการจับคู่โดเมนกับ WordPress.com จึงไม่สามารถเลือกการตั้งค่า URL ภาษาเพื่อใช้โดเมนที่แตกต่างกันในแต่ละภาษาได้เมื่อเว็บไซต์โฮสต์อยู่กับผู้ให้บริการรายนี้

สิ่งที่ต้องทำ

คุณสามารถใช้ตัวเลือก URL ภาษาอื่น ๆ ได้ ไม่ว่าจะเป็นภาษาที่แตกต่างกันในไดเรกทอรีหรือเพิ่มชื่อภาษาเป็นพารามิเตอร์ URL แทนการใช้โดเมนที่แตกต่างกันในแต่ละภาษา

จำเป็นต้องใช้โฮสต์อื่นหากโดเมนที่แตกต่างกันในแต่ละภาษาเป็นข้อกำหนดที่ต้องมี

ข้อมูลอ้างอิง: wpmltriage-2045

คำแปลที่นำเข้าและตัวแก้ไขการแปล

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

สิ่งที่คุณพบ

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

นี่เป็นเพราะเมื่อคุณนำเข้าเนื้อหาหลายภาษา WPML จะไม่สร้างงานแปล ซึ่งจำเป็นสำหรับการแบ่งส่วนสตริงข้อความ

สิ่งที่ต้องทำ

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

ข้อมูลอ้างอิง: WPMLAI-168