[{"data":1,"prerenderedAt":3737},["ShallowReactive",2],{"tag-wordpress-1":3},{"count":4,"content":5},4,[6,2344,2431,3300],{"id":7,"title":8,"body":9,"category":2331,"createdAt":2333,"description":8,"extension":2334,"index":2335,"meta":2336,"navigation":231,"path":2337,"publish":231,"seo":2338,"series":2335,"seriesTitle":2335,"stem":2339,"tag":2340,"thumbnail":2342,"updatedAt":2333,"__hash__":2343},"articles\u002Farticles\u002Fmuch-post-migration-wp.md","別CMSで作成された4万件分の大量投稿をwordpressに引越しする",{"type":10,"value":11,"toc":2313},"minimark",[12,16,23,26,31,34,41,54,57,65,71,81,84,87,98,101,104,107,122,125,128,135,138,141,169,172,183,189,192,195,489,492,498,501,504,508,515,521,527,537,574,580,583,586,589,710,713,716,810,829,869,872,878,947,950,1069,1075,1078,1081,1084,1087,1093,1096,1102,1109,1115,1118,1122,1125,1128,1262,1268,1553,1560,1611,1614,1665,1675,1678,1681,1808,1822,1825,1828,1831,1978,1986,2216,2223,2237,2248,2260,2263,2267,2270,2276,2283,2286,2292,2295,2306,2309],[13,14,15],"p",{},"こんにちはjunです。会社でとてつもない量のCMSのデータをwordpressに移行する計画がありました。色々と課題がある中なんとかwordpressにデータをマイグレーションして再構築できたので共有したいと思います。",[13,17,18,19],{},"データが４万件もあるのでプログラム的にwordpressを操作する必要がありました。日本語で検索してもなかなかヒットしなかったので、少し苦労。 ",[20,21,22],"strong",{},"しかしCLIがわかって、使う関数を把握すれば意外と簡単です。",[13,24,25],{},"引越しの背景から説明するので、「ささっと移行手順を見せろや！」という人は「wordpress側の構築概要」から見てください。",[27,28,30],"h2",{"id":29},"背景データ移行の課題","背景＆データ移行の課題",[13,32,33],{},"2006年に構築されたサイトを弊社が受け持っており、その環境が古くなってきたので移行することになりました。PHP5、centos6というレガシーな環境で動いており非常に危なっかしい上に、ろくに保守もされてないのでページングとか表示もおかしい部分も出てきました。",[13,35,36,37,40],{},"移行するサイトはwordpressではない ",[20,38,39],{},"別のCMSで構築されており、移行の際にはDBからデータを一回ダンプして加工してwordpressにマイグレーションをする必要がありました。"," しかしそのデータは",[42,43,44,48,51],"ul",{},[45,46,47],"li",{},"投稿４万件",[45,49,50],{},"ユーザー8200人",[45,52,53],{},"カテゴリー90件",[13,55,56],{},"というデータが膨大であり必然的にプログラム的にデータを移行する必要があります。とりあえず担当の方と移行するデータを精査しました。元々はコミュニティサイトとして使用していたのでユーザーが非常に多く、移行すべきアクティブなユーザーは100人程度だったのでユーザーはかなり減りました。しかし投稿は全部移行でした（泣",[13,58,59,60,64],{},"旧CMSでの「カテゴリー」はブログの種類に当てはまりました。ブログを管理、投稿する部署が異なっていることが判明し、投稿データにも ",[61,62,63],"code",{},"categoruid"," の様に区別するカラムがありました。さらに言えばユーザー情報にも紐づいています笑。",[13,66,67,70],{},[20,68,69],{},"投稿データは旧CMSで結び付けられたユーザーID、カテゴリーIDの関係性を維持しながら移行する必要があります。"," さらに投稿データには",[72,73,78],"pre",{"className":74,"code":76,"language":77},[75],"language-text","[img]http:\u002F\u002F~~~~~[\u002Fimg]\n","text",[61,79,76],{"__ignoreMap":80},"",[13,82,83],{},"という様なそのCMS独自のタグが存在したので、wordpressに移行する前に正規表現で置換する必要がありました。（今回はその解説はしません。別途の記事で）",[13,85,86],{},"まとめると",[42,88,89,92,95],{},[45,90,91],{},"データ数が膨大。",[45,93,94],{},"記事はカテゴリー、ユーザーとの関係性を維持する。",[45,96,97],{},"記事データの独自記法をwordpress用に置換または削除する。",[13,99,100],{},"という課題がありました。",[27,102,103],{"id":103},"wordpress側の構築概要",[13,105,106],{},"今回の移行手順としては前準備に",[108,109,110,113,116,119],"ol",{},[45,111,112],{},"旧CMSからデータをダンプ(mysql）してローカルに入れておく。",[45,114,115],{},"データ構成をよく観察する。",[45,117,118],{},"必要なデータをSQLを用いて取得、JSONで取得",[45,120,121],{},"JSONを元にPHPスクリプトでデータを加工",[13,123,124],{},"この様にデータの加工をしてwordpressに入れ込む準備をしました。加工済みデータJSONとwordpressの関数を用いてこれらのデータをwordpressに移行しました。",[13,126,127],{},"移行の特に厄介だったのが旧CMSでは部署ごとにカテゴリーという名前でブログ種が分けられていたことです。wordpressのカテゴリーとは別の概念です。さらに管理ユーザーもそのカテゴリーで区別されていました。",[13,129,130,131,134],{},"そこで今回は ",[20,132,133],{},"wordpressをマルチサイト構成にして構築しました。"," wordpressには一つのwordpressシステムを用いて複数の異なるブログを構築する機能があります。詳しくはこちらの公式を参照。マルチサイトにすることで複数のブログに分け、さらにそのブログごとにユーザーの割当が可能になります。",[27,136,137],{"id":137},"引越し手順",[13,139,140],{},"手順としては以下の通りです。",[108,142,143,145,147,149,151,154,157,160,163,166],{},[45,144,112],{},[45,146,115],{},[45,148,118],{},[45,150,121],{},[45,152,153],{},"wordpressプロジェクト内に上記のデータを移行、挿入用PHPスクリプトを作成",[45,155,156],{},"マルチサイト 構成をONにしてブログネットワークを機械的に作成",[45,158,159],{},"ユーザーを作成して適切なブログネットワークに割り当てる。",[45,161,162],{},"投稿データを対応するユーザーとブログネットワークに割り当てる。",[45,164,165],{},"画像などを移行する。（今回はやりません）",[45,167,168],{},"全てのブログネットワークに共通のテーマを設定する。",[27,170,171],{"id":171},"dockerで検証環境を構築",[13,173,174,175,182],{},"まずはローカルでの検証環境を作りましょう。失敗するとDBが結構汚れるのですぐにリセットできるdockerを用います。",[176,177,181],"a",{"href":178,"rel":179},"https:\u002F\u002Fhub.docker.com\u002F_\u002Fwordpress",[180],"nofollow","wordpress公式のdockerHub","の通りにすれば簡単に構築できます。ディレクトリ構成は以下の通りです。",[72,184,187],{"className":185,"code":186,"language":77},[75],"docker-wordpress\u002F\n|\n|-scrips\u002F\n|-docker-compose.yml\n",[61,188,186],{"__ignoreMap":80},[13,190,191],{},"scripts\u002F にはwordpressに挿入するためのPHPスクリプトを入れておくためのディレクトリです。最終的にこのwordpress dockerコンテナの中に入って、このスクリプトをコマンドで実行します。",[13,193,194],{},"docker-compose.yml は以下の通りです。（ほとんど公式と同じ。一部改修",[72,196,201],{"className":197,"code":198,"filename":199,"language":200,"meta":80,"style":80},"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",[61,202,203,226,233,242,246,254,265,276,284,293,301,312,323,334,345,353,361,366,374,384,393,400,410,420,430,445,452,460,465,473,481],{"__ignoreMap":80},[204,205,208,212,216,219,223],"span",{"class":206,"line":207},"line",1,[204,209,211],{"class":210},"s-wAU","version",[204,213,215],{"class":214},"sAklC",":",[204,217,218],{"class":214}," '",[204,220,222],{"class":221},"sfyAc","3.1",[204,224,225],{"class":214},"'\n",[204,227,229],{"class":206,"line":228},2,[204,230,232],{"emptyLinePlaceholder":231},true,"\n",[204,234,236,239],{"class":206,"line":235},3,[204,237,238],{"class":210},"services",[204,240,241],{"class":214},":\n",[204,243,244],{"class":206,"line":4},[204,245,232],{"emptyLinePlaceholder":231},[204,247,249,252],{"class":206,"line":248},5,[204,250,251],{"class":210},"  wordpress",[204,253,241],{"class":214},[204,255,257,260,262],{"class":206,"line":256},6,[204,258,259],{"class":210},"    image",[204,261,215],{"class":214},[204,263,264],{"class":221}," wordpress\n",[204,266,268,271,273],{"class":206,"line":267},7,[204,269,270],{"class":210},"    restart",[204,272,215],{"class":214},[204,274,275],{"class":221}," always\n",[204,277,279,282],{"class":206,"line":278},8,[204,280,281],{"class":210},"    ports",[204,283,241],{"class":214},[204,285,287,290],{"class":206,"line":286},9,[204,288,289],{"class":214},"      -",[204,291,292],{"class":221}," 8080:80\n",[204,294,296,299],{"class":206,"line":295},10,[204,297,298],{"class":210},"    environment",[204,300,241],{"class":214},[204,302,304,307,309],{"class":206,"line":303},11,[204,305,306],{"class":210},"      WORDPRESS_DB_HOST",[204,308,215],{"class":214},[204,310,311],{"class":221}," db\n",[204,313,315,318,320],{"class":206,"line":314},12,[204,316,317],{"class":210},"      WORDPRESS_DB_USER",[204,319,215],{"class":214},[204,321,322],{"class":221}," exampleuser\n",[204,324,326,329,331],{"class":206,"line":325},13,[204,327,328],{"class":210},"      WORDPRESS_DB_PASSWORD",[204,330,215],{"class":214},[204,332,333],{"class":221}," examplepass\n",[204,335,337,340,342],{"class":206,"line":336},14,[204,338,339],{"class":210},"      WORDPRESS_DB_NAME",[204,341,215],{"class":214},[204,343,344],{"class":221}," exampledb\n",[204,346,348,351],{"class":206,"line":347},15,[204,349,350],{"class":210},"    volumes",[204,352,241],{"class":214},[204,354,356,358],{"class":206,"line":355},16,[204,357,289],{"class":214},[204,359,360],{"class":221}," .\u002Fscripts:\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\n",[204,362,364],{"class":206,"line":363},17,[204,365,232],{"emptyLinePlaceholder":231},[204,367,369,372],{"class":206,"line":368},18,[204,370,371],{"class":210},"  db",[204,373,241],{"class":214},[204,375,377,379,381],{"class":206,"line":376},19,[204,378,259],{"class":210},[204,380,215],{"class":214},[204,382,383],{"class":221}," mysql:5.7\n",[204,385,387,389,391],{"class":206,"line":386},20,[204,388,270],{"class":210},[204,390,215],{"class":214},[204,392,275],{"class":221},[204,394,396,398],{"class":206,"line":395},21,[204,397,298],{"class":210},[204,399,241],{"class":214},[204,401,403,406,408],{"class":206,"line":402},22,[204,404,405],{"class":210},"      MYSQL_DATABASE",[204,407,215],{"class":214},[204,409,344],{"class":221},[204,411,413,416,418],{"class":206,"line":412},23,[204,414,415],{"class":210},"      MYSQL_USER",[204,417,215],{"class":214},[204,419,322],{"class":221},[204,421,423,426,428],{"class":206,"line":422},24,[204,424,425],{"class":210},"      MYSQL_PASSWORD",[204,427,215],{"class":214},[204,429,333],{"class":221},[204,431,433,436,438,440,443],{"class":206,"line":432},25,[204,434,435],{"class":210},"      MYSQL_RANDOM_ROOT_PASSWORD",[204,437,215],{"class":214},[204,439,218],{"class":214},[204,441,442],{"class":221},"1",[204,444,225],{"class":214},[204,446,448,450],{"class":206,"line":447},26,[204,449,350],{"class":210},[204,451,241],{"class":214},[204,453,455,457],{"class":206,"line":454},27,[204,456,289],{"class":214},[204,458,459],{"class":221}," db_wp:\u002Fvar\u002Flib\u002Fmysql\n",[204,461,463],{"class":206,"line":462},28,[204,464,232],{"emptyLinePlaceholder":231},[204,466,468,471],{"class":206,"line":467},29,[204,469,470],{"class":210},"volumes",[204,472,241],{"class":214},[204,474,476,479],{"class":206,"line":475},30,[204,477,478],{"class":210},"  .\u002Fscripts",[204,480,241],{"class":214},[204,482,484,487],{"class":206,"line":483},31,[204,485,486],{"class":210},"  db_wp",[204,488,241],{"class":214},[13,490,491],{},"DBは永続化して、そしてスクリプトもローカルで編集してすぐに実行できる様にボリュームにマウントしておきます。これで準備完了です。",[72,493,496],{"className":494,"code":495,"language":77},[75],"jun@MacBook-Pro docker-wordpress % docker-compose up -d\n",[61,497,495],{"__ignoreMap":80},[13,499,500],{},"ブラウザを開いてlocalhost:8080にアクセスするとwordpressのインストール画面が開きます。DBの設定などは済んでいるので、初期ユーザーの設定だけで終わります。",[27,502,503],{"id":503},"マルチサイトを機械的に作成",[505,506,507],"h3",{"id":507},"マルチサイトの有効化",[13,509,510,511,514],{},"それではまず旧CMSのカテゴリーにあたる、マルチサイトを機械的に作成しましょう。その前に",[61,512,513],{},"wp-config.php","でやることがあります。以下の様なコードを追記してマルチサイト化を有効にします。",[72,516,519],{"className":517,"code":518,"language":77},[75],"define('WP_ALLOW_MULTISITE', true);\n",[61,520,518],{"__ignoreMap":80},[522,523],"image-render",{":src":524,":width":525,":center":526},"'_mix\u002Fwpml-197x300.png'","'300px'","true",[13,528,529,530,532,533,536],{},"有効にすると「ツール」から「サイトネットワークの設置」というメニューが出現します。これをクリックしてサイトネットワークの設定を行います。そして新しくコードを追記しろと言われるので以下の様に",[61,531,513],{}," と ",[61,534,535],{},".htaccess","に追記します。",[72,538,542],{"className":539,"code":540,"filename":513,"language":541,"meta":80,"style":80},"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",[61,543,544,549,554,559,564,569],{"__ignoreMap":80},[204,545,546],{"class":206,"line":207},[204,547,548],{},"define('MULTISITE', true);\n",[204,550,551],{"class":206,"line":228},[204,552,553],{},"define('SUBDOMAIN_INSTALL', false);\n",[204,555,556],{"class":206,"line":235},[204,557,558],{},"define('DOMAIN_CURRENT_SITE', 'localhost');\n",[204,560,561],{"class":206,"line":4},[204,562,563],{},"define('PATH_CURRENT_SITE', '\u002F');\n",[204,565,566],{"class":206,"line":248},[204,567,568],{},"define('SITE_ID_CURRENT_SITE', 1);\n",[204,570,571],{"class":206,"line":256},[204,572,573],{},"define('BLOG_ID_CURRENT_SITE', 1);\n",[72,575,578],{"className":576,"code":577,"filename":535,"language":77,"meta":80},[75],"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",[61,579,577],{"__ignoreMap":80},[13,581,582],{},"なお、今回はドメイン別ではなくサブディレクトリ形式のマルチサイト とします。",[505,584,585],{"id":585},"サイト作成プログラム",[13,587,588],{},"移行元のデータはすでにJSONにしてあります。以下の様な構成とします。",[72,590,595],{"className":591,"code":592,"filename":593,"language":594,"meta":80,"style":80},"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",[61,596,597,602,608,613,637,657,677,696,701,705],{"__ignoreMap":80},[204,598,599],{"class":206,"line":207},[204,600,601],{"class":214},"[\n",[204,603,604],{"class":206,"line":228},[204,605,607],{"class":606},"s0W1g","  ...\n",[204,609,610],{"class":206,"line":235},[204,611,612],{"class":214},"  {\n",[204,614,615,618,622,625,627,629,632,634],{"class":206,"line":4},[204,616,617],{"class":214},"    \"",[204,619,621],{"class":620},"sJ14y","id",[204,623,624],{"class":214},"\"",[204,626,215],{"class":214},[204,628,624],{"class":214},[204,630,631],{"class":221},"6",[204,633,624],{"class":214},[204,635,636],{"class":214},",\n",[204,638,639,641,644,646,648,650,653,655],{"class":206,"line":248},[204,640,617],{"class":214},[204,642,643],{"class":620},"name",[204,645,624],{"class":214},[204,647,215],{"class":214},[204,649,624],{"class":214},[204,651,652],{"class":221},"サイトの名前",[204,654,624],{"class":214},[204,656,636],{"class":214},[204,658,659,661,664,666,668,670,673,675],{"class":206,"line":256},[204,660,617],{"class":214},[204,662,663],{"class":620},"sub_title",[204,665,624],{"class":214},[204,667,215],{"class":214},[204,669,624],{"class":214},[204,671,672],{"class":221},"サイトのキャッチフレーズ的なもの",[204,674,624],{"class":214},[204,676,636],{"class":214},[204,678,679,681,684,686,688,690,693],{"class":206,"line":267},[204,680,617],{"class":214},[204,682,683],{"class":620},"mailUser",[204,685,624],{"class":214},[204,687,215],{"class":214},[204,689,624],{"class":214},[204,691,692],{"class":221},"3::1543",[204,694,695],{"class":214},"\"\n",[204,697,698],{"class":206,"line":278},[204,699,700],{"class":214},"  },\n",[204,702,703],{"class":206,"line":286},[204,704,607],{"class":606},[204,706,707],{"class":206,"line":295},[204,708,709],{"class":214},"]\n",[13,711,712],{},"旧CMSからはこの様になっており、mailUserがこのカテゴリー（ブログ）を管理するユーザーです。wordpressのマルチサイトを作るには、初期管理ユーザーとサイト名があればとりあえず作れます。",[13,714,715],{},"そして追加スクリプトは以下の通りです。",[72,717,720],{"className":539,"code":718,"filename":719,"language":541,"meta":80,"style":80},"\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",[61,721,722,727,732,736,741,746,751,756,761,766,771,776,781,786,790,795,800,805],{"__ignoreMap":80},[204,723,724],{"class":206,"line":207},[204,725,726],{},"\u003C?php\n",[204,728,729],{"class":206,"line":228},[204,730,731],{},"require_once('..\u002F..\u002Fwp-load.php');\n",[204,733,734],{"class":206,"line":235},[204,735,232],{"emptyLinePlaceholder":231},[204,737,738],{"class":206,"line":4},[204,739,740],{},"$json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fcategory\u002Farticle_categpry.json');\n",[204,742,743],{"class":206,"line":248},[204,744,745],{},"$cats = json_decode($json,true);\n",[204,747,748],{"class":206,"line":256},[204,749,750],{},"$new_id = 2;\n",[204,752,753],{"class":206,"line":267},[204,754,755],{},"foreach($cats as $key=>&$val){\n",[204,757,758],{"class":206,"line":278},[204,759,760],{},"    wpmu_create_blog('localhost','blog'.$key,$val['name'],1,array('blogdescription'=>$val['sub_title']));\n",[204,762,763],{"class":206,"line":286},[204,764,765],{},"    \n",[204,767,768],{"class":206,"line":295},[204,769,770],{},"    if( is_wp_error( $return ) ) {\n",[204,772,773],{"class":206,"line":303},[204,774,775],{},"        print_r($return->get_error_message().\"\\n\");\n",[204,777,778],{"class":206,"line":314},[204,779,780],{},"        continue;\n",[204,782,783],{"class":206,"line":325},[204,784,785],{},"    }\n",[204,787,788],{"class":206,"line":336},[204,789,765],{},[204,791,792],{"class":206,"line":347},[204,793,794],{},"    $val['new_id']=$new_id;\n",[204,796,797],{"class":206,"line":355},[204,798,799],{},"    $new_id++;\n",[204,801,802],{"class":206,"line":363},[204,803,804],{},"}\n",[204,806,807],{"class":206,"line":368},[204,808,809],{},"file_put_contents(\"\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fcategory\u002Fregistered_article_categpry.json\", json_encode($cats,JSON_UNESCAPED_UNICODE));\n",[13,811,812,815,816,818,819,822,823],{},[61,813,814],{},"wpmu_create_blog"," という関数を用いて作成します。",[61,817,814],{}," を使用するためには上記のコード二行目にある ",[61,820,821],{},"require_once('..\u002F..\u002Fwp-load.php');"," が必要になります。 ",[20,824,825,828],{},[61,826,827],{},"wp-load.php"," を使用することでwordpress関数が使用できる様になります。引数は以下の様に取ります。",[72,830,832],{"className":539,"code":831,"language":541,"meta":80,"style":80},"wpmu_create_blog(\n  ブログのドメイン（必須）,\n  ブログのサブディレクトリ名（必須）,\n  サイト名（必須）,\n  管理ユーザーID（必須）,\n  そのほかの情報（配列）,\n)\n",[61,833,834,839,844,849,854,859,864],{"__ignoreMap":80},[204,835,836],{"class":206,"line":207},[204,837,838],{},"wpmu_create_blog(\n",[204,840,841],{"class":206,"line":228},[204,842,843],{},"  ブログのドメイン（必須）,\n",[204,845,846],{"class":206,"line":235},[204,847,848],{},"  ブログのサブディレクトリ名（必須）,\n",[204,850,851],{"class":206,"line":4},[204,852,853],{},"  サイト名（必須）,\n",[204,855,856],{"class":206,"line":248},[204,857,858],{},"  管理ユーザーID（必須）,\n",[204,860,861],{"class":206,"line":256},[204,862,863],{},"  そのほかの情報（配列）,\n",[204,865,866],{"class":206,"line":267},[204,867,868],{},")\n",[13,870,871],{},"上記スクリプトは非常に単純です。JSONにある旧CMSに登録されたブログカテゴリー分だけforeachで回して関数を実行しているだけです。",[13,873,874,875],{},"しかしブログカテゴリーは後でユーザーと投稿を挿入する際に必要となるので、 ",[20,876,877],{},"「wordpressでのブログIDと以前のブログカテゴリーIDを対応させる」様にしておきます。下記の様に工夫をしておきます。",[72,879,881],{"className":539,"code":880,"language":541,"meta":80,"style":80},"$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",[61,882,883,888,893,897,901,905,909,913,917,922,926,930,934,938,943],{"__ignoreMap":80},[204,884,885],{"class":206,"line":207},[204,886,887],{},"$new_id = 2; \u002F\u002F 新しいブログIDの最初の値\n",[204,889,890],{"class":206,"line":228},[204,891,892],{},"foreach($cats as $key=>&$val){ \u002F\u002F参照渡しをしておく\n",[204,894,895],{"class":206,"line":235},[204,896,760],{},[204,898,899],{"class":206,"line":4},[204,900,765],{},[204,902,903],{"class":206,"line":248},[204,904,770],{},[204,906,907],{"class":206,"line":256},[204,908,775],{},[204,910,911],{"class":206,"line":267},[204,912,780],{},[204,914,915],{"class":206,"line":278},[204,916,785],{},[204,918,919],{"class":206,"line":286},[204,920,921],{},"    \u002F\u002F エラーが起きなかったら new_id という新しいカラムと共にwordpressのブログIDを記録\n",[204,923,924],{"class":206,"line":295},[204,925,794],{},[204,927,928],{"class":206,"line":303},[204,929,799],{},[204,931,932],{"class":206,"line":314},[204,933,804],{},[204,935,936],{"class":206,"line":325},[204,937,232],{"emptyLinePlaceholder":231},[204,939,940],{"class":206,"line":336},[204,941,942],{},"\u002F\u002F wordpressと旧CMSとの関係性を記録したJSONを出力\n",[204,944,945],{"class":206,"line":347},[204,946,809],{},[13,948,949],{},"すると新しく作成されたJSONを見ると",[72,951,954],{"className":591,"code":952,"filename":953,"language":594,"meta":80,"style":80},"[\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",[61,955,956,960,965,969,987,1005,1023,1041,1056,1061,1065],{"__ignoreMap":80},[204,957,958],{"class":206,"line":207},[204,959,601],{"class":214},[204,961,962],{"class":206,"line":228},[204,963,964],{"class":606},"...\n",[204,966,967],{"class":206,"line":235},[204,968,612],{"class":214},[204,970,971,973,975,977,979,981,983,985],{"class":206,"line":4},[204,972,617],{"class":214},[204,974,621],{"class":620},[204,976,624],{"class":214},[204,978,215],{"class":214},[204,980,624],{"class":214},[204,982,631],{"class":221},[204,984,624],{"class":214},[204,986,636],{"class":214},[204,988,989,991,993,995,997,999,1001,1003],{"class":206,"line":248},[204,990,617],{"class":214},[204,992,643],{"class":620},[204,994,624],{"class":214},[204,996,215],{"class":214},[204,998,624],{"class":214},[204,1000,652],{"class":221},[204,1002,624],{"class":214},[204,1004,636],{"class":214},[204,1006,1007,1009,1011,1013,1015,1017,1019,1021],{"class":206,"line":256},[204,1008,617],{"class":214},[204,1010,663],{"class":620},[204,1012,624],{"class":214},[204,1014,215],{"class":214},[204,1016,624],{"class":214},[204,1018,672],{"class":221},[204,1020,624],{"class":214},[204,1022,636],{"class":214},[204,1024,1025,1027,1029,1031,1033,1035,1037,1039],{"class":206,"line":267},[204,1026,617],{"class":214},[204,1028,683],{"class":620},[204,1030,624],{"class":214},[204,1032,215],{"class":214},[204,1034,624],{"class":214},[204,1036,692],{"class":221},[204,1038,624],{"class":214},[204,1040,636],{"class":214},[204,1042,1043,1045,1048,1050,1052],{"class":206,"line":278},[204,1044,617],{"class":214},[204,1046,1047],{"class":620},"new_id",[204,1049,624],{"class":214},[204,1051,215],{"class":214},[204,1053,1055],{"class":1054},"sx098","3\n",[204,1057,1058],{"class":206,"line":286},[204,1059,1060],{"class":214},"  }\n",[204,1062,1063],{"class":206,"line":295},[204,1064,964],{"class":606},[204,1066,1067],{"class":206,"line":303},[204,1068,709],{"class":214},[13,1070,1071,1072],{},"new_idというカラムとwordpressでのブログIDが入りました。こうすることで ",[20,1073,1074],{},"「旧CMSでのブログカテゴリーID 6のものはwordpressではブログID 3」という関係性を保存できます。",[13,1076,1077],{},"以上でブログカテゴリーの移行は終了しました。訳70サイトもあるのでこんな感じ↓になります笑。",[522,1079],{":src":1080,":width":525,":center":526},"'_mix\u002Fwp-sites-146x300.jpeg'",[505,1082,1083],{"id":1083},"スクリプトの実行方法",[13,1085,1086],{},"これらスクリプトはコマンドで実行します。dockerで管理しているので",[72,1088,1091],{"className":1089,"code":1090,"language":77},[75],"docker exec -it {wordpressのコンテナ名} \u002Fbin\u002Fbash\n",[61,1092,1090],{"__ignoreMap":80},[13,1094,1095],{},"この様にしてwordpressを立ち上げているコンテナに入って、コマンドを実行しにいきます。",[72,1097,1100],{"className":1098,"code":1099,"language":77},[75],"root@0756d76ddde1:\u002Fvar\u002Fwww\u002Fhtml# \n",[61,1101,1099],{"__ignoreMap":80},[13,1103,1104,1105,1108],{},"コンテナに入るとこの様にターミナルが変化します。リモートサーバーにsshでログインしたみたいな感じです。そしてdockerを立ち上げるときに ",[61,1106,1107],{},"scripts\u002F"," ディレクトリをボリュームしているのでそこに移動します。",[72,1110,1113],{"className":1111,"code":1112,"language":77},[75],"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",[61,1114,1112],{"__ignoreMap":80},[13,1116,1117],{},"上記の様にphpファイルを指定することでスクリプトが実行されます。",[27,1119,1121],{"id":1120},"ユーザーを機械的に作成割り当て","ユーザーを機械的に作成、割り当て",[505,1123,1124],{"id":1124},"ユーザーの追加",[13,1126,1127],{},"ではそれぞれのブログを作成したので次はユーザーを作成していきます。ユーザーは以下の様なJSONです。",[72,1129,1132],{"className":591,"code":1130,"filename":1131,"language":594,"meta":80,"style":80},"[\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",[61,1133,1134,1138,1143,1148,1169,1189,1208,1228,1239,1250,1254,1258],{"__ignoreMap":80},[204,1135,1136],{"class":206,"line":207},[204,1137,601],{"class":214},[204,1139,1140],{"class":206,"line":228},[204,1141,1142],{"class":606},"    ...\n",[204,1144,1145],{"class":206,"line":235},[204,1146,1147],{"class":214},"    {\n",[204,1149,1150,1153,1156,1158,1160,1162,1165,1167],{"class":206,"line":4},[204,1151,1152],{"class":214},"        \"",[204,1154,1155],{"class":620},"uid",[204,1157,624],{"class":214},[204,1159,215],{"class":214},[204,1161,624],{"class":214},[204,1163,1164],{"class":221},"3",[204,1166,624],{"class":214},[204,1168,636],{"class":214},[204,1170,1171,1173,1176,1178,1180,1182,1185,1187],{"class":206,"line":248},[204,1172,1152],{"class":214},[204,1174,1175],{"class":620},"loginname",[204,1177,624],{"class":214},[204,1179,215],{"class":214},[204,1181,624],{"class":214},[204,1183,1184],{"class":221},"webmaster",[204,1186,624],{"class":214},[204,1188,636],{"class":214},[204,1190,1191,1193,1195,1197,1199,1201,1204,1206],{"class":206,"line":256},[204,1192,1152],{"class":214},[204,1194,643],{"class":620},[204,1196,624],{"class":214},[204,1198,215],{"class":214},[204,1200,624],{"class":214},[204,1202,1203],{"class":221},"お名前",[204,1205,624],{"class":214},[204,1207,636],{"class":214},[204,1209,1210,1212,1215,1217,1219,1221,1224,1226],{"class":206,"line":267},[204,1211,1152],{"class":214},[204,1213,1214],{"class":620},"email",[204,1216,624],{"class":214},[204,1218,215],{"class":214},[204,1220,624],{"class":214},[204,1222,1223],{"class":221},"example@example.com",[204,1225,624],{"class":214},[204,1227,636],{"class":214},[204,1229,1230,1232,1235,1237],{"class":206,"line":278},[204,1231,1152],{"class":214},[204,1233,1234],{"class":620},"user_avatar",[204,1236,624],{"class":214},[204,1238,241],{"class":214},[204,1240,1241,1243,1246,1248],{"class":206,"line":286},[204,1242,1152],{"class":214},[204,1244,1245],{"class":221},"thumbnail.jpg",[204,1247,624],{"class":214},[204,1249,636],{"class":214},[204,1251,1252],{"class":206,"line":295},[204,1253,785],{"class":214},[204,1255,1256],{"class":206,"line":303},[204,1257,1142],{"class":606},[204,1259,1260],{"class":206,"line":314},[204,1261,709],{"class":214},[13,1263,1264,1267],{},[61,1265,1266],{},"groupid"," は旧CMSの権限グループです。そしてユーザー追加スクリプトは以下の様になります。",[72,1269,1271],{"className":539,"code":1270,"language":541,"meta":80,"style":80},"\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",[61,1272,1273,1277,1281,1285,1290,1295,1299,1303,1308,1312,1317,1322,1327,1332,1337,1342,1347,1352,1356,1360,1365,1369,1373,1377,1382,1386,1390,1394,1399,1403,1407,1411,1417,1422,1427,1432,1438,1443,1448,1453,1458,1464,1470,1476,1482,1488,1494,1500,1506,1511,1516,1522,1527,1532,1537,1542,1547],{"__ignoreMap":80},[204,1274,1275],{"class":206,"line":207},[204,1276,726],{},[204,1278,1279],{"class":206,"line":228},[204,1280,731],{},[204,1282,1283],{"class":206,"line":235},[204,1284,232],{"emptyLinePlaceholder":231},[204,1286,1287],{"class":206,"line":4},[204,1288,1289],{},"$json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fuser\u002Fuser.json');\n",[204,1291,1292],{"class":206,"line":248},[204,1293,1294],{},"$uesrs = json_decode($json,true);\n",[204,1296,1297],{"class":206,"line":256},[204,1298,232],{"emptyLinePlaceholder":231},[204,1300,1301],{"class":206,"line":267},[204,1302,750],{},[204,1304,1305],{"class":206,"line":278},[204,1306,1307],{},"foreach($uesrs as &$val){\n",[204,1309,1310],{"class":206,"line":286},[204,1311,232],{"emptyLinePlaceholder":231},[204,1313,1314],{"class":206,"line":295},[204,1315,1316],{},"    $role;\n",[204,1318,1319],{"class":206,"line":303},[204,1320,1321],{},"    switch($val['groupid']){\n",[204,1323,1324],{"class":206,"line":314},[204,1325,1326],{},"        case \"1\":\n",[204,1328,1329],{"class":206,"line":325},[204,1330,1331],{},"            $role = 'administrator';\n",[204,1333,1334],{"class":206,"line":336},[204,1335,1336],{},"        break;\n",[204,1338,1339],{"class":206,"line":347},[204,1340,1341],{},"       \n",[204,1343,1344],{"class":206,"line":355},[204,1345,1346],{},"        case \"2\":\n",[204,1348,1349],{"class":206,"line":363},[204,1350,1351],{},"            $role = 'contributor';\n",[204,1353,1354],{"class":206,"line":368},[204,1355,1336],{},[204,1357,1358],{"class":206,"line":376},[204,1359,232],{"emptyLinePlaceholder":231},[204,1361,1362],{"class":206,"line":386},[204,1363,1364],{},"        case \"3\":\n",[204,1366,1367],{"class":206,"line":395},[204,1368,1351],{},[204,1370,1371],{"class":206,"line":402},[204,1372,1336],{},[204,1374,1375],{"class":206,"line":412},[204,1376,232],{"emptyLinePlaceholder":231},[204,1378,1379],{"class":206,"line":422},[204,1380,1381],{},"        case \"4\":\n",[204,1383,1384],{"class":206,"line":432},[204,1385,1331],{},[204,1387,1388],{"class":206,"line":447},[204,1389,1336],{},[204,1391,1392],{"class":206,"line":454},[204,1393,232],{"emptyLinePlaceholder":231},[204,1395,1396],{"class":206,"line":462},[204,1397,1398],{},"        case \"5\":\n",[204,1400,1401],{"class":206,"line":467},[204,1402,1351],{},[204,1404,1405],{"class":206,"line":475},[204,1406,1336],{},[204,1408,1409],{"class":206,"line":483},[204,1410,232],{"emptyLinePlaceholder":231},[204,1412,1414],{"class":206,"line":1413},32,[204,1415,1416],{},"        case \"6\":\n",[204,1418,1420],{"class":206,"line":1419},33,[204,1421,1331],{},[204,1423,1425],{"class":206,"line":1424},34,[204,1426,1336],{},[204,1428,1430],{"class":206,"line":1429},35,[204,1431,232],{"emptyLinePlaceholder":231},[204,1433,1435],{"class":206,"line":1434},36,[204,1436,1437],{},"        case \"7\":\n",[204,1439,1441],{"class":206,"line":1440},37,[204,1442,1331],{},[204,1444,1446],{"class":206,"line":1445},38,[204,1447,1336],{},[204,1449,1451],{"class":206,"line":1450},39,[204,1452,785],{},[204,1454,1456],{"class":206,"line":1455},40,[204,1457,232],{"emptyLinePlaceholder":231},[204,1459,1461],{"class":206,"line":1460},41,[204,1462,1463],{},"    $user = [\n",[204,1465,1467],{"class":206,"line":1466},42,[204,1468,1469],{},"        'user_pass'=>'PASS_WORD',\n",[204,1471,1473],{"class":206,"line":1472},43,[204,1474,1475],{},"        'user_login'=>$val['loginname'],\n",[204,1477,1479],{"class":206,"line":1478},44,[204,1480,1481],{},"        'user_email'=>$val['email'],\n",[204,1483,1485],{"class":206,"line":1484},45,[204,1486,1487],{},"        'display_name'=>$val['uid'],\n",[204,1489,1491],{"class":206,"line":1490},46,[204,1492,1493],{},"        'role'=>$role,\n",[204,1495,1497],{"class":206,"line":1496},47,[204,1498,1499],{},"    ];\n",[204,1501,1503],{"class":206,"line":1502},48,[204,1504,1505],{},"    $return = wp_insert_user($user);\n",[204,1507,1509],{"class":206,"line":1508},49,[204,1510,765],{},[204,1512,1514],{"class":206,"line":1513},50,[204,1515,770],{},[204,1517,1519],{"class":206,"line":1518},51,[204,1520,1521],{},"        print_r($return->get_error_message().':'.$val['loginname'].\"\\n\");\n",[204,1523,1525],{"class":206,"line":1524},52,[204,1526,780],{},[204,1528,1530],{"class":206,"line":1529},53,[204,1531,785],{},[204,1533,1535],{"class":206,"line":1534},54,[204,1536,794],{},[204,1538,1540],{"class":206,"line":1539},55,[204,1541,799],{},[204,1543,1545],{"class":206,"line":1544},56,[204,1546,804],{},[204,1548,1550],{"class":206,"line":1549},57,[204,1551,1552],{},"file_put_contents(\"\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fuser\u002Fregistered_user.json\", json_encode($uesrs,JSON_UNESCAPED_UNICODE));\n",[13,1554,1555,1556,1559],{},"ちょっと自分のためのコードがありますが、重要なのは ",[61,1557,1558],{},"wp_insert_user"," という関数です。引数は連想配列で入れます。以下のキー名で配列にします。",[72,1561,1563],{"className":539,"code":1562,"language":541,"meta":80,"style":80},"$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",[61,1564,1565,1570,1578,1583,1591,1599,1607],{"__ignoreMap":80},[204,1566,1567],{"class":206,"line":207},[204,1568,1569],{},"$user = [\n",[204,1571,1572,1575],{"class":206,"line":228},[204,1573,1574],{},"        'user_pass'=>'PASS_WORD',",[204,1576,1577],{},"       \u002F\u002F パスワード名\n",[204,1579,1580],{"class":206,"line":235},[204,1581,1582],{},"        'user_login'=>$val['loginname'],\u002F\u002F ログイン名（英数字でないといけない）\n",[204,1584,1585,1588],{"class":206,"line":4},[204,1586,1587],{},"        'user_email'=>$val['email'],",[204,1589,1590],{},"    \u002F\u002F 登録アドレス\n",[204,1592,1593,1596],{"class":206,"line":248},[204,1594,1595],{},"        'display_name'=>$val['uid'],",[204,1597,1598],{},"    \u002F\u002F 表示名（プロフ名）\n",[204,1600,1601,1604],{"class":206,"line":256},[204,1602,1603],{},"        'role'=>$role,",[204,1605,1606],{},"                  \u002F\u002F 権限キー\n",[204,1608,1609],{"class":206,"line":267},[204,1610,1499],{},[13,1612,1613],{},"権限キーは文字列で指定します。私のコードでは旧CMSのIDを対応させています。そしてブログの時の様に旧データと新データのIDを対応させる様にします。",[72,1615,1617],{"className":539,"code":1616,"language":541,"meta":80,"style":80},"...\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",[61,1618,1619,1623,1628,1632,1637,1641,1645,1649,1653,1657,1661],{"__ignoreMap":80},[204,1620,1621],{"class":206,"line":207},[204,1622,964],{},[204,1624,1625],{"class":206,"line":228},[204,1626,1627],{},"   $return = wp_insert_user($user);\n",[204,1629,1630],{"class":206,"line":235},[204,1631,232],{"emptyLinePlaceholder":231},[204,1633,1634],{"class":206,"line":4},[204,1635,1636],{},"　　if( is_wp_error( $return ) ) {\n",[204,1638,1639],{"class":206,"line":248},[204,1640,1521],{},[204,1642,1643],{"class":206,"line":256},[204,1644,780],{},[204,1646,1647],{"class":206,"line":267},[204,1648,785],{},[204,1650,1651],{"class":206,"line":278},[204,1652,794],{},[204,1654,1655],{"class":206,"line":286},[204,1656,799],{},[204,1658,1659],{"class":206,"line":295},[204,1660,804],{},[204,1662,1663],{"class":206,"line":303},[204,1664,1552],{},[13,1666,1667,1674],{},[20,1668,1669,1670,1673],{},"ちなみにスクリプトを実行するときは ",[61,1671,1672],{},"is_wp_error( $return ) ","でエラーをキャッチできる様にしましょう。"," なぜか私のデータには同じユーザーのデータがあったりなどで、「ユーザーがすでに登録されています」というエラーでIDがずれてしまうという事件がありました。そのためにキャッチできるスクリプトを入れておきましょう。",[505,1676,1677],{"id":1677},"ユーザーをブログに当てはめ",[13,1679,1680],{},"ユーザーのスクリプトを実行するとユーザーが作成され、新旧のIDを対応させたユーザーJSONファイルができました。これとブログカテゴリーのデータを用いて各ブログを管理するユーザーを割り当てていきます。",[72,1682,1685],{"className":539,"code":1683,"filename":1684,"language":541,"meta":80,"style":80},"\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",[61,1686,1687,1691,1695,1699,1704,1709,1714,1718,1723,1728,1733,1737,1742,1747,1751,1756,1761,1766,1771,1775,1780,1785,1790,1795,1800,1804],{"__ignoreMap":80},[204,1688,1689],{"class":206,"line":207},[204,1690,726],{},[204,1692,1693],{"class":206,"line":228},[204,1694,731],{},[204,1696,1697],{"class":206,"line":235},[204,1698,232],{"emptyLinePlaceholder":231},[204,1700,1701],{"class":206,"line":4},[204,1702,1703],{},"\u002F\u002F wordpress user IDが入ったuserのファイル\n",[204,1705,1706],{"class":206,"line":248},[204,1707,1708],{},"$user_json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fuser\u002Fregistered_user.json');\n",[204,1710,1711],{"class":206,"line":256},[204,1712,1713],{},"$uesrs = json_decode($user_json,true);\n",[204,1715,1716],{"class":206,"line":267},[204,1717,232],{"emptyLinePlaceholder":231},[204,1719,1720],{"class":206,"line":278},[204,1721,1722],{},"\u002F\u002F wordpress blog IDが入ったブログカテゴリーのファイル\n",[204,1724,1725],{"class":206,"line":286},[204,1726,1727],{},"$cat_json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Fcategory\u002Fregistered_article_categpry.json');\n",[204,1729,1730],{"class":206,"line":295},[204,1731,1732],{},"$cats = json_decode($cat_json,true);\n",[204,1734,1735],{"class":206,"line":303},[204,1736,232],{"emptyLinePlaceholder":231},[204,1738,1739],{"class":206,"line":314},[204,1740,1741],{},"foreach($cats as $cat_key=> $cat_val){\n",[204,1743,1744],{"class":206,"line":325},[204,1745,1746],{},"    $old_user_ids =explode('::',$cat_val['mailUser']);\n",[204,1748,1749],{"class":206,"line":336},[204,1750,765],{},[204,1752,1753],{"class":206,"line":347},[204,1754,1755],{},"    foreach($old_user_ids as $old_id){\n",[204,1757,1758],{"class":206,"line":355},[204,1759,1760],{},"        $user = array_values(array_filter($uesrs,function($ele) use($old_id) {\n",[204,1762,1763],{"class":206,"line":363},[204,1764,1765],{},"            return $ele['uid'] == $old_id && isset($ele['new_id']);\n",[204,1767,1768],{"class":206,"line":368},[204,1769,1770],{},"        }));\n",[204,1772,1773],{"class":206,"line":376},[204,1774,232],{"emptyLinePlaceholder":231},[204,1776,1777],{"class":206,"line":386},[204,1778,1779],{},"        if(!empty($user)){\n",[204,1781,1782],{"class":206,"line":395},[204,1783,1784],{},"            $new_userid = $user[0]['new_id'];\n",[204,1786,1787],{"class":206,"line":402},[204,1788,1789],{},"            $new_cat_id =intval($cat_val['new_id']);\n",[204,1791,1792],{"class":206,"line":412},[204,1793,1794],{},"            add_user_to_blog($new_cat_id,$new_userid,'administrator');\n",[204,1796,1797],{"class":206,"line":422},[204,1798,1799],{},"        }\n",[204,1801,1802],{"class":206,"line":432},[204,1803,785],{},[204,1805,1806],{"class":206,"line":447},[204,1807,804],{},[13,1809,1810,1811,1814,1815,1817,1818,1821],{},"私のデータの場合、ユーザーが複数人いたので",[61,1812,1813],{},"foreach","の中でさらに",[61,1816,1813],{},"しています。マルチサイト の特定のブログに対してユーザーを割り当てるためには ",[61,1819,1820],{},"add_user_to_blog"," を用います。",[13,1823,1824],{},"第一引数にユーザーID、第二引数に対象のブログID、第三には権限グループを指定することで簡単にブログに対してユーザーを割り当てられます。",[27,1826,1827],{"id":1827},"投稿を機械的に流し込み",[13,1829,1830],{},"最後に投稿を流し込みます。私が使用したデータは以下の様なデータになっています。",[72,1832,1835],{"className":591,"code":1833,"filename":1834,"language":594,"meta":80,"style":80},"[\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",[61,1836,1837,1841,1845,1849,1869,1889,1908,1927,1947,1965,1970,1974],{"__ignoreMap":80},[204,1838,1839],{"class":206,"line":207},[204,1840,601],{"class":214},[204,1842,1843],{"class":206,"line":228},[204,1844,964],{"class":606},[204,1846,1847],{"class":206,"line":235},[204,1848,1147],{"class":214},[204,1850,1851,1854,1856,1858,1860,1862,1865,1867],{"class":206,"line":4},[204,1852,1853],{"class":214},"    　\"",[204,1855,621],{"class":620},[204,1857,624],{"class":214},[204,1859,215],{"class":214},[204,1861,624],{"class":214},[204,1863,1864],{"class":221},"162",[204,1866,624],{"class":214},[204,1868,636],{"class":214},[204,1870,1871,1873,1876,1878,1880,1882,1885,1887],{"class":206,"line":248},[204,1872,1853],{"class":214},[204,1874,1875],{"class":620},"date",[204,1877,624],{"class":214},[204,1879,215],{"class":214},[204,1881,624],{"class":214},[204,1883,1884],{"class":221},"2007-08-02",[204,1886,624],{"class":214},[204,1888,636],{"class":214},[204,1890,1891,1893,1896,1898,1900,1902,1904,1906],{"class":206,"line":256},[204,1892,1853],{"class":214},[204,1894,1895],{"class":620},"category_id",[204,1897,624],{"class":214},[204,1899,215],{"class":214},[204,1901,624],{"class":214},[204,1903,631],{"class":221},[204,1905,624],{"class":214},[204,1907,636],{"class":214},[204,1909,1910,1912,1914,1916,1918,1920,1923,1925],{"class":206,"line":267},[204,1911,1853],{"class":214},[204,1913,1155],{"class":620},[204,1915,624],{"class":214},[204,1917,215],{"class":214},[204,1919,624],{"class":214},[204,1921,1922],{"class":221},"1543",[204,1924,624],{"class":214},[204,1926,636],{"class":214},[204,1928,1929,1931,1934,1936,1938,1940,1943,1945],{"class":206,"line":278},[204,1930,1853],{"class":214},[204,1932,1933],{"class":620},"title",[204,1935,624],{"class":214},[204,1937,215],{"class":214},[204,1939,624],{"class":214},[204,1941,1942],{"class":221},"タイトル",[204,1944,624],{"class":214},[204,1946,636],{"class":214},[204,1948,1949,1951,1954,1956,1958,1960,1963],{"class":206,"line":286},[204,1950,1853],{"class":214},[204,1952,1953],{"class":620},"content",[204,1955,624],{"class":214},[204,1957,215],{"class":214},[204,1959,624],{"class":214},[204,1961,1962],{"class":221},"ここにブログの内容がプレーンテキスト形式で入っています。",[204,1964,695],{"class":214},[204,1966,1967],{"class":206,"line":295},[204,1968,1969],{"class":214},"    },\n",[204,1971,1972],{"class":206,"line":303},[204,1973,964],{"class":606},[204,1975,1976],{"class":206,"line":314},[204,1977,709],{"class":214},[13,1979,1980,1982,1983,1985],{},[61,1981,1155],{},"を元にユーザー（著者）と結び付け、",[61,1984,1895],{},"を元にどのブログに投稿するのかを指定します。以下の様なスクリプトを書きました。",[72,1987,1990],{"className":539,"code":1988,"filename":1989,"language":541,"meta":80,"style":80},"\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",[61,1991,1992,1996,2001,2005,2009,2013,2017,2021,2025,2030,2035,2040,2044,2048,2052,2056,2060,2065,2070,2074,2079,2083,2088,2093,2098,2102,2107,2111,2116,2120,2125,2130,2135,2139,2143,2148,2153,2157,2162,2167,2172,2177,2182,2187,2192,2197,2202,2207,2212],{"__ignoreMap":80},[204,1993,1994],{"class":206,"line":207},[204,1995,726],{},[204,1997,1998],{"class":206,"line":228},[204,1999,2000],{},"ini_set('memory_limit', '1024M');\n",[204,2002,2003],{"class":206,"line":235},[204,2004,731],{},[204,2006,2007],{"class":206,"line":4},[204,2008,232],{"emptyLinePlaceholder":231},[204,2010,2011],{"class":206,"line":248},[204,2012,1703],{},[204,2014,2015],{"class":206,"line":256},[204,2016,1708],{},[204,2018,2019],{"class":206,"line":267},[204,2020,1713],{},[204,2022,2023],{"class":206,"line":278},[204,2024,232],{"emptyLinePlaceholder":231},[204,2026,2027],{"class":206,"line":286},[204,2028,2029],{},"\u002F\u002F 旧CMSの投稿データ\n",[204,2031,2032],{"class":206,"line":295},[204,2033,2034],{},"$article_json = file_get_contents('\u002Fvar\u002Fwww\u002Fhtml\u002Fscripts\u002Farticles\u002Farticle_replace.json');\n",[204,2036,2037],{"class":206,"line":303},[204,2038,2039],{},"$articles = json_decode($article_json,true);\n",[204,2041,2042],{"class":206,"line":314},[204,2043,232],{"emptyLinePlaceholder":231},[204,2045,2046],{"class":206,"line":325},[204,2047,1722],{},[204,2049,2050],{"class":206,"line":336},[204,2051,1727],{},[204,2053,2054],{"class":206,"line":347},[204,2055,1732],{},[204,2057,2058],{"class":206,"line":355},[204,2059,232],{"emptyLinePlaceholder":231},[204,2061,2062],{"class":206,"line":363},[204,2063,2064],{},"foreach($articles as $key => $a_val){\n",[204,2066,2067],{"class":206,"line":368},[204,2068,2069],{},"    $old_cat_id = $a_val['category_id'];\n",[204,2071,2072],{"class":206,"line":376},[204,2073,232],{"emptyLinePlaceholder":231},[204,2075,2076],{"class":206,"line":386},[204,2077,2078],{},"    if(empty($old_cat_id)) continue;\n",[204,2080,2081],{"class":206,"line":395},[204,2082,232],{"emptyLinePlaceholder":231},[204,2084,2085],{"class":206,"line":402},[204,2086,2087],{},"    $cat = array_values(array_filter($cats,function($ele) use($old_cat_id) {\n",[204,2089,2090],{"class":206,"line":412},[204,2091,2092],{},"        return $ele['id'] == $old_cat_id && isset($ele['new_id']);\n",[204,2094,2095],{"class":206,"line":422},[204,2096,2097],{},"    }));\n",[204,2099,2100],{"class":206,"line":432},[204,2101,232],{"emptyLinePlaceholder":231},[204,2103,2104],{"class":206,"line":447},[204,2105,2106],{},"    if(empty($cat)) continue;\n",[204,2108,2109],{"class":206,"line":454},[204,2110,232],{"emptyLinePlaceholder":231},[204,2112,2113],{"class":206,"line":462},[204,2114,2115],{},"    $new_cat_id = $cat[0]['new_id'];\n",[204,2117,2118],{"class":206,"line":467},[204,2119,232],{"emptyLinePlaceholder":231},[204,2121,2122],{"class":206,"line":475},[204,2123,2124],{},"    $old_user_id = $a_val['uid'];\n",[204,2126,2127],{"class":206,"line":483},[204,2128,2129],{},"    $user = array_values(array_filter($uesrs,function($ele) use($old_user_id) {\n",[204,2131,2132],{"class":206,"line":1413},[204,2133,2134],{},"        return $ele['uid'] == $old_user_id && isset($ele['new_id']);\n",[204,2136,2137],{"class":206,"line":1419},[204,2138,2097],{},[204,2140,2141],{"class":206,"line":1424},[204,2142,232],{"emptyLinePlaceholder":231},[204,2144,2145],{"class":206,"line":1429},[204,2146,2147],{},"    $new_user_id = (empty($user))?1:$user[0]['new_id'];\n",[204,2149,2150],{"class":206,"line":1434},[204,2151,2152],{},"    if(!get_user_by('id',intval($new_user_id))) continue;\n",[204,2154,2155],{"class":206,"line":1440},[204,2156,232],{"emptyLinePlaceholder":231},[204,2158,2159],{"class":206,"line":1445},[204,2160,2161],{},"    switch_to_blog($new_cat_id);\n",[204,2163,2164],{"class":206,"line":1450},[204,2165,2166],{},"    $new_post = array(\n",[204,2168,2169],{"class":206,"line":1455},[204,2170,2171],{},"        'post_title' => $a_val['title'],\n",[204,2173,2174],{"class":206,"line":1460},[204,2175,2176],{},"        'post_content' => $a_val['content'],\n",[204,2178,2179],{"class":206,"line":1466},[204,2180,2181],{},"        'post_status' => 'publish',\n",[204,2183,2184],{"class":206,"line":1472},[204,2185,2186],{},"        'post_date' => date($a_val['date']),\n",[204,2188,2189],{"class":206,"line":1478},[204,2190,2191],{},"        'post_author' => $new_user_id,\n",[204,2193,2194],{"class":206,"line":1484},[204,2195,2196],{},"        'post_type' =>'post',\n",[204,2198,2199],{"class":206,"line":1490},[204,2200,2201],{},"    );\n",[204,2203,2204],{"class":206,"line":1496},[204,2205,2206],{},"    wp_insert_post($new_post);\n",[204,2208,2209],{"class":206,"line":1502},[204,2210,2211],{},"    restore_current_blog();\n",[204,2213,2214],{"class":206,"line":1508},[204,2215,804],{},[13,2217,2218,2219,2222],{},"４万件分のデータとなると非常にメモリを食うので ",[61,2220,2221],{},"ini_set"," でメモリ上限を上げてあります。",[13,2224,2225,2226,2229,2230,2232,2233,2236],{},"投稿データからブログカテゴリーIDとユーザーIDを新しいwordpresの方と紐づけ、 ",[61,2227,2228],{},"wp_insert_post"," を用いて記事を挿入します。 ",[61,2231,2228],{}," 　の気をつける点はデフォルトでは",[61,2234,2235],{},"blogid=1","のブログに記事を作成するということです。",[13,2238,2239,2240,2243,2244,2247],{},"そのためコードに ",[61,2241,2242],{},"switch_to_blog();"," を追加して挿入対象のブログを切り替えています。この関数を使用するときはセットで ",[61,2245,2246],{},"restore_current_blog();"," を使います。",[13,2249,2250,2251,2253,2254,2256,2257],{},"挿入先のブログを切り替えて、",[61,2252,2228],{}," を用いて投稿を挿入します。",[61,2255,2228],{},"は引数に連想配列を入れます。 ",[20,2258,2259],{},"対応するキー名が決まっているので間違えない様にしましょう。",[13,2261,2262],{},"そして同じ様にターミナルでこのPHPを実行すればwordpressに投稿データが入ります。ちなみに４万件は15分かかりました。投稿したデータはエディタで普通に編集できますが、クラシックモードでの編集となります。画像などもきちんとタグとパスが生きていればきちんとレンダーされます。",[27,2264,2266],{"id":2265},"ミスってしまったら","ミスってしまったら..",[13,2268,2269],{},"大量のデータを入れたのにミスってしまったらdockerをリセットしましょう。コンテナーを削除してDBのボリュームも削除します。",[72,2271,2274],{"className":2272,"code":2273,"language":77},[75],"docker volume rm VOLUME_NAME\n",[61,2275,2273],{"__ignoreMap":80},[13,2277,2278,2279,2282],{},"そしてまた ",[61,2280,2281],{},"docker-compose up -d"," を行うことで最初からやり直しができます。",[27,2284,2285],{"id":2285},"意外と簡単でした",[13,2287,2288,2289,2291],{},"以上が旧CMSからwordpressにデータを挿入する方法です。wordpressは ",[61,2290,827],{}," を読み込めばほとんどの関数を使用でき、ターミナルからも実行できます。 スクリプト自体も100行未満で思いつける簡単なものです。",[13,2293,2294],{},"もしプログラム的にwordpressを操作したい場合は日本語だと上手く出てこないので「wordpress how to ~~~ programmatically」と調べるといいです。私が調べたものですと以下の感じです。",[42,2296,2297,2300,2303],{},[45,2298,2299],{},"wordpress how to create post programmatically",[45,2301,2302],{},"wordpress how to create user programmatically",[45,2304,2305],{},"wordpress how to set user role programmatically",[13,2307,2308],{},"ぶっちゃけ旧CMSからデータを引っ張ってきたり、適切に加工したり、構造を把握する方が大変でした。機会があればこのデータ移行の時に一番大変だった、正規表現により独自タグの置換も記事にしたいと思います。",[2310,2311,2312],"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":80,"searchDepth":235,"depth":235,"links":2314},[2315,2316,2317,2318,2319,2324,2328,2329,2330],{"id":29,"depth":228,"text":30},{"id":103,"depth":228,"text":103},{"id":137,"depth":228,"text":137},{"id":171,"depth":228,"text":171},{"id":503,"depth":228,"text":503,"children":2320},[2321,2322,2323],{"id":507,"depth":235,"text":507},{"id":585,"depth":235,"text":585},{"id":1083,"depth":235,"text":1083},{"id":1120,"depth":228,"text":1121,"children":2325},[2326,2327],{"id":1124,"depth":235,"text":1124},{"id":1677,"depth":235,"text":1677},{"id":1827,"depth":228,"text":1827},{"id":2265,"depth":228,"text":2266},{"id":2285,"depth":228,"text":2285},[2332],"devstack","2025-11-12","md",null,{},"\u002Farticles\u002Fmuch-post-migration-wp",{"title":8,"description":8},"articles\u002Fmuch-post-migration-wp",[2341,541],"wordpress","_mix\u002FWordPress-logotype-wmark-e1606319357320.png","XygCCNsuG0Q3ZTPUKENvFxlijb3Rx1MHJ5r8mRTS0sk",{"id":2345,"title":2346,"body":2347,"category":2421,"createdAt":2423,"description":2346,"extension":2334,"index":2335,"meta":2424,"navigation":231,"path":2425,"publish":231,"seo":2426,"series":2335,"seriesTitle":2335,"stem":2427,"tag":2428,"thumbnail":2429,"updatedAt":2335,"__hash__":2430},"articles\u002Farticles\u002Fwordpress-asset-chache.md","WordpressのJS・CSSファイルのキャッシュ対策",{"type":10,"value":2348,"toc":2417},[2349,2352,2356,2367,2373,2380,2386,2389,2392,2395,2398,2405,2411,2414],[13,2350,2351],{},"こんにちはjunです。wordpressのテーマを本番運用してスタイルに修正があり、修正をアップロードしてもクライアントのキャッシュが原因でユーザー側で変更されないことがあります。今回はテーマ内で読み込むjs,cssのキャッシュ対策について忘備録がてら記事として共有したいと思います。",[27,2353,2355],{"id":2354},"wp_enqueue_stylewp_enqueue_scriptに記述","wp_enqueue_style,wp_enqueue_scriptに記述",[13,2357,2358,2359,2362,2363,2366],{},"wordpressのアセット読み込みには",[61,2360,2361],{},"wp_enqueue_style",",",[61,2364,2365],{},"wp_enqueue_script","を使用します。それらの第４引数にはバージョンの文字列を入力することができます。",[13,2368,2369],{},[176,2370,2365],{"href":2371,"rel":2372},"https:\u002F\u002Fdeveloper.wordpress.org\u002Freference\u002Ffunctions\u002Fwp_enqueue_script\u002F",[180],[13,2374,2375,2376,2379],{},"例えば、",[61,2377,2378],{},"1.3","など入力すれば読み込んだアセットのURLで以下の様に設定されます。",[72,2381,2384],{"className":2382,"code":2383,"language":77},[75],"https:\u002F\u002Fexample.com\u002Fwp-content\u002Fthemes\u002Fminato\u002Fassets\u002Fcss\u002Fstyle.css?ver=1.3\n",[61,2385,2383],{"__ignoreMap":80},[13,2387,2388],{},"GETパラメーターでバージョンの文字列をつけることで、バージョンを識別できる様になります。ブラウザは同じURLのCSS、JS、画像を手元にキャッシュします。普段は通信が早くなるのでありがたいですが、修正が発生した時などは古いコードが残るのでユーザーによって動きに差異が生まれる原因になります。そして大体のユーザーはキャッシュクリアのやり方を知らないですし、スマホは特に強力なキャッシュが効いています。",[13,2390,2391],{},"更新時のファイルをユーザーに届けるためには、上記の様なバージョンのGETパラメーターをつけるなどして、別のURLを指定する必要があります。",[13,2393,2394],{},"そのため納品時には今後の修正を考えてバージョンを変化させる様にした方がいいです。マーケットプレイスならば上記の引数をリリース・修正ごとに変えていればいいです。しかし開発中や毎回バージョンを変えるのが面倒な時、Gitで管理していてバージョンの文字列をあまり変えたくない時はファイルの更新日時でバージョンを変えてあげる方法があります。",[27,2396,2397],{"id":2397},"filemtimeを使用する",[13,2399,2400,2401,2404],{},"PHPには対象ファイルの更新日時を取得する",[61,2402,2403],{},"filemtime()","という関数があります。引数には以下の様にサーバー上でのファイルパスを入力します。",[72,2406,2409],{"className":2407,"code":2408,"language":77},[75],"filemtime(get_theme_file_path('\u002Fcss\u002Feditor-style.css'))\n",[61,2410,2408],{"__ignoreMap":80},[13,2412,2413],{},"返り値はUnixタイムスタンプです。更新時はその時間が変わるので、更新のたびに変化する値を取得して変更したファイルを確実に届けることができます。対象ファイルを編集するだけで自動的にバージョンを示すことができます。",[13,2415,2416],{},"毎回更新日時を取得するのでその分のパフォーマンスがきりなりますが、自分はよくこの方法でwordpressを構築しています。",{"title":80,"searchDepth":235,"depth":235,"links":2418},[2419,2420],{"id":2354,"depth":228,"text":2355},{"id":2397,"depth":228,"text":2397},[2422],"ministack","2022-03-20",{},"\u002Farticles\u002Fwordpress-asset-chache",{"title":2346,"description":2346},"articles\u002Fwordpress-asset-chache",[541,2341],"_common\u002Fwordpress.png","S6seqQRftTxMf1j4j6_e1GgS9Q_wBpOnHTPv4lrW-Hc",{"id":2432,"title":2433,"body":2434,"category":3291,"createdAt":3292,"description":3293,"extension":2334,"index":2335,"meta":3294,"navigation":231,"path":3295,"publish":231,"seo":3296,"series":2335,"seriesTitle":2335,"stem":3297,"tag":3298,"thumbnail":2335,"updatedAt":2335,"__hash__":3299},"articles\u002Farticles\u002Fwp-batch-image-compress.md","大量の大ファイルサイズ画像をPHPでリサイズ・圧縮をする方法",{"type":10,"value":2435,"toc":3279},[2436,2439,2442,2445,2448,2451,2469,2472,2475,2478,2667,2677,2680,2684,2690,2722,2731,2780,2787,2791,2796,2805,2808,2878,2884,2887,2890,2893,3243,3250,3254,3261,3267,3270,3276],[13,2437,2438],{},"こんにちはjunです。私はこの技術ブログ以外にもブログを運営しているのですが、そちらはwebエンジニアになる前からやっていました。しかし過去の記事を見ているとやたらと重い画像、１枚あたり１MBも使っている記事が何枚もありました。当時は画像の重さなど知らずにデジカメの画像をそのままアップロードして、使用していたことが原因です。",[13,2440,2441],{},"記事の中には転送量が12MBにもなっているものもあり、原因は画像でした。それらの画像はやたらとサイズ（寸法）が大きいことが原因なので、リサイズして圧縮することで解決できます。しかし100件以上の記事を1つずつ開いて調べたり、もう一回ダウンロードして、圧縮してアップロードなんて何日かかるかわかりません。そのため今回はPHPとコマンドラインを用いて一気に画像を処理することにしました。",[13,2443,2444],{},"wordpressを使用していますが、画像処理のエッセンスや大方の処理の流れは応用できるとおもいます。では早速やっていきましょう。",[27,2446,2447],{"id":2447},"大まかな流れ",[13,2449,2450],{},"まず全体の処理の流れですが以下の通りです。",[108,2452,2453,2460,2463,2466],{},[45,2454,2455,2456,2459],{},"ターミナルで ",[61,2457,2458],{},"wp-content\u002Fuploads\u002F"," 配下にある大サイズ（500kb以上とする）をリストアップ。",[45,2461,2462],{},"バックアップしておき、数ヶ月残しておく。",[45,2464,2465],{},"PHPのGDモジュールを用いてリサイズ・圧縮を行う。",[45,2467,2468],{},"処理した画像を上書き。",[13,2470,2471],{},"以上の通りです。今回の処理を行うにあたりwordpressがあるサーバーに対してCLI\b操作が行える必要があります。SSHができ、必要な権限を付与しておいてください。今回はこの準備はできているものとします。",[27,2473,2474],{"id":2474},"処理対象をリストアップ",[13,2476,2477],{},"それではまず対象の画像をリストアップします。アップロードディレクトリに移動してfindコマンドで簡単に見つけられます。",[72,2479,2483],{"className":2480,"code":2481,"language":2482,"meta":80,"style":80},"language-bash shiki shiki-themes material-theme-ocean","# \u002Fdocumentroot\u002Fwordpress\u002F は仮です。あなたの環境に合わせてください。\n# 画像が格納されているuploadsへ移動\ncd '\u002Fdocumentroot\u002Fwordpress\u002Fwp-content\u002Fuploads'\nls\n2017 2018 2019 2020 2021 aaaa bbbbb cccc\n\n# プラグイン用画像のディレクトリなどもあるので注意！\n# 自分がアップロードした画像があるディレクトリのみを指定、500kb以上のものをリストアップ。リストはテキストファイルとしてホームディレクトリにおいておく。\nfind 2017 2018 2019 2020 2021 -size +500k > ~\u002Flist.txt\n..\n2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83-644x279.png\n2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83-720x340.png\n2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83-768x332.png\n2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83.png\n2017\u002F12\u002FDSC03961-1200x900.jpg\n2017\u002F12\u002FDSC04310-1200x900.jpg\n2017\u002F12\u002FDSC04311-1200x900.jpg\n2017\u002F12\u002FDSC04314-1200x900.jpg\n2017\u002F12\u002FDSC04315-1200x900.jpg\n2017\u002F12\u002FDSC04316-1200x900.jpg\n2017\u002F12\u002FDSC04317-1200x900.jpg\n2017\u002F12\u002FDSC04319-1200x900.jpg\n2017\u002F12\u002FDSC04320-e1512559527929-1200x1600.jpg\n2017\u002F12\u002FDSC04324-1200x900.jpg\n2017\u002F12\u002FDSC04325-1200x900.jpg\n...\n","bash",[61,2484,2485,2491,2496,2509,2515,2541,2545,2550,2555,2583,2588,2593,2598,2603,2608,2613,2618,2623,2628,2633,2638,2643,2648,2653,2658,2663],{"__ignoreMap":80},[204,2486,2487],{"class":206,"line":207},[204,2488,2490],{"class":2489},"sC9rS","# \u002Fdocumentroot\u002Fwordpress\u002F は仮です。あなたの環境に合わせてください。\n",[204,2492,2493],{"class":206,"line":228},[204,2494,2495],{"class":2489},"# 画像が格納されているuploadsへ移動\n",[204,2497,2498,2502,2504,2507],{"class":206,"line":235},[204,2499,2501],{"class":2500},"sdLwU","cd",[204,2503,218],{"class":214},[204,2505,2506],{"class":221},"\u002Fdocumentroot\u002Fwordpress\u002Fwp-content\u002Fuploads",[204,2508,225],{"class":214},[204,2510,2511],{"class":206,"line":4},[204,2512,2514],{"class":2513},"s5Dmg","ls\n",[204,2516,2517,2520,2523,2526,2529,2532,2535,2538],{"class":206,"line":248},[204,2518,2519],{"class":2513},"2017",[204,2521,2522],{"class":1054}," 2018",[204,2524,2525],{"class":1054}," 2019",[204,2527,2528],{"class":1054}," 2020",[204,2530,2531],{"class":1054}," 2021",[204,2533,2534],{"class":221}," aaaa",[204,2536,2537],{"class":221}," bbbbb",[204,2539,2540],{"class":221}," cccc\n",[204,2542,2543],{"class":206,"line":256},[204,2544,232],{"emptyLinePlaceholder":231},[204,2546,2547],{"class":206,"line":267},[204,2548,2549],{"class":2489},"# プラグイン用画像のディレクトリなどもあるので注意！\n",[204,2551,2552],{"class":206,"line":278},[204,2553,2554],{"class":2489},"# 自分がアップロードした画像があるディレクトリのみを指定、500kb以上のものをリストアップ。リストはテキストファイルとしてホームディレクトリにおいておく。\n",[204,2556,2557,2560,2563,2565,2567,2569,2571,2574,2577,2580],{"class":206,"line":286},[204,2558,2559],{"class":2513},"find",[204,2561,2562],{"class":1054}," 2017",[204,2564,2522],{"class":1054},[204,2566,2525],{"class":1054},[204,2568,2528],{"class":1054},[204,2570,2531],{"class":1054},[204,2572,2573],{"class":221}," -size",[204,2575,2576],{"class":221}," +500k",[204,2578,2579],{"class":214}," >",[204,2581,2582],{"class":221}," ~\u002Flist.txt\n",[204,2584,2585],{"class":206,"line":295},[204,2586,2587],{"class":2500},"..\n",[204,2589,2590],{"class":206,"line":303},[204,2591,2592],{"class":2513},"2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83-644x279.png\n",[204,2594,2595],{"class":206,"line":314},[204,2596,2597],{"class":2513},"2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83-720x340.png\n",[204,2599,2600],{"class":206,"line":325},[204,2601,2602],{"class":2513},"2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83-768x332.png\n",[204,2604,2605],{"class":206,"line":336},[204,2606,2607],{"class":2513},"2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83.png\n",[204,2609,2610],{"class":206,"line":347},[204,2611,2612],{"class":2513},"2017\u002F12\u002FDSC03961-1200x900.jpg\n",[204,2614,2615],{"class":206,"line":355},[204,2616,2617],{"class":2513},"2017\u002F12\u002FDSC04310-1200x900.jpg\n",[204,2619,2620],{"class":206,"line":363},[204,2621,2622],{"class":2513},"2017\u002F12\u002FDSC04311-1200x900.jpg\n",[204,2624,2625],{"class":206,"line":368},[204,2626,2627],{"class":2513},"2017\u002F12\u002FDSC04314-1200x900.jpg\n",[204,2629,2630],{"class":206,"line":376},[204,2631,2632],{"class":2513},"2017\u002F12\u002FDSC04315-1200x900.jpg\n",[204,2634,2635],{"class":206,"line":386},[204,2636,2637],{"class":2513},"2017\u002F12\u002FDSC04316-1200x900.jpg\n",[204,2639,2640],{"class":206,"line":395},[204,2641,2642],{"class":2513},"2017\u002F12\u002FDSC04317-1200x900.jpg\n",[204,2644,2645],{"class":206,"line":402},[204,2646,2647],{"class":2513},"2017\u002F12\u002FDSC04319-1200x900.jpg\n",[204,2649,2650],{"class":206,"line":412},[204,2651,2652],{"class":2513},"2017\u002F12\u002FDSC04320-e1512559527929-1200x1600.jpg\n",[204,2654,2655],{"class":206,"line":422},[204,2656,2657],{"class":2513},"2017\u002F12\u002FDSC04324-1200x900.jpg\n",[204,2659,2660],{"class":206,"line":432},[204,2661,2662],{"class":2513},"2017\u002F12\u002FDSC04325-1200x900.jpg\n",[204,2664,2665],{"class":206,"line":447},[204,2666,964],{"class":2500},[13,2668,2669,2672,2673,2676],{},[61,2670,2671],{},"find -size "," でファイルサイズでフィルターできます。1000件以上あったりと、コピーするのは大変なので ",[61,2674,2675],{},"list.txt"," などで出力しておきます。",[27,2678,2679],{"id":2679},"画像処理スクリプトを作成",[505,2681,2683],{"id":2682},"リストをphp-arrayにする","リストをPHP Arrayにする",[13,2685,2686,2687,2689],{},"サーバーでのリストアップが終わったので、ローカルでスクリプトを作っていきます。",[61,2688,2675],{}," はローカルに移動しておきます。",[72,2691,2693],{"className":2480,"code":2692,"language":2482,"meta":80,"style":80},".\n├── list.php\n├── image.php\n├── list.txt\n",[61,2694,2695,2700,2708,2715],{"__ignoreMap":80},[204,2696,2697],{"class":206,"line":207},[204,2698,2699],{"class":2500},".\n",[204,2701,2702,2705],{"class":206,"line":228},[204,2703,2704],{"class":2513},"├──",[204,2706,2707],{"class":221}," list.php\n",[204,2709,2710,2712],{"class":206,"line":235},[204,2711,2704],{"class":2513},[204,2713,2714],{"class":221}," image.php\n",[204,2716,2717,2719],{"class":206,"line":4},[204,2718,2704],{"class":2513},[204,2720,2721],{"class":221}," list.txt\n",[13,2723,2724,2726,2727,2730],{},[61,2725,2675],{}," を",[61,2728,2729],{},"list.php"," としてコピーしておき、配列に変換しておきます。テキストエディタの置換機能などを利用してください。",[72,2732,2734],{"className":539,"code":2733,"filename":2729,"language":541,"meta":80,"style":80},"\u003C?php \n$list =[\n\"2017\u002F06\u002F23c7f697593e4a4c83e01310ee4b84ec-1200x900.jpg\",\n\"2017\u002F06\u002F23c7f697593e4a4c83e01310ee4b84ec.jpg\",\n\"2017\u002F06\u002Fcropped-DSC03989-1-1024x723.jpg\",\n\"2017\u002F06\u002Fcropped-DSC03989-1-1200x847.jpg\",\n\"2017\u002F06\u002Fcropped-DSC03989-1.jpg\",\n...\n];\n",[61,2735,2736,2741,2746,2751,2756,2761,2766,2771,2775],{"__ignoreMap":80},[204,2737,2738],{"class":206,"line":207},[204,2739,2740],{},"\u003C?php \n",[204,2742,2743],{"class":206,"line":228},[204,2744,2745],{},"$list =[\n",[204,2747,2748],{"class":206,"line":235},[204,2749,2750],{},"\"2017\u002F06\u002F23c7f697593e4a4c83e01310ee4b84ec-1200x900.jpg\",\n",[204,2752,2753],{"class":206,"line":4},[204,2754,2755],{},"\"2017\u002F06\u002F23c7f697593e4a4c83e01310ee4b84ec.jpg\",\n",[204,2757,2758],{"class":206,"line":248},[204,2759,2760],{},"\"2017\u002F06\u002Fcropped-DSC03989-1-1024x723.jpg\",\n",[204,2762,2763],{"class":206,"line":256},[204,2764,2765],{},"\"2017\u002F06\u002Fcropped-DSC03989-1-1200x847.jpg\",\n",[204,2767,2768],{"class":206,"line":267},[204,2769,2770],{},"\"2017\u002F06\u002Fcropped-DSC03989-1.jpg\",\n",[204,2772,2773],{"class":206,"line":278},[204,2774,964],{},[204,2776,2777],{"class":206,"line":286},[204,2778,2779],{},"];\n",[13,2781,2782,2783,2786],{},"これで対象画像をリストアップして、PHPが扱えるようになったので ",[61,2784,2785],{},"image.php"," にて処理の方を書いていきましょう。",[505,2788,2790],{"id":2789},"画像圧縮リサイズ処理","画像圧縮・リサイズ処理",[2792,2793,2795],"h4",{"id":2794},"そのまえに","そのまえに..",[13,2797,2798,2799,2804],{},"PHPでリサイズなどの画像処理を行う場合は",[176,2800,2803],{"href":2801,"rel":2802},"https:\u002F\u002Fwww.php.net\u002Fmanual\u002Fja\u002Fintro.image.php",[180],"GDというPHPモジュール","を用います。処理を書く前にこのGDモジュールが使用しているPHP環境にあるかを確認しましょう。",[13,2806,2807],{},"phpinfoのページでも確認できますが、手っ取り早くCLIでやりましょう。以下のコマンドを打ちます。",[72,2809,2811],{"className":2480,"code":2810,"language":2482,"meta":80,"style":80},"php --info | grep GD\nGD Support => enabled\nGD headers Version => 2.3.2\nGD library Version => 2.3.2\n",[61,2812,2813,2829,2846,2863],{"__ignoreMap":80},[204,2814,2815,2817,2820,2823,2826],{"class":206,"line":207},[204,2816,541],{"class":2513},[204,2818,2819],{"class":221}," --info",[204,2821,2822],{"class":214}," |",[204,2824,2825],{"class":2513}," grep",[204,2827,2828],{"class":221}," GD\n",[204,2830,2831,2834,2837,2840,2843],{"class":206,"line":228},[204,2832,2833],{"class":2513},"GD",[204,2835,2836],{"class":221}," Support",[204,2838,2839],{"class":606}," =",[204,2841,2842],{"class":214},">",[204,2844,2845],{"class":221}," enabled\n",[204,2847,2848,2850,2853,2856,2858,2860],{"class":206,"line":235},[204,2849,2833],{"class":2513},[204,2851,2852],{"class":221}," headers",[204,2854,2855],{"class":221}," Version",[204,2857,2839],{"class":606},[204,2859,2842],{"class":214},[204,2861,2862],{"class":1054}," 2.3.2\n",[204,2864,2865,2867,2870,2872,2874,2876],{"class":206,"line":4},[204,2866,2833],{"class":2513},[204,2868,2869],{"class":221}," library",[204,2871,2855],{"class":221},[204,2873,2839],{"class":606},[204,2875,2842],{"class":214},[204,2877,2862],{"class":1054},[13,2879,2880,2883],{},[61,2881,2882],{},"GD Support => enabled"," が存在し、enabledとなっていれば使用可能です。ない場合などを別途インストールが必要です。まあwordpressが使用できる環境ならば大抵入っていると思います。これでGDの確認を行ったら、処理を書きます。",[2792,2885,2886],{"id":2886},"処理の記述",[13,2888,2889],{},"今回のスクリプトはCMSがるサーバー上で実行するものとします。そのためパスなどの構成も予め、サーバー上であることを想定してます。",[13,2891,2892],{},"全体は以下の通りです。",[72,2894,2896],{"className":539,"code":2895,"language":541,"meta":80,"style":80},"\u003C?php \n    require_once 'list.php';\n\n    $uploadRoot = '\u002Fdocumentroot\u002Fwordpress\u002Fwp-content\u002Fuploads\u002F';\n\n    foreach($list as $file){\n        \u002F** \n         * ファイル名などを分けておく。\n         * \n         * 例\n         * $file            => '2017\u002F12\u002FDSC04325-1200x900.jpg'\n         * $targetFilename  => 'DSC04325-1200x900.jpg'\n         * $fullPath        => '\u002Fdocumentroot\u002Fwordpress\u002Fwp-content\u002Fuploads\u002F2017\u002F12\u002FDSC04325-1200x900.jpg'\n        *\u002F\n        $filenames = explode('\u002F',$file);\n        $targetFilename = $filenames[count($filenames)-1];\n        $fullPath = $uploadRoot.$file;\n\n        \u002F\u002F getimagesize()を用いて寸法、拡張子の情報を取得。\n        list($w, $h,$type) = getimagesize($fullPath);\n        var_dump($fullPath);\n\n        \u002F\u002F imagecreatefromjpeg()・imagecreatefrompng()にてGDImageを取得。画像を取得しているんだなぐらいだと思ってください。\n        \u002F\u002F JPG\u002FPNGによって分ける必要あり！。\n        switch ($type) {\n            case IMAGETYPE_JPEG:\n                $original_image = imagecreatefromjpeg($fullPath);\n                break;\n            case IMAGETYPE_PNG:\n                $original_image = imagecreatefrompng($fullPath);\n                break;\n            default:\n                var_dump('対応していないファイル形式です。: '.$fullPath);\n                continue;\n        }\n\n        \u002F\u002F 寸法が大きすぎるもの(1000px以上)は600pxぐにらいするリサイズ処理を行う。\n        if($w >= 1000){\n\n            \u002F\u002F imagecreatetruecolor() で新しい画像を埋め込むための「枠」を作る。（新しいキャンバス的な？）\n            \u002F\u002F 縦横比を計算させて元画像と同じにさせること。\n            $newW = 600;\n            $newH = $newW * ($h \u002F $w);\n            $newImg = imagecreatetruecolor($newW, $newH);\n\n            \u002F\u002F リサイズ処理。\n            $success = imagecopyresampled($newImg, $original_image, 0, 0, 0, 0, $newW, $newH, $w, $h);\n\n            if($success){\n                $original_image = $newImg;\n            }else{\n                var_dump('リサイズ失敗: '.$fullPath);\n                continue;\n            }\n        }\n\n        \u002F\u002F 画像を圧縮して同じ名前、パスで上書き保存する。ここも拡張子で異なるので注意！\n        \u002F\u002F 数字は圧縮の品質。低いほど軽くなるが、粗くなる。jpgは0~100,pngは0~9なので注意。\n        switch ($type) {\n            case IMAGETYPE_JPEG:\n                imagejpeg($original_image,$fullPath,60);\n                break;\n            case IMAGETYPE_PNG:\n                imagepng($original_image,$fullPath,6);\n                break;\n            default:\n                var_dump('対応していないファイル形式です。: '.$fullPath);\n                continue;\n        }\n    }\n?>\n",[61,2897,2898,2902,2907,2911,2916,2920,2925,2930,2935,2940,2945,2950,2955,2960,2965,2970,2975,2980,2984,2989,2994,2999,3003,3008,3013,3018,3023,3028,3033,3038,3043,3047,3052,3057,3062,3066,3070,3075,3080,3084,3089,3094,3099,3104,3109,3113,3118,3123,3127,3132,3137,3142,3147,3151,3156,3160,3164,3169,3175,3180,3185,3191,3196,3201,3207,3212,3217,3222,3227,3232,3237],{"__ignoreMap":80},[204,2899,2900],{"class":206,"line":207},[204,2901,2740],{},[204,2903,2904],{"class":206,"line":228},[204,2905,2906],{},"    require_once 'list.php';\n",[204,2908,2909],{"class":206,"line":235},[204,2910,232],{"emptyLinePlaceholder":231},[204,2912,2913],{"class":206,"line":4},[204,2914,2915],{},"    $uploadRoot = '\u002Fdocumentroot\u002Fwordpress\u002Fwp-content\u002Fuploads\u002F';\n",[204,2917,2918],{"class":206,"line":248},[204,2919,232],{"emptyLinePlaceholder":231},[204,2921,2922],{"class":206,"line":256},[204,2923,2924],{},"    foreach($list as $file){\n",[204,2926,2927],{"class":206,"line":267},[204,2928,2929],{},"        \u002F** \n",[204,2931,2932],{"class":206,"line":278},[204,2933,2934],{},"         * ファイル名などを分けておく。\n",[204,2936,2937],{"class":206,"line":286},[204,2938,2939],{},"         * \n",[204,2941,2942],{"class":206,"line":295},[204,2943,2944],{},"         * 例\n",[204,2946,2947],{"class":206,"line":303},[204,2948,2949],{},"         * $file            => '2017\u002F12\u002FDSC04325-1200x900.jpg'\n",[204,2951,2952],{"class":206,"line":314},[204,2953,2954],{},"         * $targetFilename  => 'DSC04325-1200x900.jpg'\n",[204,2956,2957],{"class":206,"line":325},[204,2958,2959],{},"         * $fullPath        => '\u002Fdocumentroot\u002Fwordpress\u002Fwp-content\u002Fuploads\u002F2017\u002F12\u002FDSC04325-1200x900.jpg'\n",[204,2961,2962],{"class":206,"line":336},[204,2963,2964],{},"        *\u002F\n",[204,2966,2967],{"class":206,"line":347},[204,2968,2969],{},"        $filenames = explode('\u002F',$file);\n",[204,2971,2972],{"class":206,"line":355},[204,2973,2974],{},"        $targetFilename = $filenames[count($filenames)-1];\n",[204,2976,2977],{"class":206,"line":363},[204,2978,2979],{},"        $fullPath = $uploadRoot.$file;\n",[204,2981,2982],{"class":206,"line":368},[204,2983,232],{"emptyLinePlaceholder":231},[204,2985,2986],{"class":206,"line":376},[204,2987,2988],{},"        \u002F\u002F getimagesize()を用いて寸法、拡張子の情報を取得。\n",[204,2990,2991],{"class":206,"line":386},[204,2992,2993],{},"        list($w, $h,$type) = getimagesize($fullPath);\n",[204,2995,2996],{"class":206,"line":395},[204,2997,2998],{},"        var_dump($fullPath);\n",[204,3000,3001],{"class":206,"line":402},[204,3002,232],{"emptyLinePlaceholder":231},[204,3004,3005],{"class":206,"line":412},[204,3006,3007],{},"        \u002F\u002F imagecreatefromjpeg()・imagecreatefrompng()にてGDImageを取得。画像を取得しているんだなぐらいだと思ってください。\n",[204,3009,3010],{"class":206,"line":422},[204,3011,3012],{},"        \u002F\u002F JPG\u002FPNGによって分ける必要あり！。\n",[204,3014,3015],{"class":206,"line":432},[204,3016,3017],{},"        switch ($type) {\n",[204,3019,3020],{"class":206,"line":447},[204,3021,3022],{},"            case IMAGETYPE_JPEG:\n",[204,3024,3025],{"class":206,"line":454},[204,3026,3027],{},"                $original_image = imagecreatefromjpeg($fullPath);\n",[204,3029,3030],{"class":206,"line":462},[204,3031,3032],{},"                break;\n",[204,3034,3035],{"class":206,"line":467},[204,3036,3037],{},"            case IMAGETYPE_PNG:\n",[204,3039,3040],{"class":206,"line":475},[204,3041,3042],{},"                $original_image = imagecreatefrompng($fullPath);\n",[204,3044,3045],{"class":206,"line":483},[204,3046,3032],{},[204,3048,3049],{"class":206,"line":1413},[204,3050,3051],{},"            default:\n",[204,3053,3054],{"class":206,"line":1419},[204,3055,3056],{},"                var_dump('対応していないファイル形式です。: '.$fullPath);\n",[204,3058,3059],{"class":206,"line":1424},[204,3060,3061],{},"                continue;\n",[204,3063,3064],{"class":206,"line":1429},[204,3065,1799],{},[204,3067,3068],{"class":206,"line":1434},[204,3069,232],{"emptyLinePlaceholder":231},[204,3071,3072],{"class":206,"line":1440},[204,3073,3074],{},"        \u002F\u002F 寸法が大きすぎるもの(1000px以上)は600pxぐにらいするリサイズ処理を行う。\n",[204,3076,3077],{"class":206,"line":1445},[204,3078,3079],{},"        if($w >= 1000){\n",[204,3081,3082],{"class":206,"line":1450},[204,3083,232],{"emptyLinePlaceholder":231},[204,3085,3086],{"class":206,"line":1455},[204,3087,3088],{},"            \u002F\u002F imagecreatetruecolor() で新しい画像を埋め込むための「枠」を作る。（新しいキャンバス的な？）\n",[204,3090,3091],{"class":206,"line":1460},[204,3092,3093],{},"            \u002F\u002F 縦横比を計算させて元画像と同じにさせること。\n",[204,3095,3096],{"class":206,"line":1466},[204,3097,3098],{},"            $newW = 600;\n",[204,3100,3101],{"class":206,"line":1472},[204,3102,3103],{},"            $newH = $newW * ($h \u002F $w);\n",[204,3105,3106],{"class":206,"line":1478},[204,3107,3108],{},"            $newImg = imagecreatetruecolor($newW, $newH);\n",[204,3110,3111],{"class":206,"line":1484},[204,3112,232],{"emptyLinePlaceholder":231},[204,3114,3115],{"class":206,"line":1490},[204,3116,3117],{},"            \u002F\u002F リサイズ処理。\n",[204,3119,3120],{"class":206,"line":1496},[204,3121,3122],{},"            $success = imagecopyresampled($newImg, $original_image, 0, 0, 0, 0, $newW, $newH, $w, $h);\n",[204,3124,3125],{"class":206,"line":1502},[204,3126,232],{"emptyLinePlaceholder":231},[204,3128,3129],{"class":206,"line":1508},[204,3130,3131],{},"            if($success){\n",[204,3133,3134],{"class":206,"line":1513},[204,3135,3136],{},"                $original_image = $newImg;\n",[204,3138,3139],{"class":206,"line":1518},[204,3140,3141],{},"            }else{\n",[204,3143,3144],{"class":206,"line":1524},[204,3145,3146],{},"                var_dump('リサイズ失敗: '.$fullPath);\n",[204,3148,3149],{"class":206,"line":1529},[204,3150,3061],{},[204,3152,3153],{"class":206,"line":1534},[204,3154,3155],{},"            }\n",[204,3157,3158],{"class":206,"line":1539},[204,3159,1799],{},[204,3161,3162],{"class":206,"line":1544},[204,3163,232],{"emptyLinePlaceholder":231},[204,3165,3166],{"class":206,"line":1549},[204,3167,3168],{},"        \u002F\u002F 画像を圧縮して同じ名前、パスで上書き保存する。ここも拡張子で異なるので注意！\n",[204,3170,3172],{"class":206,"line":3171},58,[204,3173,3174],{},"        \u002F\u002F 数字は圧縮の品質。低いほど軽くなるが、粗くなる。jpgは0~100,pngは0~9なので注意。\n",[204,3176,3178],{"class":206,"line":3177},59,[204,3179,3017],{},[204,3181,3183],{"class":206,"line":3182},60,[204,3184,3022],{},[204,3186,3188],{"class":206,"line":3187},61,[204,3189,3190],{},"                imagejpeg($original_image,$fullPath,60);\n",[204,3192,3194],{"class":206,"line":3193},62,[204,3195,3032],{},[204,3197,3199],{"class":206,"line":3198},63,[204,3200,3037],{},[204,3202,3204],{"class":206,"line":3203},64,[204,3205,3206],{},"                imagepng($original_image,$fullPath,6);\n",[204,3208,3210],{"class":206,"line":3209},65,[204,3211,3032],{},[204,3213,3215],{"class":206,"line":3214},66,[204,3216,3051],{},[204,3218,3220],{"class":206,"line":3219},67,[204,3221,3056],{},[204,3223,3225],{"class":206,"line":3224},68,[204,3226,3061],{},[204,3228,3230],{"class":206,"line":3229},69,[204,3231,1799],{},[204,3233,3235],{"class":206,"line":3234},70,[204,3236,785],{},[204,3238,3240],{"class":206,"line":3239},71,[204,3241,3242],{},"?>\n",[13,3244,3245,3246,3249],{},"書いてあるコメントの通りです。ただGDは拡張子ごとに使用する関数を分ける必要があるので、そこがめんどいです。listで予めどんな拡張子が使用されているかを確かめておきましょう。ローカルでテストを行ったら、",[61,3247,3248],{},"image.php, list.php","をサーバーに転送します。",[27,3251,3253],{"id":3252},"実行前の注意","実行前の注意！",[13,3255,3256,3257,3260],{},"実行する前に必ず ",[61,3258,3259],{},"uploads"," のバックアップをしておきましょう。そうすればもしやらかしたり、予想以上に粗くなったとしてもやり直しができます。OKであれば",[72,3262,3265],{"className":3263,"code":3264,"language":77},[75],"php image.php\n",[61,3266,3264],{"__ignoreMap":80},[13,3268,3269],{},"そして実行しましょう。私の場合1500画像で5分ほどで終わった気がします。",[13,3271,3272,3275],{},[61,3273,3274],{},"ls -lh"," や上記のfindコマンドで重い画像がなくなったかを確認しましょう。また、画像のパスをブラウザで叩いて確認してもいいかもしれません。キャッシュが効いていることが多いので、シークレットモードで見ることをお勧めします。",[2310,3277,3278],{},"html pre.shiki code .sC9rS, html code.shiki .sC9rS{--shiki-default:#464B5D;--shiki-default-font-style:italic}html pre.shiki code .sdLwU, html code.shiki .sdLwU{--shiki-default:#82AAFF}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 pre.shiki code .s5Dmg, html code.shiki .s5Dmg{--shiki-default:#FFCB6B}html pre.shiki code .sx098, html code.shiki .sx098{--shiki-default:#F78C6C}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}",{"title":80,"searchDepth":235,"depth":235,"links":3280},[3281,3282,3283,3290],{"id":2447,"depth":228,"text":2447},{"id":2474,"depth":228,"text":2474},{"id":2679,"depth":228,"text":2679,"children":3284},[3285,3286],{"id":2682,"depth":235,"text":2683},{"id":2789,"depth":235,"text":2790,"children":3287},[3288,3289],{"id":2794,"depth":4,"text":2795},{"id":2886,"depth":4,"text":2886},{"id":3252,"depth":228,"text":3253},[2422],"2021-08-15","wordpressに保存された1〜4MBの1500件の画像を一括に処理する。",{},"\u002Farticles\u002Fwp-batch-image-compress",{"title":2433,"description":3293},"articles\u002Fwp-batch-image-compress",[2341,541],"XoVocS1wgJ1s3OqIpny9hQofVYNRjvOcumKbgZx2d98",{"id":3301,"title":3302,"body":3303,"category":3729,"createdAt":3730,"description":3302,"extension":2334,"index":2335,"meta":3731,"navigation":231,"path":3732,"publish":231,"seo":3733,"series":2335,"seriesTitle":2335,"stem":3734,"tag":3735,"thumbnail":2342,"updatedAt":2335,"__hash__":3736},"articles\u002Farticles\u002Fwordpress-cli-with-cron.md","wordpress CLIとcronを用いてプラグインの関数を定期自動実行させる",{"type":10,"value":3304,"toc":3719},[3305,3312,3319,3322,3329,3333,3341,3345,3351,3354,3360,3367,3371,3378,3384,3391,3397,3400,3404,3407,3413,3416,3419,3422,3425,3429,3439,3452,3531,3534,3540,3543,3615,3618,3621,3624,3627,3633,3639,3650,3656,3670,3673,3687,3690,3700,3707,3713,3716],[13,3306,3307,3308,3311],{},"こんにちはjunです。",[176,3309,3310],{"href":2337},"「別CMSで作成された4万件分の大量投稿をwordpressに引越しする」","の記事であったように４万件のデータをマルチサイト構成で移行したことがありました。そこで新しい課題として、親サイトでは登録した他のサイト全ての投稿をページングで一覧で表示するという仕様にぶち当たりました。",[13,3313,3314,3315,3318],{},"基本的にwordpressは",[61,3316,3317],{},"get_posts()","を使えば簡単にページングも兼ね備えた一覧ページを作れるのですが、マルチサイト構成の場合は上手くいかずDBから上手く引っ張る必要がありました。しかしマルチサイトだけでも75サイトあり、そこから４万件分の投稿をとる必要があります。表示のたびにそんな高コストの処理はできないので、予め必要なデータをまとめたキャッシュテーブルを作ることで解決しました。",[13,3320,3321],{},"ただしキャッシュテーブルの弱点は更新が必要なことです。手動の更新は実装できましたが、1時間に1回自動で実行するなどの実装が必要となります。すぐに思いついた方法としてはcronを用いてキャッシュ作成の関数を叩くことです。",[13,3323,3324,3325,3328],{},"wordpressにcronやCLIでできないかな〜？と調べていたら公式で",[20,3326,3327],{},"wp CLI","というものが使えると聞き、見様見真似で実装ができました。wordpressで重い処理の定期実行などを考えている方はぜひ参考にしてみてください。",[27,3330,3332],{"id":3331},"wp-cli-をインストール","wp cli をインストール",[13,3334,3335,3340],{},[176,3336,3339],{"href":3337,"rel":3338},"https:\u002F\u002Fmake.wordpress.org\u002Fcli\u002Fhandbook\u002Fguides\u002Finstalling\u002F",[180],"公式サイト","にあるようにcliを使用するにはコマンドラインを通じてインストールする必要があります。",[505,3342,3344],{"id":3343},"curlなどで-pharファイルを読み込む","curlなどで pharファイルを読み込む",[72,3346,3349],{"className":3347,"code":3348,"language":77},[75],"curl -O https:\u002F\u002Fraw.githubusercontent.com\u002Fwp-cli\u002Fbuilds\u002Fgh-pages\u002Fphar\u002Fwp-cli.phar\n",[61,3350,3348],{"__ignoreMap":80},[13,3352,3353],{},"ドキュメントルート あたりで行ってみましょう。wp-cli.pharというファイルが出現します。これだけでも",[72,3355,3358],{"className":3356,"code":3357,"language":77},[75],"php wp-cli.phar --info\n",[61,3359,3357],{"__ignoreMap":80},[13,3361,3362,3363,3366],{},"という風にして実行することができます。",[61,3364,3365],{},"wp ~~"," と実行するためにはもう一工夫必要です。",[505,3368,3370],{"id":3369},"実行権限をあたえ移動","実行権限をあたえ、移動",[13,3372,3373,3374,3377],{},"以下のようにして実行権限を付与し、",[61,3375,3376],{},"wp","というコマンドで打てるようにします。",[72,3379,3382],{"className":3380,"code":3381,"language":77},[75],"chmod +x wp-cli.phar\nsudo mv wp-cli.phar \u002Fusr\u002Flocal\u002Fbin\u002Fwp\n",[61,3383,3381],{"__ignoreMap":80},[13,3385,3386,3387,3390],{},"はい。これでOKです。",[61,3388,3389],{},"wp --info","を打ってみると",[72,3392,3395],{"className":3393,"code":3394,"language":77},[75],"$ wp --info\nOS:     Linux 4.19.76-linuxkit #1 SMP Tue May 26 11:42:35 UTC 2020 x86_64\nShell:  \u002Fbin\u002Fsh\nPHP binary:     \u002Fusr\u002Flocal\u002Fbin\u002Fphp\nPHP version:    7.4.12\nphp.ini used:\nWP-CLI root dir:        phar:\u002F\u002Fwp-cli.phar\u002Fvendor\u002Fwp-cli\u002Fwp-cli\nWP-CLI vendor dir:      phar:\u002F\u002Fwp-cli.phar\u002Fvendor\nWP_CLI phar path:       \u002Fvar\u002Fwww\u002Fhtml\nWP-CLI packages dir:\nWP-CLI global config:\nWP-CLI project config:\nWP-CLI version: 2.4.0\n",[61,3396,3394],{"__ignoreMap":80},[13,3398,3399],{},"こんな感じに情報が出てくればきちんと機能しています。",[2792,3401,3403],{"id":3402},"tips-rootでやると怒られる","TIPS rootでやると怒られる",[13,3405,3406],{},"rootユーザーでコマンドを実行しようとすると以下のように怒られます。",[72,3408,3411],{"className":3409,"code":3410,"language":77},[75],"Error: YIKES! It looks like you're running this as root. You probably meant to run this as the user that your WordPress installation exists under.\n\nIf you REALLY mean to run this as root, we won't stop you, but just bear in mind that any code on this site will then have full control of your server, making it quite DANGEROUS.\n\nIf you'd like to continue as root, please run this again, adding this flag:  --allow-root\n\nIf you'd like to run it as the user that this site is under, you can run the following to become the respective user:\n\n    sudo -u USER -i -- wp \u003Ccommand>\n",[61,3412,3410],{"__ignoreMap":80},[13,3414,3415],{},"ざっくり和訳すると",[13,3417,3418],{},"「ええっ！wpコマンドをrootユーザーで実行しようとしてない！？rootユーザーはサーバーもいろいろ弄れるから危ないよ。まあ、あなたがどうしてもrootユーザーで実行したいなら止めないけど。その時は –allow-root オプションを添えてね」",[13,3420,3421],{},"こんな感じです。rootユーザーはサーバーの最高権限を持っているので使うのは危ないです。さらにwpコマンドを通じてwordpressの内容を容易に破壊することも可能なので、rootでやるのはおすすめしないと警告されます。",[13,3423,3424],{},"回避する場合は警告の通り –allow-root オプションを添えるか、ユーザーを変更して実行します。実務サーバーではアプリケーションをrootで運用することはないので特に問題ないとは思います。",[27,3426,3428],{"id":3427},"自作プラグインの関数にフックさせる","（自作）プラグインの関数にフックさせる",[13,3430,3431,3432,3434,3435,3438],{},"それではCLIがインストールされた所でプラグインの関数にフックさせてみましょう。方法は沢山ありますが簡単なのは自作のコマンドを追加してしますことです。CLIをインストールして、",[61,3433,3376],{},"コマンドを実行すると",[61,3436,3437],{},"WP_CLI","クラスが実行時に使用可能になります。",[13,3440,3441,3442,3447,3448,3451],{},"WP_CLIクラスには",[176,3443,3446],{"href":3444,"rel":3445},"https:\u002F\u002Fmake.wordpress.org\u002Fcli\u002Fhandbook\u002Freferences\u002Finternal-api\u002F",[180],"こちらのリファランス","のように静的メソッドがいくつか用意されています。その中に",[61,3449,3450],{},"WP_CLI::add_command()","をコマンドを追加できるメソッドがあります。第一引数にコマンド名、第二引数にコールバック関数名または関数を指定します。",[72,3453,3456],{"className":539,"code":3454,"filename":3455,"language":541,"meta":80,"style":80},"\u003C?php\n\u002F*\nPlugin Name: test\n*\u002F\n\nif(!defined('ABSPATH')) {\n    die('You are not allowed to call this page directly.');\n}\n\nfunction cmm_test(){\n    echo 'test!';\n}\n\nif ( class_exists( 'WP_CLI' ) ) {\n    WP_CLI::add_command( 'foo', 'cmm_test' );\n}\n","plugins\u002Ftest\u002Ftest.php",[61,3457,3458,3462,3467,3472,3477,3481,3486,3491,3495,3499,3504,3509,3513,3517,3522,3527],{"__ignoreMap":80},[204,3459,3460],{"class":206,"line":207},[204,3461,726],{},[204,3463,3464],{"class":206,"line":228},[204,3465,3466],{},"\u002F*\n",[204,3468,3469],{"class":206,"line":235},[204,3470,3471],{},"Plugin Name: test\n",[204,3473,3474],{"class":206,"line":4},[204,3475,3476],{},"*\u002F\n",[204,3478,3479],{"class":206,"line":248},[204,3480,232],{"emptyLinePlaceholder":231},[204,3482,3483],{"class":206,"line":256},[204,3484,3485],{},"if(!defined('ABSPATH')) {\n",[204,3487,3488],{"class":206,"line":267},[204,3489,3490],{},"    die('You are not allowed to call this page directly.');\n",[204,3492,3493],{"class":206,"line":278},[204,3494,804],{},[204,3496,3497],{"class":206,"line":286},[204,3498,232],{"emptyLinePlaceholder":231},[204,3500,3501],{"class":206,"line":295},[204,3502,3503],{},"function cmm_test(){\n",[204,3505,3506],{"class":206,"line":303},[204,3507,3508],{},"    echo 'test!';\n",[204,3510,3511],{"class":206,"line":314},[204,3512,804],{},[204,3514,3515],{"class":206,"line":325},[204,3516,232],{"emptyLinePlaceholder":231},[204,3518,3519],{"class":206,"line":336},[204,3520,3521],{},"if ( class_exists( 'WP_CLI' ) ) {\n",[204,3523,3524],{"class":206,"line":347},[204,3525,3526],{},"    WP_CLI::add_command( 'foo', 'cmm_test' );\n",[204,3528,3529],{"class":206,"line":355},[204,3530,804],{},[13,3532,3533],{},"例えば上記のようにした場合は以下のように実行されます。",[72,3535,3538],{"className":3536,"code":3537,"language":77},[75],"$ wp foo\ntest!\n",[61,3539,3537],{"__ignoreMap":80},[13,3541,3542],{},"なので同じようにして関数を定義して、フックさせます。",[72,3544,3546],{"className":539,"code":3545,"language":541,"meta":80,"style":80},"\u003C?php\n\u002F*\nPlugin Name: test\n*\u002F\n\nif(!defined('ABSPATH')) {\n    die('You are not allowed to call this page directly.');\n}\n\nfunction create_cache_table(){\n    .... \u002F\u002F めちゃくちゃ時間のかかる処理など\n}\n\nif ( class_exists( 'WP_CLI' ) ) {\n    WP_CLI::add_command( 'create_cache', 'create_cache_table' );\n}\n",[61,3547,3548,3552,3556,3560,3564,3568,3572,3576,3580,3584,3589,3594,3598,3602,3606,3611],{"__ignoreMap":80},[204,3549,3550],{"class":206,"line":207},[204,3551,726],{},[204,3553,3554],{"class":206,"line":228},[204,3555,3466],{},[204,3557,3558],{"class":206,"line":235},[204,3559,3471],{},[204,3561,3562],{"class":206,"line":4},[204,3563,3476],{},[204,3565,3566],{"class":206,"line":248},[204,3567,232],{"emptyLinePlaceholder":231},[204,3569,3570],{"class":206,"line":256},[204,3571,3485],{},[204,3573,3574],{"class":206,"line":267},[204,3575,3490],{},[204,3577,3578],{"class":206,"line":278},[204,3579,804],{},[204,3581,3582],{"class":206,"line":286},[204,3583,232],{"emptyLinePlaceholder":231},[204,3585,3586],{"class":206,"line":295},[204,3587,3588],{},"function create_cache_table(){\n",[204,3590,3591],{"class":206,"line":303},[204,3592,3593],{},"    .... \u002F\u002F めちゃくちゃ時間のかかる処理など\n",[204,3595,3596],{"class":206,"line":314},[204,3597,804],{},[204,3599,3600],{"class":206,"line":325},[204,3601,232],{"emptyLinePlaceholder":231},[204,3603,3604],{"class":206,"line":336},[204,3605,3521],{},[204,3607,3608],{"class":206,"line":347},[204,3609,3610],{},"    WP_CLI::add_command( 'create_cache', 'create_cache_table' );\n",[204,3612,3613],{"class":206,"line":355},[204,3614,804],{},[13,3616,3617],{},"ちなみにif ( class_exists( 'WP_CLI' ) ) がないとUndefined type 'WP_CLI'というエラーが発生して怒られます。ドキュメントルート 配下のwordpressフォルダにはWP_CLIクラスのソースがなく、コマンドを実行（wp-cli.pharを実行）するときにクラスが提供されるそうです。一応これが標準らしい。",[13,3619,3620],{},"コマンドが追加できたのであとはcronを設定してwpコマンドを設定してあげます。",[27,3622,3623],{"id":3623},"cronを設定",[13,3625,3626],{},"rootでないユーザーで操作しているものとします。",[72,3628,3631],{"className":3629,"code":3630,"language":77},[75],"$ crontab -e\n",[61,3632,3630],{"__ignoreMap":80},[72,3634,3637],{"className":3635,"code":3636,"language":77},[75],"PATH = \u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Flocal\u002Fsbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fsbin:\u002Fusr\u002Fbin:\u002Fsbin:\u002Fbin;\n0 * * * * cd \u002Fvar\u002Fwww\u002Fhtml && wp create_cache >> \u002Fdev\u002Fnull 2>&1\n",[61,3638,3636],{"__ignoreMap":80},[13,3640,3641,3642,3645,3646,3649],{},"このcronは1時間ごと（00分）に実行されます。",[61,3643,3644],{},"cd \u002Fvar\u002Fwww\u002Fhtm","l でドキュメントルート へ移動して先ほどのコマンドを打って、思い処理の関数を実行しています。ちなみに上の ",[61,3647,3648],{},"PATH = ...."," がないと",[72,3651,3654],{"className":3652,"code":3653,"language":77},[75],"\u002Fusr\u002Fbin\u002Fenv: 'php': No such file or directory\n",[61,3655,3653],{"__ignoreMap":80},[13,3657,3658,3659,2362,3662,3665,3666,3669],{},"というようにエラーが出てしまい、指定のcron処理が行われません。これ結構ハマったのですが、cron実行時のPATHの設定が",[61,3660,3661],{},"\u002Fbin",[61,3663,3664],{},"\u002Fusr\u002Fbin","だけしか通っていないので、PHPやwpが存在する ",[61,3667,3668],{},"\u002Fusr\u002Flocal\u002Fbin","配下を見ておらずPHPが実行できないのが原因です。",[13,3671,3672],{},"なので予め普段使用しているPATHを出しておいて、crontab上で再定義しています。上記のようにすればあとは指定の時間が来れば",[108,3674,3675,3678,3681,3684],{},[45,3676,3677],{},"cronでコマンドを実行",[45,3679,3680],{},"コマンドに結びついた関数を呼び出す",[45,3682,3683],{},"処理が実行",[45,3685,3686],{},"ログがあればそれに吐き出す",[13,3688,3689],{},"と言った自動運用が可能になります。",[3691,3692,3696,3697],"div",{"className":3693},[3694,3695],"alert","alert-info","\n「>> \u002Fdev\u002Fnull 2>&1」 これは「エラー出力を標準出力とし、\u002Fdev\u002Fnullに書き出す」という意味です。\n",[13,3698,3699],{},"「？」となった方にもう簡単説明します。>> で実行したコマンドの結果などを出力できます。エラーであればエラー文が得られます。そして \u002Fdev\u002Fnull はunixのスペシャルファイルで、空のファイルです。空のファイルを指定して結果を捨てることができます。「無に書き出す」みたいなことをしています。2>&1 はエラー出力を標準出力にします。という意味です。",[13,3701,3702,3703,3706],{},"つまり",[61,3704,3705],{},">> \u002Fdev\u002Fnull 2>&1","はエラー出力であっても結果内容を残さず捨てるという意味です。テストぐらいであれば問題ないのですが、実務でやると何か起きたときに原因が分からないので以下のようにするといいです。",[72,3708,3711],{"className":3709,"code":3710,"language":77},[75],"PATH = \u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Flocal\u002Fsbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fsbin:\u002Fusr\u002Fbin:\u002Fsbin:\u002Fbin;\n0 * * * * cd \u002Fvar\u002Fwww\u002Fhtml && wp create_cache >> \u002Fvar\u002Flog\u002Fcron.log 2>&1\n",[61,3712,3710],{"__ignoreMap":80},[13,3714,3715],{},"こうするときちんとログファイルにエラーが残ります。",[2310,3717,3718],{},"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);}",{"title":80,"searchDepth":235,"depth":235,"links":3720},[3721,3727,3728],{"id":3331,"depth":228,"text":3332,"children":3722},[3723,3724],{"id":3343,"depth":235,"text":3344},{"id":3369,"depth":235,"text":3370,"children":3725},[3726],{"id":3402,"depth":4,"text":3403},{"id":3427,"depth":228,"text":3428},{"id":3623,"depth":228,"text":3623},[2332],"2020-11-26",{},"\u002Farticles\u002Fwordpress-cli-with-cron",{"title":3302,"description":3302},"articles\u002Fwordpress-cli-with-cron",[541,2341],"1F5rQcoO_KWxxu1bCXWSeo1uX58qewfjTBZ8Az0AndI",1780987147650]