WPML

ユーザーがWPMLを使用してコンテンツを簡単に翻訳できるように、プラグインやテーマの文字列パッケージを作成する方法を学びます。

文字列パッケージとは、特定のコンテキストで「バンドル」された文字列のグループです。その目的は、各文字列を個別に翻訳する手間を省き、エンドユーザーがより効率的にコンテンツを翻訳できるようにすることです。

たとえば、文字列パッケージがある場合とない場合で、ユーザーがカスタムユーザーフィールドを翻訳する方法は次のようになります。

文字列パッケージがない場合

The four fields as separate strings, on WPML → Translations → Strings
The four fields as separate strings, on WPML → Translations → Strings

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

文字列パッケージがある場合

The same four fields as one package, on the Translation Dashboard
The same four fields as one package, on the Translation Dashboard

ユーザーは自動翻訳のオプションを使用して、複数の文字列を一度にまとめて翻訳できます。

ご覧のように、文字列パッケージを使用すると、ユーザーが複数のカスタムユーザーフィールドを一度に翻訳できるようになり、翻訳プロセスが簡素化されます。ユーザーに最適な翻訳エクスペリエンスを提供するには、以下の手順に従って独自の文字列パッケージを作成してください。

以下の手順で説明する文字列パッケージの完全な実装を確認したい場合は、使用したテストプラグインが含まれるこの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との互換性を確認するためのツール。

執筆者:Amir · 最終更新日:2025年3月24日