Claude APIでWordPressの記事を翻訳する

2025/04/28 (月) - 09:00 PHP&CMS

今回はWordPressの記事タイトルと本文を生成AIを組み合わせて自動的に機械翻訳する機能を簡易的に実装しました。記事詳細ページに「英訳を見る」ボタンを配置し、押下したら英訳ページに遷移しClaude APIを利用し翻訳します。

ブラウザの機能やGoogleなどの翻訳サービスで簡単かつ無料で全文翻訳出来るので不要と言えば不要ですがネタ的に。

実装ポイントとしては以下。

  • 翻訳に時間とAPI使用料金が取られるので初回のみ翻訳
  • 2回目以降は翻訳内容をキャッシュして表示
  • 翻訳ページへの切り替えはクエリパラメータで判断
  • アクセス解析の時にパラメータの有無で翻訳ページのアクセス数を判断できる

翻訳前のブログ記事

翻訳前のブログ記事の表示(日本語)。デメリットは以下の通り

  • 翻訳内容の精度は元の文章の品質とAIモデルに依存する
  • あまり長い文章は非対応(max-tokenを超えると文章が途中で切れる)
  • APIの使用利用料金に注意

あらかじめAnthropic ConsoleでAPIキーの取得と課金は済ませておきましょう。

翻訳後のブログ記事

翻訳後のブログ記事の表示(英語)。環境は以下の通り

  • WordPress 6.5
  • PHP 8.2

細かいエラーやセキュリティ処理はしていないので、参考までに。また一部マークアップが崩れる可能性もあるのでその点も注意しましょう。

コード例

function.phpに以下を記述。指定したクエリパラメータの記事詳細にアクセスすると初回翻訳が実行されます。1度翻訳した内容はカスタムフィールドに格納するため、2回以降はカスタムフィールドの翻訳内容を表示します。

function translationContent(){
 $API = 'https://api.anthropic.com/v1/messages';
 $API_KEY = '取得したAPIキーを設定';
 if( get_post_meta(get_the_ID(), 'translation_en') ) {
  //翻訳後ならキャッシュを表示
  $the_content = get_post_meta(get_the_ID(),'translation_en',true);
  return $the_content;
 }
 //翻訳前なら翻訳を実行
 $system = '指定したテキストを英語で翻訳する。HTMLタグは変えずにテキスト内容だけ翻訳する。';
 $single_title = get_the_title();
 $single_date = get_the_time('Y/m/d (D) - H:i');
 $single_content = get_the_content();
 $content = "<h1>{$single_title}</h1><p><time>{$single_date}</time></p>{$single_content}";
 $data = json_encode([
  'model' => 'claude-3-5-haiku-20241022', //モデルを選択
  'max_tokens' => 8192, //最大トークン(モデルに依存)
  'system' => $system,
  'messages' => [
   ['role' => 'user', 'content' => $content]
  ]
 ]);
 $ch = curl_init($API);
 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_HTTPHEADER, [
  'Content-Type: application/json',
  'anthropic-version: 2023-06-01',
  'x-api-key: '.$API_KEY
 ]);  
 $result = curl_exec($ch);
 $httpcode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
 curl_close($ch);
 $output = json_decode($result, true);
 if($httpcode===200){
  $contents = $output['content'][0]['text'];
  update_post_meta(get_the_ID(), 'translation_en', $contents );
  return $contents;
 }else{
  return 'エラー: '.$result;
 }
}

single.phpの任意の位置に以下を記述。クエリパラメータの有無で本来の日本語の記事と、翻訳の記事を分岐表示します。このとき英訳のページへの同線を設置します。

<?php
if($_GET['lang']==='en'){
 echo translationContent();
}else{
?>
 <h1><?php the_title(); ?></h1>
 <p><time><?php the_time('Y/m/d (D) - H:i') ?></time></p>
 <p><a href="<?php the_permalink() ?>?lang=en">この記事を英語で見る(English)</a></p>
<?php
 the_content();
}
?>

もし翻訳内容を変えたい場合はカスタムフィールドを直接変更します。また翻訳内容をリセットして再翻訳したい場合はカスタムフィールドを削除して保存した後、再度翻訳をします。

本格的に翻訳記事を用意したり、機密情報を扱うのであれば専門の翻訳業者に依頼し、WordPressの多言語プラグインを利用するのが最適です。しかし生成AIの翻訳精度もかなりの物ですね。

おしまい

タグ:

記事をシェアする

  • facebookでシェアする
  • twitter(X)でシェアする
  • LINEでシェアする
  • はてなブックマークでシェアする
  • Threadsでシェアする
  • Pocketでシェアする
  • Pinterestでシェアする

おすすめ記事

トラックバック & ピンバック

この記事へのトラックバックURI
https://weblog.walk-life.me/wordpress_claude_translation/trackback/

コメント

コメントは下記からどうぞ

ページの先頭へ