데이터 이전을 해야 하는 상황에서는 첨부파일을 일반적 절차에 따라 넣기가 힘들다. 폼으로 첨부파일을 넘기지 못하고 그냥 copy를 해야 하는데, 이 경우 워드프레스 시스템 안에 첨부파일을 넣고, 특정 포스트와 첨부파일을 연결시키고, 첨부파일의 메타데이터들을 생성하는 작업은 수동으로 해야 한다.

여기서는 첨부파일을 복사한 뒤에 첨부파일을 특정 포스트와 연결하고, 생성해야 하는 메타데이터들을 어떤 것이 있는지 설명한다.

아래 코드에 주석을 붙였다.

// $old_path: 넣어야 하는 첨부파일이 있는 경로.
// 예컨대 /home/ubuntu/Downloads/old-site/data/my-picture.jpg
// 파일명만 따로 뽑아 둔다.
$file_basename = pathinfo($old_path, PATHINFO_BASENAME);

// 워드프레스의 업로드 폴더 경로에 연/월로 폴더 경로를 덧붙여 기본 url 경로를 뽑는다. 
// 사용하는 워드프레스 시스템에 따라 달리 해도 된다.
$baseurl = wp_get_upload_dir()['baseurl'].'/'.date('Y/m');

// 첨부파일을 복사할 경로.
$dest_path = $basedir.'/'.$file_basename;

if ( ! is_dir($basedir)) {
    // 첨부파일을 복사할 경로가 없으면 만든다.
    mkdir($basedir, 0777, true);
}

// 첨부파일이 중복되면 숫자를 붙여서 파일명을 달리해 준다.
$i = 0;
while (file_exists($dest_path)) {
    $i++;
    $dest_path = $basedir.'/'.pathinfo($old_path, PATHINFO_FILENAME)."-$i.".pathinfo($old_path, PATHINFO_EXTENSION);
}

// 첨부파일을 워드프레스 첨부파일 경로로 복사한다.
copy($old_path, $dest_path);

// 첨부파일용 포스트를 만들기 위한 데이터 구성
$post_data = array(
    'post_title' => $file_basename,
    'post_content' => '',
    'author' => 5,
    'post_status' => 'publish',
    'ping_status' => false,
    'guid' => $baseurl.'/'.$file_basename,
    'post_mime_type' => mime_content_type($old_path),
);

// 워드프레스에서 모든 첨부파일은 또 하나의 post다. 
// 첨부파일 post의 post_type은 attachment다.
// wp_insert_attachment 함수를 이용하면 그렇게 들어간다.
// 이 함수의 첫 번째 인자값은 $post_data다.
// 두 번째 인자값은 워드프레스 사이트에 첨부된 첨부파일의 경로다. 
// 이 데이터에 따라 _wp_attached_file 메타 정보가 wp_postmeta 테이블에 생성된다.
// 세 번째 인자값으로 이 첨부파일을 연결할 post의 ID($post_id)를 넣어 준다. 
// 그러면 미디어 페이지에서는 글이, 글에서는 미디어가 연결돼 있다는 사실이 나오게 된다.
$attachment_id = wp_insert_attachment($post_data, $dest_path, $post_id);

// 첨부파일의 메타 데이터를 생성한다. 
// 이미지라면 사이즈별 경로, 너비, 높이 정보 같은 것이 생성돼 
// _wp_attachment_metadata라는 이름으로 wp_postmeta 테이블에 생성된다.
wp_generate_attachment_metadata($attachment_id, $dest_path);

이상이다.