티스토리에서 워드프레스로 이사하는 방법

티스토리에서는 카카오 데이터센터 화재 사건 이후 글과 이미지를 백업할 수 있는 기능을 추가했습니다. 백업 파일을 이용하여 워드프레스로 이전하거나 웹 스크래핑 방식으로 티스토리 콘텐츠를 워드프레스로 임포트할 수 있습니다. 이 글에서는 데이터를 백업하여 워드프레스로 이사 가는 방법에 대하여 살펴보겠습니다.

내용이 제법 길고 어렵게 느껴질 수 있습니다. 먼저는 가벼운 마음으로 시험적으로 시도해보면 감이 올 것입니다. 전체적인 과정이 이해되었다면 본격적으로 시도할 수 있을 것입니다.

티스토리 이전: 웹 스크래퍼 방식 vs. 백업 파일을 이용한 임포트

본문에서는 티스토리 백업 파일을 이용하여 HTML 콘텐츠를 임포트하는 방식으로 이전하는 과정을 설명합니다.

아래 방법이 어렵게 느껴질 수 있습니다. 다른 방법으로 Crawlomatic Multisite Scraper Post Generator Plugin for WordPress라는 유료 플러그인을 사용하여 웹 스크래퍼 방식으로 콘텐츠를 크롤링하여 이전하는 것도 가능합니다.

워드프레스 웹 스크래퍼 방식으로 티스토리 사이트 이전하기

플러그인 개발자에게 문의하여 티스토리 블로그 글들을 크롤링 방식으로 임포트하는 것이 가능하다는 답변을 받았습니다. 이 플러그인을 활용하면 유머 사이트 등의 콘텐츠를 수집하여 워드프레스로 발행하는 것도 가능합니다.

이 플러그인을 구입하여 테스트해보니 글 개수가 많은 경우(예: 1000개 이상) 일괄적으로 이전하는 방법으로는 시간이 제법 걸릴 것 같습니다. (크롤링 방식은 본래 시간이 걸리는 편입니다.) 100~200개 정도씩 데이터를 옮겨서 약간 수정한 후에 발행하려는 경우 좋은 선택일 수 있습니다.

이미지를 워드프레스로 임포트할지 여부를 선택하는 옵션이 제공되고, 날짜, 카테고리 등을 매핑할 수 있습니다. 하지만 슬러그를 매핑하는 옵션은 제공되지 않기 때문에 URL을 그대로 유지할 수 없습니다. 웹 스크래핑 방식을 이용하는 경우 데이터 임포트 후에 슬러그를 수동으로 변경하는 것을 고려할 수 있습니다.

참고로 새벽에 테스트해보니 매우 빠르게 크롤링/스크래핑하지만, 방문자가 많은 시간대는 시간이 조금 걸리는 것을 확인했습니다. 방문자가 적은 시간대에 실행하면 짧은 시간에 많은 포스트를 임포트할 수 있으리라 생각됩니다.

Crawlomatic 플러그인을 사용하여 티스토리 블로그 글을 워드프레스로 옮기는 자세한 방법은 다음 글을 참고해보세요.

티스토리 백업 파일을 이용하여 워드프레스로 이사하기

아래 과정은 한 번 만에 만족스러운 결과가 나오지 않을 수도 있습니다. 먼저 시도해보시고, 잘 되지 않는 경우 사이트를 초기화한 후에 다시 시도해볼 수 있습니다. 먼저는 백업본을 만든 후에 잘못될 경우 되돌린 후에 다시 시도하면 편리할 것입니다. 한 두 번 시도해보시면 어떤 식으로 진행할지 감이 잡힐 것입니다. 궁금한 점이 있다면 아래 댓글이나 네이버 블로그의 Q&A 게시판을 이용해주세요.

티스토리 백업 파일은 html 파일로 되어 있습니다. 플러그인을 사용하여 html 파일의 콘텐츠를 워드프레스 포스트(글)로 임포트할 수 있습니다.

다음 단계에 따라 티스토리 블로그를 워드프레스로 이사할 수 있습니다.

아래의 과정은 클라우드웨이즈에서 잘 작동했지만 일부 웹호스팅에 설치된 워드프레스에서는 작동하지 않았습니다. 이용하는 호스팅에 따라 작동하지 않을 수도 있습니다.

  1. 티스토리 데이터 백업
  2. 파일 가공하기 (파일 이름, 이미지 URL 등 조정하기)
  3. 웹호스팅 가입하여 워드프레스 설치하기
  4. 티스토리 백업 파일 업로드하기
  5. HTML Import 2 플러그인을 사용하여 이전 실시하기
  6. 이전 후 이미지 URL 변경 등 이전 후 작업하기
  7. 테마 설정/플러그인 설치 및 설정

이 방법은 아직도 제대로 작동하는 것을 확인했습니다. 임포트 후에 슬러그가 숫자인 경우 “-2″가 붙는 현상이 발생한다면 이 글의 맨 아래에 있는 URL에 “-2″가 추가되는 경우 섹션을 참고해보세요.

티스토리 데이터 백업하기

먼저 티스토리 데이터를 백업합니다. 티스토리 관리자 페이지에 로그인한 다음, 관리 » 블로그를 클릭하고 데이터 관리 섹션의 데이터 관리하기 부분을 클릭하여 백업을 진행할 수 있습니다.

티스토리 백업

블로그 백업 페이지에서 “위 안내 사항을 모두 확인하였으며, 데이터 백업을 진행합니다.” 체크란을 체크하고 백업하기 버튼을 클릭하면 백업이 시작됩니다.

티스토리 블로그 백업

기다리면 백업이 완료되고 알림이 표시됩니다. 백업 파일은 zip 압축 파일 포맷으로 되어 있습니다. 반디집 등의 압축 프로그램을 사용하여 압축을 해제할 수 있습니다. (알집 등 알시리즈 제품은 가급적 사용하지 마세요.?)

백업 파일의 압축을 해제하면 글들이 각 하위 폴더 내에 html 파일로 되어 있습니다.

티스토리 블로그 백업 데이터

웹호스팅 가입하기

백업을 하였다면 새로 이사 갈 사이트를 만들어야 합니다. 워드프레스를 운영하기 위해서는 웹호스팅에 가입해야 하고, 도메인도 등록해야 합니다.

블로그를 시작하는 경우에는 카페24의 저가형 상품(월 1,100원 상품 등)을 이용하는 것도 가능합니다.

티스토리 블로그에 이미지가 많다면 웹 용량이 큰 상품을 선택해야 합니다. 특히 워드프레스로 이미지 파일을 임포트할 경우 더 많은 웹 공간이 필요합니다.

워드프레스 설치하기

요즘 웹호스팅에서는 가입하면 곧바로 워드프레스가 설치되어 운영이 가능하거나 워드프레스 자동 설치 옵션을 제공합니다.

우선은 워드프레스를 설치하고 테마를 선택하여 워드프레스를 시작할 수 있도록 준비합니다. 테마는 추후에 변경할 수 있습니다. 그리고 플러그인도 당장은 설치하지 않아도 됩니다.

※ 2023년 7월 3일 추가: 티스토리에서 URL을 문자로 지정한 경우, 워드프레스로 이전 시 워드프레스에서 URL 길이 제한으로 인해 기존 URL가 새 URL이 잘 매칭이 안 될 수 있습니다. URL이 문자 형식인 경우 먼저 다음 글에서 소개하는 플러그인을 설치하면 매칭 오류를 줄일 수 있습니다.

티스토리 백업 데이터 가공하기 – HTML 파일 이름 변경

티스토리 백업 데이터는 html 파일로 제공됩니다. 우선 html 파일의 이름을 폴더의 이름으로 대체하도록 합니다.

예시:

1234-글-제목.html  ==> 1234.html

저는 Bulk Rename Utility라는 프로그램을 사용하여 html 파일의 이름을 폴더의 이름으로 일괄적으로 대체했습니다.

티스토리 백업 파일을 이용하여 워드프레스로 이사하기

프로그램을 실행한 다음, 폴더를 선택하고 위와 같이 설정하도록 합니다. 그런 다음, 모든 파일을 선택하고 Rename 버튼을 클릭하면 파일 이름이 일괄 변경됩니다.

※블로그 주소 형식이 “문자”인 경우에는 다음과 같이 HTML 파일이 변경되어야 합니다.

1234-글-제목.html  ==> 글-제목.html

이와 같이 일괄 변환하는 방법은 이 글의 “추가: 티스토리 글 URL이 ‘문자’로 설정되어 있는 경우” 부분을 참고해보세요.

티스토리 백업 데이터 가공하기 – 이미지 파일에서 공백 제거하기

img 폴더 내의 이미지 파일의 이름에는 공백이 없어야 합니다.

Yoast-SEO-Search-Console.jpg (O)
Yoast SEO Search Console.jpg (X)

만약 이미지 파일 이름에 공백이 있다면 공백을 대시(-) 등으로 일괄 변경하여 스페이스를 제거해야 합니다. 그렇지 않으면 이미지를 미디어 라이브러리로 임포트할 수 없게 됩니다.

저는 살펴보니 일부 글에서 이미지 파일 이름에 공백이 있었습니다. 파일 이름에 공백이 있는 이미지 파일 이름이 많다면 추가적으로 다음 작업을 진행해야 합니다.

  1. 이미지 파일 이름에서 공백을 하이픈(-)으로 대체하기
  2. 모든 html 파일에서 이미지 경로에 있는 공백을 하이픈(-)으로 대체하기

혹시 이미지 파일 이름에 공백이 있는 경우 다음 글에서 다루는 방법을 통해 이미지 파일에서 공백을 모두 제거하시기 바랍니다.

티스토리 데이터를 워드프레스 포스트로 가져오기

위의 단계가 모두 완료되었다면 이제 티스토리 데이터를 워드프레스로 포스트(글)로 임포트할 수 있습니다.

FTP를 통해 티스토리 데이터를 업로드합니다. 이미지 파일이 많은 경우 웹 용량이 충분한지 확인하시기 바랍니다.

예를 들어, 이미지 크기가 1GB인 경우, 우선 ftp를 통해 업로드해야 하는 1GB 용량 외에 워드프레스에서 이미지들을 미디어 라이브러리로 임포트해야 하므로 2~3GB 용량이 필요할 수 있습니다. 워드프레스에서는 다음 그림과 같이 원본 이미지만 있는 것이 아니라 여러 크기의 썸네일을 생성하므로 생각보다 많은 웹 용량이 있어야 할 것입니다.

워드프레스 이미지

위의 그림에서는 3가지 크기가 추가로 생성되었지만 설치하는 테마나 플러그인에 따라 더 많은 크기의 썸네일이 생성될 수도 있습니다.

FTP를 통해 웹서버에 접속하여 워드프레스가 설치된 루트 폴더에 tistory라는 폴더를 만들고 티스토리 백업 파일들을 업로드합니다. (폴더 이름은 원하는 대로 지정하도록 합니다.)

티스토리 백업 데이터 업로드

FTP 사용 방법은 여기를 참고해보세요.

이제 마지막 단계로서 html 파일을 워드프레스 포스트로 변환할 수 있습니다. 워드프레스 관리자 페이지에 로그인한 다음, 플러그인 » 새로 추가를 선택하고 “HTML Import 2“를 검색하여 HTML Import 2 플러그인을 설치하고 활성화합니다.

이 플러그인은 5년 이상 업데이트가 안 되었지만 최신 워드프레스에서 잘 작동할 것입니다.

설정 » HTML Import를 클릭합니다.

File 탭

File 탭에서는 다음과 비슷하게 지정하도록 합니다.

플러그인을 사용하여 티스토리 백업 파일을  워드프레스로 이사하기

Directory to import에서는 “워드프레스 설치 폴더/tistory“로 입력하면 됩니다. 워드프레스 설치 디렉터리 경로는 Hint 부분에 있으므로 참고하시기 바랍니다.

Old site URL은 중요한 것 같지는 않습니다. File extensions to include에는 html을 입력합니다.

그리고 Preserve file names 섹션에서는 Use the file’s name as the imported page’s slug를 체크하도록 합니다.

Content 탭

Content 탭에서는 다음 그림과 같이 설정합니다.

티스토리 백업 파일을 이용하여 워드프레스로 마이그레이션

Select content by 부분은 제 티스토리 블로그의 백업 데이터를 기준으로 한 것입니다. 이 부분은 티스토리에 사용된 스킨에 따라 다른지는 모르겠습니다. 아마도 모든 티스토리 백업 파일에서 동일하지 않을까 생각됩니다.

More content options에서는 Import linked images 옵션을 체크하도록 합니다.

[navytext]업데이트:[/navytext] Import linked images(링크된 이미지 가져오기)는 체크하지 않아도 될 것 같습니다. 이 글을 작성할 당시에는 이미지가 제대로 임포트되고 포스트에서 이미지 URL이 올바른 이미지 URL로 바뀌었지만, 이후에 콘텐츠에서 이미지 URL이 바뀌지 않는 현상이 발생했습니다. 그러므로 이미지를 가져오지 말고, 대신 서버에 업로드한 티스토리 백업본 폴더 내의 이미지를 사용하도록 약간의 조정을 하는 것이 바람직한 것 같습니다. 혹시 모르니 백업을 한 다음, 이 옵션을 체크하지 않고 진행해도 문제가 없다면 그대로 진행하고, 완료 후에 문제가 발생할 경우 백업본을 사용하여 복원한 후에 이 옵션을 체크한 후에 다시 과정을 반복하는 것도 고려해보세요.

Title & Metadata 탭

Title & Metadata 탭에서는 아래 그림과 같이 설정합니다.

티스토리 백업 파일을 이용하여 워드프레스로 옮기기

Import files as는 “글”을 선택하고 Set status todraft (임시글) 또는 publish (발행)를 선택합니다.

그리고 Set timestamps to 옵션을 custom field로 지정하고 Custom Fields 탭에서 설정해주어야 글 발행 날짜가 티스토리에서 발행한 글 날짜로 임포트됩니다.

Custom Fields 탭

Custom Fields 탭에서는 Select date by 섹션을 아래와 같이 지정하도록 합니다.

블로그 날짜 설정하기

Categories & Tags

카테고리와 태그는 매핑할 수 없지만, 티스토리 스킨에서 카테고리가 표시되도록 수정한 다음, 카테고리를 커스텀 필드로 저장되도록 할 수 있습니다. 임포트 후에 커스텀 필드 값을 카테고리로 지정하는 것을 시도할 수 있습니다.

이제 하단의 Save Settings를 클릭하고 파일 임포트를 실행할 수 있습니다.

✅임포트 후에 이미지가 엑박으로 표시되는 경우 이 글을 참고하여 문제를 해결해보시기 바랍니다. 또는, 임포트를 진행하기 전에 이미지 경로를 변경하는 것도 고려할 수 있습니다. 이 경우 다음 PHP 코드를 사용할 수 있습니다.

<?php
$dir = new DirectoryIterator('/home/1046924.cloudwaysapps.com/bgvbpvqjfy/public_html/tistory'); // Set initial directory to '/public_html/tistory'

// Loop through all sub-directories
foreach ($dir as $fileInfo) {
    if($fileInfo->isDot() || !$fileInfo->isDir()) continue; // skip if not a directory or is '.' or '..'

    $post_id = $fileInfo->getFilename(); // Get the directory name, i.e., post_id

    // Now iterate over each file in the directory
    foreach(new DirectoryIterator($fileInfo->getPathname()) as $file) {
        if($file->isDot() || $file->isDir()) continue; // skip if not a file or is '.' or '..'

        // Check if file is HTML
        if(pathinfo($file->getFilename(), PATHINFO_EXTENSION) === 'html') {
            // Read HTML file
            $htmlContent = file_get_contents($file->getPathname());

            // Use regex to replace the image src
            $htmlContent = preg_replace_callback(
                '#<img\s(.*?)src="(./img/([^"]*?))"(.*?)>#',
                function($matches) use ($post_id) {
                    $imgName = $matches[3]; // the part of regex that captures the image name
                    return '<img ' . $matches[1] . 'src="https://wordpress-1046924-3681420.cloudwaysapps.com/tistory/' . $post_id . '/img/' . $imgName . '"' . $matches[4] . '>';
                },
                $htmlContent
            );

            // Write the new HTML content back to the file
            file_put_contents($file->getPathname(), $htmlContent);

            // Print out a message for each file modified
            echo "/{$post_id}/{$file->getFilename()} completed<br/>";
        }
    }
}

// Print out a message when all files are processed
echo "All completed";

?>

파일 경로도 동일한 방법으로 변환할 수 있습니다.

<?php
$dir = new DirectoryIterator('/home/1217020.cloudwaysapps.com/efuwktndmt/public_html/wp-content/uploads/tistory'); // Set initial directory to '/public_html/wp-content/uploads/tistory'

// Loop through all sub-directories
foreach ($dir as $fileInfo) {
    if ($fileInfo->isDot() || !$fileInfo->isDir()) continue; // Skip if not a directory or is '.' or '..'

    $post_id = $fileInfo->getFilename(); // Get the directory name, i.e., post_id

    // Now iterate over each file in the directory
    foreach (new DirectoryIterator($fileInfo->getPathname()) as $file) {
        if ($file->isDot() || $file->isDir()) continue; // Skip if not a file or is '.' or '..'

        // Check if file is HTML
        if (pathinfo($file->getFilename(), PATHINFO_EXTENSION) === 'html') {
            // Read HTML file
            $htmlContent = file_get_contents($file->getPathname());

            // Use regex to replace the image src
            $htmlContent = preg_replace_callback(
                '#<img\s(.*?)src="(./img/([^"]*?))"(.*?)>#',
                function ($matches) use ($post_id) {
                    $imgName = $matches[3]; // The part of regex that captures the image name
                    return '<img ' . $matches[1] . 'src="https://wordpress-1217020-4324420.cloudwaysapps.com/wp-content/uploads/tistory/' . $post_id . '/img/' . $imgName . '"' . $matches[4] . '>';
                },
                $htmlContent
            );

            // Use regex to replace the file href
            $htmlContent = preg_replace_callback(
                '#<a\s(.*?)href="(./file/([^"]*?))"(.*?)>#',
                function ($matches) use ($post_id) {
                    $fileName = $matches[3]; // The part of regex that captures the file name
                    return '<a ' . $matches[1] . 'href="https://wordpress-1217020-4324425.cloudwaysapps.com/wp-content/uploads/tistory/' . $post_id . '/file/' . $fileName . '"' . $matches[4] . '>';
                },
                $htmlContent
            );

            // Write the new HTML content back to the file
            file_put_contents($file->getPathname(), $htmlContent);

            // Print out a message for each file modified
            echo "/{$post_id}/{$file->getFilename()} completed<br/>";
        }
    }
}

// Print out a message when all files are processed
echo "All completed";

?>

✅자바스크립트를 이용하여 이미지 경로를 재설정하는 방법을 원하지 않는 경우에는 콘텐츠를 임포트하기 전에 PHP를 사용하여 경로를 재설정하는 것을 고려할 수 있습니다. “티스토리에서 워드프레스로 이전하기: 이미지 경로를 절대 경로로 변경하기” 글을 참고해보세요.

✅이 플러그인은 카테고리 매핑 기능은 제공되지 않고 임포트한 모든 글에 동일한 카테고리를 지정할 수 있는 옵션이 제공됩니다. 커스텀 필드를 추가하여 카테고리를 지정하는 것이 가능합니다. 커스텀 필드(사용자 정의 필드)를 사용하여 카테고리를 가져오는 방법은 여기를 참고해보세요.

저는 이 방법으로 테스트로 티스토리 블로그를 이전해 보니 제대로 이전되었습니다.

티스토리 원본
티스토리 원본
워드프레스로 이전 후
워드프레스로 이전 후.

데이터 임포트 후 작업

데이터를 임포트한 후에는 FTP 서버에서 tistory 백업 파일을 삭제하고 HTML Import 2 플러그인도 제거하도록 합니다.

임포트 시 “Importing HTML files… There has been a critical error on this website.” 에러가 표시될 수도 있습니다. 이 경우 실제로 실패할 수도 있지만, 데이터가 제대로 임포트되는 경우에도 이 오류 메시지가 표시될 수 있습니다.

이제 워드프레스 관리자 페이지 » 글 » 모든 글을 클릭하면 티스토리 글들이 임포트된 것을 확인할 수 있습니다. 또한, 미디어 라이브러리에 이미지 파일들이 임포트되어 있을 것입니다.

링크에 기존 티스토리 URL이 있다면 플러그인을 사용하여 일괄적으로 변경이 가능합니다(예: example.tistory.com => your-domain.co.kr).

전체 백업을 한 후에 URL을 일괄 변경하시기 바랍니다.

리디렉션 설정하기

이전이 완료되었다면 기존 티스토리 주소로 유입되는 방문자들을 새로운 주소로 리디렉션시켜주어야 합니다(예: example.tistory.com => your-domain.co.kr).

이와 관련하여 다음과 같은 코드(출처: How to redirect from a domain to another keeping the path component?)를 티스토리 HTML 파일 편집에서 <head>…</head> 부분에 추가하여 테스트해볼 수 있습니다.

<script>
window.location.href = "http://" + "here-your-target-domain" + window.location.pathname
</script>

실제로 잘 작동하는지는 체크해보지 않았습니다. 잘 안 되는 경우 아래 댓글을 통해 알려주시면 테스트해보고 잘 작동하는 코드로 대체하도록 하겠습니다.

추가: 티스토리에서 리디렉션을 설정하면 어뷰징으로 계정이 정지될 수 있다고 하네요. 리디렉션과 관련하여 이러한 리스크가 있으므로 주지하셔서 사용 여부를 결정할 수 있습니다. 티스토리 블로그의 헤더에 noindex 메타태그를 입력하고 리디렉션을 지연시켜 실행되도록 하는 것은 어떨까 하는 생각이 드네요. SEO에 미칠 수 있는 영향을 모니터링하여 적합한 방법을 찾아보시기 바랍니다.

개인 도메인을 티스토리에 연결하여 사용하다가 워드프레스로 이전하는 경우에는 보통 리디렉션을 설정할 필요가 없지만, 이전 후 주소가 변경되는 경우에는 Redirection 플러그인을 설치하여 리디렉션을 정교하게 설정하는 것이 가능합니다. 정규표현식을 조금 알면 어렵지 않게 301 리디렉션 설정이 가능할 것입니다.

고전 편집기 vs. 블록 에디터

워드프레스에서는 블록 에디터가 기본 편집기로 사용되고 있습니다. 단축키를 익혀서 활용하면 능률적으로 글 작성이 가능합니다.

HTML Import 2 플러그인을 사용하여 티스토리 데이터를 임포트하면 고전 편집기에서 글이 편집됩니다. 이는 HTML 태그 때문인데요. 원하는 경우 “블록으로 변환”이 가능합니다. 하지만 HTML 태그 때문에 제대로 변환되지 않을 것입니다. 글을 수정해야 하는 경우 아래의 단계에 따라 블록으로 변환이 가능합니다. (이 단계는 굳이 할 필요가 없지만 글을 블록 에디터에서 수정하고 싶은 경우에 참고하세요.)

① 글 편집 화면에서 Ctlr+Shift+Alt+M 단축키를 눌러 HTML 모드로 전환합니다.

② 맨 위의 <div class=”contents_style”>과 맨 아래의 “</div>”를 삭제합니다.

블록으로 변환하기

③ Ctlr+Shift+Alt+M 단축키를 눌러 비주얼 보기로 전환합니다.

④ 글 본문을 선택하고 상단의 블록으로 변환 버튼을 클릭하면 정상적으로 블록으로 변환될 것입니다.

임포트 후에 모든 글에서 불필요한 HTML 태그 제거하기

임포트 후에 위의 방법과 같이 개별 글에서 <div class=”contents_style”>…</div> 태그를 제거하는 방법 대신 모든 글에서 일괄적으로 이 태그를 삭제하는 것도 가능합니다.

phpMyAdmin 등의 데이터베이스 툴을 사용하여 DB에 접속하여 다음 명령을 수행하면 <div class=”contents_style”> 태그가 삭제됩니다.

UPDATE wp_posts 
SET post_content = REPLACE (
    post_content, 
    '<div class="contents_style">', 
    ''
);

DB 작업은 위험하므로 반드시 백업을 실시한 후에 진행하시기 바랍니다. 이러한 작업이 무엇을 의미하는지 이해하지 못한 경우에는 실행하지 않는 것이 안전합니다.

각 포스트의 끝에 있는 </div>를 제거하는 것은 간단하지 않습니다. 다음과 같은 PHP 파일을 만들어서 실행하면 각 블로그 글의 끝에 위치한 </div>가 삭제됩니다.

<?php 

require_once('wp-load.php');
// Get global database object
global $wpdb;

// Query to get all posts
$posts = $wpdb->get_results("SELECT ID, post_content FROM {$wpdb->prefix}posts WHERE post_type='post'");

// Loop through each post
foreach ($posts as $post) {
    // Check if content ends with '</div>'
    if (substr($post->post_content, -6) === '</div>') {
        // Remove '</div>' at the end of the content
        $new_content = substr($post->post_content, 0, -6);

        // Update the post in the database
        $wpdb->update(
            "{$wpdb->prefix}posts",
            ['post_content' => $new_content],
            ['ID' => $post->ID]
        );
    }
}

?>

예를 들어, wp-config.phpwp-content.php 파일이 위치한 곳에 tistory.php 파일을 만들고, 위의 코드를 추가한 다음, 실행할 수 있습니다. 한 번만 실행하고 PHP 파일은 삭제하도록 합니다.

✅ 위의 작업에도 불구하고 HTML 태그가 사라지지 않는 경우에는 Object Cache Pro가 사용되고 있을 수 있습니다. 2GB (램) 이상의 서버 크기를 이용한다면 Redis를 비활성화(정지)하면 문제가 해결될 것입니다.

HTML Import 2 플러그인 실행 시 오류

HTML Import 2 플러그인을 설정하고 임포트 실행을 누르면 치명적인 오류가 발생하는 경우가 있습니다.

HTML Importer
Importing HTML files...
There has been a critical error on this website.
이 웹사이트에 치명적인 오류가 있습니다.

두 가지 상황에서 이 오류가 발생할 수 있습니다.

  1. 플러그인이 현재 이용 중인 웹호스팅 서버와 호환이 되지 않아서 플러그인이 제대로 실행되지 않는 경우
  2. 임포트할 콘텐츠가 많은 경우에 서버 리소스 부족으로 인해 오류 메시지 발생

첫 번째의 경우 임포트에 실패하게 됩니다. 저는 몇 군데의 웹호스팅에서 테스트했는데, 클라우드웨이즈, Vultr/Digital Ocean, PHP 7.4 환경에서 제대로 작동했습니다.

두 번째의 경우 임포트에 성공했지만 오류 메시지가 표시될 수 있습니다. 글 » 모든 글에서 콘텐츠가 제대로 임포트되었는지 체크해보세요. 참고로 링크된 이미지를 가져오는 옵션을 해제하면 이 오류가 발생할 가능성이 줄어듭니다.

DigitalOcean 2GB 램 크기의 서버에서 위와 같은 오류 메시지가 표시되면서 임포트에 성공했지만, 비슷한 크기의 사이트를 디지털오션 4GB 램 크기의 서버에서는 오류 메시지를 표시하지 않고 임포트에 성공했습니다. 오류 메시지가 표시되지 않고 성공하면 .htaccess 파일에 추가할 리디렉션 코드를 제시합니다. 글 개수가 많은 경우(예: 1000개 혹은 2000개 이상), .htaccess 파일에 추가할 코드가 너무 길어서 오류 메시지가 표시되는 것은 아닌가 생각됩니다.

특성 이미지 지정하기

상기 방법으로 티스트로 블로그 콘텐츠를 워드프레스로 옮기면 특성 이미지가 지정되지 않습니다. 이 경우 “워드프레스 콘텐츠 내의 외부 이미지를 자동으로 특성 이미지로 설정하기“에서 소개하는 FIFU(Featured Image from URL) 플러그인을 사용하면 포스트 내의 첫 번째 이미지를 자동으로 특성 이미지로 설정하게 됩니다.

URL에 “-2″가 추가되는 경우

워드프레스에서는 이미지, 글 등 모든 요소에 ID를 부여합니다. 이 때문에 슬러그에 숫자를 지정하면 “숫자-2″로 바뀔 수 있습니다.

이 문제를 해결하려면 설정 » 고유주소에서 고유주소 설정을 사용자 정의구조를 선택하고 /blog/%postname%/을 입력하시기 바랍니다. blog 대신 entry 등으로 바꾸어도 됩니다.

워드프레스 고유주소 설정

티스토리에 개인 도메인을 연결한 후에 워드프레스로 이사하고 개인 도메인을 다시 워드프레스 연결한 경우, 301 리디렉션을 설정하여 https://example.com/숫자로 된 URL을 클릭 시 https://example.com/blog/숫자로 리디렉션되도록 설정해야 합니다.

.htaccess 파일에 다음과 같은 코드를 추가할 수 있습니다.

RedirectMatch 301 ^/(\d+)$ https://example.com/blog/$1

만약 모바일 버전(/m/숫자)도 네이버나 구글에서 노출된다면 다음과 같은 코드를 사용해보세요.

RedirectMatch 301 ^/(m/)?(\d+)$ https://example.com/blog/$2

위의 코드를 추가한 후에 리디렉션이 제대로 되는지 반드시 테스트해보세요. 301 리디렉션을 잘못 설정할 경우 SEO에 문제가 발생하게 됩니다. .htaccess 파일 편집을 위해서는 FTP에 접속이 가능해야 합니다.

마치며

이상으로 티스토리 백업 데이터를 워드프레스로 이전하는 방법에 대하여 살펴보았습니다. 이 방법을 이용하면 포스트와 이미지를 모두 이전이 가능합니다.

이 방법은 PHP 7.4, 워드프레스 6.3.2 버전에서 잘 작동합니다. 추후 워드프레스가 업데이트되면서 플러그인과 호환이 되지 않을 경우 워드프레스 버전을 다운그레이드한 후에 이전 작업을 실시할 수 있습니다. 이전이 완료되면 PHP 버전과 워드프레스 버전을 최신 버전으로 바꿀 수 있습니다.

워드크래커는 워드프레스 정보꾸러미 블로그와 워드프레스를 사용하는 사람들(네이버 카페)을 운영하고 있습니다.

0 0 votes
Article Rating
Subscribe
Notify of
0 Comments
Inline Feedbacks
View all comments