2026年9月20日
2026年9月20日
TranslatePress の翻訳が保存されない・表示されない問題を解決する方法
はじめに
TranslatePressで翻訳を保存しても反映されない・言語を切り替えても同じ内容が表示される・言語スイッチャーが表示されないといった問題は、パーマリンク設定の不整合・TranslatePressのキャッシュ・データベーステーブルの問題が原因です。
症状・原因
- フロントエンドで翻訳を保存しても次回アクセス時に元に戻る
/en/などの言語URLにアクセスすると404エラーになる- 言語スイッチャーが表示されるが切り替え後も同じ言語のまま
- Google翻訳の自動翻訳が適用されない
解決手順
ステップ1:TranslatePressの設定を確認する
# TranslatePressのバージョンと設定を確認
wp eval "
if (defined('TRP_PLUGIN_VERSION')) {
echo 'TranslatePress version: ' . TRP_PLUGIN_VERSION . PHP_EOL;
}
\$settings = get_option('trp_settings');
echo 'Default language: ' . (\$settings['default-language'] ?? 'not set') . PHP_EOL;
echo 'Translation languages: ' . implode(', ', \$settings['translation-languages'] ?? []) . PHP_EOL;
echo 'URL type: ' . (\$settings['add-subdirectory-to-default-language'] ?? 'not set') . PHP_EOL;
"
# 翻訳データベーステーブルを確認
wp eval "
global \$wpdb;
// TranslatePressの翻訳テーブルを確認
\$tables = \$wpdb->get_results(\"SHOW TABLES LIKE '{\$wpdb->prefix}trp_%'\");
foreach (\$tables as \$table) {
\$table_name = array_values((array)\$table)[0];
\$count = \$wpdb->get_var(\"SELECT COUNT(*) FROM {\$table_name}\");
echo \$table_name . ': ' . \$count . ' rows' . PHP_EOL;
}
"
# パーマリンクをリセット
wp rewrite flush --hard
ステップ2:翻訳URLとパーマリンクを修正する
// functions.php: TranslatePress のURL設定をカスタマイズ
// ① 特定URLを翻訳対象から除外
add_filter('trp_skip_selectors_from_translation', function(array $selectors): array {
// コードブロック内のテキストを翻訳しない
$selectors[] = '.wp-block-code';
$selectors[] = 'pre';
$selectors[] = 'code';
return $selectors;
});
// ② 言語URLのプレフィックスをカスタマイズ
add_filter('trp_language_url', function(string $url, string $language): string {
// 日本語をデフォルト(プレフィックスなし)に設定
if ($language === 'ja_JP') {
return home_url(str_replace(home_url('/ja/'), home_url('/'), $url));
}
return $url;
}, 10, 2);
// ③ 翻訳済みコンテンツのキャッシュを制御
add_filter('trp_allow_machine_translation', function(bool $allow): bool {
// 管理者のリクエストでは自動翻訳を無効化
if (current_user_can('manage_options')) {
return false;
}
return $allow;
});
ステップ3:翻訳データを修正・再構築する
# 翻訳データの整合性を確認
wp eval "
global \$wpdb;
\$lang_table = \$wpdb->prefix . 'trp_dictionary_en_gb';
\$count = \$wpdb->get_var(\"SELECT COUNT(*) FROM {\$lang_table}\");
echo 'English translations: ' . \$count . PHP_EOL;
// 翻訳ステータスの分布を確認
\$statuses = \$wpdb->get_results(\"
SELECT status, COUNT(*) as count
FROM {\$lang_table}
GROUP BY status
\");
foreach (\$statuses as \$s) {
echo 'Status ' . \$s->status . ': ' . \$s->count . ' strings' . PHP_EOL;
}
// status: 0=未翻訳, 1=機械翻訳, 2=人間翻訳
"
# TranslatePressのキャッシュをクリア
wp eval "
// TranslatePressのキャッシュをリセット
delete_option('trp_cache_timestamp');
wp_cache_flush();
echo 'TranslatePress cache cleared' . PHP_EOL;
"
// functions.php: 翻訳の保存とキャッシュ制御
// ① 翻訳保存時にキャッシュをクリア
add_action('trp_after_save_translation', function(string $language, array $strings): void {
// キャッシュプラグインのキャッシュをクリア
if (function_exists('wp_cache_clear_cache')) {
wp_cache_clear_cache();
}
error_log(sprintf('[TRP] Saved %d translations for %s', count($strings), $language));
}, 10, 2);
// ② 翻訳フォームのnonce有効期間を延長
add_filter('trp_nonce_life', function(): int {
return DAY_IN_SECONDS; // 24時間
});
// ③ 特定ページを翻訳対象から除外
add_filter('trp_stop_translating_page', function(bool $stop): bool {
if (is_page('privacy-policy') || is_admin()) {
return true;
}
return $stop;
});
ステップ4:Google翻訳APIを設定する
# Google翻訳APIの設定を確認
wp eval "
\$settings = get_option('trp_settings');
\$api_key = \$settings['trp-machine-translation-google-api-key'] ?? '';
echo 'Google API Key: ' . (empty(\$api_key) ? 'NOT SET' : 'SET (length: ' . strlen(\$api_key) . ')') . PHP_EOL;
echo 'Machine translation: ' . (\$settings['machine-translation'] ?? 'not set') . PHP_EOL;
"
# Google APIの動作テスト
wp eval "
\$api_key = get_option('trp_settings')['trp-machine-translation-google-api-key'] ?? '';
if (!empty(\$api_key)) {
\$response = wp_remote_get(
'https://translation.googleapis.com/language/translate/v2?key=' . \$api_key . '&q=Hello&source=en&target=ja'
);
\$code = wp_remote_retrieve_response_code(\$response);
echo 'Google API status: ' . \$code . PHP_EOL;
if (\$code === 200) {
\$body = json_decode(wp_remote_retrieve_body(\$response), true);
echo 'Translation: ' . (\$body['data']['translations'][0]['translatedText'] ?? 'error') . PHP_EOL;
}
}
"
ステップ5:言語スイッチャーをカスタマイズする
// functions.php: TranslatePress言語スイッチャーのカスタマイズ
// ① ショートコードで言語スイッチャーを表示
// テンプレートファイルに [language-switcher] を記述
// ② ウィジェットエリア以外でスイッチャーを表示
add_action('wp_footer', function(): void {
if (function_exists('trp_language_switcher')) {
echo '<div class="floating-lang-switcher">';
trp_language_switcher([
'display-names-as' => 'name',
'show-flag' => 'no',
'show-arrow' => 'yes',
]);
echo '</div>';
}
});
// ③ メニューに言語スイッチャーを追加
add_filter('wp_nav_menu_items', function(string $items, object $args): string {
if ($args->theme_location === 'primary' && function_exists('do_shortcode')) {
$switcher = do_shortcode('[language-switcher]');
$items .= '<li class="menu-item lang-menu">' . $switcher . '</li>';
}
return $items;
}, 10, 2);
// ④ hreflangタグを出力(SEO対策)
add_action('wp_head', function(): void {
if (!function_exists('TRP_Translate_Press')) return;
$settings = get_option('trp_settings');
$languages = $settings['translation-languages'] ?? [];
foreach ($languages as $lang_code) {
$url = apply_filters('trp_language_url', home_url('/'), $lang_code);
$hreflang = str_replace('_', '-', strtolower($lang_code));
printf('<link rel="alternate" hreflang="%s" href="%s">' . PHP_EOL,
esc_attr($hreflang), esc_url($url));
}
});
注意事項
- TranslatePressの翻訳データは
wp_trp_dictionary_{言語コード}テーブルに保存されます。サイトの移行時はこれらのテーブルも必ずエクスポート・インポートしてください - Google翻訳APIの自動翻訳機能を使う場合はAPIキーの設定が必要です。APIの使用量に応じて課金されるため、本番環境では翻訳量を確認してください
- TranslatePressはページのHTMLを解析して翻訳するため、JavaScriptで動的に生成されるコンテンツ(Ajaxで読み込む要素など)はデフォルトでは翻訳対象になりません。TranslatePress Proの「動的コンテンツ翻訳」機能が必要です
まとめ
TranslatePressの修復は①trp_settingsオプションと翻訳テーブル件数を確認してwp rewrite flush --hardでURLを再生成、②trp_skip_selectors_from_translationフィルターでコードブロックなどを翻訳除外、③trp_after_save_translationフックでキャッシュプラグインと連携した自動クリア、④Google翻訳APIキーを設定してwp_remote_get()で動作確認、⑤wp_nav_menu_itemsフィルターでメニューに言語スイッチャーを追加しhreflangタグをwp_headに出力する手順で解決します。