🌍 WordPress 다국어 사이트 deep L ai 와 Polylang 플러은과 연동하여 자동 번역 시스템 구축 강의

User avatar placeholder
Written by 노퇴근

2025년 02월 05일

안녕하세요! 😊 오늘은 워드프레스(WordPress) 사이트에서 기존 게시물과 새 게시물을 자동으로 번역하고, SEO 최적화까지 수행하는 시스템을 구축하는 방법을 배워보겠습니다.

이 강의에서는 DeepL API, Polylang 플러그인, Yoast SEO를 활용하여 한 번 설정하면 번역이 자동으로 이루어지는 환경을 만들 것입니다. 🚀

참고로 deep l api 는 한 달에 500,000자까지 번역 무료로 이용이 가능합니다.

📌 강의 목표

1️⃣ 기존에 작성된 모든 한국어 게시물을 영어와 일본어로 번역
2️⃣ 앞으로 작성되는 게시물도 자동으로 번역
3️⃣ 번역된 게시물의 HTML 구조를 유지하여 깨지지 않게 처리
4️⃣ SEO(검색엔진 최적화) 설정을 적용하여 검색 노출을 극대화
5️⃣ 중복 번역을 방지하여 이미 번역된 게시물은 다시 번역하지 않음

💡 1. 프로젝트 준비

먼저, 프로젝트를 준비해야 합니다. 아래 작업이 되어 있어야 합니다.

📌 필수 설치

WordPress 사이트
Polylang 플러그인 (다국어 지원)
Yoast SEO 플러그인 (검색 최적화)
DeepL API 키 발급 (번역 API 사용)

📌 DeepL API 키 발급

DeepL 번역 API를 사용하려면 API 키가 필요합니다.
1️⃣ DeepL API 웹사이트로 이동
2️⃣ 회원 가입 후 API 키 발급
3️⃣ API 키 복사 (YOUR_DEEPL_API_KEY 부분에 입력)

💡 2. 코드 작성: 자동 번역 시스템 구축

이제 functions.php에 코드를 추가하여 번역 시스템을 구축해보겠습니다.

📌 2-1. 기존 게시물 자동 번역 코드

먼저, 이미 작성된 모든 게시물을 자동으로 번역하는 코드를 만들어보겠습니다.

// 이미 번역된 글인지 확인하는 함수 (중복 번역 방지)
function is_already_translated($post_id, $lang) {
    $translations = pll_get_post_translations($post_id);
    return isset($translations[$lang]); // 해당 언어의 번역 존재 여부 확인
}

// 기존 모든 게시물을 번역하는 함수 (한 번만 실행)
function auto_translate_existing_posts() {
    $languages = [
        'en' => ['prefix' => 'en', 'sep' => '-', 'sitename' => get_bloginfo('name')],
        'ja' => ['prefix' => 'ja', 'sep' => '-', 'sitename' => get_bloginfo('name')],
    ];

    $args = [
        'post_type' => 'post',
        'post_status' => 'publish',
        'posts_per_page' => -1,
    ];
    $posts = get_posts($args);

    foreach ($posts as $post) {
        if (pll_get_post_language($post->ID) !== 'ko') continue;

        foreach ($languages as $lang => $settings) {
            if (is_already_translated($post->ID, $lang)) {
                continue; // 이미 번역된 경우 건너뜀
            }

            $translated_title = deepl_translate_with_html($post->post_title, $lang);
            $translated_content = deepl_translate_with_html($post->post_content, $lang);
            $translated_slug = $settings['prefix'] . '-' . sanitize_title($translated_title);
            $seo_title = $translated_title . ' ' . $settings['sep'] . ' ' . $settings['sitename'];

            $translated_post_id = wp_insert_post([
                'post_title'    => $translated_title,
                'post_content'  => $translated_content,
                'post_status'   => 'publish',
                'post_type'     => $post->post_type,
                'post_author'   => $post->post_author,
                'post_name'     => $translated_slug,
                'post_category' => wp_get_post_categories($post->ID),
                'meta_input'    => [
                    '_yoast_wpseo_title' => $seo_title,
                ],
            ]);

            pll_set_post_language($translated_post_id, $lang);
            pll_save_post_translations([
                'ko' => $post->ID,
                $lang => $translated_post_id,
            ]);
        }
    }
}

// 기존 게시물 번역 실행 (한 번만 실행)
add_action('admin_init', function () {
    if (isset($_GET['run_translation']) && $_GET['run_translation'] === '1') {
        auto_translate_existing_posts();
        wp_die('Translation for all existing posts completed.');
    }
});

🚀 이제 브라우저에서 아래 URL을 실행하면 기존 모든 글이 번역됩니다!

(your-site.com내 사이트 도메인으로 변경해야 합니다.)

https://your-site.com/wp-admin/?run_translation=1

📌 2-2. 새 글 자동 번역 코드

이제 새로운 글이 작성될 때 자동으로 번역되도록 설정합니다.

function auto_translate_and_seo_publish($post_id) {
    $original_post = get_post($post_id);
    if ($original_post->post_status !== 'publish') return;

    $languages = [
        'en' => ['prefix' => 'en', 'sep' => '-', 'sitename' => get_bloginfo('name')],
        'ja' => ['prefix' => 'ja', 'sep' => '-', 'sitename' => get_bloginfo('name')],
    ];

    if (pll_get_post_language($post_id) !== 'ko') return;

    foreach ($languages as $lang => $settings) {
        if (is_already_translated($post_id, $lang)) {
            continue; // 이미 번역된 경우 건너뜀
        }

        $translated_title = deepl_translate_with_html($original_post->post_title, $lang);
        $translated_content = deepl_translate_with_html($original_post->post_content, $lang);
        $translated_slug = $settings['prefix'] . '-' . sanitize_title($translated_title);
        $seo_title = $translated_title . ' ' . $settings['sep'] . ' ' . $settings['sitename'];

        $translated_post_id = wp_insert_post([
            'post_title'    => $translated_title,
            'post_content'  => $translated_content,
            'post_status'   => 'publish',
            'post_type'     => $original_post->post_type,
            'post_author'   => $original_post->post_author,
            'post_name'     => $translated_slug,
            'meta_input'    => [
                '_yoast_wpseo_title' => $seo_title,
            ],
        ]);

        pll_set_post_language($translated_post_id, $lang);
        pll_save_post_translations([
            'ko' => $post_id,
            $lang => $translated_post_id,
        ]);
    }
}

// 새로운 글이 게시될 때 자동 번역 실행
add_action('publish_post', 'auto_translate_and_seo_publish');

🚀 최종 정리

기존 모든 글을 번역하려면?

  • 한 번만 실행: https://your-site.com/wp-admin/?run_translation=1

새로운 글을 번역하려면?

  • 새 글 작성 후 자동 번역됨. (추가 작업 필요 없음)

번역된 글을 다시 만들고 싶다면?

  • 기존 번역 글을 삭제 후 다시 실행.

💡 이제 워드프레스에서 완전히 자동으로 다국어 콘텐츠를 운영할 수 있습니다! 🚀 더 궁금한 점이 있다면 언제든지 질문해주세요! 😊

📌 실행 후 추가 확인해야 할 사항

  1. 번역된 게시물이 생성되었는지 확인
    • 워드프레스 관리자 → “모든 글” 에서 영어(en), 일본어(ja)로 번역된 글이 있는지 확인하세요.
  2. URL 확인
    • 한국어 글: https://example.co.kr/올림픽-일정/
    • 영어 글: https://example.co.kr/en/olympic-schedule/
    • 일본어 글: https://example.co.kr/ja/オリンピック日程/
  3. 번역된 글이 Polylang에서 제대로 연결되었는지 확인
    • 워드프레스 관리자 → Polylang에서 번역 관계 확인.

📌 기존 글 번역이 끝나면 더 실행할 필요 없음

✅ 기존 글을 한 번 번역하면 이 URL을 다시 실행할 필요가 없습니다.
✅ 이후에는 새로운 글을 작성하면 자동으로 번역됩니다.

📌 추가 질문

Q1. 이 URL을 여러 번 실행해도 되나요?

✅ 이미 번역된 글은 다시 번역되지 않으므로 여러 번 실행해도 문제없습니다.
✅ 중복 번역을 방지하는 코드 (is_already_translated())가 포함되어 있기 때문입니다.

Q2. 기존 글을 다시 번역하려면?

🚨 기존 번역을 삭제하고 다시 실행해야 합니다.
✅ 기존 번역된 글을 삭제하고, https://your-site.com/wp-admin/?run_translation=1 을 다시 실행하세요.

Q3. 자동으로 번역이 진행되지 않으면?

❌ 실행했는데 번역이 되지 않는다면, 다음을 확인하세요.

  1. functions.php에 코드가 제대로 추가되었는지 확인.
  2. DeepL API 키가 올바르게 설정되었는지 확인.
  3. Polylang 플러그인이 활성화되었는지 확인.
  4. 워드프레스 관리자 → 설정 → 고유주소(퍼머링크) 저장 버튼 클릭 후 다시 실행.
Image placeholder

블로그외에도 SNS 채널에서 요약된 정보를 빠르게 확인해볼 수 있습니다.

목차