PythonとDeepLでWordPressの投稿を英語に翻訳して下書きにする
手順
- アプリケーションパスワードをWordPressで作成(左メニュー「ユーザー」→「プロフィール」をクリック
(または「ユーザー」→「あなたのプロフィール」ページ下部にスクロールすると「アプリケーションパスワード」という項目があります。「新しいアプリケーションパスワード名」を入力※表示された 一度だけ表示されるパスワード をメモしてください!) - DeepLで無料APIキーを取得
- 私から渡すテンプレートコードを自分用に書き換え(コピペでOK)
- コマンドで「python 翻訳.py」と実行するだけ!
カテゴリーとタグも反映バージョンのPythonコード
課題
- ブロックエディタにならない。(クラシックエディタになる)
- ちょっと崩れる…HTMLにしてプレビューに
- Youtubeのコードは反映されない
pip install requests
import requests
# ====== ユーザー設定 ======
WP_SITE = "ワードプレスのドメイン"
WP_USER = "ワードプレスのID"
WP_APP_PASS = "ワードプレスのパスワード"
DEEPL_API_KEY = "DEEPLのAPIキー"
TARGET_IDS = [ワードプレスの投稿ID(複数ある場合は,で区切る)]
# ===========================
AUTH = (WP_USER, WP_APP_PASS)
def translate_text(text):
url = "https://api.deepl.com/v2/translate"
data = {
"auth_key": DEEPL_API_KEY,
"text": text,
"source_lang": "JA",
"target_lang": "EN",
}
r = requests.post(url, data=data)
response = r.json()
if "translations" in response:
return response["translations"][0]["text"]
else:
raise Exception(f"[DeepL ERROR] {response}")
def get_post(post_id):
url = f"{WP_SITE}/wp-json/wp/v2/posts/{post_id}?_embed"
r = requests.get(url, auth=AUTH)
return r.json()
def create_translated_post(original_post, translated_title, translated_content):
# スラッグ(英語用)
original_slug = original_post["slug"]
en_slug = f"en/{original_slug}"
# アイキャッチ画像(メディアID)
featured_media = original_post.get("featured_media", 0)
# カテゴリとタグ
categories = original_post.get("categories", [])
tags = original_post.get("tags", [])
# カスタムフィールド(ACF対応)
meta_fields = {}
if "acf" in original_post:
meta_fields = {"acf": original_post["acf"]}
# 投稿作成用データ
post_data = {
"title": translated_title,
"content": f"<!-- wp:paragraph --><p>{translated_content}</p><!-- /wp:paragraph -->",
"status": "publish",
"slug": en_slug,
"featured_media": featured_media,
"categories": categories,
"tags": tags,
**meta_fields,
}
# 投稿作成
url = f"{WP_SITE}/wp-json/wp/v2/posts"
r = requests.post(url, auth=AUTH, json=post_data)
if r.status_code == 201:
print(f"✅ Translated post created: {translated_title}")
else:
print(f"❌ Failed to create post: {r.status_code} {r.text}")
# 実行
for post_id in TARGET_IDS:
print(f"🔄 Processing post ID: {post_id}")
original_post = get_post(post_id)
translated_title = translate_text(original_post["title"]["rendered"])
translated_content = translate_text(original_post["content"]["rendered"])
create_translated_post(original_post, translated_title, translated_content)
カテゴリーとタグはなしのPythonコード
※現在こちらを使用中
import requests
# ====== ユーザー設定 ======
WP_SITE = "https://ay-g.com" # WordPressのURL(末尾に / は不要)
WP_USER = "aya-goto" # WordPressユーザー名
WP_APP_PASS = "AA66 Svbn LAbX K9A4 SOQE R7Sw" # アプリケーションパスワード
DEEPL_API_KEY = "96b5ae06-3da0-464d-adf3-be7822fa2f04" # DeepL APIキー
TARGET_IDS = [480,452,558,421,591] # 翻訳したい投稿のID(複数OK)
# ==========================
AUTH = (WP_USER, WP_APP_PASS)
def translate_text(text):
url = "https://api.deepl.com/v2/translate"
data = {
"auth_key": DEEPL_API_KEY,
"text": text,
"source_lang": "JA",
"target_lang": "EN",
}
r = requests.post(url, data=data)
response = r.json()
if "translations" in response:
return response["translations"][0]["text"]
else:
raise Exception(f"[DeepL ERROR] {response}")
def get_post(post_id):
url = f"{WP_SITE}/wp-json/wp/v2/posts/{post_id}"
r = requests.get(url, auth=AUTH)
r.raise_for_status()
return r.json()
def create_translated_draft(title_en, content_en):
url = f"{WP_SITE}/wp-json/wp/v2/posts"
data = {
"title": title_en,
"content": f"<!-- wp:paragraph --><p>{content_en}</p><!-- /wp:paragraph -->",
"status": "draft", # ← 下書き
}
r = requests.post(url, auth=AUTH, json=data)
if r.status_code == 201:
print(f"✅ 下書き作成成功: {title_en}")
else:
print(f"❌ 作成失敗: {r.status_code}, {r.text}")
# === 実行 ===
for post_id in TARGET_IDS:
print(f"🔄 投稿ID {post_id} を処理中...")
original = get_post(post_id)
title_ja = original["title"]["rendered"]
content_ja = original["content"]["rendered"]
title_en = translate_text(title_ja)
content_en = translate_text(content_ja)
create_translated_draft(title_en, content_en)
ディスカッション
コメント一覧
まだ、コメントがありません