EnglishEN EspañolES FrançaisFR DeutschDE ItalianoIT PortuguêsPT 中文ZH 日本語JA 한국어KO РусскийRU NederlandsNL
← Back to all articles

SEO 손실 없이 WordPress에서 맞춤형 PHP로 마이그레이션 – 완전한 7단계 가이드

순위를 잃지 않고 사이트를 WordPress에서 옮기는 것이 제 일이며, 그 뒤에는 반복 가능한 절차가 있습니다. 깔끔한 맞춤형 PHP 코드베이스는 TTFB를 70% 줄이고, 플러그인 취약점 한 묶음을 통째로 없애며, 100% 소유권을 안겨줍니다. 하지만 리디렉션이나 메타데이터를 그르치면 순위가 가라앉는 것을 보게 됩니다. 30건이 넘는 WordPress 이전을 거치며 저는 SEO를 보존하고 대개는 향상시키는 정확한 순서를 다듬어 왔습니다. 그것은 추측이 아니라 Google 자체의 사이트 이전 지침에 근거합니다. 다음은 정말로 중요한 순서대로 정리한 일곱 단계입니다.

WordPress에서 맞춤형 PHP로 마이그레이션해야 하는 이유는?

  • 느린 성능 – 캐싱을 사용해도 WordPress는 847KB 이상의 JavaScript를 로드합니다.
  • 플러그인 취약점 – 해킹된 WordPress 사이트의 96%는 오래된 플러그인 때문입니다.
  • 월 사용료 – 프리미엄 플러그인, WP에 최적화된 호스팅, 유지보수 비용이 누적됩니다.
  • 잠금 – 코드를 소유하지 않습니다. 게시물 데이터베이스와 테마를 소유할 뿐입니다.

맞춤형 PHP는 완전한 제어권, 1초 미만의 로드 시간, 그리고 월간 플랫폼 수수료 제로를 제공합니다. 그러나 마이그레이션은 완벽해야 합니다.

시작하기 전: 사전 마이그레이션 감사

  • 모든 URL 내보내기 – Screaming Frog(500 URL까지 무료) 또는 wget 사용: wget --spider --force-html -r -l 3 https://yoursite.com 2>&1 | grep '^--' | awk '{ print $3 }' > urls.txt
  • 순위 기록 – Google Search Console(성능 보고서)에서 상위 100개 키워드를 내보냅니다.
  • 메타데이터 저장 – Screaming Frog는 제목 태그, 메타 설명, H1을 CSV로 내보낼 수 있습니다.
  • 백링크 문서화 – Search Console → 링크 → 외부 링크 또는 가능한 경우 Ahrefs/SEMrush를 사용합니다.

1단계: 이전 사이트 크롤링 (Screaming Frog 심층 분석)

Screaming Frog SEO Spider를 다운로드합니다(500 URL까지 무료). 다음을 추출하도록 구성합니다:

  1. 모든 내부 URL.
  2. 제목 태그 및 메타 설명.
  3. 표준 태그.
  4. H1 제목.
  5. 응답 코드(200, 301, 404).

CSV로 내보냅니다. 이 파일이 마이그레이션 맵이 됩니다. 이를 사용하여 모든 기존 페이지에 대상이 있는지 확인합니다.

2단계: URL을 새 구조에 매핑 – 가능하면 동일하게 유지

가장 안전한 접근 방식: 정확히 동일한 URL 경로를 유지합니다. WordPress URL이 깔끔한 경우(예: /services/web-design) 재사용할 수 있습니다. 다음과 같은 경우에만 구조를 변경합니다:

  • WordPress URL에 /2023/01/post-name/(날짜)가 포함된 경우 – 날짜를 제거합니다.
  • /category//tag/ 아카이브에서 중복 콘텐츠가 있는 경우 – 제거합니다.

블로그 매핑 예시:

/2023/01/why-custom-php → /blog/why-custom-php
/category/performance → /blog/category/performance (선택 사항, 카테고리 페이지는 제거 가능)
/tag/seo → (제거 – 태그 페이지는 권위를 희석시키는 경우가 많음)

두 개의 열로 CSV를 만듭니다: old_url, new_url. 다시 생성하지 않는 페이지(예: 태그 아카이브)의 경우 가장 가까운 관련 페이지로 리디렉션합니다.

3단계: WordPress에서 콘텐츠 내보내기

방법 A – WP REST API (소규모 사이트에 가장 쉬움)

<code>&lt;?php<br>$posts = json_decode(file_get_contents('https://yoursite.com/wp-json/wp/v2/posts?per_page=100&page=1'));<br>foreach ($posts as $post) {<br>    $data = [<br>        'title' => $post->title->rendered,<br>        'slug' => $post->slug,<br>        'content' => $post->content->rendered,<br>        'excerpt' => $post->excerpt->rendered,<br>        'date' => $post->date,<br>        'meta' => [<br>            'title' => get_post_meta($post->id, '_yoast_wpseo_title', true),<br>            'description' => get_post_meta($post->id, '_yoast_wpseo_metadesc', true)<br>        ]<br>    ];<br>    // 사용자 정의 MySQL 테이블에 삽입<br>}<br>?&gt;</code>

방법 B – WP CLI (대규모 사이트에 가장 빠름)

<code>wp export --dir=/tmp --post_type=post,page --with_attachments</code>

방법 C – 직접 MySQL (완전한 제어)

<code>SELECT ID, post_title, post_name, post_content, post_date FROM wp_posts WHERE post_status = 'publish' AND post_type IN ('post', 'page');</code>

그런 다음 wp_postmeta에서 Yoast SEO 메타데이터를 가져옵니다. meta_key IN ('_yoast_wpseo_title','_yoast_wpseo_metadesc').

4단계: 동일한 메타데이터로 맞춤형 PHP 사이트 재구축

  • 정확히 동일한 <title> 태그 (Yoast 또는 All in One SEO에서).
  • 동일한 <meta name="description">.
  • 동일한 <h1> (약간의 변경은 일반적으로 허용됨).

메타데이터를 데이터베이스(예: page_meta 테이블) 또는 PHP 배열에 저장합니다. 동적 사이트의 경우 전환 중에 WordPress 데이터베이스를 읽기 전용 소스로 유지할 수도 있습니다 – 그러나 복잡성이 추가됩니다.

5단계: 301 리디렉션 구현 (가장 중요한 단계)

301 리디렉션은 Google에 "이 페이지가 영구적으로 이동했습니다"라고 알립니다. Google은 이전 페이지의 순위 권한의 거의 100%를 새 URL로 전송합니다.

Apache(.htaccess)의 경우 – 200개 미만의 리디렉션에 가장 적합

<code>Redirect 301 /old-url /new-url<br>Redirect 301 /2023/01/why-custom-php /blog/why-custom-php</code>

수천 개의 리디렉션의 경우 – PHP 맵 사용 (.htaccess 비대화 방지)

<code>&lt;?php<br>$redirects = json_decode(file_get_contents(__DIR__ . '/redirects.json'), true);<br>$request = $_SERVER['REQUEST_URI'];<br>if (isset($redirects[$request])) {<br>    header('HTTP/1.1 301 Moved Permanently');<br>    header('Location: ' . $redirects[$request]);<br>    exit;<br>}<br>?&gt;</code>

Nginx의 경우 – map 지시문 사용

<code>map $request_uri $new_uri {<br>    /old-url /new-url;<br>    /2023/01/why-custom-php /blog/why-custom-php;<br>}<br>server {<br>    if ($new_uri) {<br>        return 301 $new_uri;<br>    }<br>}</code>

전문가 팁: 리디렉션을 연쇄하지 마십시오(A → B → C). 각 홉은 링크 가치를 약간 잃습니다. 항상 직접 A → C로 리디렉션하십시오.

6단계: 동적 XML 사이트맵 생성

정적 사이트맵을 사용하지 마십시오 – 오래됩니다. 대신 XML을 동적으로 출력하는 sitemap.php를 만듭니다:

<code>&lt;?php<br>header('Content-Type: application/xml');<br>echo '&lt;?xml version="1.0" encoding="UTF-8"?&gt;';<br>echo '&lt;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&gt;';<br>$pages = getAllPageUrlsFromDatabase(); // 사용자 정의 함수<br>foreach ($pages as $url) {<br>    echo '&lt;url&gt;&lt;loc&gt;' . htmlspecialchars($url) . '&lt;/loc&gt;&lt;lastmod&gt;' . date('Y-m-d') . '&lt;/lastmod&gt;&lt;/url&gt;';<br>}<br>echo '&lt;/urlset&gt;';<br>?&gt;</code>

그런 다음 .htaccess에 다시 쓰기 규칙을 추가합니다:

<code>RewriteRule ^sitemap\.xml$ sitemap.php [L]</code>

시작 직후 사이트맵을 Google Search Console에 제출합니다.

7단계: 시작하고 30일 동안 모니터링

  1. 모든 리디렉션 확인 – 크롤러(Screaming Frog)를 사용하여 모든 이전 URL을 방문하고 새 URL로 301을 반환하는지 확인합니다.
  2. 매일 Google Search Console "적용 범위" 보고서 모니터링 – 404 오류를 찾습니다. 각 404에 대해 누락된 리디렉션을 추가하거나 끊어진 링크를 수정합니다.
  3. 새 사이트맵 제출 – Search Console에서 사이트맵 → 새 사이트맵 추가(sitemap.xml)로 이동합니다.
  4. Core Web Vitals 관찰 – 일주일 이내에 개선이 보여야 합니다. 그렇지 않으면 이미지, CSS 또는 서버 구성을 디버그합니다.
  5. 4주 후 순위 비교 – GSC 데이터를 다시 내보냅니다. 대부분의 클라이언트는 변화가 없거나 더 빠른 로드 시간으로 인한 약간의 개선을 봅니다.

일반적인 함정과 이를 피하는 방법

함정 1: 리디렉션 없이 URL 변경

증상: Search Console에 404 오류.

해결 방법: 시작하기 전에 PHP 리디렉션 맵을 구현합니다.

함정 2: 메타 설명 마이그레이션을 잊어버림

증상: Google이 임의의 텍스트로 스니펫을 다시 작성합니다.

해결 방법: 1단계의 동일한 메타데이터 내보내기를 사용합니다.

함정 3: 이미지(미디어 파일) 손실

증상: 맞춤형 사이트에 깨진 이미지.

해결 방법: 전체 /wp-content/uploads/ 폴더를 새 사이트의 공개 디렉터리에 복사합니다. 폴더를 이동한 경우 /wp-content/uploads/...에서 /uploads/...로의 리디렉션을 설정합니다.

함정 4: 혼합 콘텐츠 경고 (HTTP 이미지)

증상: 브라우저가 HTTPS에서 "안전하지 않은 콘텐츠"를 표시합니다.

해결 방법: 데이터베이스에서 이전 이미지 URL을 http://oldsite.com에서 https://newsite.com으로 검색 및 교체합니다.

실제 클라이언트 사례 연구: 500페이지 비즈니스 사이트 마이그레이션

한 전국 프랜차이즈 네트워크에는 500개 이상의 위치 페이지가 있는 WordPress 사이트가 있었으며, 각 페이지에는 고유한 콘텐츠가 있었습니다. 로드 시간은 2.8초(모바일)였고, 호스팅과 플러그인에 월 $300를 지불하고 있었습니다.

프로세스:

  • WP CLI를 사용하여 모든 위치 데이터 내보내기.
  • MySQL에서 위치 데이터를 가져오는 단일 PHP 템플릿으로 맞춤형 PHP 사이트 재구축.
  • URL 구조를 동일하게 유지(/locations/city-state/).
  • 301 리디렉션에 PHP 맵 사용 (URL은 변경되지 않았지만 안전을 위해 맵 유지).

60일 후 결과:

  • TTFB: 800ms → 180ms.
  • Lighthouse 성능: 58 → 96.
  • 호스팅 비용: $300/월 → $30/월 (표준 VPS).
  • 순위: 위치 페이지의 87%에서 개선 (속도 덕분).
  • 유기적 트래픽: +23% 3개월 내.

이제 클라이언트는 코드를 완전히 소유하고, 플러그인 비용을 지불하지 않으며, 간단한 CSV 업로드를 통해 즉시 새 위치를 추가할 수 있습니다.

마이그레이션해야 할까요? 의사 결정 프레임워크

다음과 같은 경우 맞춤형 PHP로 마이그레이션하세요:

  • 사이트가 대부분 정적이거나 예측 가능한 콘텐츠(블로그 + 서비스)가 있는 경우.
  • 플러그인 유지보수 및 보안 업데이트에 지친 경우.
  • 100% 코드 소유권과 월간 플랫폼 수수료 제로를 원하는 경우.

다음과 같은 경우 WordPress에 머무르세요:

  • 고급 이커머스가 필요한 경우 (맞춤형 PHP도 처리할 수 있지만).
  • WooCommerce 확장 기능에 크게 의존하는 경우.
  • 팀이 기술적이지 않고 WP 관리자에 익숙한 경우.

전환할 준비가 되셨나요?

저는 30개 이상의 WordPress 사이트를 맞춤형 PHP로 마이그레이션했습니다 – 작은 블로그에서 2,000페이지 규모의 이커머스 스토어까지. 콘텐츠 내보내기, URL 매핑, 301 리디렉션, 메타데이터 보존, 출시 후 모니터링 등 모든 것을 처리합니다.

귀하의 맞춤형 PHP 사이트는 0.8초 미만으로 로드되고, Lighthouse에서 100점을 받으며, 다시는 플러그인 비용을 지불하지 않게 됩니다.

WordPress 사이트 마이그레이션 의뢰하기 →

모든 데이터는 BuiltToWinWeb이 수행한 실제 클라이언트 마이그레이션에서 비롯되었습니다. 개별 결과는 사이트 복잡성 및 콘텐츠에 따라 다를 수 있습니다.