WPML

プラグインとテーマをWPMLに対応させるためのステップバイステップガイドに従ってください。

このガイドは、当社の互換性プログラムであるGo Globalにすでに参加しているテーマおよびプラグイン開発者を対象としています。まだ参加していない場合は、このガイドに従う前に申し込みを送信してください。

WPMLとの互換性を持たせる方法

1. 言語設定ファイルの作成

言語設定ファイルは、プラグインやテーマ内のどのテキストを翻訳し、どのテキストを翻訳しないかをWPMLに指示します。これには、カスタム投稿タイプ、タクソノミー、フィールド、管理画面、ウィジェットなどのテキストが含まれます。

言語設定ファイルの作成方法をすでに知っている場合は、以下の手順に従ってセットアップをテストしてください。そうでない場合は、言語設定ガイドを参照して作成方法を学んでください。

テストのセットアップ
1. いくつかの投稿とタクソノミーを作成します
2. それらを翻訳に送信します
3. フロントエンドで翻訳されて表示されることを確認します

2. 翻訳用文字列の準備

文字列とは、サイト上に表示されるテキストのうち、投稿、ページ、またはタクソノミーの一部ではないもののことです。プラグインやテーマ内の文字列をWPMLで翻訳できるようにするには、各ユースケースについて以下の手順に従ってください。

文字列を設定する際は、Multilingual Toolsプラグインを使用して、どの文字列が翻訳可能で、どの文字列に追加の設定が必要かを確認してください。

ハードコードされた文字列

ハードコードされた文字列は、gettext関数で登録する必要があります。gettextの使用とコードの準備について詳しくはこちらをご覧ください。

wp_options内の文字列

プラグインやテーマがwp_optionsテーブルの文字列を使用している場合は、wpml-config.xmlファイルに登録してください。

オプションキーが固定されておらず、テーマがユーザーの入力によって増加する可能性のあるエントリの配列を使用している場合は、これらのエントリを動的に登録します。これにはWPMLのAPI関数を使用できます。

動的文字列

前述の方法がいずれも文字列に該当しない場合は、以下のガイドに従って翻訳用の文字列を準備してください。

テストのセットアップ
1. WPMLテーマとプラグインのローカライズでプラグイン/テーマの文字列をスキャンします 
2. 文字列を含むページを作成します
3. 文字列が文字列翻訳に表示されるか確認します
4. いくつかの文字列を翻訳し、フロントエンドで翻訳されて表示されることを確認します

3. 翻訳用カスタムウィジェットとブロックの登録

テーマやプラグインにElementorなどのページビルダー用のカスタムウィジェットが含まれている場合、それらを翻訳用に登録する必要があります。

ページビルダーのコンテンツの登録について詳しくは、以下のガイドを参照してください。

テストのセットアップ
1. すべてのカスタムウィジェットを含むページを作成します
2. ページを翻訳に送信し、ウィジェットのテキストが高度な翻訳エディタに表示されることを確認します
3. 翻訳がフロントエンドに表示されるか確認します
4. 手順を繰り返して、異なるウィジェット設定をテストします

4. 異なる言語からのIDの自動取得

テーマやプラグインに、言語ごとに異なる投稿IDを読み込む機能やオプションがある場合は、wpml_object_idフィルターを使用して、翻訳された投稿IDを自動的に取得します。

たとえば、言語ごとに異なるスライドがあり、それぞれに一意のIDがあるスライダーを考えてみましょう。各言語で正しいスライドIDを自動的に読み込むには、wpml_object_idフィルターを使用できます。

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

テストのセットアップ
1. 関連する投稿やテンプレートなどを作成し、テキスト文字列を追加します
2. その投稿を使用するように機能を設定します
3. 投稿を翻訳し、テキスト文字列に異なる値を設定します
4. 機能がフロントエンドで翻訳されたIDを読み込んでいるか確認します

5. WooCommerceへの対応

WPMLは、WPML Multilingual & Multicurrency for WooCommerceアドオンを使用してWooCommerceのコンテンツを翻訳できます。テーマやプラグインにWooCommerceの要素が含まれている場合は、WPML Multilingual & Multicurrency for WooCommerce互換性ガイドに従ってWPMLに対応させてください。

6. 管理画面の言語スイッチャーの表示または非表示

デフォルトでは、WPMLはWordPressの管理バーに言語スイッチャーを追加します。このスイッチャーは、フロントエンドとバックエンドの両方で、ログインしているユーザーに表示されます。

上部の管理バーにある言語スイッチャー
上部の管理バーにある言語スイッチャー

設定エリアなどの機密性の高いページで言語スイッチャーを非表示にしたい場合があります。これを行うには、functions.phpファイルに以下のコードを追加します。

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

特別な機能への対応

テーマやプラグインに(カスタムテーブルの使用などの)特別な機能が含まれている場合、それらをWPMLに対応させるにはカスタムコードを使用する必要があります。

カスタム開発に関する情報については、開発者向けリソースを参照してください。

よくある問題と解決策

フォームのラベルがデータベースから取得されているため翻訳できない

解決策:

$label = esc_html( apply_filters('wpml_translate_single_string', $this->checkout_item->name, 'wpsc', '$this->checkout_item->name .'_checkout_form_label'' ) );
wp_query($args)またはget_posts($args)が現在の言語の正しい投稿IDをフィルタリングしない

解決策:

wp_query($args)またはget_posts($args)を使用する場合は、引数に「suppress_filters=0」を追加する必要があります。

すべてのスライドが1つの言語で表示される

解決策:

// 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が異なる

解決策:

// Loop posts
while (have_posts()): the_post();
$post = get_post( apply_filters( 'wpml_object_id', $post->ID, 'slide' ) );
スライダーがカスタム管理ページを使用しており、カスタムフィールドの値を翻訳に登録する必要がある

解決策:

// 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が異なる

解決策:

$taxonomy_id = apply_filters( 'wpml_object_id', $taxonomy_id, 'my_custom_taxonomy' );
カスタム(非標準WordPress)AJAXリクエストが常にデフォルト言語のコンテンツを返す

解決策:

カスタムAJAX URLを構築する際は、wpml_current_languageフックを使用し、現在の言語をAJAX URLのパラメーターとして追加します。

$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'
}

handle-ajax.phpファイルでAJAXリクエストを処理する際、コンテンツの出力を生成する前に、wpml_switch_languageフックを使用してコンテンツの言語を切り替えます。終了したら言語スコープを閉じます。WPML 5.0以降では、言語の切り替えがネストされるため、切り替えごとに独自の復元が必要です。

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 );
    }
}
WP_Queryの$args[ ‘tax_query’ ][ ‘field’ ]引数における「id」値の誤った使用

解決策:

「field」パラメーターに「id」引数を使用すると、デフォルト言語では機能しますが、セカンダリ言語では機能しません。以下は誤ったクエリの例です。

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

開発者は「field」パラメーターを修正する必要があります。

'field'    => 'id',

修正後:

'field'    => 'term_id',

参考: https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters (新しいタブで開く)。「field」パラメーターに「id」という値はありません。デフォルト値は「term_id」です。

執筆者:Amir