WPML

Làm theo hướng dẫn từng bước của chúng tôi để làm cho plugin và giao diện của bạn tương thích với WPML.

Hướng dẫn này dành cho các nhà phát triển giao diện và plugin đã tham gia chương trình tương thích của chúng tôi – Go Global. Nếu bạn chưa tham gia, vui lòng gửi đơn đăng ký của bạn trước khi làm theo hướng dẫn này.

Cách trở nên tương thích với WPML

1. Tạo tệp cấu hình ngôn ngữ

Tệp cấu hình ngôn ngữ cho WPML biết văn bản nào cần dịch (và văn bản nào không) trong plugin hoặc giao diện của bạn. Điều này bao gồm các văn bản trong các loại nội dung tùy chỉnh, phân loại, trường, màn hình quản trị, widget và nhiều nội dung khác.

Nếu bạn đã biết cách tạo tệp cấu hình ngôn ngữ, hãy làm theo các hướng dẫn bên dưới để kiểm tra thiết lập của bạn. Nếu không, hãy xem hướng dẫn cấu hình ngôn ngữ của chúng tôi để tìm hiểu cách tạo một tệp.

Kiểm tra thiết lập
1. Tạo một vài bài viết và phân loại
2. Gửi chúng để dịch
3. Xác minh chúng hiển thị bản dịch trên giao diện người dùng

2. Chuẩn bị các chuỗi văn bản để dịch

Chuỗi văn bản là bất kỳ văn bản nào xuất hiện trên trang web và không thuộc về bài viết, trang hoặc phân loại. Để WPML có thể dịch các chuỗi văn bản trong plugin hoặc giao diện của bạn, hãy làm theo các hướng dẫn bên dưới cho từng trường hợp sử dụng.

Khi bạn cấu hình các chuỗi văn bản của mình, hãy sử dụng plugin Multilingual Tools để xác minh chuỗi văn bản nào có thể dịch được và chuỗi nào cần cấu hình thêm.

Các chuỗi văn bản được mã hóa cứng

Các chuỗi văn bản được mã hóa cứng cần được đăng ký bằng các hàm gettext. Tìm hiểu thêm về cách sử dụng gettext và chuẩn bị mã của bạn.

Các chuỗi văn bản trong wp_options

Nếu plugin hoặc giao diện của bạn sử dụng các chuỗi văn bản từ bảng wp_options , hãy đăng ký chúng trong tệp wpml-config.xml.

Nếu các khóa tùy chọn của bạn không cố định và giao diện của bạn sử dụng một mảng các mục nhập có thể tăng lên theo thông tin đầu vào của người dùng, hãy đăng ký các mục nhập này một cách linh hoạt. Bạn có thể sử dụng các hàm API của WPML để làm việc này.

Các chuỗi văn bản động

Nếu không có phương pháp nào ở trên áp dụng cho các chuỗi văn bản của bạn, hãy làm theo các hướng dẫn sau để chuẩn bị cho các chuỗi văn bản để dịch:

Kiểm tra thiết lập
1. Quét plugin / giao diện của bạn để tìm các chuỗi văn bản trong WPMLBản địa hóa giao diện và plugin 
2. Tạo một trang có chứa các chuỗi văn bản
3. Kiểm tra xem các chuỗi văn bản có xuất hiện trong Dịch chuỗi hay không
4. Dịch một vài chuỗi văn bản và xác minh chúng hiển thị bản dịch trên giao diện người dùng

3. Đăng ký các widget và khối tùy chỉnh để dịch

Nếu giao diện hoặc plugin của bạn bao gồm các widget tùy chỉnh cho các trình tạo trang, như Elementor, bạn cần đăng ký chúng để dịch.

Xem các hướng dẫn sau để tìm hiểu thêm về cách đăng ký nội dung của trình tạo trang:

Kiểm tra thiết lập
1. Tạo một trang với tất cả các widget tùy chỉnh của bạn
2. Gửi trang để dịch và xác minh các văn bản của widget xuất hiện trong Trình biên tập dịch thuật nâng cao
3. Kiểm tra xem các bản dịch có hiển thị trên giao diện người dùng hay không
4. Lặp lại các bước để kiểm tra các cài đặt widget khác nhau

4. Tự động lấy ID từ các ngôn ngữ khác nhau

Nếu giao diện hoặc plugin của bạn có các tính năng hoặc tùy chọn tải các ID bài viết khác nhau trong mỗi ngôn ngữ, hãy sử dụng bộ lọc wpml_object_id để tự động lấy ID bài viết đã dịch.

Ví dụ: xem xét một slider với các slide bằng các ngôn ngữ khác nhau, mỗi slide có một ID duy nhất. Để tự động tải đúng ID slide trong mỗi ngôn ngữ, chúng ta có thể sử dụng bộ lọc wpml_object_id :

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

Kiểm tra thiết lập
1. Tạo bài viết / template liên quan, v.v. và thêm một chuỗi văn bản
2. Thiết lập tính năng của bạn để sử dụng bài viết đó
3. Dịch bài viết và đặt một giá trị khác trong chuỗi văn bản
4. Kiểm tra xem tính năng có đang tải ID đã dịch trên giao diện người dùng hay không

5. Trở nên tương thích với WooCommerce

WPML có thể dịch nội dung WooCommerce bằng tiện ích bổ sung WPML Multilingual & Multicurrency for WooCommerce của nó. Nếu giao diện hoặc plugin của bạn chứa các thành phần WooCommerce, hãy làm theo hướng dẫn tương thích WPML Multilingual & Multicurrency for WooCommerce của chúng tôi để làm cho nó tương thích với WPML.

6. Hiển thị hoặc ẩn bộ chuyển đổi ngôn ngữ quản trị

Theo mặc định, WPML thêm một bộ chuyển đổi ngôn ngữ vào thanh quản trị WordPress. Bộ chuyển đổi này hiển thị cho những người dùng đã đăng nhập, trên cả giao diện người dùng và trang quản trị.

Bộ chuyển đổi ngôn ngữ trên thanh quản trị trên cùng
Bộ chuyển đổi ngôn ngữ trên thanh quản trị trên cùng

Trong một số trường hợp, bạn có thể muốn ẩn bộ chuyển đổi ngôn ngữ trên các trang nhạy cảm, như khu vực cài đặt của bạn. Để làm điều này, hãy thêm mã sau vào tệp functions.php của bạn:

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

Làm cho các tính năng đặc biệt tương thích

Nếu giao diện hoặc plugin của bạn bao gồm các tính năng đặc biệt (như sử dụng các bảng tùy chỉnh), bạn sẽ cần sử dụng mã tùy chỉnh để làm cho chúng tương thích với WPML.

Xem tài nguyên dành cho nhà phát triển của chúng tôi để biết thông tin về phát triển tùy chỉnh.

Các vấn đề thường gặp & Giải pháp

Không thể dịch các nhãn biểu mẫu vì chúng đến từ cơ sở dữ liệu

Giải pháp:

$label = esc_html( apply_filters('wpml_translate_single_string', $this->checkout_item->name, 'wpsc', '$this->checkout_item->name .'_checkout_form_label'' ) );
wp_query($args) hoặc get_posts($args) không lọc đúng ID bài viết cho ngôn ngữ hiện tại

Giải pháp:

Nếu bạn sử dụng wp_query($args) hoặc get_posts($args), bạn cần thêm “suppress_filters=0” vào các đối số.

Tất cả các slide được hiển thị bằng một ngôn ngữ

Giải pháp:

// 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 slide khác nhau trong ngôn ngữ thứ hai

Giải pháp:

// Loop posts
while (have_posts()): the_post();
$post = get_post( apply_filters( 'wpml_object_id', $post->ID, 'slide' ) );
Slider đang sử dụng một trang quản trị tùy chỉnh và tôi cần đăng ký các giá trị trường tùy chỉnh cho các bản dịch

Giải pháp:

// 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 phân loại tùy chỉnh khác nhau trong ngôn ngữ thứ hai

Giải pháp:

$taxonomy_id = apply_filters( 'wpml_object_id', $taxonomy_id, 'my_custom_taxonomy' );
Các yêu cầu AJAX tùy chỉnh (không theo tiêu chuẩn WordPress) luôn trả về nội dung bằng ngôn ngữ mặc định

Giải pháp:

Khi xây dựng các URL AJAX tùy chỉnh, hãy sử dụng hook wpml_current_language và thêm ngôn ngữ hiện tại làm tham số cho các 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'
}

Khi xử lý các yêu cầu AJAX tại tệp handle-ajax.php, trước khi tạo đầu ra nội dung, hãy sử dụng hook wpml_switch_language để chuyển đổi ngôn ngữ nội dung. Đóng phạm vi ngôn ngữ khi bạn hoàn thành. Kể từ WPML 5.0, các chuyển đổi ngôn ngữ được lồng vào nhau, vì vậy mỗi lần chuyển đổi cần có thao tác khôi phục riêng.

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 );
    }
}
Sử dụng sai giá trị “id” trong (các) đối số WP_Query $args[ ‘tax_query’ ][ ‘field’ ]

Giải pháp:

Việc sử dụng đối số “id” cho tham số “field” hoạt động đối với ngôn ngữ mặc định nhưng nó không hoạt động đối với ngôn ngữ thứ hai. Dưới đây là ví dụ về một truy vấn không chính xác:

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

Các nhà phát triển nên sửa lại tham số “field”.

'field'    => 'id',

thành:

'field'    => 'term_id',

Tham khảo: https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters (mở trong tab mới). Không có giá trị “id” cho tham số “field”. Giá trị mặc định của nó là “term_id”.

Được viết bởiAmir