ユーザーがWPMLを使用してコンテンツを簡単に翻訳できるように、プラグインやテーマの文字列パッケージを作成する方法を学びます。
文字列パッケージとは、特定のコンテキストで「バンドル」された文字列のグループです。その目的は、各文字列を個別に翻訳する手間を省き、エンドユーザーがより効率的にコンテンツを翻訳できるようにすることです。
たとえば、文字列パッケージがある場合とない場合で、ユーザーがカスタムユーザーフィールドを翻訳する方法は次のようになります。
文字列パッケージがない場合

ユーザーは自動翻訳のオプションを使用できず、文字列を1つずつ翻訳する必要があります。
文字列パッケージがある場合

ユーザーは自動翻訳のオプションを使用して、複数の文字列を一度にまとめて翻訳できます。
ご覧のように、文字列パッケージを使用すると、ユーザーが複数のカスタムユーザーフィールドを一度に翻訳できるようになり、翻訳プロセスが簡素化されます。ユーザーに最適な翻訳エクスペリエンスを提供するには、以下の手順に従って独自の文字列パッケージを作成してください。
以下の手順で説明する文字列パッケージの完全な実装を確認したい場合は、使用したテストプラグインが含まれるこのGitHubリポジトリを確認してください。
1. 翻訳可能なコンテンツの特定
最初のステップは、タイトル、ラベル、ユーザー生成コンテンツなど、ユーザーが翻訳したいと思うコンテンツを特定することです。
2. パッケージの種類の宣言
次に、パッケージの種類(kind)を宣言する必要があります。このステップにより、WPMLはアクティブなプラグインに接続されている文字列パッケージを検出し、それらのパッケージのみを翻訳できるようになります。
比較として、このフィルターは文字列パッケージに対して、register_post_typesフィルターが投稿タイプに対して機能するのと同じように機能します。
パッケージの種類を宣言するには、wpml_active_string_package_kindsフィルターを使用します。
define( 'FOO_USER_FIELD_PACKAGE_KIND_TITLE', 'OTGS Foo User Fields' );
define( 'FOO_USER_FIELD_PACKAGE_KIND_TITLE', 'otgs-foo-user-fields' );
add_filter( 'wpml_active_string_package_kinds', function( $kinds ) {
$kinds[ FOO_USER_FIELD_PACKAGE_KIND_TITLE ] = [
'title' => FOO_USER_FIELD_PACKAGE_KIND_TITLE,
'slug' => FOO_USER_FIELD_PACKAGE_KIND_TITLE,
'plural' => FOO_USER_FIELD_PACKAGE_KIND_TITLE,
];
return $kinds;
} );
引数の定義
title – 種類のタイトル。パッケージのkindと同じである必要があります。plural – タイトルの複数形。slug – 種類のスラッグ。パッケージのkind_slugと同じである必要があります。
3. パッケージの作成と文字列の登録
次に、パッケージを作成し、wpml_register_stringフックを使用してグループ化する文字列を登録する必要があります。
$userId = 123;
$user = get_user_by( 'id', $userId );
$package = [
'kind' => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".
'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace" slug.
'name' => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.
'title' => $user->display_name, // The title for the package entity inside the "kind" namespace.
];
$fooUserFields = get_option( 'otgs_foo_user_fields' );
foreach ( $fooUserFields as $fooUserField ) {
$fieldValue = get_user_meta( $userId, $fooUserField, true );
do_action( 'wpml_register_string', $fieldValue, sanitize_key( $fooUserField ), $package, $fooUserField, 'LINE' );
}
引数の定義
$kind – エンティティの名前空間ラベル(例: Gravity Form)。$kind_slug – エンティティの名前空間スラッグ(例: gravity-form)。省略した場合、「kind」のスラッグバージョンになります。$name – kind内のエンティティの一意の識別子。文字列(スラッグなど)または整数(IDなど)にすることができます。$title – kind内のエンティティのタイトル。実際のエンティティのタイトルを使用することをお勧めします。
必須ではありませんが、次の2つの追加引数を含めることもできます。$edit_link – オブジェクトを編集するためのURL。$view_link – オブジェクトを表示するためのURL。
4. 翻訳の取得
最後に、フロントエンドに翻訳を表示するには、wpml_translate_stringフックを使用する必要があります。
$userId = 123;
$user = get_user_by( 'id', $userId );
$package = [
'kind' => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".
'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace" slug.
'name' => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.
'title' => $user->display_name, // The title for the package entity inside the "kind" namespace.
];
$fooUserFields = get_option( 'otgs_foo_user_fields' );
$translatedFieldValues = [];
foreach ( $fooUserFields as $fooUserField ) {
$fieldValue = get_user_meta( $userId, $fooUserField, true );
$translatedFieldValues[ $fooUserField ] = apply_filters( 'wpml_translate_string', $fieldValue, sanitize_key( $fooUserField ), $package );
}
文字列の更新と削除
ユーザーがコンテンツを更新するたびに、WPMLは新しい文字列と削除された文字列を識別できる必要があります。これらの変更をWPMLに通知するには、登録コードを次の2つの関数でラップします。
$userId = 123;
$package = [
'kind' => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".
'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace" slug.
'name' => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.
// The 'title' key is not not required in the "translate" context.
];
do_action( 'wpml_start_string_package_registration', $package );
$fooUserFields = get_option( 'otgs_foo_user_fields' );
foreach ( $fooUserFields as $fooUserField ) {
$fieldValue = get_user_meta( $userId, $fooUserField, true );
do_action( 'wpml_register_string', $fieldValue, sanitize_key( $fooUserField ), $package, $fooUserField, 'LINE' );
}
do_action( 'wpml_delete_unused_package_strings',$package );
文字列パッケージの削除
ユーザーがコンテンツを削除した場合は、関連する文字列パッケージも削除する必要があります。これには、関連するすべての文字列、翻訳、および翻訳ジョブが含まれます。このクリーンアップを行うことで、データベースに不要なデータが残らず、サイトの効率を維持できます。
文字列パッケージを削除するには、プラグインまたはテーマ内の適切なアクションにフックし、wpml_delete_package関数を呼び出します。
$userId = 123; do_action( 'wpml_delete_package', $userId, FOO_USER_FIELD_PACKAGE_KIND_SLUG );
追加リソース
- WPML言語設定ファイル – wpml-config.xml(プラグインやテーマ内でWPMLが翻訳すべきテキストを指定するファイル)の使用に関するガイド。
- Multilingual Tools – 設定のセットアップをテストし、WPMLとの互換性を確認するためのツール。