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に出力する手順で解決します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲