บางสิ่งทำงานแตกต่างออกไปบนเว็บไซต์หลายภาษาตามที่ออกแบบไว้ เช่น ฟังก์ชัน 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 ไม่ทำงานสำหรับโพสต์ที่แปลแล้ว
ตัวอย่างของปัญหานี้มีดังนี้:
- เรามีหมวดหมู่ที่มี slug ภาษาอังกฤษ "test" และคำแปลภาษาฝรั่งเศส "test-fr"
- หมวดหมู่นี้ถูกกำหนดให้กับโพสต์
- เมื่อคุณเรียกใช้
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