プラグインとテーマを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フックを使用してコンテンツの言語を切り替えます。
if ( isset( $_GET[ 'wpml_lang' ] ) ) {
do_action( 'wpml_switch_language', $_GET[ 'wpml_lang' ] ); // switch the content language
}
// Run other content queries.
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」です。