Migrate WordPress to Custom PHP Without Losing SEO – BuiltToWinWeb
EN ES FR DE IT PT ZH JA KO RU NL
← Back to all articles
?>

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

WordPress에서 맞춤형 PHP 코드베이스로 전환하면 TTFB를 70%까지 줄이고, 플러그인 취약점을 제거하며, 100% 소유권을 얻을 수 있습니다. 그러나 리디렉션과 메타데이터를 잘못 처리하면 순위가 급락합니다. 저는 30개 이상의 WordPress 사이트를 마이그레이션했습니다 – 여기에 SEO를 보존(하고 종종 개선)하는 정확한 프로세스가 있습니다.

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이 수행한 실제 클라이언트 마이그레이션에서 비롯되었습니다. 개별 결과는 사이트 복잡성 및 콘텐츠에 따라 다를 수 있습니다.