//AdSenseにリンク

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)