<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>WordPress &#8211; OptiCode.Lab</title>
	<atom:link href="https://opticode-lab.com/tag/wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>https://opticode-lab.com</link>
	<description>だれもが使える、最適化されたサイトを構築するための技術研究所</description>
	<lastBuildDate>Mon, 30 Mar 2026 04:47:04 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>WordPress環境でCloudFrontを使用する場合に必要なカスタムポリシー設定</title>
		<link>https://opticode-lab.com/technology/1587/</link>
					<comments>https://opticode-lab.com/technology/1587/#respond</comments>
		
		<dc:creator><![CDATA[るた]]></dc:creator>
		<pubDate>Mon, 30 Mar 2026 04:45:09 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[CloudFront]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://opticode-lab.com/?p=1587</guid>

					<description><![CDATA[先日、AWS環境で高可用性構成を作成した際にCloudFrontを使用しました。その中で設定に手間取ったポイントがありましたので備忘録も兼ねて記しておきます。 作成したAWS環境で高可用性構成 というのが何か知りたい方は [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>先日、AWS環境で高可用性構成を作成した際にCloudFrontを使用しました。<br>その中で設定に手間取ったポイントがありましたので備忘録も兼ねて記しておきます。</p>



<p>作成したAWS環境で高可用性構成 というのが何か知りたい方は以下もご覧いただけますと幸いです。</p>


<a href="https://opticode-lab.com/works/1543/" class="opti-link-card">  <img decoding="async" src="https://opticode-lab.com/wp-content/uploads/2026/03/20260318_130945_01-600x335.webp" alt="" class="opti-link-card__thumb">  <div class="opti-link-card__body">    <div class="opti-link-card__title">Fargate + Single AZ RDSで構築する、高可用性&amp;コスト最適化WordPress AWS構成</div>    <div class="opti-link-card__meta">opticode.lab.com</div>  </div></a>



<p>なお、AWSプランや管理画面はよく変更されるため、2026年3月時点の設定であることをご理解ください。</p>



<h2 class="wp-block-heading">CloudFrontとは？サービス内容を解説</h2>



<p><strong>CloudFront</strong>は、AWS（Amazon Web Services）が提供する<strong>CDN（Content Delivery Network）</strong>サービスです。<br>簡単に言うと、「世界中に配置されたキャッシュサーバーを使って、Webサイトの画像や動画、HTMLなどのコンテンツをユーザーに素早く届ける仕組み」です。<br>競合サービスとしては<strong>Cloudflare</strong>、<strong>Akamai</strong>、<strong>Fastly</strong>などがありますが、AWSで環境を構築しているならCloudFront一択です。</p>



<h3 class="wp-block-heading">CloudFrontを導入するメリット</h3>



<p>導入すると以下のようなメリットがあります。</p>



<ul class="wp-block-list">
<li><strong>ページキャッシュ：</strong>ページや画像などをキャッシュしてユーザーへ渡すため、オリジンであるWebサーバー等へのアクセスを抑えてコストダウン&amp;負荷耐性が向上</li>



<li><strong>エッジロケーション：</strong>ユーザーと物理的に近いデータセンターにキャッシュを保持してユーザーへ渡すため、表示速度の向上につながる</li>



<li><strong>AWSコンポーネントとの親和性：</strong>AWS連携が容易でサービス間でのデータ転送量が安い</li>



<li><strong>無料枠：</strong>小規模なサイトであれば実質無料で使用できることも珍しくない</li>



<li><strong>セキュリティ向上：</strong>CloudFrontが間に入りユーザーがWebサーバーを直接見ないためセキュリティが向上・WAF設定も可能</li>
</ul>



<p>無料枠を超えるアクセス数の多いサイトは費用がかかりますが、高スペックなサーバーを動かし続けるより安く済む場合が多いでしょう。</p>



<h2 class="wp-block-heading">WordPressでCloudFrontを使用する場合の注意点</h2>



<p>メリットは大きいですが、注意点もあります。</p>



<ul class="wp-block-list">
<li>ログイン状態のページがキャッシュされる</li>



<li>カスタムポリシーを使用できるプランに制限がある</li>
</ul>



<h3 class="wp-block-heading">ログイン状態のページがキャッシュされる問題と解消方法</h3>



<p>CloudFrontはユーザーがページへアクセスした場合に、<br>キャッシュがあればキャッシュを返す<br>キャッシュが無ければオリジンからページを取得しキャッシュを生成<br>という動作を行います。</p>



<p>そこで問題になるのが、ログイン状態のユーザーです。<br>WordPressでログインをしている場合、ページ上部の admin bar のようにWordPressログイン状態にのみ表示される要素が存在するため、これをCloudFrontがキャッシュしてしまうと一般ユーザーにも admin bar が表示されるような事態となってしまいます。</p>



<p>つまり、<strong>WordPressにログインしたユーザーをキャッシュ対象外</strong>にする必要があります。</p>



<p>設定にはCloudFrontのカスタムポリシー作成が必須となりますので、以下の手順でカスタムポリシーを作成のうえCloudFrontのビヘイビアに登録します。</p>



<ul class="wp-block-list">
<li>AWSコンソールからCloudFrontの管理画面を開き、左メニューからポリシーの管理ページを表示</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="318" height="411" src="https://opticode-lab.com/wp-content/uploads/2026/03/20260330_133322_03.webp" alt="AWSコンソールCloudFrontの左メニューからポリシーページへアクセス" class="wp-image-1591"/><figcaption class="wp-element-caption">CloudFront：左メニュー</figcaption></figure>
</div>


<ul class="wp-block-list">
<li>ページ下部の「キャッシュポリシーを作成」</li>



<li>cookie「指定された cookie を含める」を選択し以下の3つを追加しポリシーを作成する<br><code>comment_author_*</code>、<code>wp-postpass_*</code>、<code>wordpress_logged_in_*</code></li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="303" src="https://opticode-lab.com/wp-content/uploads/2026/03/20260330_133322_02-1024x303.webp" alt="カスタムポリシーでcookieを許可する" class="wp-image-1590" srcset="https://opticode-lab.com/wp-content/uploads/2026/03/20260330_133322_02-1024x303.webp 1024w, https://opticode-lab.com/wp-content/uploads/2026/03/20260330_133322_02-600x177.webp 600w, https://opticode-lab.com/wp-content/uploads/2026/03/20260330_133322_02-768x227.webp 768w, https://opticode-lab.com/wp-content/uploads/2026/03/20260330_133322_02.webp 1082w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">ポリシー設定：cookieの追加</figcaption></figure>



<ul class="wp-block-list">
<li>CloudFrontのディストリビューション、ビヘイビア設定の「デフォルト(*)」を選択し編集</li>



<li>キャッシュポリシーで作成したカスタムポリシーを選択、オリジンリクエストポリシーをAllViewerに設定し保存</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="334" src="https://opticode-lab.com/wp-content/uploads/2026/03/20260330_133322_01-1024x334.webp" alt="ディストリビューションで作成したポリシーを使用する" class="wp-image-1593" srcset="https://opticode-lab.com/wp-content/uploads/2026/03/20260330_133322_01-1024x334.webp 1024w, https://opticode-lab.com/wp-content/uploads/2026/03/20260330_133322_01-600x196.webp 600w, https://opticode-lab.com/wp-content/uploads/2026/03/20260330_133322_01-768x251.webp 768w, https://opticode-lab.com/wp-content/uploads/2026/03/20260330_133322_01.webp 1137w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">ディストリビューション：キャッシュポリシーの設定</figcaption></figure>



<p>これはWordPressのログインセッションに使用するcookieを持っていればログインユーザーとして扱い、ページをキャッシュしない&amp;キャッシュを表示しない という設定です。</p>



<h3 class="wp-block-heading">カスタムポリシーを使用できるプランに制限がある</h3>



<p>なんと、CloudFrontのディストリビューションが定額料金プランの<strong>Freeプラン(0$)・Proプラン(月額15$)はカスタムポリシーが選択できず</strong>、<strong>ビジネスプラン(月額200$)以上</strong>を選べという案内が表示されます。<br>学習目的や収益の少ないサイトでこの負担は現実的ではありません。</p>



<p>しかし、<strong>従量課金プラン</strong>(Pay as you go) を使用すればビジネスプランでなくともカスタムポリシーを使用することが可能です。<br>従量課金プランでも<strong>一定の範囲内であれば無料</strong>で使用が可能ですので、学習用や小規模なサイトであれば従量課金プランで始めて、アクセス数が増え収益が出るならビジネスプランへの変更を検討するのがよさそうです。</p>



<p>無料枠については今後変更される可能性があるため、<a href="https://aws.amazon.com/jp/cloudfront/pricing/pay-as-you-go/" target="_blank" rel="noreferrer noopener nofollow">AWS公式の情報</a>をご確認のうえ検討してください。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>最初は定額プランのFreeプランで設定していたのでカスタムポリシーが設定できず手間取りました。<br>学習目的でお金をかけたくなかったため、従量課金プランでも無料枠があってくれてラッキーでした。</p>



<p>とはいえCloudFront自体はかなり安価なので、よほど記事がバズったりしなければ高額な請求などは無いかなとは思います。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://opticode-lab.com/technology/1587/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Fargate + Single AZ RDSで構築する、高可用性&#038;コスト最適化WordPress AWS構成</title>
		<link>https://opticode-lab.com/works/1543/</link>
					<comments>https://opticode-lab.com/works/1543/#respond</comments>
		
		<dc:creator><![CDATA[るた]]></dc:creator>
		<pubDate>Wed, 18 Mar 2026 04:09:57 +0000</pubDate>
				<category><![CDATA[Works]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[CloudFront]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[アーキテクチャ設計]]></category>
		<guid isPermaLink="false">https://opticode-lab.com/?p=1543</guid>

					<description><![CDATA[当サイトは AWS Lightsailにて運用されておりますが、学習目的でAWS ECS のコンテナ Fargate を使用した高可用性の構成を作成してみました。 1. 要件 可用性とコストのどちらを優先するかは都度判断 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>当サイトは <a href="https://aws.amazon.com/jp/lightsail/">AWS Lightsail</a>にて運用されておりますが、学習目的でAWS ECS のコンテナ Fargate を使用した高可用性の構成を作成してみました。</p>



<h2 class="wp-block-heading">1. 要件</h2>



<ul class="wp-block-list">
<li>AWS学習を目的としてAWS Lightsail環境の当サイトをAWS高可用性構成で再現する。</li>



<li>あくまでも学習のため、削れるコストは可能な限り削る。</li>



<li>Lightsail環境のデータベースやメディアを全て移行する。</li>
</ul>



<p>可用性とコストのどちらを優先するかは都度判断。</p>



<h2 class="wp-block-heading">2. 構成図の全体像と設計思想</h2>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="972" height="652" src="https://opticode-lab.com/wp-content/uploads/2026/03/aws-architecture-01.webp" alt="AWS高可用性構成図" class="wp-image-1544" srcset="https://opticode-lab.com/wp-content/uploads/2026/03/aws-architecture-01.webp 972w, https://opticode-lab.com/wp-content/uploads/2026/03/aws-architecture-01-600x402.webp 600w, https://opticode-lab.com/wp-content/uploads/2026/03/aws-architecture-01-768x515.webp 768w" sizes="auto, (max-width: 972px) 100vw, 972px" /><figcaption class="wp-element-caption">構成図：AWS高可用性構成</figcaption></figure>
</div>


<p>この構成図は、WordPressをAWS上に構築するための、疎結合（Decoupled）なモダン・アーキテクチャを示しています。</p>



<h3 class="wp-block-heading">この構成の肝となる3つのポイント</h3>



<ul class="wp-block-list">
<li><strong><strong>高可用性（High Availability）</strong>: </strong>CloudFront、ALB、FargateマルチAZ展開</li>



<li><strong><strong>コスト最適化（Cost-Optimized）</strong>:</strong>Fargate Spot、Single AZ RDS</li>



<li><strong>ステートレスなコンピュート層</strong>：Fargateコンテナを使い、テーマ、プラグイン、メディアファイルを外部サービスへ外部化</li>
</ul>



<h2 class="wp-block-heading">3. 各コンポーネントの詳細解説：データの流れに沿って</h2>



<p>データの流れ（フロントエンドからバックエンドへ）に沿って、各コンポーネントの役割と設計意図を解説します。</p>



<h3 class="wp-block-heading">3-1. フロントエンド（VPC外サービス）：配信の効率化と可用性</h3>



<p>ユーザーアクセスはまず、VPC（Virtual Private Cloud）の外にあるグローバルサービスで受けます。</p>



<ul class="wp-block-list">
<li><strong>AWS Route 53 (DNS)</strong>: DNSルーティングを行います。</li>



<li><strong>AWS CloudFront (CDN)</strong>: データの配信の肝です。</li>



<li><strong>静的コンテンツ origin</strong>: Amazon S3 から画像やCSS/JSをキャッシュして高速配信。</li>



<li><strong>動的コンテンツ origin</strong>: ALBを経由してWordPress（Fargate）に接続。</li>



<li><strong>Amazon S3</strong>: WordPressのメディアファイル（アップロード画像など）を保存するストレージ。静的ファイルの配信はここを起点に行います。</li>
</ul>



<p><strong>設計のポイント：</strong> <br>静的ファイルをCloudFront/S3へ外部化することで、Fargateコンテナの負荷を大幅に軽減し、かつユーザーの体感速度を向上させています。</p>



<h3 class="wp-block-heading">3-2. VPC内ネットワーク（Subnet設計）：疎結合と可用性の担保</h3>



<p>VPC内は、高可用性を実現するために2つのアベイラビリティゾーン（AZ-a、AZ-b）にまたがって設計しています。</p>



<ul class="wp-block-list">
<li><strong>Public Subnet</strong>: WordPressが動作するFargateコンテナを配置。</li>



<li><strong>Private Subnet</strong>: データベース（RDS）と、共有ストレージのマウントターゲット（EFS）を配置。外部からの直接アクセスを遮断し、セキュアに守ります。</li>
</ul>



<p><strong>コスト削減のポイント：</strong> <br>FargateコンテナはPrivate Subnet内に配置するとセキュリティを向上させることが可能ですが、NATゲートウェイ（月額2,000円ほど）が必要となります。<br>今回はコスト削減のためFargateコンテナはPublic Subnetに配置し、インバンドアクセスをALBに限定することでセキュリティを担保しています。</p>



<h3 class="wp-block-heading">3-3. ロードバランサー（ALB）：マルチAZ可用性の鍵</h3>



<ul class="wp-block-list">
<li><strong>ALB (Application Load Balancer)</strong>: Public Subnetにまたがって配置。CloudFrontからの動的リクエストを受け取り、背後のFargateタスクへ負荷分散します。</li>
</ul>



<p><strong>高可用性のポイント：</strong><br>ALBは、AZ-aとAZ-bの両方のサブネットを監視し、正常なタスクにのみリクエストを振るため、どちらかのAZで障害が発生してもサイトは落ちません。</p>



<h3 class="wp-block-heading">3-4. コンピュート層（Fargate）：ステートレス化とコスト最適化</h3>



<p>WordPressが動作するコンピュート層は、EC2ではなくマネージドなコンテナサービスである<strong>AWS Fargate</strong>を利用します。EC2のOSパッチ当てなどの運用負荷を軽減できます。</p>



<p>この構成の最大のポイントは、Fargateの<strong>AutoScalingによる高可用性</strong>の実現です。</p>



<ul class="wp-block-list">
<li><strong>On-Demand Base Task: </strong>常時1台起動する、サイトの「生命線」となるベースタスク。安定性を確保。</li>



<li><strong>Spot Task: </strong>負荷に応じて追加されるタスク。負荷低減により自動で停止。</li>
</ul>



<p><strong>コスト削減のポイント：</strong> <br>今回は学習目的のため、スケールアウトで追加される2台目以降のFargateはSpot Taskを採用しています。<br>Spot Taskはオンデマンドと比較して最大80-90%引きと安価に使用可能ですが、AWSのリソースが枯渇するとタスクが中断されるデメリットがあります。実際の案件ではオンデマンド：Spot は 50:50 の程度の比率が現実的です。</p>



<p><strong>学習のポイント：</strong><br>Fargateコンテナをステートレス化（ファイルはEFS、メディアはS3、DBはRDSへ外部化）しているため、Spot Task の突然の中断にも耐えられる設計になっています。</p>



<h3 class="wp-block-heading">3-5. データベース層（RDS）：コスト優先のSingle AZ構成</h3>



<ul class="wp-block-list">
<li><strong>Amazon RDS for MySQL [Single AZ]</strong>: データベースはプライベートサブネットに配置。Fargateからの接続のみを許可。</li>
</ul>



<p><strong>コストと可用性のトレードオフ：</strong><br> 高可用性を目指すならRDSもマルチAZ（Multi-AZ）にすべきですが、今回は<strong>「学習目的」であり「削れるコストは削る」</strong>という方針のため、あえてSingle AZ構成にしています。これにより、RDSのコストを大幅に削減しています。<br>コスト度外視で高可用性・耐久性・性能を求める場合はAWS Auroraも使用可能です。</p>



<h3 class="wp-block-heading">3-6. ストレージ層（EFS）：Fargateステートレス化の肝</h3>



<ul class="wp-block-list">
<li><strong>Amazon EFS (Elastic File System)</strong>: Fargateコンテナは起動・終了を繰り返すため、コンテナ内にテーマ、プラグイン、設定ファイルを保存できません。これらを複数のFargateコンテナ間で共有・保存するための共有ストレージです。</li>



<li><strong>EFS Mount Target</strong>: 各AZのプライベートサブネットにマウントターゲットを配置し、Fargateからマウントします。</li>
</ul>



<p><strong>疎結合設計のポイント：</strong> <br>Lightsailでは1つのVPS内にあったすべてのファイルを、Fargate、RDS、EFS、S3へと外部化した疎結合設計にすることで、スケーラビリティと可用性を実現しています。</p>



<h2 class="wp-block-heading">4. 既存Lightsail環境からの移行手順</h2>



<p>Lightsailの環境（WordPress Certified by Bitnami）からの移行は、以下のようなステップになります。</p>



<ol class="wp-block-list">
<li>各コンポーネントの作成</li>



<li>中心となるFargateとRDS,EFS,ALBを接続</li>



<li>LightsailのMySQLからデータをエクスポート（mysqldump）</li>



<li>RDSへデータをインポート（Fargate経由）</li>



<li>テーマファイルをFargate WordPressの管理画面からアップロード（マウント済みのEFSに自動アップロード）</li>



<li>プラグインをFargate WordPressの管理画面からインストール&amp;有効化</li>



<li>LightsailのWordPressからwp-content/uploadsディレクトリをS3へコピー</li>



<li>Fargate WordPressメディアアップロードから画像がS3にアップされるように接続</li>



<li>CloudFrontとALB,S3を接続し、動的ページをALB、静的ファイルをS3から取得するようビヘイビア設定</li>



<li>動作検証（WordPress動作やスケールアウトなど）</li>



<li>WordPressサイトURLやDB内URLを本番ドメインに切り替え</li>



<li>Route 53でDNSを切り替え</li>



<li>DNS浸透待ちで数日経過後にLightsail停止</li>
</ol>



<p>このプロセスを通じて、Lightsailという「オールインワン」のシンプルさから、AWSの基本サービスの「疎結合設計」への変化を深く理解できます。</p>



<h2 class="wp-block-heading">5. この構成を作るにあたって学んだこと</h2>



<p>以下のAWS技術と設計思想を理解し、実際に作成できることの証明ができます。</p>



<ul class="wp-block-list">
<li><strong>疎結合設計（Decoupled Architecture）</strong>: Web、DB、Storage、Global Servicesの分離。</li>



<li><strong>高可用性（High Availability）</strong>: CloudFront、ALB、マルチAZネットワーク設計の理解。</li>



<li><strong>コスト最適化（Cost-Optimized）</strong>: Fargate Spot、Single AZ RDSの使い分け。</li>



<li><strong>AWSの基本サービスの理解</strong>: Route 53, CloudFront, ACM, ALB, VPC (Subnet/SG), Fargate, RDS, EFS, S3</li>



<li><strong>コンテナ技術</strong>: Fargateの利用とコンテナのステートレス化。</li>



<li><strong>トレードオフの理解</strong>: 学習目的として可用性とコストのバランスを意識した設計（例：RDS Single AZ）。</li>
</ul>



<h3 class="wp-block-heading">5-1. 苦労したポイント</h3>



<ul class="wp-block-list">
<li><strong>CloudFrontがWordPressログインユーザーのアクセスをキャッシュしてしまう：</strong><br>CloudFrontのキャッシュポリシーを変更し、WordPressログインを判別するCookieを持ったアクセスはキャッシュさせない</li>



<li><strong>Fargateコンテナの操作：</strong><br>EFSマウントしたファイル以外は保持されず、デフォルトだと機能が最小限でzip解凍すらできなかった</li>



<li><strong>RDSが直接操作不可：</strong><br>RDSがPrivate Subnet内に存在するため直接接続ができずFargate経由で接続する必要があった</li>



<li><strong>エラー原因の特定：</strong><br>複数のコンポーネントに跨るため、どこにエラーがあったか特定が難しい</li>



<li><strong>料金が高い：</strong><br>可能な限りコストを削減するための構成かつ安価なプランを使用したが、それでも月8,000円ほどかかる見込み<br>RDS無料枠はAWSアカウントを作成して1年間のみなのが痛い</li>
</ul>



<h2 class="wp-block-heading">6. まとめと今後の展望</h2>



<p>この構成は、学習用としてはかなり実戦的なWordPress環境が作成できたのではと思います。Lightsailからのステップアップとして、Fargateや疎結合設計を学ぶのに最適でした。</p>



<p>ただし、小規模なブログを運用するには過剰なスペックかつ高価です。おとなしく国内レンタルサーバー + Cloudflare を使用した安価な環境が現実的でしょう。<br>僕はしばらく学習に使用する際にのみ起動し、Lightsailでの運用を継続しようと思います。</p>



<p>今後の展望としては、以下を想定しています。</p>



<ul class="wp-block-list">
<li>CloudFrontのより詳細なキャッシュ設定</li>



<li>IaC を使用したstg環境の作成</li>



<li>GitHub からの CI/CD</li>



<li>Lambda@Edgeを使用したS3画像ファイルのWebP,AVIF生成自動化</li>
</ul>



<p>ご相談・ご依頼お待ちしております。</p>



<p style="text-align: center;">
    <a href="/contact/" class="opti-btn">お問い合わせはこちら</a>
</p>
]]></content:encoded>
					
					<wfw:commentRss>https://opticode-lab.com/works/1543/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>プラグインを使用せずWordPressで構造化データを実装する方法</title>
		<link>https://opticode-lab.com/technology/1476/</link>
					<comments>https://opticode-lab.com/technology/1476/#respond</comments>
		
		<dc:creator><![CDATA[るた]]></dc:creator>
		<pubDate>Thu, 05 Mar 2026 09:21:59 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://opticode-lab.com/?p=1476</guid>

					<description><![CDATA[この記事では、WordPress環境でレビューブログに設定すべき構造化データとプラグインを使用せずに実装する方法について解説します。実際に当サイトを開発・運営した経験をもとに書いています。 この記事を読むと： リッチリザ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>この記事では、WordPress環境でレビューブログに設定すべき構造化データとプラグインを使用せずに実装する方法について解説します。<br>実際に当サイトを開発・運営した経験をもとに書いています。</p>



<p>この記事を読むと：</p>



<ul class="wp-block-list">
<li>Googleの検索結果で投稿が<strong>リッチリザルトで表示</strong>できる</li>



<li><strong>クリック率が上がる</strong></li>



<li>Googleに正確な情報が伝えられ<strong>SEO評価向上</strong>につながる</li>
</ul>



<h2 class="wp-block-heading">リッチリザルトとは？</h2>



<p>リッチリザルトとは、検索結果において、通常の「青いリンクと少しの説明文」だけでなく、<strong>画像、星の評価、よくある質問などが視覚的にリッチ（豪華）に表示される仕組み</strong>のことです。</p>



<p>百聞は一見に如かずということで、リッチリザルトのサンプル画像をご覧ください。<br>ニュース がカルーセルで表示されているかと思います。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="615" height="1024" src="https://opticode-lab.com/wp-content/uploads/2026/03/220759-1-615x1024.webp" alt="「アメリカ」と検索した場合に表示されたリッチリザルト" class="wp-image-1478" srcset="https://opticode-lab.com/wp-content/uploads/2026/03/220759-1-615x1024.webp 615w, https://opticode-lab.com/wp-content/uploads/2026/03/220759-1-361x600.webp 361w, https://opticode-lab.com/wp-content/uploads/2026/03/220759-1.webp 721w" sizes="auto, (max-width: 615px) 100vw, 615px" /><figcaption class="wp-element-caption">Google検索：リッチリザルト</figcaption></figure>
</div>


<p>このように、検索結果の画面で他よりも明らかに目立って表示されるのが最大の特徴です。<br>代表的なリッチリザルトの種類は以下のようなものがあります。（実際はもっとたくさんの種類があります。）</p>



<ul class="wp-block-list">
<li>レシピ（Recipe）</li>



<li>レビュー（Review）</li>



<li>よくある質問（FAQ）</li>



<li>記事（Article,BlogPosting）</li>



<li>カルーセル（ItemList）</li>
</ul>



<p>通常より目立つ表示なので、できるだけこのリッチリザルトで表示されるようサイト側で設定を行いたいです。<br>そのために必要なのが<strong>構造化データ</strong>です。</p>



<h2 class="wp-block-heading">構造化データとは？一言でいうと「Google専用の自己紹介カード」</h2>



<p>私たちのサイトを巡回するGoogleのクローラーは、単なるテキストの羅列としてしか認識していません。<br>たとえばページに著者名を入れていた場合に、それが投稿の著者（ライター）なのか記事の中身の登場人物か、Googleのクローラーには完全には判別できないのです。</p>



<p>そこで役立つのが<strong>構造化データ</strong>です。</p>



<p>構造化データがあればGoogleのクローラーに対して<br>「このテキストは記事のタイトル（Headline）ですよ」<br>「この画像はアイキャッチ画像（Image）ですよ」 <br>「この記事を書いたのは山田太郎（Author）ですよ」<br> と、意味を明確にタグ付けして伝えるための「自己紹介カード」のような役割を果たします。</p>



<p>これによって、Googleクローラーがサイトの情報を正確に取得しリッチリザルトとして表示してくれるようになります。</p>



<h3 class="wp-block-heading">構造化データはどのように設定する？</h3>



<p>現在、Googleが最も推奨している構造化データの書き方が<strong>「JSON-LD（ジェイソン・エルディー）」</strong>という形式です。これは、HTMLのタグを直接いじるのではなく、headタグの中にスクリプトとして記述するため、サイトの見た目に影響を与えずに安全に実装できるというメリットがあります。</p>



<p>サポートしている構造化データの種類や形式が詳しく知りたい場合は公式ドキュメント：<a href="https://developers.google.com/search/docs/appearance/structured-data/search-gallery?hl=ja" target="_blank" rel="noreferrer noopener nofollow">Google 検索がサポートする構造化データ マークアップ </a>をご覧ください。</p>



<h2 class="wp-block-heading">WordPressで構造化データを設定する方法</h2>



<p>WordPressを使用する場合、<strong>SEOプラグイン</strong>に出力させる方法と、head タグ内に JSON-LD を出力するコードを <strong>functions.php に追記</strong>する方法があります。<br>今回は後者の方法で解説します。</p>



<p>functions.php に以下を追記すれば投稿に<strong>記事（Article）</strong>の構造化データが追加されます。<br>Articleはニュースやブログ記事などに使える汎用的な指定です。</p>



<pre class="wp-block-code"><code>function insert_custom_json_ld() {
    // 記事ページ（is_single）のみ出力
    if ( is_single() ) {
        global $post;
        
        // 公開日時と更新日時の取得
        $pub_time_c  = get_the_time( 'c' ); // 出力用（ISO 8601形式）
        $mod_time_c  = get_the_modified_time( 'c' );
        
        // 比較用にUnixタイムスタンプも取得
        $pub_time_ts = get_the_time( 'U' );
        $mod_time_ts = get_the_modified_time( 'U' );

        // アイキャッチ画像（ない場合のデフォルト画像）
        $image_url = get_the_post_thumbnail_url( $post-&gt;ID, 'full' ) ?: home_url( '/wp-content/uploads/default-image.jpg' );

        $schema = array(
            '@context'         =&gt; 'https://schema.org',
            '@type'            =&gt; 'Article',
            'mainEntityOfPage' =&gt; array(
                '@type' =&gt; 'WebPage',
                '@id'   =&gt; get_permalink()
            ),
            // 投稿タイトル
            'headline'         =&gt; get_the_title(),
            // アイキャッチ画像
            'image'            =&gt; array( $image_url ),
            'datePublished'    =&gt; $pub_time_c,
            // 'dateModified' は下の条件分岐で追加します
            'author'           =&gt; array(
                '@type' =&gt; 'Person',
                // WPプロフィール設定の「ニックネーム」を明示的に指定
                'name'  =&gt; get_the_author_meta( 'nickname', $post-&gt;post_author ),
                // WPプロフィール設定の「サイト」を明示的に指定
                'url'   =&gt; get_the_author_meta( 'user_url', $post-&gt;post_author )
            ),
            'publisher'        =&gt; array(
                '@type' =&gt; 'Organization',
                // WP一般設定の「サイトのタイトル」を明示的に指定
                'name'  =&gt; get_bloginfo( 'name' ),
                'logo'  =&gt; array(
                    '@type' =&gt; 'ImageObject',
                    // サイトのロゴ画像を指定
                    'url'   =&gt; home_url( '/wp-content/uploads/logo.png' )
                )
            )
        );

        // 更新日時が公開日時以上のときのみ dateModified を配列に追加
        if ( $mod_time_ts &gt;= $pub_time_ts ) {
            $schema&#91;'dateModified'] = $mod_time_c;
        }

        // JSON-LDの出力
        echo '&lt;script type="application/ld+json"&gt;' . "\n";
        echo wp_json_encode( $schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT );
        echo "\n" . '&lt;/script&gt;' . "\n";
    }
}
// head内で出力
add_action( 'wp_head', 'insert_custom_json_ld' );</code></pre>



<p>各項目の指定内容はコメントの通りですので、変更したい場所は該当項目を修正してください。<br>注意点のみ以下に記載します。</p>



<h3 class="wp-block-heading">注意① 著者 author をユーザー名にしない</h3>



<p>author（著者）の情報は名前とURLを設定します。</p>



<p>上記コードでは名前をWordPressのプロフィール画面「ニックネーム」の内容を取得するようにしています。ここは<strong>必ずユーザー名以外を表示するようにしてください。</strong><br>ユーザー名はWordPressのログインに使用するため、公開すると不正アクセスの危険があります。</p>



<p>また、<strong>URLは必須ではないものの強く推奨される項目</strong>です。<br>現在のGoogleは、記事の評価において<strong>「E-E-A-T（経験、専門性、権威性、信頼性）」</strong>を非常に重視しています。<br>url を指定して著者プロフィールと紐づけることは、Googleに対して次のようなアピールになります。</p>



<ul class="wp-block-list">
<li><strong>このURLの先には、著者のこれまでの執筆実績や、SNSへのリンク、専門的な経歴が載っています</strong><br>個人ブログであれば aboutページなどを指定すればよいです。</li>



<li><strong>この記事は、どこの誰とも分からない匿名の人ではなく、身元がはっきりしたこのURLの人物が責任を持って書いています</strong></li>
</ul>



<p>結果として、記事単体だけでなく「サイト全体の信頼性」を底上げすることに繋がります。<br>個人ブログであれば about ページでもよいので、必ずサイトを指定しましょう。</p>



<h3 class="wp-block-heading">注意② 更新日時 dateModified は公開日時 datePublished より新しい日時にする</h3>



<p>WordPressの更新日時は、投稿画面を保存した時間となる仕様です。<br>そのため、予約投稿を行った際は 公開日時 &gt; 更新日時 となってしまい、これをそのまま使用すると公開日時より前に更新日時がある というチグハグな状態となっています。</p>



<p>これを防ぐために以下のように<strong>公開日時と更新日時を比較し、更新日時の方が新しい場合のみ dateModified を指定</strong>するようにしています。</p>



<pre class="wp-block-code"><code>        // 更新日時が公開日時以上のときのみ dateModified を配列に追加
        if ( $mod_time_ts &gt;= $pub_time_ts ) {
            $schema&#91;'dateModified'] = $mod_time_c;
        }</code></pre>



<p>ポイントとしては、Unixタイムスタンプで比較することです。<br><strong>ISO 8601形式の比較は文字列同士の比較</strong>となってしまうため、<strong>予期せぬバグ</strong>が発生することがあります。<br>そのため<strong>Unixタイムスタンプ（整数）同士の比較</strong>をするほうがプログラム的には安全で確実です。</p>



<h2 class="wp-block-heading">記事以外に構造化データを追加する方法</h2>



<p>追記したfunctionの頭にある<code>if ( is_single() )</code>を分岐させてテンプレートごとに適した構造化データを指定しましょう。<br>また、投稿の内容によって、レシピ・レビュー・FAQ など、別の構造化データを指定したい場合は、<strong>投稿のカテゴリやタグを利用して分岐</strong>させるのがおすすめです。</p>



<p><a href="https://developers.google.com/search/docs/appearance/structured-data/search-gallery?hl=ja" target="_blank" rel="noreferrer noopener nofollow">Google 検索がサポートする構造化データ マークアップ</a> の中から選びましょう。</p>



<p>ただし、構造化データのタイプによって必須な項目も異なるため、継続的に運用できるかを考慮して判断しましょう。<br>（たとえば、商品 Product の価格 offers は常に変動するものなので指定が難しい など）</p>



<h2 class="wp-block-heading">構造化データの検証方法</h2>



<p>構造化データが適切に設定されているかは以下のツールで検証が可能ですが、スキーマ マークアップ検証ツールは<strong>Google固有の警告は表示してくれない</strong>ようです。<br>Google公式が提供しているのが<strong>リッチリザルト テスト</strong>なので、こちらのほうがおすすめです。</p>



<ul class="wp-block-list">
<li><a href="https://search.google.com/test/rich-results" target="_blank" rel="noreferrer noopener nofollow">リッチリザルト テスト</a></li>



<li><a href="https://validator.schema.org/" target="_blank" rel="noreferrer noopener nofollow">スキーマ マークアップ検証ツール</a></li>
</ul>



<p>ただし、<strong>構造化データが正しい形式で指定されていたとしても、リッチリザルトで表示されるとは限りません</strong>。<br>とは言えGoogleには正しく伝わっているはずなので、<strong>気長に待ちましょう</strong>。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>今回はプラグインを使用しないWordPressでの構造化データの指定方法を解説しました。</p>



<p>設定してもGoogleは中々リッチリザルトで表示してくれませんが、表示されたときは「やってよかったな」という満足感があります。</p>



<p>デメリットも無いので、とりあえずで設定しておくべきの必須級の機能ですね。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://opticode-lab.com/technology/1476/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>新規サイト構築 Lightsail + WordPress を使用したAWS環境でのブログ構築</title>
		<link>https://opticode-lab.com/works/1445/</link>
					<comments>https://opticode-lab.com/works/1445/#respond</comments>
		
		<dc:creator><![CDATA[るた]]></dc:creator>
		<pubDate>Tue, 03 Mar 2026 08:21:46 +0000</pubDate>
				<category><![CDATA[Works]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Lightsail]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://opticode-lab.com/?p=1445</guid>

					<description><![CDATA[当サイトの構築および運用を担当しています。主に学習目的のためサイト自体はシンプルな構成です。 要件 実績作り兼AWS学習を目的としたブログメディア構築 後ほど EC2+RDS+S3+CloudFront 環境へ移行するこ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>当サイトの構築および運用を担当しています。<br>主に学習目的のためサイト自体はシンプルな構成です。</p>



<h2 class="wp-block-heading">要件</h2>



<p>実績作り兼AWS学習を目的としたブログメディア構築</p>



<p>後ほど EC2+RDS+S3+CloudFront 環境へ移行することを前提として <a href="https://aws.amazon.com/jp/lightsail/" target="_blank" rel="noreferrer noopener nofollow">AWS Lightsail</a> にてサイトを作成し、ドメインやルーティングは <a href="https://aws.amazon.com/jp/route53/" target="_blank" rel="noreferrer noopener nofollow">Route53</a> を使用する。</p>



<p>計測・広告のタグなど、ハードコーディングは避け管理画面で設定可能とする。</p>



<h2 class="wp-block-heading">実施内容</h2>



<ul class="wp-block-list">
<li><strong>サイトデザイン作成</strong><br>Geminiにてベースデザインを作成し微調整</li>



<li><strong>インフラ構築</strong><br>AWS Lightsail + WordPress + Route53、CloudWatchによる監視</li>



<li><strong>WordPress設計・構築</strong><br>既存テーマは使用せず新規テーマ作成</li>



<li><strong>広告</strong><br>GoogleAdsenceによるディスプレイ広告およびAmazon、楽天などのアフィリエイト広告を導入</li>



<li><strong>SEO施策</strong><br>プラグインを使用しないsitemapやcanonical指定等、標準的なSEO設定のみ</li>



<li><strong>セキュリティ</strong><br>セキュリティプラグインの導入</li>



<li><strong>運用</strong><br>コードはGit管理、広告はGoogleTagManager or 管理画面</li>
</ul>



<h2 class="wp-block-heading">使用技術</h2>



<ul class="wp-block-list">
<li>HTML/CSS</li>



<li>JavaScript</li>



<li>PHP</li>



<li>WordPress</li>



<li>AWS Lightsail</li>



<li>Route53</li>



<li>CloudWatch</li>
</ul>



<h2 class="wp-block-heading">まとめ</h2>



<p>まずは最低限の実装から始めています。<br>SEOプラグインを導入せず一つずつ自前で設定しており、想定より工数がかかってしまったため、次回からはおとなしく既存のプラグインを使用したほうがよさそうです。</p>



<p>また今回は学習のためAWS Lightsailを使用しましたが、小規模なメディアであればConoHa wingなどの<strong>国内レンタルサーバーを使用するほうが安価で簡単</strong>です。</p>



<p>ディレクションばかりやってましたが、実はコードを触るほうが好きです。</p>



<h2 class="wp-block-heading">こんな相談に対応できます</h2>



<p>当サイトと同程度の規模でしたら10営業日ほどで作成可能です。</p>



<p>ご相談・ご依頼お待ちしております。</p>



<p style="text-align: center;">
    <a href="/contact" class="opti-btn">お問い合わせはこちら</a>
</p>
]]></content:encoded>
					
					<wfw:commentRss>https://opticode-lab.com/works/1445/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Dockerを使用したWordPressローカル環境の構築方法</title>
		<link>https://opticode-lab.com/technology/1293/</link>
					<comments>https://opticode-lab.com/technology/1293/#respond</comments>
		
		<dc:creator><![CDATA[るた]]></dc:creator>
		<pubDate>Wed, 11 Feb 2026 08:45:00 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://18.180.129.10/?p=1293</guid>

					<description><![CDATA[この記事では、Dockerを使用してローカル環境にWordPressを構築する方法について解説します。実際に当サイトを開発・運営した経験をもとに書いています。 この記事を読むと： なぜDockerなのか？ Dockerを [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>この記事では、Dockerを使用してローカル環境にWordPressを構築する方法について解説します。<br>実際に当サイトを開発・運営した経験をもとに書いています。</p>



<p>この記事を読むと：</p>



<ul class="wp-block-list">
<li>自由に触れるWordPress環境を構築できる</li>



<li>Dockerによる環境構築方法を理解できる</li>
</ul>



<h2 class="wp-block-heading">なぜDockerなのか？</h2>



<p>Dockerを使用してローカル開発環境を作るメリットは「<strong>動作環境をコード化して、どのPCでも同じ状態を再現できる</strong>」という点にあります。<br><br>実務上は以下のようなメリットになります。</p>



<ul class="wp-block-list">
<li>本番環境に合わせた構成が簡単に作成できる</li>



<li>環境差分（PC環境ごとに動作が違う）を無くす</li>



<li>複数の構成が異なる環境を同時に起動できる</li>
</ul>



<p>逆にデメリットはローカルで動かすためPCに負荷がかかる点です。<br>PCのスペックが低い、Docker側で重い作業を行う等でPCの動作が遅くなります。</p>



<h2 class="wp-block-heading">前提条件・環境</h2>



<p>今回の検証環境は以下です。</p>



<ul class="wp-block-list">
<li>Docker Desktop</li>



<li>テキストエディタ（VSCodeなど）</li>



<li>Webブラウザ（Chromeなど）</li>



<li>コマンドプロンプト（macならターミナル）</li>
</ul>



<p>Docker Desktopの導入方法は以下にて解説しておりますので、未導入の場合は是非参考にしてください。</p>


<a href="https://opticode-lab.com/technology/1279/" class="opti-link-card">  <img decoding="async" src="https://opticode-lab.com/wp-content/uploads/2026/02/dockerwp-300x300.png" alt="" class="opti-link-card__thumb">  <div class="opti-link-card__body">    <div class="opti-link-card__title">ローカル開発環境構築のためのDocker Desktop導入手順</div>    <div class="opti-link-card__meta">opticode.lab.com</div>  </div></a>



<h2 class="wp-block-heading">ステップ1 Docker Desktopの起動</h2>



<p>なにはともあれDocker Desktopを起動しましょう。起動すれば以下のような画面が表示されるはずです。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="570" src="https://opticode-lab.com/wp-content/uploads/2026/02/133610-1024x570.jpg" alt="" class="wp-image-1283" srcset="https://opticode-lab.com/wp-content/uploads/2026/02/133610-1024x570.jpg 1024w, https://opticode-lab.com/wp-content/uploads/2026/02/133610-300x167.jpg 300w, https://opticode-lab.com/wp-content/uploads/2026/02/133610-768x427.jpg 768w, https://opticode-lab.com/wp-content/uploads/2026/02/133610.jpg 1247w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Docker Desktop：起動画面</figcaption></figure>



<p>また、Windowsなら以下のようにタスクバーにも表示されているはずです。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="279" height="134" src="https://opticode-lab.com/wp-content/uploads/2026/02/image-1.png" alt="" class="wp-image-1295"/><figcaption class="wp-element-caption">Docker Desktop：タスクバーの表示</figcaption></figure>
</div>


<h2 class="wp-block-heading">ステップ2 Docker設定ファイルの作成</h2>



<p>Dockerで環境を構築するためには <code>docker-compose.yml</code> という設定ファイルが必要になります。<br>このファイルにはコンテナ内に構築する環境の構成を記述し、それをもとにDockerが自動で環境を構築する仕組みになっています。</p>



<p><code>docker-compose.yml</code> に記述する構成は本番環境と同様のものを指定しましょう。<br>本記事では複雑になりすぎないよう &#8220;ローカルにWordPress環境を作るための最小構成&#8221; で説明します。</p>



<h3 class="wp-block-heading">作業用ディレクトの作成</h3>



<p>まずは <code>docker-compose.yml</code> を置くフォルダを作成します。<br>場所やフォルダ名は何でもいいですが、WordPressのDBやテーマファイルもここに入るため作業しやすい場所がいいと思います。</p>



<p>今回は Cドライブ直下に <code>test-site</code> フォルダを作成することとしました。</p>



<h3 class="wp-block-heading">docker-compose.yml ファイルの作成</h3>



<p>テキストエディタを開き、以下の内容を記述したうえで <code>docker-compose.yml</code> というファイル名で保存し、作成した作業用ディレクトリに置きます。</p>



<pre class="wp-block-code"><code>services:
  db:
    image: mysql:8.4
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppass
      MYSQL_ROOT_PASSWORD: rootpass
    volumes:
      - db_data:/var/lib/mysql

  wordpress:
    image: wordpress:6.9.1-php8.2-apache
    restart: unless-stopped
    depends_on:
      - db
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppass
    volumes:
      - ./wp-content:/var/www/html/wp-content

volumes:
  db_data:</code></pre>



<p>ひとつずつ解説します。</p>



<h4 class="wp-block-heading">全体像</h4>



<ul class="wp-block-list">
<li><code>services:</code> の下に「起動するコンテナ（サービス）」を並べる<br>今回は <code>db:</code> と <code>wordpress: </code>を起動しています。</li>



<li><code>volumes:</code> でデータを永続化するための領域を定義<br>これがなければコンテナを停止した時にデータが消えちゃうので必須の記述です。</li>
</ul>



<h4 class="wp-block-heading">DB</h4>



<pre class="wp-block-code"><code>db:
    image: mysql:8.4
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppass
      MYSQL_ROOT_PASSWORD: rootpass
    volumes:
      - db_data:/var/lib/mysql</code></pre>



<ul class="wp-block-list">
<li>db という名前のサービスの設定内容を記述</li>



<li><code>image: mysql:8.4</code> MySQL 8.4 の公式イメージを指定する</li>



<li><code>restart: unless-stopped</code> コンテナが落ちた時に自動で再起動する（手動で停止させた場合を除く）</li>



<li><code>environment:</code>データベース名、ユーザー名とそのパスワード、rootユーザーのパスワードをそれぞれ指定する</li>



<li><code>volumes:</code>MySQLのデータ保存場所を指定する</li>
</ul>



<h4 class="wp-block-heading">WordPress</h4>



<pre class="wp-block-code"><code>  wordpress:
    image: wordpress:6.9.1-php8.2-apache
    restart: unless-stopped
    depends_on:
      - db
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppass
    volumes:
      - ./wp-content:/var/www/html/wp-content</code></pre>



<ul class="wp-block-list">
<li>wordpressという名前のサービスの設定内容を記述</li>



<li><code>image: wordpress:6.9.1-php8.2-apache</code> WordPress 6.9.1 をPHP 8.2、WebサーバーはApacheを指定</li>



<li><code>restart: unless-stopped</code> DBと同様に落ちたら自動復帰</li>



<li><code>depends_on: - db</code> 先に記述したdbが起動した後にWordPressを起動するという指定</li>



<li><code>ports:- "8080:80"</code> ブラウザを使用し http://localhost:8080 でページを閲覧するためのポート設定</li>



<li><code>environment:</code>先に記述したDBをWordPressに使用させるための接続情報を指定</li>



<li><code>volumes:</code> コンテナ内の <code>wp-content</code> を、PC上の <code>./wp-content</code> フォルダにマウントさせる設定</li>
</ul>



<p>長くなりましたが、ひとまずこれで最低限WordPressを動かすための準備ができました。</p>



<h2 class="wp-block-heading">ステップ3 コンテナの起動</h2>



<p>コマンドプロンプト（またはターミナル）を使用してコンテナを起動します。<br>まずはコマンドプロンプトを起動し、<code>docker-compose.yml</code> を格納した作業用フォルダに移動します。</p>



<p>そこで以下のコマンドを実行してください。</p>



<pre class="wp-block-code"><code>docker compose up -d</code></pre>



<p>これは <code>docker-compose.yml</code> の内容をもとにコンテナを作成するものです。<br>実行するとコンテナの初回起動が行われます。以下のような表示が出るはずです。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="159" src="https://opticode-lab.com/wp-content/uploads/2026/02/193844-1024x159.jpg" alt="" class="wp-image-1296" srcset="https://opticode-lab.com/wp-content/uploads/2026/02/193844-1024x159.jpg 1024w, https://opticode-lab.com/wp-content/uploads/2026/02/193844-300x46.jpg 300w, https://opticode-lab.com/wp-content/uploads/2026/02/193844-768x119.jpg 768w, https://opticode-lab.com/wp-content/uploads/2026/02/193844.jpg 1091w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">コマンドプロンプト: コンテナ初回起動</figcaption></figure>



<p>また、Docker Desktopを見ると以下のように起動中のコンテナが確認できるようになっています。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="575" src="https://opticode-lab.com/wp-content/uploads/2026/02/195357-1024x575.jpg" alt="" class="wp-image-1297" srcset="https://opticode-lab.com/wp-content/uploads/2026/02/195357-1024x575.jpg 1024w, https://opticode-lab.com/wp-content/uploads/2026/02/195357-300x168.jpg 300w, https://opticode-lab.com/wp-content/uploads/2026/02/195357-768x431.jpg 768w, https://opticode-lab.com/wp-content/uploads/2026/02/195357.jpg 1253w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Docker Desktop：コンテナ起動確認</figcaption></figure>



<h2 class="wp-block-heading">ステップ4 WordPressにアクセス</h2>



<p>起動したWordPressにアクセスしましょう。<br>http://localhost:8080 でアクセスできるよう設定していたので、Webブラウザを使用してこのURLにアクセスしてみてください。<br>まっさらなWordPressが入っているので、以下のような言語設定の画面から始まると思います。日本語を選択して次へ進んでください。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="640" height="757" src="https://opticode-lab.com/wp-content/uploads/2026/02/200020.jpg" alt="" class="wp-image-1298" srcset="https://opticode-lab.com/wp-content/uploads/2026/02/200020.jpg 640w, https://opticode-lab.com/wp-content/uploads/2026/02/200020-254x300.jpg 254w" sizes="auto, (max-width: 640px) 100vw, 640px" /><figcaption class="wp-element-caption">WordPress: 言語設定画面</figcaption></figure>



<p>サイトの基本情報を入力して、WordPressをインストールしてください。<br>ここで入力した内容は後ほどWordPressの管理画面から設定変更が可能なので、まだ決まって無ければとりあえずのものを入れておきましょう。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="773" height="893" src="https://opticode-lab.com/wp-content/uploads/2026/02/200144.jpg" alt="" class="wp-image-1299" srcset="https://opticode-lab.com/wp-content/uploads/2026/02/200144.jpg 773w, https://opticode-lab.com/wp-content/uploads/2026/02/200144-260x300.jpg 260w, https://opticode-lab.com/wp-content/uploads/2026/02/200144-768x887.jpg 768w" sizes="auto, (max-width: 773px) 100vw, 773px" /><figcaption class="wp-element-caption">WordPress: 基本情報入力画面</figcaption></figure>



<p>インストールが完了したらログイン画面に遷移するため、先ほど設定したユーザー名・パスワードでログインしてください。<br>無事ログインできればWordPressのダッシュボードが表示されるはずです。</p>



<h2 class="wp-block-heading">ステップ5 コンテナの停止と保存確認</h2>



<p>コンテナを停止した際に情報が消えてしまわないか確認します。<br>コマンドプロンプトにて、作業用ディレクトリへ移動し以下のコマンドを実行します。</p>



<pre class="wp-block-code"><code>docker compose down</code></pre>



<p>これで再度 http://localhost:8080 にアクセスしてみてください。停止できていればアクセスできなくなっているはずです。<br>そのまま以下のコマンドを実行し、コンテナを起動してみましょう。</p>



<pre class="wp-block-code"><code>docker compose up -d</code></pre>



<p>初回起動ほど待たずに起動されたかと思います。http://localhost:8080 にアクセスしましょう。<br>コンテナ停止で情報が消えてなければ、初回起動時のような言語設定・基本情報設定は表示されません。<br>http://localhost:8080/wp-login.php にアクセスしてログインしてみましょう。ユーザー情報も残っているためログインできます。</p>



<h2 class="wp-block-heading">ステップ6 テーマ読み込み確認</h2>



<p>ステップ2 にて <code>wp-content</code> フォルダのマウント設定を行っているため、作業フォルダ内の <code>wp-content</code> 内にあるファイルを変更すればローカル環境にもその内容が反映されます。</p>



<p>WordPress 6.9.1 ではデフォルトで <code>twentytwentyfive</code> のテーマが読み込まれているので、このテーマを編集して反映されるか確認してみましょう。</p>



<p>触るファイルは何でもいいですが、今回はわかりやすいように <code>wp-content/themes/twentytwentyfive/patterns</code> の <code>header.php</code> を使用してみます。</p>



<p>テキストエディタで <code>header.php</code> を開き、末尾に好きな文字列を入れて保存してみてください。<br>以下のようにサイトのヘッダーに記述した文字列が出ていれば成功です。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="588" src="https://opticode-lab.com/wp-content/uploads/2026/02/204500-1024x588.jpg" alt="" class="wp-image-1300" srcset="https://opticode-lab.com/wp-content/uploads/2026/02/204500-1024x588.jpg 1024w, https://opticode-lab.com/wp-content/uploads/2026/02/204500-300x172.jpg 300w, https://opticode-lab.com/wp-content/uploads/2026/02/204500-768x441.jpg 768w, https://opticode-lab.com/wp-content/uploads/2026/02/204500.jpg 1031w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">TOP: テーマ修正の反映確認</figcaption></figure>



<p>これでDockerを使用したWordPressローカル環境を作成することができました。</p>



<p>既に本番サイトが存在する場合はローカル環境にテーマファイルをアップロードしたり、投稿のインポート・エクスポート機能を用いて本番同様の環境にしてしまいましょう。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>今回はDockerを使用したWordPress開発環境の作り方を解説していきました。</p>



<p>コンテナは複数作ってもOKなのでサイトごとにどんどんコンテナを作っていきましょう。<br>また、チームで開発を行っている場合は同じ <code>docker-compose.yml</code> を共有することで環境差分を減らせます。<br><br>本来は本番環境の構成に合わせて設定を行うため、細かな設定は以下のリファレンスで確認してみましょう。</p>



<ul class="wp-block-list">
<li><a href="https://docs.docker.com/reference/compose-file/" target="_blank" rel="noreferrer noopener nofollow">Compose file reference</a>（公式）</li>



<li><a href="https://docs.docker.jp/reference/compose-file/toc.html" data-type="link" data-id="https://docs.docker.jp/reference/compose-file/toc.html" target="_blank" rel="noreferrer noopener nofollow">Compose ファイル リファレンス</a>（非公式）</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://opticode-lab.com/technology/1293/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
