【WordPress70記事→Astro完全移行録】Cocoon・カエレバ・KATTENEと広告ブロッカー消失罠を突破する『AffiliateCard』と11大共通ルール
長年 WordPress(Cocoon テーマ等)で書き溜めたレビュー記事が何十本もあると、「高速で安全な Astro 静的サイトへ乗り換えたいけれど、Cocoon 独自のボックスや吹き出し、そしてカエレバ・KATTENE 等の商品リンク枠を全部手で作り直すなんて無理!」と足がすくんでしまいますよね。さらに苦労して移行しても、読者のブラウザの広告ブロッカーによって Amazon と楽天のボタンだけが消滅し、Yahoo! ボタン 1 個だけになってしまう隠れトラップ まで待ち受けています。
本記事では、旧 WordPress 上の全 78 記事・画像 1,625 枚・アフィリエイト枠 185 個を REST API 経由で Astro(MDX + WebP)へ一括救出し、広告ブロッカーによるボタン消失を 100% 防ぐ自作『<AffiliateCard>』コンポーネントと、過去記事の品質を一気に引き上げた「レビュー記事 11 大共通ルール」の全貌を公開します。 -
【50代からの脱WordPress】プラグイン地獄と決別!VS Code×最新AIで作る爆速・安全な個人ブログ運営術 : そもそもなぜ WordPress を卒業して手元の Mac と AI エディタによる運営へ切り替えたのか、全体像とメリットをまとめた記事です。
-
【Xserver×Astro移行の罠】なぜ404ではなく500無限ループになるのか?親WordPress『.htaccess継承・日本語URL後方参照バグ・XPageSpeed』完全解決録 : 記事の移行が終わった後、旧 URL から新 URL へ検索評価を 100% 引き継ぐ
.htaccess設計の実践編です。 -
【Web安全設計の基本】なぜ古いPHPサイトやC言語ソフトは狙われるのか?『メモリの番地(ポインタ)手作業管理』の限界とRust・静的サイトが安全な理由 : 古い商品リンクプラグインが原因で
PHP 7.4から上げられなくなる構造リスクを技術面から解説しています。
-
WordPress(特に Cocoon テーマ)で長年育てた 50〜100 本規模の記事と大量の写真を、失敗なく Astro 静的サイトへ引っ越しさせたい方
-
カエレバ・ヨメレバ・KATTENE・Rinker などの PHP ショートコード依存から脱却し、10 年後も壊れない商品紹介カードを作りたい方
-
もしもアフィリエイト等のリンクを貼った際、uBlock Origin などの広告ブロッカー環境で「Amazon・楽天ボタンだけ消える現象」に気づいていない方
-
自動変換しただけの荒れた Markdown をそのまま出さず、プロ品質に整える具体的な監査チェックリスト を知りたい方
わしの古い WordPress ブログにも 70 本ぐらい実機レビュー記事があるんじゃが、写真だけで 1,500 枚以上あるし、Cocoon の吹き出しやラベル枠、それに『KATTENE』のショートコードだらけなんじゃ……。これを Astro に移すなんて、半年かかるんじゃないか!?
手作業でコピペしていたら本当に半年かかってしまいます!でも WordPress 標準の REST API と AI エディタのスクリプト作成力を組み合わせれば、70 記事・画像 1,625 枚の取得から WebP 変換、商品カードの TypeScript 化まで 1 日でベース変換 できてしまうんですよ!実際にやって分かった手順と落とし穴を全部お話ししますね。
WordPress78記事と画像1625枚の救出作戦
REST API取得と非公開フラグによる安全隔離
WordPress から記事を取り出す際、管理画面の「XML エクスポート」を使う方法もありますが、今回は公開中のサイトから /wp-json/wp/v2/posts(および pages, categories, tags, media)の REST API を叩いて JSON 形式で一括取得する方式を採りました。JSON なら本文 HTML だけでなくスラッグ、公開日・更新日、アイキャッチ画像 ID の紐付けが最初から構造化されているため、変換スクリプトでの処理が圧倒的に正確だからです。
取得した全 78 記事(すでに新サイト側で先行リライトしていた 8 本を除く 新規移行対象 70 本)と 画像 1,625 枚 を変換する際、安全のために徹底したのが次の 3 ステップです。
- いきなり本番公開せず、全件
hidden: true(非公開フラグ)付きで専用ディレクトリsrc/content/blog/review-old/<slug>/へ隔離出力する - まず写真が 30〜60 枚ある複雑な 3 記事だけで「試験変換(ドライラン)」を行い、ビルドが通ることを確認してから残り全件を一括変換する
- 1,625 枚の画像はすべて各記事フォルダ内の
./images/*.webpへ自動変換・ローカル保存し、旧サイトのwp-content/uploadsへの外部直リンクをゼロにする
Cocoon独自タグと入れ子枠が招いた変換の癖
HTML から MDX へ自動変換してみると、人気テーマ Cocoon 特有の HTML 構造 がいくつもの面白い「変換の癖」を生むことが分かりました。
| Cocoon 側の元要素 | 自動変換後の MDX コンポーネント | そのままでは起きた問題と手直しポイント |
|---|---|---|
| ラベル付きボックス / 白抜き枠 | GadgetSection コンポーネント | 元記事で枠の中に枠を入れていた箇所が 二重ネスト になったり、## 見出し 直下に同名の枠が来て全文が緑枠で囲まれたりしたため平準化。 |
| キャラクター吹き出し | SpeechBalloon コンポーネント | 単なる引用(>)に変換すると掛け合いの楽しさが消えるため、専用アイコン付きコンポーネントへ復元。 |
| 星評価ショートコード | Markdown 比較テーブル | [star rate="4.0"] などが剥がれて末尾に 4.0:手頃な価格 のような謎の生文字として残ったため、見やすい表に整形。 |
自動抜粋の description | 80〜140 文字の要約文へ書き直し | 本文 1 行目の挨拶や見出しが機械的に切り取られていたため、記事の結論が伝わる要約へ 1 本ずつ改善。 |
カエレバ・KATTENE脱却と広告ブロッカー対策
もしもリンクでAmazonと楽天が消える真犯人
今回の移行で一番の急所であり、かつ「WordPress を卒業して本当に良かった!」と実感したのが 商品紹介リンク(アフィリエイト枠)の再設計 です。
旧ブログでは定番プラグインの『KATTENE』や『カエレバ』を使っていましたが、これらは PHP で動いているため、プラグインの更新が止まるとサーバーの PHP バージョンを 7.4 から 8.x へ上げられなくなる原因になっていました。そこで全記事に散らばっていた 185 個の商品枠 を解析し、記事ごとの型安全なデータファイル(<slug>-affiliate.ts)と共通コンポーネント <AffiliateCard id="..." /> へ統合しました。
ところが、完成したページをブラウザで実機確認していたとき、背筋が凍る現象を発見しました。一部の環境で「Amazon」と「楽天市場」のボタンだけが忽然と消え、「Yahoo!」ボタン 1 個しか表示されていなかったのです!
原因は、uBlock Origin や AdGuard などの 広告ブロッカー拡張機能が持つ CSS 非表示フィルター(コスメティックフィルタ) でした。
- もしもアフィリエイト等を経由する場合、リンク先の
href属性にはhttps://af.moshimo.com/af/c/click?...という URL が入ります(もしものバリューコマース連携や別 ASP を使ったボタンだけドメインが異なると、片方だけ生き残る現象が起きます)。 - 多くの広告ブロッカーは、ページ内の
a[href*="af.moshimo.com"] { display: none !important; }という CSS ルールを自動注入するため、HTML 上にボタンが存在していても 画面上から跡形もなく消されてしまう のです!さらに旧ブログ時代に残っていた1×1 ピクセルの計測用<img>タグも、壊れた画像アイコンやレイアウト崩れの原因になっていました。
WebP化と非表示検知フェイルセーフの実装コード
この問題をクリーンに解決するため、自作の AffiliateCard.astro には次の 3 つの設計 を組み込みました。
- 商品画像は外部サーバー直リンクをやめ、
astro:assetsの<Image>で120×120pxの軽量ローカル WebP として配信する(外部画像ブロックやリンク切れが永久に起きない)。 - 不要な
1pxトラッキング画像タグを完全撤去し、型定義(AffiliateItem)で存在しない ID を指定したらビルド時に即エラーで知らせる。 - 広告ブロッカーに
display: noneで消された場合のみ発動する「非表示検知フェイルセーフ」を入れる:通常環境では素直な<a href="...">のまま動作し、もしwindow.getComputedStyle(a).display === 'none'と判定された環境でのみ、data-aff-urlに退避しておいた遷移先をclickイベントで開くようhrefを切り替えます。これにより、どのブラウザ環境でも オレンジ(Amazon)・青(楽天市場)・赤(Yahoo!)の 3 ボタン が崩れず綺麗に並びます!
---
// src/components/AffiliateCard.astro(要部抜粋)
import { Image } from 'astro:assets';
import { affiliateData } from '../data/affiliates/index';
const { id } = Astro.props;
const item = affiliateData[id];
if (!item) {
throw new Error(`AffiliateCard ID "${id}" が未定義です。データファイルを確認してください。`);
}
---
<div class="p-card-wrap">
<div class="p-card-img">
<Image src={item.image} alt={item.title} width={120} height={120} format="webp" />
</div>
<div class="p-card-info">
<p class="p-card-ttl">{item.title}</p>
<div class="trg-grp">
<a href={item.amazon} data-aff-url={item.amazon} class="trg-lnk-a" target="_blank" rel="nofollow noopener noreferrer">Amazon</a>
<a href={item.rakuten} data-aff-url={item.rakuten} class="trg-lnk-r" target="_blank" rel="nofollow noopener noreferrer">楽天市場</a>
<a href={item.yahoo} data-aff-url={item.yahoo} class="trg-lnk-y" target="_blank" rel="nofollow noopener noreferrer">Yahoo!</a>
</div>
</div>
</div>
<script>
function ensureAffiliateButtonsVisible() {
document.querySelectorAll('a[data-aff-url]').forEach((a) => {
if (window.getComputedStyle(a).display === 'none') {
const url = a.getAttribute('data-aff-url');
if (url) {
a.setAttribute('href', '#open-shop');
a.addEventListener('click', (e) => {
e.preventDefault();
window.open(url, '_blank', 'noopener,noreferrer');
});
}
}
});
}
ensureAffiliateButtonsVisible();
document.addEventListener('DOMContentLoaded', ensureAffiliateButtonsVisible);
</script>
移行後の品質を揃えるレビュー記事11大共通ルール
元画像幅を超える拡大禁止とショートコード掃除
自動スクリプトで 70 記事のファイル変換が通ったとしても、それだけで公開すると「昔の記事の粗」がそのまま出てしまいます。そこで、もともと手作業で丁寧に仕上げていた基準レビュー 9 記事を手本にして 『REVIEW_POST_RULES.md(11 大共通ルール)』 を策定し、1 記事ずつ順番に精読・改修してから公開しました。
おお〜、機械でバーッと一括置換して終わりにするんじゃなく、1 記事ずつちゃんと人間の目線とルールで磨き上げたんじゃな!特にどんなところが危なかったんじゃ?
一番多かったのが 「小さい元画像の無理な引き伸ばし(ボケボケ画像)」 と 「数年前の通信プランや税制の時点ズレ」 でした!ここを潰すだけで、過去記事が新築みたいに蘇るんです!
-
元画像のピクセル幅を超える拡大(アップスケール)の厳禁 : 昔撮った横
320pxの小画像に一律でwidth={800}やstyle="width: 100%"を当てると、画面いっぱいに引き伸ばされてモザイク状にぼやけます。全画像の実際のピクセル寸法を計測し、必ず元サイズ以下かつmax-width: 100%(単体画像は横最大560〜620px・縦最大480px目安)に統一しました。 -
冒頭 3 枠の導入統一(「論旨」「関連情報」「対象となる方」) : 読者が最初の 5 秒で結論を掴めるよう、冒頭に
<mark>付きの「論旨」と「対象となる方」(旧記事によくあった対称となる方という変換ミスも根絶!)を揃えました。 -
5 重ロックによる「時点明記」と「数値・安全境界」の再検証 : 数年前に書いた格安 SIM プランや家電レビューは、当時の一次計測データを大切に温存しつつ「※〇〇年時点の実機検証記録および現行仕様の補足」を添えることで、いつ読まれても誤解を与えない情報資産にしました。
AI国家本編と文体・見出しを分離する設計原則
また、同じ Astro プロジェクトの中に「硬派な社会制度論考(である調)」と「親しみやすいガジェット・生活レビュー(です・ます調+吹き出し+猫様写真)」が同居している場合、AI エディタにルールを 1 つしか渡さないと レビュー記事まで論文調に書き換えてユーモアを消してしまう事故 が起きます。
これを防ぐため、レビュー記事専用のルールファイル(REVIEW_POST_RULES.md)を完全に独立させ、「一次情報・実測値・失敗談・吹き出しの掛け合いは 1 文字も削らず 100% 保全する」という防護壁を敷いたことが大成功の決め手になりました。
まとめ:過去の記事資産を10年戦える静的MDXへ
WordPress で何年もかけて書いた記事や写真は、かけがえのない自分の歴史そのものです。PHP やプラグインの寿命に引きずられて放置してしまう前に、純粋なテキスト(MDX)と軽量な WebP 画像として救い出しておけば、10 年先・20 年先もサーバー環境を選ばず光速で表示し続けられます。
- REST API で記事とメディア構造を取得し、まずは
hidden: trueで安全に隔離変換する - カエレバ・KATTENE 等の PHP 依存枠は型安全な
<AffiliateCard>へ統合し、広告ブロッカーによるボタン消失もフェイルセーフで防ぐ - 一括変換で終わりにせず、画像の実寸上限や時点明記などの共通ルールで 1 記事ずつ丁寧に磨き上げる
「いつかは脱 WordPress したいな」と考えている方の背中を押す実践ガイドになれば嬉しいです!

▲ 引っ越し作業は少し大仕事でも、一度片付いてしまえばプラグイン更新に追われない快適な毎日が待っています