[{"data":1,"prerenderedAt":2342},["ShallowReactive",2],{"article-much-post-migration-wp":3},{"id":4,"title":5,"body":6,"category":2329,"createdAt":2331,"description":5,"extension":2332,"index":2333,"meta":2334,"navigation":228,"path":2335,"publish":228,"seo":2336,"series":2333,"seriesTitle":2333,"stem":2337,"tag":2338,"thumbnail":2340,"updatedAt":2331,"__hash__":2341},"articles\u002Farticles\u002Fmuch-post-migration-wp.md","別CMSで作成された4万件分の大量投稿をwordpressに引越しする",{"type":7,"value":8,"toc":2311},"minimark",[9,13,20,23,28,31,38,51,54,62,68,78,81,84,95,98,101,104,119,122,125,132,135,138,166,169,180,186,189,192,487,490,496,499,502,506,513,519,525,535,572,578,581,584,587,708,711,714,808,827,867,870,876,945,948,1067,1073,1076,1079,1082,1085,1091,1094,1100,1107,1113,1116,1120,1123,1126,1260,1266,1551,1558,1609,1612,1663,1673,1676,1679,1806,1820,1823,1826,1829,1976,1984,2214,2221,2235,2246,2258,2261,2265,2268,2274,2281,2284,2290,2293,2304,2307],[10,11,12],"p",{},"こんにちはjunです。会社でとてつもない量のCMSのデータをwordpressに移行する計画がありました。色々と課題がある中なんとかwordpressにデータをマイグレーションして再構築できたので共有したいと思います。",[10,14,15,16],{},"データが４万件もあるのでプログラム的にwordpressを操作する必要がありました。日本語で検索してもなかなかヒットしなかったので、少し苦労。 ",[17,18,19],"strong",{},"しかしCLIがわかって、使う関数を把握すれば意外と簡単です。",[10,21,22],{},"引越しの背景から説明するので、「ささっと移行手順を見せろや！」という人は「wordpress側の構築概要」から見てください。",[24,25,27],"h2",{"id":26},"背景データ移行の課題","背景＆データ移行の課題",[10,29,30],{},"2006年に構築されたサイトを弊社が受け持っており、その環境が古くなってきたので移行することになりました。PHP5、centos6というレガシーな環境で動いており非常に危なっかしい上に、ろくに保守もされてないのでページングとか表示もおかしい部分も出てきました。",[10,32,33,34,37],{},"移行するサイトはwordpressではない ",[17,35,36],{},"別のCMSで構築されており、移行の際にはDBからデータを一回ダンプして加工してwordpressにマイグレーションをする必要がありました。"," しかしそのデータは",[39,40,41,45,48],"ul",{},[42,43,44],"li",{},"投稿４万件",[42,46,47],{},"ユーザー8200人",[42,49,50],{},"カテゴリー90件",[10,52,53],{},"というデータが膨大であり必然的にプログラム的にデータを移行する必要があります。とりあえず担当の方と移行するデータを精査しました。元々はコミュニティサイトとして使用していたのでユーザーが非常に多く、移行すべきアクティブなユーザーは100人程度だったのでユーザーはかなり減りました。しかし投稿は全部移行でした（泣",[10,55,56,57,61],{},"旧CMSでの「カテゴリー」はブログの種類に当てはまりました。ブログを管理、投稿する部署が異なっていることが判明し、投稿データにも ",[58,59,60],"code",{},"categoruid"," の様に区別するカラムがありました。さらに言えばユーザー情報にも紐づいています笑。",[10,63,64,67],{},[17,65,66],{},"投稿データは旧CMSで結び付けられたユーザーID、カテゴリーIDの関係性を維持しながら移行する必要があります。"," さらに投稿データには",[69,70,75],"pre",{"className":71,"code":73,"language":74},[72],"language-text","[img]http:\u002F\u002F~~~~~[\u002Fimg]\n","text",[58,76,73],{"__ignoreMap":77},"",[10,79,80],{},"という様なそのCMS独自のタグが存在したので、wordpressに移行する前に正規表現で置換する必要がありました。（今回はその解説はしません。別途の記事で）",[10,82,83],{},"まとめると",[39,85,86,89,92],{},[42,87,88],{},"データ数が膨大。",[42,90,91],{},"記事はカテゴリー、ユーザーとの関係性を維持する。",[42,93,94],{},"記事データの独自記法をwordpress用に置換または削除する。",[10,96,97],{},"という課題がありました。",[24,99,100],{"id":100},"wordpress側の構築概要",[10,102,103],{},"今回の移行手順としては前準備に",[105,106,107,110,113,116],"ol",{},[42,108,109],{},"旧CMSからデータをダンプ(mysql）してローカルに入れておく。",[42,111,112],{},"データ構成をよく観察する。",[42,114,115],{},"必要なデータをSQLを用いて取得、JSONで取得",[42,117,118],{},"JSONを元にPHPスクリプトでデータを加工",[10,120,121],{},"この様にデータの加工をしてwordpressに入れ込む準備をしました。加工済みデータJSONとwordpressの関数を用いてこれらのデータをwordpressに移行しました。",[10,123,124],{},"移行の特に厄介だったのが旧CMSでは部署ごとにカテゴリーという名前でブログ種が分けられていたことです。wordpressのカテゴリーとは別の概念です。さらに管理ユーザーもそのカテゴリーで区別されていました。",[10,126,127,128,131],{},"そこで今回は ",[17,129,130],{},"wordpressをマルチサイト構成にして構築しました。"," wordpressには一つのwordpressシステムを用いて複数の異なるブログを構築する機能があります。詳しくはこちらの公式を参照。マルチサイトにすることで複数のブログに分け、さらにそのブログごとにユーザーの割当が可能になります。",[24,133,134],{"id":134},"引越し手順",[10,136,137],{},"手順としては以下の通りです。",[105,139,140,142,144,146,148,151,154,157,160,163],{},[42,141,109],{},[42,143,112],{},[42,145,115],{},[42,147,118],{},[42,149,150],{},"wordpressプロジェクト内に上記のデータを移行、挿入用PHPスクリプトを作成",[42,152,153],{},"マルチサイト 構成をONにしてブログネットワークを機械的に作成",[42,155,156],{},"ユーザーを作成して適切なブログネットワークに割り当てる。",[42,158,159],{},"投稿データを対応するユーザーとブログネットワークに割り当てる。",[42,161,162],{},"画像などを移行する。（今回はやりません）",[42,164,165],{},"全てのブログネットワークに共通のテーマを設定する。",[24,167,168],{"id":168},"dockerで検証環境を構築",[10,170,171,172,179],{},"まずはローカルでの検証環境を作りましょう。失敗するとDBが結構汚れるのですぐにリセットできるdockerを用います。",[173,174,178],"a",{"href":175,"rel":176},"https:\u002F\u002Fhub.docker.com\u002F_\u002Fwordpress",[177],"nofollow","wordpress公式のdockerHub","の通りにすれば簡単に構築できます。ディレクトリ構成は以下の通りです。",[69,181,184],{"className":182,"code":183,"language":74},[72],"docker-wordpress\u002F\n|\n|-scrips\u002F\n|-docker-compose.yml\n",[58,185,183],{"__ignoreMap":77},[10,187,188],{},"scripts\u002F にはwordpressに挿入するためのPHPスクリプトを入れておくためのディレクトリです。最終的にこのwordpress dockerコンテナの中に入って、このスクリプトをコマンドで実行します。",[10,190,191],{},"docker-compose.yml は以下の通りです。（ほとんど公式と同じ。一部改修",[69,193,198],{"className":194,"code":195,"filename":196,"language":197,"meta":77,"style":77},"language-yml shiki shiki-themes material-theme-ocean","version: '3.1'\n\nservices:\n\n  wordpress:\n    image: wordpress\n    restart: always\n    ports:\n      - 8080:80\n    environment:\n      WORDPRESS_DB_HOST: db\n      WORDPRESS_DB_USER: exampleuser\n      WORDPRESS_DB_PASSWORD: examplepass\n      WORDPRESS_DB_NAME: exampledb\n    volumes:\n      - .\u002Fscripts:\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\n\n  db:\n    image: mysql:5.7\n    restart: always\n    environment:\n      MYSQL_DATABASE: exampledb\n      MYSQL_USER: exampleuser\n      MYSQL_PASSWORD: examplepass\n      MYSQL_RANDOM_ROOT_PASSWORD: '1'\n    volumes:\n      - db_wp:\u002Fvar\u002Flib\u002Fmysql\n\nvolumes:\n  .\u002Fscripts:\n  db_wp:\n","docker-compose.yml","yml",[58,199,200,223,230,239,244,252,263,274,282,291,299,310,321,332,343,351,359,364,372,382,391,398,408,418,428,443,450,458,463,471,479],{"__ignoreMap":77},[201,202,205,209,213,216,220],"span",{"class":203,"line":204},"line",1,[201,206,208],{"class":207},"s-wAU","version",[201,210,212],{"class":211},"sAklC",":",[201,214,215],{"class":211}," '",[201,217,219],{"class":218},"sfyAc","3.1",[201,221,222],{"class":211},"'\n",[201,224,226],{"class":203,"line":225},2,[201,227,229],{"emptyLinePlaceholder":228},true,"\n",[201,231,233,236],{"class":203,"line":232},3,[201,234,235],{"class":207},"services",[201,237,238],{"class":211},":\n",[201,240,242],{"class":203,"line":241},4,[201,243,229],{"emptyLinePlaceholder":228},[201,245,247,250],{"class":203,"line":246},5,[201,248,249],{"class":207},"  wordpress",[201,251,238],{"class":211},[201,253,255,258,260],{"class":203,"line":254},6,[201,256,257],{"class":207},"    image",[201,259,212],{"class":211},[201,261,262],{"class":218}," wordpress\n",[201,264,266,269,271],{"class":203,"line":265},7,[201,267,268],{"class":207},"    restart",[201,270,212],{"class":211},[201,272,273],{"class":218}," always\n",[201,275,277,280],{"class":203,"line":276},8,[201,278,279],{"class":207},"    ports",[201,281,238],{"class":211},[201,283,285,288],{"class":203,"line":284},9,[201,286,287],{"class":211},"      -",[201,289,290],{"class":218}," 8080:80\n",[201,292,294,297],{"class":203,"line":293},10,[201,295,296],{"class":207},"    environment",[201,298,238],{"class":211},[201,300,302,305,307],{"class":203,"line":301},11,[201,303,304],{"class":207},"      WORDPRESS_DB_HOST",[201,306,212],{"class":211},[201,308,309],{"class":218}," db\n",[201,311,313,316,318],{"class":203,"line":312},12,[201,314,315],{"class":207},"      WORDPRESS_DB_USER",[201,317,212],{"class":211},[201,319,320],{"class":218}," exampleuser\n",[201,322,324,327,329],{"class":203,"line":323},13,[201,325,326],{"class":207},"      WORDPRESS_DB_PASSWORD",[201,328,212],{"class":211},[201,330,331],{"class":218}," examplepass\n",[201,333,335,338,340],{"class":203,"line":334},14,[201,336,337],{"class":207},"      WORDPRESS_DB_NAME",[201,339,212],{"class":211},[201,341,342],{"class":218}," exampledb\n",[201,344,346,349],{"class":203,"line":345},15,[201,347,348],{"class":207},"    volumes",[201,350,238],{"class":211},[201,352,354,356],{"class":203,"line":353},16,[201,355,287],{"class":211},[201,357,358],{"class":218}," .\u002Fscripts:\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\n",[201,360,362],{"class":203,"line":361},17,[201,363,229],{"emptyLinePlaceholder":228},[201,365,367,370],{"class":203,"line":366},18,[201,368,369],{"class":207},"  db",[201,371,238],{"class":211},[201,373,375,377,379],{"class":203,"line":374},19,[201,376,257],{"class":207},[201,378,212],{"class":211},[201,380,381],{"class":218}," mysql:5.7\n",[201,383,385,387,389],{"class":203,"line":384},20,[201,386,268],{"class":207},[201,388,212],{"class":211},[201,390,273],{"class":218},[201,392,394,396],{"class":203,"line":393},21,[201,395,296],{"class":207},[201,397,238],{"class":211},[201,399,401,404,406],{"class":203,"line":400},22,[201,402,403],{"class":207},"      MYSQL_DATABASE",[201,405,212],{"class":211},[201,407,342],{"class":218},[201,409,411,414,416],{"class":203,"line":410},23,[201,412,413],{"class":207},"      MYSQL_USER",[201,415,212],{"class":211},[201,417,320],{"class":218},[201,419,421,424,426],{"class":203,"line":420},24,[201,422,423],{"class":207},"      MYSQL_PASSWORD",[201,425,212],{"class":211},[201,427,331],{"class":218},[201,429,431,434,436,438,441],{"class":203,"line":430},25,[201,432,433],{"class":207},"      MYSQL_RANDOM_ROOT_PASSWORD",[201,435,212],{"class":211},[201,437,215],{"class":211},[201,439,440],{"class":218},"1",[201,442,222],{"class":211},[201,444,446,448],{"class":203,"line":445},26,[201,447,348],{"class":207},[201,449,238],{"class":211},[201,451,453,455],{"class":203,"line":452},27,[201,454,287],{"class":211},[201,456,457],{"class":218}," db_wp:\u002Fvar\u002Flib\u002Fmysql\n",[201,459,461],{"class":203,"line":460},28,[201,462,229],{"emptyLinePlaceholder":228},[201,464,466,469],{"class":203,"line":465},29,[201,467,468],{"class":207},"volumes",[201,470,238],{"class":211},[201,472,474,477],{"class":203,"line":473},30,[201,475,476],{"class":207},"  .\u002Fscripts",[201,478,238],{"class":211},[201,480,482,485],{"class":203,"line":481},31,[201,483,484],{"class":207},"  db_wp",[201,486,238],{"class":211},[10,488,489],{},"DBは永続化して、そしてスクリプトもローカルで編集してすぐに実行できる様にボリュームにマウントしておきます。これで準備完了です。",[69,491,494],{"className":492,"code":493,"language":74},[72],"jun@MacBook-Pro docker-wordpress % docker-compose up -d\n",[58,495,493],{"__ignoreMap":77},[10,497,498],{},"ブラウザを開いてlocalhost:8080にアクセスするとwordpressのインストール画面が開きます。DBの設定などは済んでいるので、初期ユーザーの設定だけで終わります。",[24,500,501],{"id":501},"マルチサイトを機械的に作成",[503,504,505],"h3",{"id":505},"マルチサイトの有効化",[10,507,508,509,512],{},"それではまず旧CMSのカテゴリーにあたる、マルチサイトを機械的に作成しましょう。その前に",[58,510,511],{},"wp-config.php","でやることがあります。以下の様なコードを追記してマルチサイト化を有効にします。",[69,514,517],{"className":515,"code":516,"language":74},[72],"define('WP_ALLOW_MULTISITE', true);\n",[58,518,516],{"__ignoreMap":77},[520,521],"image-render",{":src":522,":width":523,":center":524},"'_mix\u002Fwpml-197x300.png'","'300px'","true",[10,526,527,528,530,531,534],{},"有効にすると「ツール」から「サイトネットワークの設置」というメニューが出現します。これをクリックしてサイトネットワークの設定を行います。そして新しくコードを追記しろと言われるので以下の様に",[58,529,511],{}," と ",[58,532,533],{},".htaccess","に追記します。",[69,536,540],{"className":537,"code":538,"filename":511,"language":539,"meta":77,"style":77},"language-php shiki shiki-themes material-theme-ocean","define('MULTISITE', true);\ndefine('SUBDOMAIN_INSTALL', false);\ndefine('DOMAIN_CURRENT_SITE', 'localhost');\ndefine('PATH_CURRENT_SITE', '\u002F');\ndefine('SITE_ID_CURRENT_SITE', 1);\ndefine('BLOG_ID_CURRENT_SITE', 1);\n","php",[58,541,542,547,552,557,562,567],{"__ignoreMap":77},[201,543,544],{"class":203,"line":204},[201,545,546],{},"define('MULTISITE', true);\n",[201,548,549],{"class":203,"line":225},[201,550,551],{},"define('SUBDOMAIN_INSTALL', false);\n",[201,553,554],{"class":203,"line":232},[201,555,556],{},"define('DOMAIN_CURRENT_SITE', 'localhost');\n",[201,558,559],{"class":203,"line":241},[201,560,561],{},"define('PATH_CURRENT_SITE', '\u002F');\n",[201,563,564],{"class":203,"line":246},[201,565,566],{},"define('SITE_ID_CURRENT_SITE', 1);\n",[201,568,569],{"class":203,"line":254},[201,570,571],{},"define('BLOG_ID_CURRENT_SITE', 1);\n",[69,573,576],{"className":574,"code":575,"filename":533,"language":74,"meta":77},[72],"RewriteEngine On\nRewriteBase \u002F\nRewriteRule ^index\\.php$ - [L]\n\n# add a trailing slash to \u002Fwp-admin\nRewriteRule ^([_0-9a-zA-Z-]+\u002F)?wp-admin$ $1wp-admin\u002F [R=301,L]\n\nRewriteCond %{REQUEST_FILENAME} -f [OR]\nRewriteCond %{REQUEST_FILENAME} -d\nRewriteRule ^ - [L]\nRewriteRule ^([_0-9a-zA-Z-]+\u002F)?(wp-(content|admin|includes).*) $2 [L]\nRewriteRule ^([_0-9a-zA-Z-]+\u002F)?(.*\\.php)$ $2 [L]\nRewriteRule . index.php [L]\n",[58,577,575],{"__ignoreMap":77},[10,579,580],{},"なお、今回はドメイン別ではなくサブディレクトリ形式のマルチサイト とします。",[503,582,583],{"id":583},"サイト作成プログラム",[10,585,586],{},"移行元のデータはすでにJSONにしてあります。以下の様な構成とします。",[69,588,593],{"className":589,"code":590,"filename":591,"language":592,"meta":77,"style":77},"language-json shiki shiki-themes material-theme-ocean","[\n  ...\n  {\n    \"id\":\"6\",\n    \"name\":\"サイトの名前\",\n    \"sub_title\":\"サイトのキャッチフレーズ的なもの\",\n    \"mailUser\":\"3::1543\"\n  },\n  ...\n]\n","article_category.json","json",[58,594,595,600,606,611,635,655,675,694,699,703],{"__ignoreMap":77},[201,596,597],{"class":203,"line":204},[201,598,599],{"class":211},"[\n",[201,601,602],{"class":203,"line":225},[201,603,605],{"class":604},"s0W1g","  ...\n",[201,607,608],{"class":203,"line":232},[201,609,610],{"class":211},"  {\n",[201,612,613,616,620,623,625,627,630,632],{"class":203,"line":241},[201,614,615],{"class":211},"    \"",[201,617,619],{"class":618},"sJ14y","id",[201,621,622],{"class":211},"\"",[201,624,212],{"class":211},[201,626,622],{"class":211},[201,628,629],{"class":218},"6",[201,631,622],{"class":211},[201,633,634],{"class":211},",\n",[201,636,637,639,642,644,646,648,651,653],{"class":203,"line":246},[201,638,615],{"class":211},[201,640,641],{"class":618},"name",[201,643,622],{"class":211},[201,645,212],{"class":211},[201,647,622],{"class":211},[201,649,650],{"class":218},"サイトの名前",[201,652,622],{"class":211},[201,654,634],{"class":211},[201,656,657,659,662,664,666,668,671,673],{"class":203,"line":254},[201,658,615],{"class":211},[201,660,661],{"class":618},"sub_title",[201,663,622],{"class":211},[201,665,212],{"class":211},[201,667,622],{"class":211},[201,669,670],{"class":218},"サイトのキャッチフレーズ的なもの",[201,672,622],{"class":211},[201,674,634],{"class":211},[201,676,677,679,682,684,686,688,691],{"class":203,"line":265},[201,678,615],{"class":211},[201,680,681],{"class":618},"mailUser",[201,683,622],{"class":211},[201,685,212],{"class":211},[201,687,622],{"class":211},[201,689,690],{"class":218},"3::1543",[201,692,693],{"class":211},"\"\n",[201,695,696],{"class":203,"line":276},[201,697,698],{"class":211},"  },\n",[201,700,701],{"class":203,"line":284},[201,702,605],{"class":604},[201,704,705],{"class":203,"line":293},[201,706,707],{"class":211},"]\n",[10,709,710],{},"旧CMSからはこの様になっており、mailUserがこのカテゴリー（ブログ）を管理するユーザーです。wordpressのマルチサイトを作るには、初期管理ユーザーとサイト名があればとりあえず作れます。",[10,712,713],{},"そして追加スクリプトは以下の通りです。",[69,715,718],{"className":537,"code":716,"filename":717,"language":539,"meta":77,"style":77},"\u003C?php\nrequire_once('..\u002F..\u002Fwp-load.php');\n\n$json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fcategory\u002Farticle_categpry.json');\n$cats = json_decode($json,true);\n$new_id = 2;\nforeach($cats as $key=>&$val){\n    wpmu_create_blog('localhost','blog'.$key,$val['name'],1,array('blogdescription'=>$val['sub_title']));\n    \n    if( is_wp_error( $return ) ) {\n        print_r($return->get_error_message().\"\\n\");\n        continue;\n    }\n    \n    $val['new_id']=$new_id;\n    $new_id++;\n}\nfile_put_contents(\"\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fcategory\u002Fregistered_article_categpry.json\", json_encode($cats,JSON_UNESCAPED_UNICODE));\n","\u002Fscripts\u002Fcreate_site.php",[58,719,720,725,730,734,739,744,749,754,759,764,769,774,779,784,788,793,798,803],{"__ignoreMap":77},[201,721,722],{"class":203,"line":204},[201,723,724],{},"\u003C?php\n",[201,726,727],{"class":203,"line":225},[201,728,729],{},"require_once('..\u002F..\u002Fwp-load.php');\n",[201,731,732],{"class":203,"line":232},[201,733,229],{"emptyLinePlaceholder":228},[201,735,736],{"class":203,"line":241},[201,737,738],{},"$json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fcategory\u002Farticle_categpry.json');\n",[201,740,741],{"class":203,"line":246},[201,742,743],{},"$cats = json_decode($json,true);\n",[201,745,746],{"class":203,"line":254},[201,747,748],{},"$new_id = 2;\n",[201,750,751],{"class":203,"line":265},[201,752,753],{},"foreach($cats as $key=>&$val){\n",[201,755,756],{"class":203,"line":276},[201,757,758],{},"    wpmu_create_blog('localhost','blog'.$key,$val['name'],1,array('blogdescription'=>$val['sub_title']));\n",[201,760,761],{"class":203,"line":284},[201,762,763],{},"    \n",[201,765,766],{"class":203,"line":293},[201,767,768],{},"    if( is_wp_error( $return ) ) {\n",[201,770,771],{"class":203,"line":301},[201,772,773],{},"        print_r($return->get_error_message().\"\\n\");\n",[201,775,776],{"class":203,"line":312},[201,777,778],{},"        continue;\n",[201,780,781],{"class":203,"line":323},[201,782,783],{},"    }\n",[201,785,786],{"class":203,"line":334},[201,787,763],{},[201,789,790],{"class":203,"line":345},[201,791,792],{},"    $val['new_id']=$new_id;\n",[201,794,795],{"class":203,"line":353},[201,796,797],{},"    $new_id++;\n",[201,799,800],{"class":203,"line":361},[201,801,802],{},"}\n",[201,804,805],{"class":203,"line":366},[201,806,807],{},"file_put_contents(\"\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fcategory\u002Fregistered_article_categpry.json\", json_encode($cats,JSON_UNESCAPED_UNICODE));\n",[10,809,810,813,814,816,817,820,821],{},[58,811,812],{},"wpmu_create_blog"," という関数を用いて作成します。",[58,815,812],{}," を使用するためには上記のコード二行目にある ",[58,818,819],{},"require_once('..\u002F..\u002Fwp-load.php');"," が必要になります。 ",[17,822,823,826],{},[58,824,825],{},"wp-load.php"," を使用することでwordpress関数が使用できる様になります。引数は以下の様に取ります。",[69,828,830],{"className":537,"code":829,"language":539,"meta":77,"style":77},"wpmu_create_blog(\n  ブログのドメイン（必須）,\n  ブログのサブディレクトリ名（必須）,\n  サイト名（必須）,\n  管理ユーザーID（必須）,\n  そのほかの情報（配列）,\n)\n",[58,831,832,837,842,847,852,857,862],{"__ignoreMap":77},[201,833,834],{"class":203,"line":204},[201,835,836],{},"wpmu_create_blog(\n",[201,838,839],{"class":203,"line":225},[201,840,841],{},"  ブログのドメイン（必須）,\n",[201,843,844],{"class":203,"line":232},[201,845,846],{},"  ブログのサブディレクトリ名（必須）,\n",[201,848,849],{"class":203,"line":241},[201,850,851],{},"  サイト名（必須）,\n",[201,853,854],{"class":203,"line":246},[201,855,856],{},"  管理ユーザーID（必須）,\n",[201,858,859],{"class":203,"line":254},[201,860,861],{},"  そのほかの情報（配列）,\n",[201,863,864],{"class":203,"line":265},[201,865,866],{},")\n",[10,868,869],{},"上記スクリプトは非常に単純です。JSONにある旧CMSに登録されたブログカテゴリー分だけforeachで回して関数を実行しているだけです。",[10,871,872,873],{},"しかしブログカテゴリーは後でユーザーと投稿を挿入する際に必要となるので、 ",[17,874,875],{},"「wordpressでのブログIDと以前のブログカテゴリーIDを対応させる」様にしておきます。下記の様に工夫をしておきます。",[69,877,879],{"className":537,"code":878,"language":539,"meta":77,"style":77},"$new_id = 2; \u002F\u002F 新しいブログIDの最初の値\nforeach($cats as $key=>&$val){ \u002F\u002F参照渡しをしておく\n    wpmu_create_blog('localhost','blog'.$key,$val['name'],1,array('blogdescription'=>$val['sub_title']));\n    \n    if( is_wp_error( $return ) ) {\n        print_r($return->get_error_message().\"\\n\");\n        continue;\n    }\n    \u002F\u002F エラーが起きなかったら new_id という新しいカラムと共にwordpressのブログIDを記録\n    $val['new_id']=$new_id;\n    $new_id++;\n}\n\n\u002F\u002F wordpressと旧CMSとの関係性を記録したJSONを出力\nfile_put_contents(\"\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fcategory\u002Fregistered_article_categpry.json\", json_encode($cats,JSON_UNESCAPED_UNICODE));\n",[58,880,881,886,891,895,899,903,907,911,915,920,924,928,932,936,941],{"__ignoreMap":77},[201,882,883],{"class":203,"line":204},[201,884,885],{},"$new_id = 2; \u002F\u002F 新しいブログIDの最初の値\n",[201,887,888],{"class":203,"line":225},[201,889,890],{},"foreach($cats as $key=>&$val){ \u002F\u002F参照渡しをしておく\n",[201,892,893],{"class":203,"line":232},[201,894,758],{},[201,896,897],{"class":203,"line":241},[201,898,763],{},[201,900,901],{"class":203,"line":246},[201,902,768],{},[201,904,905],{"class":203,"line":254},[201,906,773],{},[201,908,909],{"class":203,"line":265},[201,910,778],{},[201,912,913],{"class":203,"line":276},[201,914,783],{},[201,916,917],{"class":203,"line":284},[201,918,919],{},"    \u002F\u002F エラーが起きなかったら new_id という新しいカラムと共にwordpressのブログIDを記録\n",[201,921,922],{"class":203,"line":293},[201,923,792],{},[201,925,926],{"class":203,"line":301},[201,927,797],{},[201,929,930],{"class":203,"line":312},[201,931,802],{},[201,933,934],{"class":203,"line":323},[201,935,229],{"emptyLinePlaceholder":228},[201,937,938],{"class":203,"line":334},[201,939,940],{},"\u002F\u002F wordpressと旧CMSとの関係性を記録したJSONを出力\n",[201,942,943],{"class":203,"line":345},[201,944,807],{},[10,946,947],{},"すると新しく作成されたJSONを見ると",[69,949,952],{"className":589,"code":950,"filename":951,"language":592,"meta":77,"style":77},"[\n...\n  {\n    \"id\":\"6\",\n    \"name\":\"サイトの名前\",\n    \"sub_title\":\"サイトのキャッチフレーズ的なもの\",\n    \"mailUser\":\"3::1543\",\n    \"new_id\":3\n  }\n...\n]\n","registered_article_category.json",[58,953,954,958,963,967,985,1003,1021,1039,1054,1059,1063],{"__ignoreMap":77},[201,955,956],{"class":203,"line":204},[201,957,599],{"class":211},[201,959,960],{"class":203,"line":225},[201,961,962],{"class":604},"...\n",[201,964,965],{"class":203,"line":232},[201,966,610],{"class":211},[201,968,969,971,973,975,977,979,981,983],{"class":203,"line":241},[201,970,615],{"class":211},[201,972,619],{"class":618},[201,974,622],{"class":211},[201,976,212],{"class":211},[201,978,622],{"class":211},[201,980,629],{"class":218},[201,982,622],{"class":211},[201,984,634],{"class":211},[201,986,987,989,991,993,995,997,999,1001],{"class":203,"line":246},[201,988,615],{"class":211},[201,990,641],{"class":618},[201,992,622],{"class":211},[201,994,212],{"class":211},[201,996,622],{"class":211},[201,998,650],{"class":218},[201,1000,622],{"class":211},[201,1002,634],{"class":211},[201,1004,1005,1007,1009,1011,1013,1015,1017,1019],{"class":203,"line":254},[201,1006,615],{"class":211},[201,1008,661],{"class":618},[201,1010,622],{"class":211},[201,1012,212],{"class":211},[201,1014,622],{"class":211},[201,1016,670],{"class":218},[201,1018,622],{"class":211},[201,1020,634],{"class":211},[201,1022,1023,1025,1027,1029,1031,1033,1035,1037],{"class":203,"line":265},[201,1024,615],{"class":211},[201,1026,681],{"class":618},[201,1028,622],{"class":211},[201,1030,212],{"class":211},[201,1032,622],{"class":211},[201,1034,690],{"class":218},[201,1036,622],{"class":211},[201,1038,634],{"class":211},[201,1040,1041,1043,1046,1048,1050],{"class":203,"line":276},[201,1042,615],{"class":211},[201,1044,1045],{"class":618},"new_id",[201,1047,622],{"class":211},[201,1049,212],{"class":211},[201,1051,1053],{"class":1052},"sx098","3\n",[201,1055,1056],{"class":203,"line":284},[201,1057,1058],{"class":211},"  }\n",[201,1060,1061],{"class":203,"line":293},[201,1062,962],{"class":604},[201,1064,1065],{"class":203,"line":301},[201,1066,707],{"class":211},[10,1068,1069,1070],{},"new_idというカラムとwordpressでのブログIDが入りました。こうすることで ",[17,1071,1072],{},"「旧CMSでのブログカテゴリーID 6のものはwordpressではブログID 3」という関係性を保存できます。",[10,1074,1075],{},"以上でブログカテゴリーの移行は終了しました。訳70サイトもあるのでこんな感じ↓になります笑。",[520,1077],{":src":1078,":width":523,":center":524},"'_mix\u002Fwp-sites-146x300.jpeg'",[503,1080,1081],{"id":1081},"スクリプトの実行方法",[10,1083,1084],{},"これらスクリプトはコマンドで実行します。dockerで管理しているので",[69,1086,1089],{"className":1087,"code":1088,"language":74},[72],"docker exec -it {wordpressのコンテナ名} \u002Fbin\u002Fbash\n",[58,1090,1088],{"__ignoreMap":77},[10,1092,1093],{},"この様にしてwordpressを立ち上げているコンテナに入って、コマンドを実行しにいきます。",[69,1095,1098],{"className":1096,"code":1097,"language":74},[72],"root@0756d76ddde1:\u002Fvar\u002Fwww\u002Fhtml# \n",[58,1099,1097],{"__ignoreMap":77},[10,1101,1102,1103,1106],{},"コンテナに入るとこの様にターミナルが変化します。リモートサーバーにsshでログインしたみたいな感じです。そしてdockerを立ち上げるときに ",[58,1104,1105],{},"scripts\u002F"," ディレクトリをボリュームしているのでそこに移動します。",[69,1108,1111],{"className":1109,"code":1110,"language":74},[72],"root@0756d76ddde1:\u002Fvar\u002Fwww\u002Fhtml# cd scripts\nroot@0756d76ddde1:\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts# ls\ncreate_site.php\narticle_category.json\n\nroot@0756d76ddde1:\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts# php create_site.php\n",[58,1112,1110],{"__ignoreMap":77},[10,1114,1115],{},"上記の様にphpファイルを指定することでスクリプトが実行されます。",[24,1117,1119],{"id":1118},"ユーザーを機械的に作成割り当て","ユーザーを機械的に作成、割り当て",[503,1121,1122],{"id":1122},"ユーザーの追加",[10,1124,1125],{},"ではそれぞれのブログを作成したので次はユーザーを作成していきます。ユーザーは以下の様なJSONです。",[69,1127,1130],{"className":589,"code":1128,"filename":1129,"language":592,"meta":77,"style":77},"[\n    ...\n    {\n        \"uid\":\"3\",\n        \"loginname\":\"webmaster\",\n        \"name\":\"お名前\",\n        \"email\":\"example@example.com\",\n        \"user_avatar\":\n        \"thumbnail.jpg\",\n    }\n    ...\n]\n","user.json",[58,1131,1132,1136,1141,1146,1167,1187,1206,1226,1237,1248,1252,1256],{"__ignoreMap":77},[201,1133,1134],{"class":203,"line":204},[201,1135,599],{"class":211},[201,1137,1138],{"class":203,"line":225},[201,1139,1140],{"class":604},"    ...\n",[201,1142,1143],{"class":203,"line":232},[201,1144,1145],{"class":211},"    {\n",[201,1147,1148,1151,1154,1156,1158,1160,1163,1165],{"class":203,"line":241},[201,1149,1150],{"class":211},"        \"",[201,1152,1153],{"class":618},"uid",[201,1155,622],{"class":211},[201,1157,212],{"class":211},[201,1159,622],{"class":211},[201,1161,1162],{"class":218},"3",[201,1164,622],{"class":211},[201,1166,634],{"class":211},[201,1168,1169,1171,1174,1176,1178,1180,1183,1185],{"class":203,"line":246},[201,1170,1150],{"class":211},[201,1172,1173],{"class":618},"loginname",[201,1175,622],{"class":211},[201,1177,212],{"class":211},[201,1179,622],{"class":211},[201,1181,1182],{"class":218},"webmaster",[201,1184,622],{"class":211},[201,1186,634],{"class":211},[201,1188,1189,1191,1193,1195,1197,1199,1202,1204],{"class":203,"line":254},[201,1190,1150],{"class":211},[201,1192,641],{"class":618},[201,1194,622],{"class":211},[201,1196,212],{"class":211},[201,1198,622],{"class":211},[201,1200,1201],{"class":218},"お名前",[201,1203,622],{"class":211},[201,1205,634],{"class":211},[201,1207,1208,1210,1213,1215,1217,1219,1222,1224],{"class":203,"line":265},[201,1209,1150],{"class":211},[201,1211,1212],{"class":618},"email",[201,1214,622],{"class":211},[201,1216,212],{"class":211},[201,1218,622],{"class":211},[201,1220,1221],{"class":218},"example@example.com",[201,1223,622],{"class":211},[201,1225,634],{"class":211},[201,1227,1228,1230,1233,1235],{"class":203,"line":276},[201,1229,1150],{"class":211},[201,1231,1232],{"class":618},"user_avatar",[201,1234,622],{"class":211},[201,1236,238],{"class":211},[201,1238,1239,1241,1244,1246],{"class":203,"line":284},[201,1240,1150],{"class":211},[201,1242,1243],{"class":218},"thumbnail.jpg",[201,1245,622],{"class":211},[201,1247,634],{"class":211},[201,1249,1250],{"class":203,"line":293},[201,1251,783],{"class":211},[201,1253,1254],{"class":203,"line":301},[201,1255,1140],{"class":604},[201,1257,1258],{"class":203,"line":312},[201,1259,707],{"class":211},[10,1261,1262,1265],{},[58,1263,1264],{},"groupid"," は旧CMSの権限グループです。そしてユーザー追加スクリプトは以下の様になります。",[69,1267,1269],{"className":537,"code":1268,"language":539,"meta":77,"style":77},"\u003C?php\nrequire_once('..\u002F..\u002Fwp-load.php');\n\n$json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fuser\u002Fuser.json');\n$uesrs = json_decode($json,true);\n\n$new_id = 2;\nforeach($uesrs as &$val){\n\n    $role;\n    switch($val['groupid']){\n        case \"1\":\n            $role = 'administrator';\n        break;\n       \n        case \"2\":\n            $role = 'contributor';\n        break;\n\n        case \"3\":\n            $role = 'contributor';\n        break;\n\n        case \"4\":\n            $role = 'administrator';\n        break;\n\n        case \"5\":\n            $role = 'contributor';\n        break;\n\n        case \"6\":\n            $role = 'administrator';\n        break;\n\n        case \"7\":\n            $role = 'administrator';\n        break;\n    }\n\n    $user = [\n        'user_pass'=>'PASS_WORD',\n        'user_login'=>$val['loginname'],\n        'user_email'=>$val['email'],\n        'display_name'=>$val['uid'],\n        'role'=>$role,\n    ];\n    $return = wp_insert_user($user);\n    \n    if( is_wp_error( $return ) ) {\n        print_r($return->get_error_message().':'.$val['loginname'].\"\\n\");\n        continue;\n    }\n    $val['new_id']=$new_id;\n    $new_id++;\n}\nfile_put_contents(\"\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fuser\u002Fregistered_user.json\", json_encode($uesrs,JSON_UNESCAPED_UNICODE));\n",[58,1270,1271,1275,1279,1283,1288,1293,1297,1301,1306,1310,1315,1320,1325,1330,1335,1340,1345,1350,1354,1358,1363,1367,1371,1375,1380,1384,1388,1392,1397,1401,1405,1409,1415,1420,1425,1430,1436,1441,1446,1451,1456,1462,1468,1474,1480,1486,1492,1498,1504,1509,1514,1520,1525,1530,1535,1540,1545],{"__ignoreMap":77},[201,1272,1273],{"class":203,"line":204},[201,1274,724],{},[201,1276,1277],{"class":203,"line":225},[201,1278,729],{},[201,1280,1281],{"class":203,"line":232},[201,1282,229],{"emptyLinePlaceholder":228},[201,1284,1285],{"class":203,"line":241},[201,1286,1287],{},"$json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fuser\u002Fuser.json');\n",[201,1289,1290],{"class":203,"line":246},[201,1291,1292],{},"$uesrs = json_decode($json,true);\n",[201,1294,1295],{"class":203,"line":254},[201,1296,229],{"emptyLinePlaceholder":228},[201,1298,1299],{"class":203,"line":265},[201,1300,748],{},[201,1302,1303],{"class":203,"line":276},[201,1304,1305],{},"foreach($uesrs as &$val){\n",[201,1307,1308],{"class":203,"line":284},[201,1309,229],{"emptyLinePlaceholder":228},[201,1311,1312],{"class":203,"line":293},[201,1313,1314],{},"    $role;\n",[201,1316,1317],{"class":203,"line":301},[201,1318,1319],{},"    switch($val['groupid']){\n",[201,1321,1322],{"class":203,"line":312},[201,1323,1324],{},"        case \"1\":\n",[201,1326,1327],{"class":203,"line":323},[201,1328,1329],{},"            $role = 'administrator';\n",[201,1331,1332],{"class":203,"line":334},[201,1333,1334],{},"        break;\n",[201,1336,1337],{"class":203,"line":345},[201,1338,1339],{},"       \n",[201,1341,1342],{"class":203,"line":353},[201,1343,1344],{},"        case \"2\":\n",[201,1346,1347],{"class":203,"line":361},[201,1348,1349],{},"            $role = 'contributor';\n",[201,1351,1352],{"class":203,"line":366},[201,1353,1334],{},[201,1355,1356],{"class":203,"line":374},[201,1357,229],{"emptyLinePlaceholder":228},[201,1359,1360],{"class":203,"line":384},[201,1361,1362],{},"        case \"3\":\n",[201,1364,1365],{"class":203,"line":393},[201,1366,1349],{},[201,1368,1369],{"class":203,"line":400},[201,1370,1334],{},[201,1372,1373],{"class":203,"line":410},[201,1374,229],{"emptyLinePlaceholder":228},[201,1376,1377],{"class":203,"line":420},[201,1378,1379],{},"        case \"4\":\n",[201,1381,1382],{"class":203,"line":430},[201,1383,1329],{},[201,1385,1386],{"class":203,"line":445},[201,1387,1334],{},[201,1389,1390],{"class":203,"line":452},[201,1391,229],{"emptyLinePlaceholder":228},[201,1393,1394],{"class":203,"line":460},[201,1395,1396],{},"        case \"5\":\n",[201,1398,1399],{"class":203,"line":465},[201,1400,1349],{},[201,1402,1403],{"class":203,"line":473},[201,1404,1334],{},[201,1406,1407],{"class":203,"line":481},[201,1408,229],{"emptyLinePlaceholder":228},[201,1410,1412],{"class":203,"line":1411},32,[201,1413,1414],{},"        case \"6\":\n",[201,1416,1418],{"class":203,"line":1417},33,[201,1419,1329],{},[201,1421,1423],{"class":203,"line":1422},34,[201,1424,1334],{},[201,1426,1428],{"class":203,"line":1427},35,[201,1429,229],{"emptyLinePlaceholder":228},[201,1431,1433],{"class":203,"line":1432},36,[201,1434,1435],{},"        case \"7\":\n",[201,1437,1439],{"class":203,"line":1438},37,[201,1440,1329],{},[201,1442,1444],{"class":203,"line":1443},38,[201,1445,1334],{},[201,1447,1449],{"class":203,"line":1448},39,[201,1450,783],{},[201,1452,1454],{"class":203,"line":1453},40,[201,1455,229],{"emptyLinePlaceholder":228},[201,1457,1459],{"class":203,"line":1458},41,[201,1460,1461],{},"    $user = [\n",[201,1463,1465],{"class":203,"line":1464},42,[201,1466,1467],{},"        'user_pass'=>'PASS_WORD',\n",[201,1469,1471],{"class":203,"line":1470},43,[201,1472,1473],{},"        'user_login'=>$val['loginname'],\n",[201,1475,1477],{"class":203,"line":1476},44,[201,1478,1479],{},"        'user_email'=>$val['email'],\n",[201,1481,1483],{"class":203,"line":1482},45,[201,1484,1485],{},"        'display_name'=>$val['uid'],\n",[201,1487,1489],{"class":203,"line":1488},46,[201,1490,1491],{},"        'role'=>$role,\n",[201,1493,1495],{"class":203,"line":1494},47,[201,1496,1497],{},"    ];\n",[201,1499,1501],{"class":203,"line":1500},48,[201,1502,1503],{},"    $return = wp_insert_user($user);\n",[201,1505,1507],{"class":203,"line":1506},49,[201,1508,763],{},[201,1510,1512],{"class":203,"line":1511},50,[201,1513,768],{},[201,1515,1517],{"class":203,"line":1516},51,[201,1518,1519],{},"        print_r($return->get_error_message().':'.$val['loginname'].\"\\n\");\n",[201,1521,1523],{"class":203,"line":1522},52,[201,1524,778],{},[201,1526,1528],{"class":203,"line":1527},53,[201,1529,783],{},[201,1531,1533],{"class":203,"line":1532},54,[201,1534,792],{},[201,1536,1538],{"class":203,"line":1537},55,[201,1539,797],{},[201,1541,1543],{"class":203,"line":1542},56,[201,1544,802],{},[201,1546,1548],{"class":203,"line":1547},57,[201,1549,1550],{},"file_put_contents(\"\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fuser\u002Fregistered_user.json\", json_encode($uesrs,JSON_UNESCAPED_UNICODE));\n",[10,1552,1553,1554,1557],{},"ちょっと自分のためのコードがありますが、重要なのは ",[58,1555,1556],{},"wp_insert_user"," という関数です。引数は連想配列で入れます。以下のキー名で配列にします。",[69,1559,1561],{"className":537,"code":1560,"language":539,"meta":77,"style":77},"$user = [\n        'user_pass'=>'PASS_WORD',       \u002F\u002F パスワード名\n        'user_login'=>$val['loginname'],\u002F\u002F ログイン名（英数字でないといけない）\n        'user_email'=>$val['email'],    \u002F\u002F 登録アドレス\n        'display_name'=>$val['uid'],    \u002F\u002F 表示名（プロフ名）\n        'role'=>$role,                  \u002F\u002F 権限キー\n    ];\n",[58,1562,1563,1568,1576,1581,1589,1597,1605],{"__ignoreMap":77},[201,1564,1565],{"class":203,"line":204},[201,1566,1567],{},"$user = [\n",[201,1569,1570,1573],{"class":203,"line":225},[201,1571,1572],{},"        'user_pass'=>'PASS_WORD',",[201,1574,1575],{},"       \u002F\u002F パスワード名\n",[201,1577,1578],{"class":203,"line":232},[201,1579,1580],{},"        'user_login'=>$val['loginname'],\u002F\u002F ログイン名（英数字でないといけない）\n",[201,1582,1583,1586],{"class":203,"line":241},[201,1584,1585],{},"        'user_email'=>$val['email'],",[201,1587,1588],{},"    \u002F\u002F 登録アドレス\n",[201,1590,1591,1594],{"class":203,"line":246},[201,1592,1593],{},"        'display_name'=>$val['uid'],",[201,1595,1596],{},"    \u002F\u002F 表示名（プロフ名）\n",[201,1598,1599,1602],{"class":203,"line":254},[201,1600,1601],{},"        'role'=>$role,",[201,1603,1604],{},"                  \u002F\u002F 権限キー\n",[201,1606,1607],{"class":203,"line":265},[201,1608,1497],{},[10,1610,1611],{},"権限キーは文字列で指定します。私のコードでは旧CMSのIDを対応させています。そしてブログの時の様に旧データと新データのIDを対応させる様にします。",[69,1613,1615],{"className":537,"code":1614,"language":539,"meta":77,"style":77},"...\n   $return = wp_insert_user($user);\n\n　　if( is_wp_error( $return ) ) {\n        print_r($return->get_error_message().':'.$val['loginname'].\"\\n\");\n        continue;\n    }\n    $val['new_id']=$new_id;\n    $new_id++;\n}\nfile_put_contents(\"\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fuser\u002Fregistered_user.json\", json_encode($uesrs,JSON_UNESCAPED_UNICODE));\n",[58,1616,1617,1621,1626,1630,1635,1639,1643,1647,1651,1655,1659],{"__ignoreMap":77},[201,1618,1619],{"class":203,"line":204},[201,1620,962],{},[201,1622,1623],{"class":203,"line":225},[201,1624,1625],{},"   $return = wp_insert_user($user);\n",[201,1627,1628],{"class":203,"line":232},[201,1629,229],{"emptyLinePlaceholder":228},[201,1631,1632],{"class":203,"line":241},[201,1633,1634],{},"　　if( is_wp_error( $return ) ) {\n",[201,1636,1637],{"class":203,"line":246},[201,1638,1519],{},[201,1640,1641],{"class":203,"line":254},[201,1642,778],{},[201,1644,1645],{"class":203,"line":265},[201,1646,783],{},[201,1648,1649],{"class":203,"line":276},[201,1650,792],{},[201,1652,1653],{"class":203,"line":284},[201,1654,797],{},[201,1656,1657],{"class":203,"line":293},[201,1658,802],{},[201,1660,1661],{"class":203,"line":301},[201,1662,1550],{},[10,1664,1665,1672],{},[17,1666,1667,1668,1671],{},"ちなみにスクリプトを実行するときは ",[58,1669,1670],{},"is_wp_error( $return ) ","でエラーをキャッチできる様にしましょう。"," なぜか私のデータには同じユーザーのデータがあったりなどで、「ユーザーがすでに登録されています」というエラーでIDがずれてしまうという事件がありました。そのためにキャッチできるスクリプトを入れておきましょう。",[503,1674,1675],{"id":1675},"ユーザーをブログに当てはめ",[10,1677,1678],{},"ユーザーのスクリプトを実行するとユーザーが作成され、新旧のIDを対応させたユーザーJSONファイルができました。これとブログカテゴリーのデータを用いて各ブログを管理するユーザーを割り当てていきます。",[69,1680,1683],{"className":537,"code":1681,"filename":1682,"language":539,"meta":77,"style":77},"\u003C?php\nrequire_once('..\u002F..\u002Fwp-load.php');\n\n\u002F\u002F wordpress user IDが入ったuserのファイル\n$user_json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fuser\u002Fregistered_user.json');\n$uesrs = json_decode($user_json,true);\n\n\u002F\u002F wordpress blog IDが入ったブログカテゴリーのファイル\n$cat_json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fcategory\u002Fregistered_article_categpry.json');\n$cats = json_decode($cat_json,true);\n\nforeach($cats as $cat_key=> $cat_val){\n    $old_user_ids =explode('::',$cat_val['mailUser']);\n    \n    foreach($old_user_ids as $old_id){\n        $user = array_values(array_filter($uesrs,function($ele) use($old_id) {\n            return $ele['uid'] == $old_id && isset($ele['new_id']);\n        }));\n\n        if(!empty($user)){\n            $new_userid = $user[0]['new_id'];\n            $new_cat_id =intval($cat_val['new_id']);\n            add_user_to_blog($new_cat_id,$new_userid,'administrator');\n        }\n    }\n}\n","add_user_blog.php",[58,1684,1685,1689,1693,1697,1702,1707,1712,1716,1721,1726,1731,1735,1740,1745,1749,1754,1759,1764,1769,1773,1778,1783,1788,1793,1798,1802],{"__ignoreMap":77},[201,1686,1687],{"class":203,"line":204},[201,1688,724],{},[201,1690,1691],{"class":203,"line":225},[201,1692,729],{},[201,1694,1695],{"class":203,"line":232},[201,1696,229],{"emptyLinePlaceholder":228},[201,1698,1699],{"class":203,"line":241},[201,1700,1701],{},"\u002F\u002F wordpress user IDが入ったuserのファイル\n",[201,1703,1704],{"class":203,"line":246},[201,1705,1706],{},"$user_json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fuser\u002Fregistered_user.json');\n",[201,1708,1709],{"class":203,"line":254},[201,1710,1711],{},"$uesrs = json_decode($user_json,true);\n",[201,1713,1714],{"class":203,"line":265},[201,1715,229],{"emptyLinePlaceholder":228},[201,1717,1718],{"class":203,"line":276},[201,1719,1720],{},"\u002F\u002F wordpress blog IDが入ったブログカテゴリーのファイル\n",[201,1722,1723],{"class":203,"line":284},[201,1724,1725],{},"$cat_json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fcategory\u002Fregistered_article_categpry.json');\n",[201,1727,1728],{"class":203,"line":293},[201,1729,1730],{},"$cats = json_decode($cat_json,true);\n",[201,1732,1733],{"class":203,"line":301},[201,1734,229],{"emptyLinePlaceholder":228},[201,1736,1737],{"class":203,"line":312},[201,1738,1739],{},"foreach($cats as $cat_key=> $cat_val){\n",[201,1741,1742],{"class":203,"line":323},[201,1743,1744],{},"    $old_user_ids =explode('::',$cat_val['mailUser']);\n",[201,1746,1747],{"class":203,"line":334},[201,1748,763],{},[201,1750,1751],{"class":203,"line":345},[201,1752,1753],{},"    foreach($old_user_ids as $old_id){\n",[201,1755,1756],{"class":203,"line":353},[201,1757,1758],{},"        $user = array_values(array_filter($uesrs,function($ele) use($old_id) {\n",[201,1760,1761],{"class":203,"line":361},[201,1762,1763],{},"            return $ele['uid'] == $old_id && isset($ele['new_id']);\n",[201,1765,1766],{"class":203,"line":366},[201,1767,1768],{},"        }));\n",[201,1770,1771],{"class":203,"line":374},[201,1772,229],{"emptyLinePlaceholder":228},[201,1774,1775],{"class":203,"line":384},[201,1776,1777],{},"        if(!empty($user)){\n",[201,1779,1780],{"class":203,"line":393},[201,1781,1782],{},"            $new_userid = $user[0]['new_id'];\n",[201,1784,1785],{"class":203,"line":400},[201,1786,1787],{},"            $new_cat_id =intval($cat_val['new_id']);\n",[201,1789,1790],{"class":203,"line":410},[201,1791,1792],{},"            add_user_to_blog($new_cat_id,$new_userid,'administrator');\n",[201,1794,1795],{"class":203,"line":420},[201,1796,1797],{},"        }\n",[201,1799,1800],{"class":203,"line":430},[201,1801,783],{},[201,1803,1804],{"class":203,"line":445},[201,1805,802],{},[10,1807,1808,1809,1812,1813,1815,1816,1819],{},"私のデータの場合、ユーザーが複数人いたので",[58,1810,1811],{},"foreach","の中でさらに",[58,1814,1811],{},"しています。マルチサイト の特定のブログに対してユーザーを割り当てるためには ",[58,1817,1818],{},"add_user_to_blog"," を用います。",[10,1821,1822],{},"第一引数にユーザーID、第二引数に対象のブログID、第三には権限グループを指定することで簡単にブログに対してユーザーを割り当てられます。",[24,1824,1825],{"id":1825},"投稿を機械的に流し込み",[10,1827,1828],{},"最後に投稿を流し込みます。私が使用したデータは以下の様なデータになっています。",[69,1830,1833],{"className":589,"code":1831,"filename":1832,"language":592,"meta":77,"style":77},"[\n...\n    {\n    　\"id\":\"162\",\n    　\"date\":\"2007-08-02\",\n    　\"category_id\":\"6\",\n    　\"uid\":\"1543\",\n    　\"title\":\"タイトル\",\n    　\"content\":\"ここにブログの内容がプレーンテキスト形式で入っています。\"\n    },\n...\n]\n","article.json",[58,1834,1835,1839,1843,1847,1867,1887,1906,1925,1945,1963,1968,1972],{"__ignoreMap":77},[201,1836,1837],{"class":203,"line":204},[201,1838,599],{"class":211},[201,1840,1841],{"class":203,"line":225},[201,1842,962],{"class":604},[201,1844,1845],{"class":203,"line":232},[201,1846,1145],{"class":211},[201,1848,1849,1852,1854,1856,1858,1860,1863,1865],{"class":203,"line":241},[201,1850,1851],{"class":211},"    　\"",[201,1853,619],{"class":618},[201,1855,622],{"class":211},[201,1857,212],{"class":211},[201,1859,622],{"class":211},[201,1861,1862],{"class":218},"162",[201,1864,622],{"class":211},[201,1866,634],{"class":211},[201,1868,1869,1871,1874,1876,1878,1880,1883,1885],{"class":203,"line":246},[201,1870,1851],{"class":211},[201,1872,1873],{"class":618},"date",[201,1875,622],{"class":211},[201,1877,212],{"class":211},[201,1879,622],{"class":211},[201,1881,1882],{"class":218},"2007-08-02",[201,1884,622],{"class":211},[201,1886,634],{"class":211},[201,1888,1889,1891,1894,1896,1898,1900,1902,1904],{"class":203,"line":254},[201,1890,1851],{"class":211},[201,1892,1893],{"class":618},"category_id",[201,1895,622],{"class":211},[201,1897,212],{"class":211},[201,1899,622],{"class":211},[201,1901,629],{"class":218},[201,1903,622],{"class":211},[201,1905,634],{"class":211},[201,1907,1908,1910,1912,1914,1916,1918,1921,1923],{"class":203,"line":265},[201,1909,1851],{"class":211},[201,1911,1153],{"class":618},[201,1913,622],{"class":211},[201,1915,212],{"class":211},[201,1917,622],{"class":211},[201,1919,1920],{"class":218},"1543",[201,1922,622],{"class":211},[201,1924,634],{"class":211},[201,1926,1927,1929,1932,1934,1936,1938,1941,1943],{"class":203,"line":276},[201,1928,1851],{"class":211},[201,1930,1931],{"class":618},"title",[201,1933,622],{"class":211},[201,1935,212],{"class":211},[201,1937,622],{"class":211},[201,1939,1940],{"class":218},"タイトル",[201,1942,622],{"class":211},[201,1944,634],{"class":211},[201,1946,1947,1949,1952,1954,1956,1958,1961],{"class":203,"line":284},[201,1948,1851],{"class":211},[201,1950,1951],{"class":618},"content",[201,1953,622],{"class":211},[201,1955,212],{"class":211},[201,1957,622],{"class":211},[201,1959,1960],{"class":218},"ここにブログの内容がプレーンテキスト形式で入っています。",[201,1962,693],{"class":211},[201,1964,1965],{"class":203,"line":293},[201,1966,1967],{"class":211},"    },\n",[201,1969,1970],{"class":203,"line":301},[201,1971,962],{"class":604},[201,1973,1974],{"class":203,"line":312},[201,1975,707],{"class":211},[10,1977,1978,1980,1981,1983],{},[58,1979,1153],{},"を元にユーザー（著者）と結び付け、",[58,1982,1893],{},"を元にどのブログに投稿するのかを指定します。以下の様なスクリプトを書きました。",[69,1985,1988],{"className":537,"code":1986,"filename":1987,"language":539,"meta":77,"style":77},"\u003C?php\nini_set('memory_limit', '1024M');\nrequire_once('..\u002F..\u002Fwp-load.php');\n\n\u002F\u002F wordpress user IDが入ったuserのファイル\n$user_json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fuser\u002Fregistered_user.json');\n$uesrs = json_decode($user_json,true);\n\n\u002F\u002F 旧CMSの投稿データ\n$article_json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Farticles\u002Farticle_replace.json');\n$articles = json_decode($article_json,true);\n\n\u002F\u002F wordpress blog IDが入ったブログカテゴリーのファイル\n$cat_json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fcategory\u002Fregistered_article_categpry.json');\n$cats = json_decode($cat_json,true);\n\nforeach($articles as $key => $a_val){\n    $old_cat_id = $a_val['category_id'];\n\n    if(empty($old_cat_id)) continue;\n\n    $cat = array_values(array_filter($cats,function($ele) use($old_cat_id) {\n        return $ele['id'] == $old_cat_id && isset($ele['new_id']);\n    }));\n\n    if(empty($cat)) continue;\n\n    $new_cat_id = $cat[0]['new_id'];\n\n    $old_user_id = $a_val['uid'];\n    $user = array_values(array_filter($uesrs,function($ele) use($old_user_id) {\n        return $ele['uid'] == $old_user_id && isset($ele['new_id']);\n    }));\n\n    $new_user_id = (empty($user))?1:$user[0]['new_id'];\n    if(!get_user_by('id',intval($new_user_id))) continue;\n\n    switch_to_blog($new_cat_id);\n    $new_post = array(\n        'post_title' => $a_val['title'],\n        'post_content' => $a_val['content'],\n        'post_status' => 'publish',\n        'post_date' => date($a_val['date']),\n        'post_author' => $new_user_id,\n        'post_type' =>'post',\n    );\n    wp_insert_post($new_post);\n    restore_current_blog();\n}\n","insert_post.php",[58,1989,1990,1994,1999,2003,2007,2011,2015,2019,2023,2028,2033,2038,2042,2046,2050,2054,2058,2063,2068,2072,2077,2081,2086,2091,2096,2100,2105,2109,2114,2118,2123,2128,2133,2137,2141,2146,2151,2155,2160,2165,2170,2175,2180,2185,2190,2195,2200,2205,2210],{"__ignoreMap":77},[201,1991,1992],{"class":203,"line":204},[201,1993,724],{},[201,1995,1996],{"class":203,"line":225},[201,1997,1998],{},"ini_set('memory_limit', '1024M');\n",[201,2000,2001],{"class":203,"line":232},[201,2002,729],{},[201,2004,2005],{"class":203,"line":241},[201,2006,229],{"emptyLinePlaceholder":228},[201,2008,2009],{"class":203,"line":246},[201,2010,1701],{},[201,2012,2013],{"class":203,"line":254},[201,2014,1706],{},[201,2016,2017],{"class":203,"line":265},[201,2018,1711],{},[201,2020,2021],{"class":203,"line":276},[201,2022,229],{"emptyLinePlaceholder":228},[201,2024,2025],{"class":203,"line":284},[201,2026,2027],{},"\u002F\u002F 旧CMSの投稿データ\n",[201,2029,2030],{"class":203,"line":293},[201,2031,2032],{},"$article_json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Farticles\u002Farticle_replace.json');\n",[201,2034,2035],{"class":203,"line":301},[201,2036,2037],{},"$articles = json_decode($article_json,true);\n",[201,2039,2040],{"class":203,"line":312},[201,2041,229],{"emptyLinePlaceholder":228},[201,2043,2044],{"class":203,"line":323},[201,2045,1720],{},[201,2047,2048],{"class":203,"line":334},[201,2049,1725],{},[201,2051,2052],{"class":203,"line":345},[201,2053,1730],{},[201,2055,2056],{"class":203,"line":353},[201,2057,229],{"emptyLinePlaceholder":228},[201,2059,2060],{"class":203,"line":361},[201,2061,2062],{},"foreach($articles as $key => $a_val){\n",[201,2064,2065],{"class":203,"line":366},[201,2066,2067],{},"    $old_cat_id = $a_val['category_id'];\n",[201,2069,2070],{"class":203,"line":374},[201,2071,229],{"emptyLinePlaceholder":228},[201,2073,2074],{"class":203,"line":384},[201,2075,2076],{},"    if(empty($old_cat_id)) continue;\n",[201,2078,2079],{"class":203,"line":393},[201,2080,229],{"emptyLinePlaceholder":228},[201,2082,2083],{"class":203,"line":400},[201,2084,2085],{},"    $cat = array_values(array_filter($cats,function($ele) use($old_cat_id) {\n",[201,2087,2088],{"class":203,"line":410},[201,2089,2090],{},"        return $ele['id'] == $old_cat_id && isset($ele['new_id']);\n",[201,2092,2093],{"class":203,"line":420},[201,2094,2095],{},"    }));\n",[201,2097,2098],{"class":203,"line":430},[201,2099,229],{"emptyLinePlaceholder":228},[201,2101,2102],{"class":203,"line":445},[201,2103,2104],{},"    if(empty($cat)) continue;\n",[201,2106,2107],{"class":203,"line":452},[201,2108,229],{"emptyLinePlaceholder":228},[201,2110,2111],{"class":203,"line":460},[201,2112,2113],{},"    $new_cat_id = $cat[0]['new_id'];\n",[201,2115,2116],{"class":203,"line":465},[201,2117,229],{"emptyLinePlaceholder":228},[201,2119,2120],{"class":203,"line":473},[201,2121,2122],{},"    $old_user_id = $a_val['uid'];\n",[201,2124,2125],{"class":203,"line":481},[201,2126,2127],{},"    $user = array_values(array_filter($uesrs,function($ele) use($old_user_id) {\n",[201,2129,2130],{"class":203,"line":1411},[201,2131,2132],{},"        return $ele['uid'] == $old_user_id && isset($ele['new_id']);\n",[201,2134,2135],{"class":203,"line":1417},[201,2136,2095],{},[201,2138,2139],{"class":203,"line":1422},[201,2140,229],{"emptyLinePlaceholder":228},[201,2142,2143],{"class":203,"line":1427},[201,2144,2145],{},"    $new_user_id = (empty($user))?1:$user[0]['new_id'];\n",[201,2147,2148],{"class":203,"line":1432},[201,2149,2150],{},"    if(!get_user_by('id',intval($new_user_id))) continue;\n",[201,2152,2153],{"class":203,"line":1438},[201,2154,229],{"emptyLinePlaceholder":228},[201,2156,2157],{"class":203,"line":1443},[201,2158,2159],{},"    switch_to_blog($new_cat_id);\n",[201,2161,2162],{"class":203,"line":1448},[201,2163,2164],{},"    $new_post = array(\n",[201,2166,2167],{"class":203,"line":1453},[201,2168,2169],{},"        'post_title' => $a_val['title'],\n",[201,2171,2172],{"class":203,"line":1458},[201,2173,2174],{},"        'post_content' => $a_val['content'],\n",[201,2176,2177],{"class":203,"line":1464},[201,2178,2179],{},"        'post_status' => 'publish',\n",[201,2181,2182],{"class":203,"line":1470},[201,2183,2184],{},"        'post_date' => date($a_val['date']),\n",[201,2186,2187],{"class":203,"line":1476},[201,2188,2189],{},"        'post_author' => $new_user_id,\n",[201,2191,2192],{"class":203,"line":1482},[201,2193,2194],{},"        'post_type' =>'post',\n",[201,2196,2197],{"class":203,"line":1488},[201,2198,2199],{},"    );\n",[201,2201,2202],{"class":203,"line":1494},[201,2203,2204],{},"    wp_insert_post($new_post);\n",[201,2206,2207],{"class":203,"line":1500},[201,2208,2209],{},"    restore_current_blog();\n",[201,2211,2212],{"class":203,"line":1506},[201,2213,802],{},[10,2215,2216,2217,2220],{},"４万件分のデータとなると非常にメモリを食うので ",[58,2218,2219],{},"ini_set"," でメモリ上限を上げてあります。",[10,2222,2223,2224,2227,2228,2230,2231,2234],{},"投稿データからブログカテゴリーIDとユーザーIDを新しいwordpresの方と紐づけ、 ",[58,2225,2226],{},"wp_insert_post"," を用いて記事を挿入します。 ",[58,2229,2226],{}," 　の気をつける点はデフォルトでは",[58,2232,2233],{},"blogid=1","のブログに記事を作成するということです。",[10,2236,2237,2238,2241,2242,2245],{},"そのためコードに ",[58,2239,2240],{},"switch_to_blog();"," を追加して挿入対象のブログを切り替えています。この関数を使用するときはセットで ",[58,2243,2244],{},"restore_current_blog();"," を使います。",[10,2247,2248,2249,2251,2252,2254,2255],{},"挿入先のブログを切り替えて、",[58,2250,2226],{}," を用いて投稿を挿入します。",[58,2253,2226],{},"は引数に連想配列を入れます。 ",[17,2256,2257],{},"対応するキー名が決まっているので間違えない様にしましょう。",[10,2259,2260],{},"そして同じ様にターミナルでこのPHPを実行すればwordpressに投稿データが入ります。ちなみに４万件は15分かかりました。投稿したデータはエディタで普通に編集できますが、クラシックモードでの編集となります。画像などもきちんとタグとパスが生きていればきちんとレンダーされます。",[24,2262,2264],{"id":2263},"ミスってしまったら","ミスってしまったら..",[10,2266,2267],{},"大量のデータを入れたのにミスってしまったらdockerをリセットしましょう。コンテナーを削除してDBのボリュームも削除します。",[69,2269,2272],{"className":2270,"code":2271,"language":74},[72],"docker volume rm VOLUME_NAME\n",[58,2273,2271],{"__ignoreMap":77},[10,2275,2276,2277,2280],{},"そしてまた ",[58,2278,2279],{},"docker-compose up -d"," を行うことで最初からやり直しができます。",[24,2282,2283],{"id":2283},"意外と簡単でした",[10,2285,2286,2287,2289],{},"以上が旧CMSからwordpressにデータを挿入する方法です。wordpressは ",[58,2288,825],{}," を読み込めばほとんどの関数を使用でき、ターミナルからも実行できます。 スクリプト自体も100行未満で思いつける簡単なものです。",[10,2291,2292],{},"もしプログラム的にwordpressを操作したい場合は日本語だと上手く出てこないので「wordpress how to ~~~ programmatically」と調べるといいです。私が調べたものですと以下の感じです。",[39,2294,2295,2298,2301],{},[42,2296,2297],{},"wordpress how to create post programmatically",[42,2299,2300],{},"wordpress how to create user programmatically",[42,2302,2303],{},"wordpress how to set user role programmatically",[10,2305,2306],{},"ぶっちゃけ旧CMSからデータを引っ張ってきたり、適切に加工したり、構造を把握する方が大変でした。機会があればこのデータ移行の時に一番大変だった、正規表現により独自タグの置換も記事にしたいと思います。",[2308,2309,2310],"style",{},"html pre.shiki code .s-wAU, html code.shiki .s-wAU{--shiki-default:#F07178}html pre.shiki code .sAklC, html code.shiki .sAklC{--shiki-default:#89DDFF}html pre.shiki code .sfyAc, html code.shiki .sfyAc{--shiki-default:#C3E88D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s0W1g, html code.shiki .s0W1g{--shiki-default:#BABED8}html pre.shiki code .sJ14y, html code.shiki .sJ14y{--shiki-default:#C792EA}html pre.shiki code .sx098, html code.shiki .sx098{--shiki-default:#F78C6C}",{"title":77,"searchDepth":232,"depth":232,"links":2312},[2313,2314,2315,2316,2317,2322,2326,2327,2328],{"id":26,"depth":225,"text":27},{"id":100,"depth":225,"text":100},{"id":134,"depth":225,"text":134},{"id":168,"depth":225,"text":168},{"id":501,"depth":225,"text":501,"children":2318},[2319,2320,2321],{"id":505,"depth":232,"text":505},{"id":583,"depth":232,"text":583},{"id":1081,"depth":232,"text":1081},{"id":1118,"depth":225,"text":1119,"children":2323},[2324,2325],{"id":1122,"depth":232,"text":1122},{"id":1675,"depth":232,"text":1675},{"id":1825,"depth":225,"text":1825},{"id":2263,"depth":225,"text":2264},{"id":2283,"depth":225,"text":2283},[2330],"devstack","2025-11-12","md",null,{},"\u002Farticles\u002Fmuch-post-migration-wp",{"title":5,"description":5},"articles\u002Fmuch-post-migration-wp",[2339,539],"wordpress","_mix\u002FWordPress-logotype-wmark-e1606319357320.png","XygCCNsuG0Q3ZTPUKENvFxlijb3Rx1MHJ5r8mRTS0sk",1780987140635]