[{"data":1,"prerenderedAt":283},["ShallowReactive",2],{"content-/wordpress-migration-layout-fixes":3,"all-pages-for-dir":262,"related-/wordpress-migration-layout-fixes":263,"og-image-/wordpress-migration-layout-fixes":282},{"id":4,"title":5,"body":6,"category":244,"concepts":245,"description":246,"extension":247,"meta":248,"navigation":249,"ogImage":245,"path":250,"project_name":251,"published":252,"publishedAt":253,"seo":254,"stem":255,"tags":256,"todo":245,"unpublished":252,"updatedAt":245,"__hash__":261},"pages/2026-07/2026-07-22/wordpress-migration-layout-fixes.md","WordPress移行記事の本文幅・行間をブログ基準に揃え直した一日",{"type":7,"value":8,"toc":235},"minimark",[9,13,22,25,28,32,35,38,41,45,48,73,142,153,157,160,163,166,170,173,180,183,187,190,193,196,199,203,206,209,212,228,231],[10,11,5],"h1",{"id":12},"wordpress移行記事の本文幅行間をブログ基準に揃え直した一日",[14,15,16,17,21],"p",{},"進捗ドキュメントを確認させることから、今日はいつも始まった。前日までに大きなバグを何本も潰していたはずなのに、いざ再開しようとすると自分でもどこまで終わっていたか怪しい。頼りになるのは記憶ではなく",[18,19,20],"code",{},"memo/2026-07-22/progress-2026-07-22.md","のほうだった。",[14,23,24],{},"今日だけでこのサイクルを3回繰り返すことになる。コンテキストが埋まるたびに区切り、進捗ドキュメントを更新してから次のセッションへ渡す。3回目の再開のときには、もう自分でもどれが今日の何回目の続きなのか数えないと分からなくなっていた。",[14,26,27],{},"裏では機械的なチェックスクリプトも並行して走り、リンク切れやテーブル崩れを勝手に洗い出してくれていた。ただ、その日いちばん記憶に残ったのは機械が拾えない種類の指摘、つまり見た目そのものへの違和感の連続だった。",[29,30,31],"h2",{"id":31},"本文の実効幅がなぜか合っていない",[14,33,34],{},"移行先のページはブログ記事のフォーマットを踏襲したはずだった。ところが並べて見ると、なんとなく幅が違う気がする。「ブログ記事、あるじゃないですか。あれとメインコンテンツの幅を合わせてほしいんですよ」と伝え、実測を頼んだ。",[14,36,37],{},"計測結果を見ると、外枠の要素自体は800pxで一致している。ところが本文を包む要素には左48pxのパディングがあり、実際のコンテンツ幅は752pxだった。",[14,39,40],{},"原因を辿らせると、この48pxは技術記事向けの行番号ガター機能のための余白だと分かった。行番号を表示する機能そのものは会計記事には要らない。パディングの数値だけを移植し、機能は持ち込まないという判断で決着させた。全記事を作り直させ、パンくずやタイトルは元の位置のまま、本文だけが右にわずかに沈み込む見た目になったことをブラウザで確認した。",[29,42,44],{"id":43},"詰まった行間の正体は見出し側の上書きだった","詰まった行間の正体は、見出し側の上書きだった",[14,46,47],{},"幅は合ったはずなのに、続けて「行間ですね。あとパラグラフの間……これ両方多分ちょっと詰まりすぎてる」という指摘が来た。「多分そのブログのCSSが当たってないと思います」という見立てが的中していた。",[14,49,50,51,54,55,58,59,61,62,65,66,69,70,72],{},"実機のp要素のcomputed styleを測らせ、原因を追わせる。本家のブログでは",[18,52,53],{},".doc","コンテナに",[18,56,57],{},"line-height: 1.7","が設定され、見出し（h1を除く）も本文もそのまま継承している。移行先のテンプレートは、見出し（",[18,60,29],{},"〜",[18,63,64],{},"h6","）に",[18,67,68],{},"line-height: 1.3","の個別指定が残っていて見出しの行間だけ本家より詰まって見え、加えて",[18,71,14],{},"のmarginが未移植でパラグラフ同士の間隔も詰まっていた。原因は1つではなく、見出し側の行間と本文側の余白、2つが重なって「全体的に詰まっている」という見え方になっていた。",[74,75,80],"pre",{"className":76,"code":77,"language":78,"meta":79,"style":79},"language-css shiki shiki-themes vitesse-light vitesse-light","/* 見出しに残っていた個別指定を削除し、.docのline-height: 1.7に統一 */\nh2, h3, h4, h5, h6 { line-height: 1.3; } /* ← これを削除 */\n","css","",[18,81,82,91],{"__ignoreMap":79},[83,84,87],"span",{"class":85,"line":86},"line",1,[83,88,90],{"class":89},"sxvE3","/* 見出しに残っていた個別指定を削除し、.docのline-height: 1.7に統一 */\n",[83,92,94,97,101,104,106,109,111,114,116,119,122,126,129,133,136,139],{"class":85,"line":93},2,[83,95,29],{"class":96},"sHkkW",[83,98,100],{"class":99},"shFtX",",",[83,102,103],{"class":96}," h3",[83,105,100],{"class":99},[83,107,108],{"class":96}," h4",[83,110,100],{"class":99},[83,112,113],{"class":96}," h5",[83,115,100],{"class":99},[83,117,118],{"class":96}," h6",[83,120,121],{"class":99}," {",[83,123,125],{"class":124},"sz8Xr"," line-height",[83,127,128],{"class":99},":",[83,130,132],{"class":131},"sM54T"," 1.3",[83,134,135],{"class":99},";",[83,137,138],{"class":99}," }",[83,140,141],{"class":89}," /* ← これを削除 */\n",[14,143,144,145,148,149,152],{},"見出し側の指定を消させ、pのmargin（",[18,146,147],{},"1rem 0","）、imgのmargin（",[18,150,151],{},"24px 0","）、strong/bのfont-weight（900）も本家の数値に合わせて追加させた。210記事を再変換させ、数値も見た目も本家と一致したことを確認した。",[29,154,156],{"id":155},"クリックヒアーは動画の1コマ目だった","「クリックヒアー」は、動画の1コマ目だった",[14,158,159],{},"ある記事を見ていて、「クリックヒアー」というプレースホルダーが目に入った。「これ多分動画の1コマ目なんですかね」と聞かれ、記憶をたどる。もともと普通の静止画の上に、当時苦渋の決断でこの仕組みを載せた記憶がうっすら残っていた。WordPress時代、クリックすると静止画が動くGIFに切り替わるという、今となっては古典的なJSトリックだった。",[14,161,162],{},"このパターンは116記事・546箇所という規模で残っていた。旧サイトから移す過程で、切り替えを起こしていたonclick属性がまるごと落ちていて、静止画のまま固定されていたのが不具合の正体だった。",[14,164,165],{},"ffmpegでGIFを動画に変換させ、1コマ目はそのまま起動画像（poster）として残し、上に再生ボタンを重ねる実装に変えさせた。動画そのものを差し替えるのではなく、当時の「1枚目を先に見せる」という判断だけは引き継いで、仕組みだけを今の技術に載せ替える形にした。この日の後半では、同じ「クリックで画像が切り替わる」系の別パターン（動画とは無関係な、Q&Aの解答を切り替える仕組み）が15記事・142箇所で見つかり、同じ考え方で汎用対応させることになる。",[29,167,169],{"id":168},"ぼやけて見えたのは黒い膜のせいだった","ぼやけて見えたのは、黒い膜のせいだった",[14,171,172],{},"その再生ボタンを実装させた直後、「これなんかすごい曇って見えるじゃないですか」という指摘が飛んできた。画像を見せられると、たしかに全体が薄いフィルターを掛けたようにくすんでいる。",[14,174,175,176,179],{},"原因はオーバーレイの背景に敷いていた半透明の黒（",[18,177,178],{},"rgba(0,0,0,0.18)","）だった。動画そのもののオーバーレイならこの濃さでも違和感はないが、1コマ目の静止画をそのまま見せたい今回の用途では、この膜が画質を落として見えていた。",[14,181,182],{},"poster画像がある場合は背景を透明にし、画像そのものがクリアに見えるよう直させた。視覚的にも曇りが消えたことを確認してから、次のバグ潰しに進んだ。",[29,184,186],{"id":185},"今開いてないですよねで気づいたこと","「今開いてないですよね」で気づいたこと",[14,188,189],{},"別の作業の区切りで、実装した機能の確認をすでに終えたと報告した。すると「ごめん、表示って確認してくれてますか？Chrome DevToolsで。今開いてないですよね」と聞き返された。",[14,191,192],{},"慌ててタブの状態を確認させると、指摘の通りだった。少し前まで開いていたはずのプレビュータブは既に閉じられていて、今開いているのは全く別のページだった。",[14,194,195],{},"そのターンの中で複数回、実際にクリックや矢印キー操作、モバイルエミュレーションでの検証はやらせていたのは事実だ。ただ、「確認済み」と報告した時点でそのタブは目の前になかった。過去にやった確認と、今この瞬間に見えている状態は別物だと突きつけられた形になる。",[14,197,198],{},"新しいタブを開き直させ、その場であらためて見せてもらってから、続きの報告に進んだ。ボタンクリックや矢印キー操作、モバイルでのタップまで、やった検証の中身自体は間違っていなかった。抜けていたのは、報告の直前にもう一度画面を開き直す、というただ一手間だけだった。",[29,200,202],{"id":201},"セッションが埋まるたびにドキュメントへ渡す","セッションが埋まるたびに、ドキュメントへ渡す",[14,204,205],{},"今日はこの調子で作業を進め、コンテキストが埋まるたびに区切りを入れた。区切りの前にやることは決まっていて、進捗ドキュメントを最新化してから引き継ぎプロンプトを出す。",[14,207,208],{},"次のセッションは必ずそのドキュメントを読むところから始まり、前回どこまで終えたかを確認してから続きに入る。1日の中で3回、このサイクルを回した。同じ日にここまで区切りを重ねたのは、この移行作業では初めてだった。",[29,210,211],{"id":211},"今日の学び",[213,214,215,219,222,225],"ul",{},[216,217,218],"li",{},"幅も行間も、原因は「新しいCSSが足りない」ではなく「余計な指定が上書きしている」側にあった。差分を疑うときは、足りない箇所より先に、消し忘れた個別指定を探した方が早いことがある",[216,220,221],{},"昔「苦渋の決断」で組んだ実装は、理由を思い出せなくても意味はあった。1コマ目を先に見せるという判断そのものは引き継ぎ、仕組みだけを今の作り方に載せ替えるのが現実的だった",[216,223,224],{},"「確認した」と言えるのは、今この瞬間に画面が開いている時だけだ。少し前にやった確認を根拠に「確認済み」と言い切ると、その差はいずれ突かれる",[216,226,227],{},"1日に3回もセッションを区切ることになったが、進捗ドキュメントさえ更新しておけば、続きは前回の続きとして自然に始められた。記憶ではなくドキュメントに頼る方が、結局は早い",[14,229,230],{},"210記事のうち、実際にカテゴリを横断してChrome DevToolsで目視確認まで済んだのはまだ一部だ。残りは次のセッションに引き継いだ進捗ドキュメントの中で待っている。",[232,233,234],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":79,"searchDepth":93,"depth":93,"links":236},[237,238,239,240,241,242,243],{"id":31,"depth":93,"text":31},{"id":43,"depth":93,"text":44},{"id":155,"depth":93,"text":156},{"id":168,"depth":93,"text":169},{"id":185,"depth":93,"text":186},{"id":201,"depth":93,"text":202},{"id":211,"depth":93,"text":211},"dev",null,"旧WordPressブログの移行作業で、移行先ページの本文幅と行間が新ブログの基準からずれていた問題を修正した記録。動画プレースホルダーの扱いや、Chrome DevToolsでの確認不足を指摘された経緯も残す。","md",{},true,"/wordpress-migration-layout-fixes","mdx-playground",false,"2026-07-22T00:00:00.000Z",{"title":5,"description":246},"2026-07/2026-07-22/wordpress-migration-layout-fixes",[257,258,259,260],"WordPress","データ移行","CSS","開発日記","Mxz471k8xfVktY-Rk80JI6H0r2a0gEmP1PknXeSofRA",[],[264,268,271,275,279],{"title":265,"path":266,"publishedAt":267},"WordPressバックアップから記事を復元できるか検証し、専用リポジトリを立てた日","/wordpress-restore-and-repo-split","2026-07-21T00:00:00.000Z",{"title":269,"path":270,"publishedAt":267},"DRAM価格ページの解説文追加で、サブエージェントの嘘の報告を実物確認で見破った話","/memory-price-mechanism-subagent-fabrication",{"title":272,"path":273,"publishedAt":274},"決算ビートモニタリングにAEHR・ASMLを追加 — /add-tickerを1日2本回して、ASMLのPER拡大に気づくまで","/beat-monitoring-add-aehr-asml","2026-07-15T00:00:00.000Z",{"title":276,"path":277,"publishedAt":278},"Claude Codeで他社モデルが動く非対称性からMCP解剖まで — AIベンダー戦略を対話で掘って記事5本を書いた日","/ai-vendor-strategy-writing","2026-07-14T00:00:00.000Z",{"title":280,"path":281,"publishedAt":278},"AI生成キャラを動かす — 擬似リグのモーション実装からLive2D正攻法の計画確定、保留の判断まで","/live2d-motion-session","https://log.eurekapu.com/og/blog/wordpress-migration-layout-fixes.png?v=2026-07-22T00%3A00%3A00.000Z&title=WordPress%E7%A7%BB%E8%A1%8C%E8%A8%98%E4%BA%8B%E3%81%AE%E6%9C%AC%E6%96%87%E5%B9%85%E3%83%BB%E8%A1%8C%E9%96%93%E3%82%92%E3%83%96%E3%83%AD%E3%82%B0%E5%9F%BA%E6%BA%96%E3%81%AB%E6%8F%83%E3%81%88%E7%9B%B4%E3%81%97%E3%81%9F%E4%B8%80%E6%97%A5&author=Kei%20Komatsu&sig=372a50579e440ce9",1784786419913]