🌍 WordPress λ‹€κ΅­μ–΄ μ‚¬μ΄νŠΈ deep L ai 와 Polylang ν”ŒλŸ¬μ€κ³Ό μ—°λ™ν•˜μ—¬ μžλ™ λ²ˆμ—­ μ‹œμŠ€ν…œ ꡬ좕 κ°•μ˜

μ½˜ν…μΈ ν”Œλ‘œμš°

μ•ˆλ…•ν•˜μ„Έμš”! 😊 μ˜€λŠ˜μ€ μ›Œλ“œν”„λ ˆμŠ€(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. μ›Œλ“œν”„λ ˆμŠ€ κ΄€λ¦¬μž β†’ μ„€μ • β†’ κ³ μœ μ£Όμ†Œ(퍼머링크) μ €μž₯ λ²„νŠΌ 클릭 ν›„ λ‹€μ‹œ μ‹€ν–‰.
Content View