[{"data":1,"prerenderedAt":685},["ShallowReactive",2],{"content-/2026-07-26-diary":3,"all-pages-for-dir":665,"related-/2026-07-26-diary":666,"og-image-/2026-07-26-diary":684},{"id":4,"title":5,"body":6,"category":647,"concepts":648,"description":649,"extension":650,"meta":651,"navigation":567,"ogImage":648,"path":652,"project_name":653,"published":654,"publishedAt":655,"seo":656,"stem":657,"tags":658,"todo":648,"unpublished":654,"updatedAt":648,"__hash__":664},"pages/2026-07/2026-07-26/diary-2026-07-26.md","2026年7月26日の開発日記 - WordPressサイトをついに本番切替した日",{"type":7,"value":8,"toc":627},"minimark",[9,14,18,22,29,32,37,40,43,49,62,73,76,80,83,86,89,93,104,112,114,118,121,124,128,139,147,149,153,156,159,163,174,182,184,188,191,194,198,209,217,219,223,226,229,232,236,247,255,257,261,264,267,270,274,285,293,295,299,302,305,309,320,328,330,333,526,528,531,551,553,556,588,590,593],[10,11,13],"h1",{"id":12},"_2026年7月26日の開発日記","2026年7月26日の開発日記",[15,16,17],"p",{},"三日前、確認画面の直前で自分の判断として本番切替を止めた。移行先の完成度が足りないという理由だった。今日はその足りない分を朝のうちに埋めて、DNSを切り替えた。203記事すべてが200を返し、301のルールも13本そろって動いた。ここまでは順調だったと思う。ところが旧カテゴリ階層のURLに末尾スラッシュを足した瞬間、404が返ってきた。",[19,20,21],"h2",{"id":21},"今日のタイムライン",[15,23,24],{},[25,26],"img",{"alt":27,"src":28},"タイムライン","/2026-07/2026-07-26/timeline-2026-07-26.png",[19,30,31],{"id":31},"今日やったこと",[33,34,36],"h3",{"id":35},"_1-wordpressサイトの本番dns切替","1. WordPressサイトの本番DNS切替",[15,38,39],{},"会社サイトのDNSを移行先へ向け、切替直後に総当たりで検証した。記事の全件200、301ルール13本、旧形式のクエリURL 210件、画像の枚数、robots.txtとサイトマップ、下書き記事が露出していないこと。検索コンソールにもサイトマップを出し直した。上位10ページの表示確認まではすんなり通った。",[15,41,42],{},"そこから全222ページの突き合わせに進もうとして管理画面が反応しなくなり、URLの体系側から攻める方向に切り替えたところで末尾スラッシュの穴が出てきた。ローカルで再現させて直し、デプロイし直している。",[15,44,45],{},[46,47,48],"strong",{},"主な成果:",[50,51,52,56,59],"ul",{},[53,54,55],"li",{},"本番DNSの切替と、切替直後の総当たり検証",[53,57,58],{},"旧カテゴリ階層URLの末尾スラッシュで404になる不具合の発見と修正",[53,60,61],{},"1週間・2週間・1ヶ月で何を見るかのモニタリング方針を台帳に追記",[15,63,64,67,68],{},[46,65,66],{},"詳細:"," ",[69,70,72],"a",{"href":71},"/wordpress-cutover-phase4","WordPressサイトの本番DNS切替と、移行後に見つかった301の穴",[74,75],"hr",{},[33,77,79],{"id":78},"_2-切替前のサイト仕上げ","2. 切替前のサイト仕上げ",[15,81,82],{},"切替の前にローカルで全ページを見て回った。コンセプトページの画像が出ないのは移行データの欠損だと思い込んでいたが、実際は現行サイトでは表示されていて、ローカルだけが404を返していた。参照側8か所を置き換えて解決した。",[15,84,85],{},"お問い合わせフォームはメール送信まで本番で一周させた。二通目から日本語が壊れたのは、壊れたのが差し込み値だけでテンプレート文言は無事だったことから、ターミナルから送ったときの文字コードが原因だと切り分けられた。フォーム本体は無傷だった。",[15,87,88],{},"トップページは記事一覧と役割が重なっていて気持ち悪かったので作り直した。記事の中で作ったアニメーションをその場で再生させ、原書コンテンツをスライドで見せる。小さすぎて中身が読めなかったので、モーダルで拡大してページ送りできるようにした。",[15,90,91],{},[46,92,48],{},[50,94,95,98,101],{},[53,96,97],{},"画像が出ない原因の切り分けと修正",[53,99,100],{},"お問い合わせメールの文字化けの原因特定",[53,102,103],{},"トップページの作り直しとフッター追加、コンセプトページの1カラム化",[15,105,106,67,108],{},[46,107,66],{},[69,109,111],{"href":110},"/wordpress-site-final-polish","本番切替の前に移行先サイトを仕上げた日",[74,113],{},[33,115,117],{"id":116},"_3-計画書の判断をボタンで返す仕組み","3. 計画書の判断をボタンで返す仕組み",[15,119,120],{},"サイト全体のタイトルとディスクリプションは、これまで我流で書いてきた。一貫性も狙いもない。203記事のメタ情報をまとめてレビューさせたら、同じ意味の定型句が27種類に分裂していた。",[15,122,123],{},"改善計画はできたが、判断が必要な項目が4件残った。ターミナルの選択肢UIだと、何を聞かれているかの前提が読めないまま選ぶことになる。そこで計画書のHTMLの中に3択ボタンを埋め込み、前提を読んだ流れでそのまま押せるようにした。選択肢に収まらない条件は自由記述欄から返ってきて、これが実際に効いた。",[15,125,126],{},[46,127,48],{},[50,129,130,133,136],{},[53,131,132],{},"203記事のメタ情報レビューと改善計画の作成",[53,134,135],{},"計画書HTMLに3択ボタンを埋める決裁フォームの実装",[53,137,138],{},"この運用を全プロジェクト共通のルールへ昇格",[15,140,141,67,143],{},[46,142,66],{},[69,144,146],{"href":145},"/plan-decision-form","計画書の中で判断を返す — ターミナルの選択肢をやめてHTMLに3択ボタンを埋めた",[74,148],{},[33,150,152],{"id":151},"_4-コンピュータのしくみ講座を触れるものにする","4. コンピュータのしくみ講座を触れるものにする",[15,154,155],{},"前日の仕掛かりを調べさせたら、12本のプルリクエストが宙に浮いていた。12体のエージェントを並列で走らせてレビューさせ、要修正3本・マージ可9本に仕分けた。正解の位置が周期的に偏る問題と、図解の座標が重なっている箇所が出てきた。",[15,157,158],{},"トップページでは講座が学習クイズの中に散らばっていたので、1つのカテゴリにまとめ、あいだに一覧ページを挟んで3階層にした。中身がテキストと図ばかりだった全18講には、既存の教材から転用できるものを洗い出させて触れるシミュレーターを入れた。",[15,160,161],{},[46,162,48],{},[50,164,165,168,171],{},[53,166,167],{},"宙に浮いていた12本のPRのレビューとマージ",[53,169,170],{},"トップページのカテゴリ集約と一覧ページの新設、パンくずの修正",[53,172,173],{},"全18講へのシミュレーター投入（公開は翌日に持ち越し）",[15,175,176,67,178],{},[46,177,66],{},[69,179,181],{"href":180},"/code-course-interactive-rollout","全18講に触って動くシミュレーターを入れた日",[74,183],{},[33,185,187],{"id":186},"_5-インタラクティブ教材の集約と本文の整理","5. インタラクティブ教材の集約と本文の整理",[15,189,190],{},"翻訳記事に埋め込んだ15個の教材をブラウザで全部動かし、元記事と突き合わせさせた。原文とずれていたものが3件、原文にあって教材に入っていなかったものが3件見つかった。体験だけを集めた一覧ページを新しく作り、シミュレーターの一覧にもテーマ別の見出しで追加分を並べた。",[15,192,193],{},"本文の文字がグレーで薄く、意味のない枠線が多くて読みづらかったので、黒に戻して枠を落とした。背景のグレーだけ残している。数週間前に変換した記事を内容の記憶だけで特定させ、そこで表示されていなかった画像10枚が外部への直リンクだったことも分かった。ダウンロードして記事ディレクトリに置き、出典URLを添える形にした。",[15,195,196],{},[46,197,48],{},[50,199,200,203,206],{},[53,201,202],{},"教材15個の表示レビューと原文との整合（ずれ3件・不足3件を修正）",[53,204,205],{},"体験だけを集めたページの新設と、一覧のテーマ別再編",[53,207,208],{},"本文のタイポグラフィ整理と、外部直リンク画像のローカル引き取り",[15,210,211,67,213],{},[46,212,66],{},[69,214,216],{"href":215},"/interactive-content-consolidation","インタラクティブ教材を1枚に集約し、本文の線を減らした日",[74,218],{},[33,220,222],{"id":221},"_6-語源英単語コースの手触りと設定のdb保存","6. 語源英単語コースの手触りと、設定のDB保存",[15,224,225],{},"矢印キーでページを移動したときに音声をどう鳴らすかを、チェックボックス2つで4パターンから選べるようにした。単語だけか、例文も鳴らすか、その両方か。",[15,227,228],{},"英単語を間違えたときにだけ例文と情景画像を出すようにもした。間違えるということは、その語のイメージがついていないということだ。だったら画像でイメージを立ててやればいい、という仮説である。誤答表示から「不正解」の3文字も消した。×が赤くなっていれば分かる。",[15,230,231],{},"設定はブラウザに保存されるだけだったので、ログイン済みユーザーごとにデータベースへ持たせる形に移した。計画を立ててからレビューを4往復させ、別ブラウザで同じ設定が戻るところまで確かめている。",[15,233,234],{},[46,235,48],{},[50,237,238,241,244],{},[53,239,240],{},"矢印キー移動時の音声再生をチェックボックスで選択可能に",[53,242,243],{},"誤答時だけ例文と情景画像を出す仕組み、誤答表示の視認性改善",[53,245,246],{},"設定のユーザー別DB保存（計画・レビュー4往復・実装・別ブラウザでの復元確認）",[15,248,249,67,251],{},[46,250,66],{},[69,252,254],{"href":253},"/etymology-learning-ux-and-settings-sync","語源英単語コースの手触りを直した一日",[74,256],{},[33,258,260],{"id":259},"_7-手持ちサイトの棚卸し","7. 手持ちサイトの棚卸し",[15,262,263],{},"口頭で説明できたのは4サイトだった。並列で調べさせたら、業種別のランディングページ群と画像配信用のサブドメインが出てきて、公開ドメインは合計15あった。",[15,265,266],{},"旧PaaSで動かしているアプリを静的化して別の基盤へ移す案が出たとき、「統合は考えていない」と即答した。その数分後、そのアプリを別サイトへ統合する構想を自分が2月に書いていたことを思い出して、前提を訂正することになった。それでも独立したまま残す判断は変えていない。",[15,268,269],{},"棚卸しでは実害も出てきた。トップページのリンク切れ3本が1ヶ月半放置されていて、しかもビルドログは成功と出ていた。",[15,271,272],{},[46,273,48],{},[50,275,276,279,282],{},[53,277,278],{},"リポジトリと公開ドメインの対応の棚卸し（把握していた4→実際は15）",[53,280,281],{},"旧PaaSアプリの扱いについて、過去の構想を踏まえた前提の訂正",[53,283,284],{},"リンク切れ・メタ情報欠落・サイトマップ不在などの実害の洗い出し",[15,286,287,67,289],{},[46,288,66],{},[69,290,292],{"href":291},"/site-portfolio-due-diligence","把握していたのは4サイト、実際は15ドメイン",[74,294],{},[33,296,298],{"id":297},"_8-notionアーカイブの実物照合","8. Notionアーカイブの実物照合",[15,300,301],{},"10日分のコミットが宙に浮いていたので片付けた。プッシュを投げながら、ローカルの整合はNotion側の完全性を証明しないと引っかかって、ブラウザの実物と突き合わせる工程を足した。",[15,303,304],{},"一覧を取る経路が見つからず、画面のDOMから列挙する形に切り替えた。欠落に見えた49件のうち48件は、そもそもMarkdownを持たない設計のビューブロックだった。取得そのものはほぼ完全で、落ちていたのは変換側のテーブルとページプロパティだと分かった。",[15,306,307],{},[46,308,48],{},[50,310,311,314,317],{},[53,312,313],{},"10日分の未コミット（8,718ファイル）の整理とプッシュ",[53,315,316],{},"完了報告を信じず、ブラウザの実物と突き合わせた照合",[53,318,319],{},"落ちているのは取得側ではなく変換側だという切り分け",[15,321,322,67,324],{},[46,323,66],{},[69,325,327],{"href":326},"/notion-archive-completeness-check","「本当に全部終わったのか」を疑ってNotionアーカイブを実物照合した日",[74,329],{},[19,331,332],{"id":332},"今日の試行錯誤",[334,335,336,358],"table",{},[337,338,339],"thead",{},[340,341,342,346,349,352,355],"tr",{},[343,344,345],"th",{},"#",[343,347,348],{},"テーマ",[343,350,351],{},"試したこと",[343,353,354],{},"結果",[343,356,357],{},"気づき",[359,360,361,379,395,412,428,444,460,476,493,510],"tbody",{},[340,362,363,367,370,373,376],{},[364,365,366],"td",{},"1",[364,368,369],{},"移行先の画像が出ない",[364,371,372],{},"移行データの欠損を疑ってバックアップを確認",[364,374,375],{},"失敗",[364,377,378],{},"現行サイトでは表示されていた。壊れていたのはローカルの配信設定だけだった",[340,380,381,384,387,390,392],{},[364,382,383],{},"2",[364,385,386],{},"切替後の全ページ確認",[364,388,389],{},"管理画面から222ページを一覧表示",[364,391,375],{},[364,393,394],{},"500行表示にUIが反応しない。URL体系から攻める方向に切り替えた",[340,396,397,400,403,406,409],{},[364,398,399],{},"3",[364,401,402],{},"旧URLの301",[364,404,405],{},"記事の全件200を確認して安心",[364,407,408],{},"不十分",[364,410,411],{},"末尾スラッシュ付きのカテゴリURLだけ404。パターンを1つ見落としていた",[340,413,414,417,420,423,425],{},[364,415,416],{},"4",[364,418,419],{},"お問い合わせメールの文字化け",[364,421,422],{},"フォーム側の実装を疑う",[364,424,375],{},[364,426,427],{},"化けたのは差し込み値だけ。ターミナルから送ったときの文字コードが原因で、フォームは無傷",[340,429,430,433,436,439,441],{},[364,431,432],{},"5",[364,434,435],{},"教材の表示検証",[364,437,438],{},"スクリーンショットで確認",[364,440,375],{},[364,442,443],{},"タイムアウトする。DOMの値を直接読む方式に切り替えて通した",[340,445,446,449,452,455,457],{},[364,447,448],{},"6",[364,450,451],{},"記事の画像が404",[364,453,454],{},"パスの誤りを疑う",[364,456,375],{},[364,458,459],{},"外部への直リンクで、参照先が再ビルドされてハッシュが変わっていた。ローカルに引き取って解決",[340,461,462,465,468,471,473],{},[364,463,464],{},"7",[364,466,467],{},"講座のインタラクティブ化",[364,469,470],{},"10体のエージェントを並列で派遣",[364,472,375],{},[364,474,475],{},"セッション上限で全滅。ただし6点はディスクに完成品が残っていて回収でき、残りは3並列で通した",[340,477,478,481,484,487,490],{},[364,479,480],{},"8",[364,482,483],{},"表示幅の調整",[364,485,486],{},"380から400へ変更",[364,488,489],{},"空振り",[364,491,492],{},"セレクタが合っておらず変わっていなかった。実測して発覚し、500に置き直した",[340,494,495,498,501,504,507],{},[364,496,497],{},"9",[364,499,500],{},"判断項目の受け渡し",[364,502,503],{},"ターミナルの選択肢で聞く",[364,505,506],{},"却下",[364,508,509],{},"何を聞かれているかの前提が読めない。計画書HTMLに3択ボタンを埋める方式へ",[340,511,512,515,518,521,523],{},[364,513,514],{},"10",[364,516,517],{},"Notionの取得漏れ調査",[364,519,520],{},"検索APIと探索系エンドポイントを試す",[364,522,375],{},[364,524,525],{},"どちらも通らず、画面のDOMから列挙する方式に切り替えた",[74,527],{},[19,529,530],{"id":530},"今日の学び",[50,532,533,536,539,542,545,548],{},[53,534,535],{},"全件200が返ってきても、URLのパターンを1つ見落としていれば穴は残る。記事本体だけでなく、末尾スラッシュのような形の違いまで含めて総当たりする必要がある",[53,537,538],{},"何かが表示されないとき、まず疑うべきは「データが欠けている」ではなく「どの環境で見ているか」。現行サイトで出ているならデータは無事で、壊れているのは手元の設定である",[53,540,541],{},"判断を求めるUIは、選択肢そのものより「前提が同じ画面にあるか」で使いやすさが決まる。読んだ流れでそのまま押せる位置にボタンがあるかどうか",[53,543,544],{},"並列で派遣するエージェントの数には上限がある。多く出せば速いわけではなく、全滅すると取り返しに時間を取られる",[53,546,547],{},"完了報告はディスクの中を見ているだけかもしれない。別の経路で実物と突き合わせるまでは、終わったとは言えない",[53,549,550],{},"自分が過去に書いた構想は忘れる。「統合は考えていない」と即答した数分後に、統合構想を自分で書いていたことを思い出した",[74,552],{},[19,554,555],{"id":555},"明日やること",[50,557,560,570,576,582],{"className":558},[559],"contains-task-list",[53,561,564,569],{"className":562},[563],"task-list-item",[565,566],"input",{"disabled":567,"type":568},true,"checkbox"," コンピュータのしくみ講座の残件を公開まで持っていく",[53,571,573,575],{"className":572},[563],[565,574],{"disabled":567,"type":568}," サイト棚卸しの未決の論点5つに方針を出す（再開は計画書をブラウザで開くところから）",[53,577,579,581],{"className":578},[563],[565,580],{"disabled":567,"type":568}," Notionアーカイブの変換側を直し、テーブルとページプロパティを拾えるようにする",[53,583,585,587],{"className":584},[563],[565,586],{"disabled":567,"type":568}," 語源英単語の誤答語の復習ページ",[74,589],{},[19,591,592],{"id":592},"関連記事",[50,594,595,599,603,607,611,615,619,623],{},[53,596,597],{},[69,598,72],{"href":71},[53,600,601],{},[69,602,111],{"href":110},[53,604,605],{},[69,606,146],{"href":145},[53,608,609],{},[69,610,181],{"href":180},[53,612,613],{},[69,614,216],{"href":215},[53,616,617],{},[69,618,254],{"href":253},[53,620,621],{},[69,622,292],{"href":291},[53,624,625],{},[69,626,327],{"href":326},{"title":628,"searchDepth":629,"depth":629,"links":630},"",2,[631,632,643,644,645,646],{"id":21,"depth":629,"text":21},{"id":31,"depth":629,"text":31,"children":633},[634,636,637,638,639,640,641,642],{"id":35,"depth":635,"text":36},3,{"id":78,"depth":635,"text":79},{"id":116,"depth":635,"text":117},{"id":151,"depth":635,"text":152},{"id":186,"depth":635,"text":187},{"id":221,"depth":635,"text":222},{"id":259,"depth":635,"text":260},{"id":297,"depth":635,"text":298},{"id":332,"depth":629,"text":332},{"id":530,"depth":629,"text":530},{"id":555,"depth":629,"text":555},{"id":592,"depth":629,"text":592},"diary",null,"三日前に土壇場で止めた本番DNS切替を、ようやく実行した。203記事すべてが200を返して安心した直後、旧カテゴリURLに末尾スラッシュを足すと404が出る。判断をボタンで返す仕組みも作った一日の記録。","md",{},"/2026-07-26-diary","daily-log",false,"2026-07-26T00:00:00.000Z",{"title":5,"description":649},"2026-07/2026-07-26/diary-2026-07-26",[659,660,661,662,663],"日記","WordPress移行","Cloudflare","教材開発","Claude Code","ss8uDRtbZCYWJb_tJrIIsgLNVfFtPjCCNbouiiUPfLE",[],[667,671,675,679,680],{"title":668,"path":669,"publishedAt":670},"2026年7月27日の開発日記 - 画像3,810件の配信復旧とHeroku停止の実測","/2026-07-27-diary","2026-07-27T00:00:00.000Z",{"title":672,"path":673,"publishedAt":674},"2026年3月11日の開発日記 - CF計算書メンタルモデルとAI時代の質問力","/2026-03-11-diary","2026-03-11T00:00:00.000Z",{"title":676,"path":677,"publishedAt":678},"2026年7月29日の開発日記 - 朝いちで ~/.claude が消えた日に、7本の作業が並走した","/2026-07-29-diary","2026-07-29T00:00:00.000Z",{"title":72,"path":71,"publishedAt":655},{"title":681,"path":682,"publishedAt":683},"2026年7月25日の開発日記 - 挿絵1,576枚の完走とクラウド12セッション投入","/2026-07-25-diary","2026-07-25T00:00:00.000Z","https://log.eurekapu.com/og/blog/2026-07-26-diary.png?v=2026-07-26T00%3A00%3A00.000Z&title=2026%E5%B9%B47%E6%9C%8826%E6%97%A5%E3%81%AE%E9%96%8B%E7%99%BA%E6%97%A5%E8%A8%98%20-%20WordPress%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E3%81%A4%E3%81%84%E3%81%AB%E6%9C%AC%E7%95%AA%E5%88%87%E6%9B%BF%E3%81%97%E3%81%9F%E6%97%A5&author=Kei%20Komatsu&sig=01579208d2ae992f",1785379945925]