はじめに
前回の記事ではjQueryの使い方としてセレクター・DOM操作・イベントハンドリング・Ajax通信の基本を解説しました。今回はWordPressのテーマ開発で必要になるPHPの基礎を解説します。「プログラミングはJavaScriptしか触ったことがない」という方でも、WordPressのテーマをカスタマイズする場面でPHPを読んで書く必要があります。サーバーサイドの言語であるPHPの基本的な書き方を、Web制作者の視点で実践的に解説します。
1. PHPとは何か
1.1 PHPの特徴
PHPとは:
サーバーサイドで動くプログラミング言語。
1994年に登場しWordPressをはじめ
多くのWebサービスで使われている。
JavaScriptとの違い:
JavaScript:
→ ブラウザ(クライアント)で動く
→ ページが表示された後にDOMを操作する
→ ユーザーの操作に反応する
PHP:
→ サーバーで動く
→ HTMLを生成してからブラウザに送る
→ データベースと連携する
→ WordPressはPHPで書かれている
→ テーマファイル(.php)の中に
HTMLとPHPが混在している
1.2 PHPの書き方の基本
<?php
// PHP コードはこのタグで囲む
// 1行コメント
/* 複数行コメント */
// 文字列を出力する
echo 'こんにちは';
echo "こんにちは";
// HTMLと混在させる書き方
?>
<p>ここはHTML</p>
<?php
echo 'ここはPHP';
?>
<p>また HTML</p>
<?php
// PHPの終了タグは省略できる(ファイルの末尾)
<?php
// WordPressのテーマファイルでよく見る形
get_header(); // ヘッダーを読み込む関数
?>
<main class="main">
<?php if ( have_posts() ) : // 投稿がある場合 ?>
<?php while ( have_posts() ) : the_post(); // ループ ?>
<article>
<h2><?php the_title(); ?></h2>
<p><?php the_content(); ?></p>
</article>
<?php endwhile; ?>
<?php endif; ?>
</main>
<?php get_footer(); // フッターを読み込む関数
2. 変数
2.1 変数の基本
<?php
/*
PHPの変数は必ず $ で始まる
これはJavaScriptとの大きな違い
*/
// 文字列
$name = '山田太郎';
$message = "こんにちは、$name さん"; // ダブルクォートでは変数展開できる
// 数値
$age = 30;
$price = 1980.5;
// 真偽値
$is_logged_in = true;
$is_admin = false;
// null
$value = null;
// 出力する
echo $name; // 山田太郎
echo $message; // こんにちは、山田太郎 さん
echo $age; // 30
// 文字列の連結(.を使う)
$full_message = 'こんにちは、' . $name . ' さん';
echo $full_message;
2.2 配列
<?php
// 通常の配列(インデックス配列)
$colors = [ 'red', 'blue', 'green' ];
echo $colors[0]; // red
echo $colors[1]; // blue
// 連想配列(キーと値のペア)
$user = [
'name' => '山田太郎',
'email' => 'yamada@example.com',
'age' => 30,
];
echo $user['name']; // 山田太郎
echo $user['email']; // yamada@example.com
// 配列の要素を追加する
$colors[] = 'yellow'; // 末尾に追加
$colors[0] = 'pink'; // 指定したインデックスを変更
// 多次元配列
$posts = [
[
'title' => '記事1のタイトル',
'date' => '2024-01-01',
],
[
'title' => '記事2のタイトル',
'date' => '2024-01-15',
],
];
echo $posts[0]['title']; // 記事1のタイトル
echo $posts[1]['date']; // 2024-01-15
2.3 WordPressでの変数の使い方
<?php
// WordPressの関数から値を受け取って変数に格納する
$post_title = get_the_title(); // 投稿のタイトル
$post_url = get_permalink(); // 投稿のURL
$site_name = get_bloginfo( 'name' ); // サイト名
$theme_url = get_template_directory_uri(); // テーマフォルダのURL
// 変数をHTMLの属性値として使う
?>
<a href="<?php echo esc_url( $post_url ); ?>">
<?php echo esc_html( $post_title ); ?>
</a>
<?php
/*
esc_url() → URLをエスケープ(セキュリティ対策)
esc_html() → HTMLをエスケープ(セキュリティ対策)
ユーザーから来た値を出力するときは必ずエスケープする
*/
3. 条件分岐
3.1 if・elseif・else
<?php
$score = 85;
if ( $score >= 90 ) {
echo '優秀です';
} elseif ( $score >= 70 ) {
echo '合格です';
} elseif ( $score >= 50 ) {
echo 'もう少しです';
} else {
echo '不合格です';
}
// → 「合格です」と出力される
// 比較演算子
// == → 値が等しい(型は問わない)
// === → 値と型が等しい(推奨)
// != → 値が等しくない
// !== → 値と型が等しくない
// > → より大きい
// < → より小さい
// >= → 以上
// <= → 以下
// 論理演算子
// &&(and) → 両方が true のとき
// ||(or) → どちらかが true のとき
// ! → 否定(true を false に)
$is_logged_in = true;
$is_admin = false;
if ( $is_logged_in && !$is_admin ) {
echo '一般ユーザーとしてログイン中';
}
3.2 HTMLと混在させる書き方
<?php
// PHPをHTMLに埋め込む場合は
// コロン構文が読みやすい
$is_logged_in = true;
?>
<?php if ( $is_logged_in ) : ?>
<p>ようこそ!ログイン中です。</p>
<?php else : ?>
<p><a href="/login">ログインしてください</a></p>
<?php endif; ?>
<?php
// WordPressのテーマでよく見るパターン:
// カテゴリーがあれば表示する
if ( has_category() ) : ?>
<div class="categories">
<?php the_category( ', ' ); ?>
</div>
<?php endif; ?>
<?php
// アイキャッチ画像があれば表示する
if ( has_post_thumbnail() ) : ?>
<div class="thumbnail">
<?php the_post_thumbnail( 'large' ); ?>
</div>
<?php endif;
3.3 三項演算子
<?php
// 三項演算子:短い条件分岐に使う
// 条件 ? true のとき : false のとき
$is_admin = true;
$role = $is_admin ? '管理者' : '一般ユーザー';
echo $role; // 管理者
// Null合体演算子(PHP7以上)
// 値が存在すればその値を・なければデフォルト値を使う
$name = $user['name'] ?? '名無しさん';
echo $name;
// WordPressでの使用例
$custom_title = get_field( 'custom_title' ) ?? get_the_title();
echo esc_html( $custom_title );
4. ループ
4.1 for ループ
<?php
// for ループ:回数が決まっているとき
for ( $i = 0; $i < 5; $i++ ) {
echo $i . '回目<br>';
}
// → 0回目・1回目・2回目・3回目・4回目
// カウントダウン
for ( $i = 5; $i > 0; $i-- ) {
echo $i . '...<br>';
}
// → 5...4...3...2...1...
4.2 foreach ループ(最もよく使う)
<?php
// foreach:配列を1件ずつ処理するとき
// インデックス配列
$colors = [ 'red', 'blue', 'green' ];
foreach ( $colors as $color ) {
echo $color . '<br>';
}
// → red・blue・green
// インデックス番号も使う場合
foreach ( $colors as $index => $color ) {
echo $index . ': ' . $color . '<br>';
}
// → 0: red・1: blue・2: green
// 連想配列
$user = [
'name' => '山田太郎',
'email' => 'yamada@example.com',
'age' => 30,
];
foreach ( $user as $key => $value ) {
echo $key . ': ' . $value . '<br>';
}
// → name: 山田太郎・email: yamada@example.com・age: 30
4.3 HTMLと組み合わせる
<?php
$menu_items = [
[ 'label' => 'ホーム', 'url' => '/' ],
[ 'label' => 'サービス', 'url' => '/service/' ],
[ 'label' => 'お知らせ', 'url' => '/news/' ],
[ 'label' => 'お問い合わせ', 'url' => '/contact/' ],
];
?>
<nav class="nav">
<ul class="nav-list">
<?php foreach ( $menu_items as $item ) : ?>
<li class="nav-item">
<a href="<?php echo esc_url( $item['url'] ); ?>">
<?php echo esc_html( $item['label'] ); ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</nav>
4.4 WordPressのメインループ
<?php
// WordPressで最も重要なループ
// 投稿を1件ずつ処理する
if ( have_posts() ) :
while ( have_posts() ) :
the_post(); // 投稿データをセットする
?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<?php if ( has_post_thumbnail() ) : ?>
<div class="thumbnail">
<?php the_post_thumbnail( 'medium' ); ?>
</div>
<?php endif; ?>
<header class="entry-header">
<h2 class="entry-title">
<a href="<?php the_permalink(); ?>">
<?php the_title(); ?>
</a>
</h2>
<time datetime="<?php echo get_the_date( 'Y-m-d' ); ?>">
<?php echo get_the_date(); ?>
</time>
</header>
<div class="entry-summary">
<?php the_excerpt(); ?>
</div>
</article>
<?php endwhile;
// ページネーション
the_posts_pagination();
else :
echo '<p>投稿が見つかりません。</p>';
endif;
5. 関数
5.1 関数の基本
<?php
// 関数の定義
function greet( $name ) {
return 'こんにちは、' . $name . ' さん!';
}
// 関数の呼び出し
$message = greet( '山田太郎' );
echo $message; // こんにちは、山田太郎 さん!
// デフォルト引数
function greet_with_default( $name = 'ゲスト' ) {
return 'こんにちは、' . $name . ' さん!';
}
echo greet_with_default(); // こんにちは、ゲスト さん!
echo greet_with_default( '鈴木' ); // こんにちは、鈴木 さん!
// 複数の引数
function calculate_price( $base_price, $tax_rate = 0.1 ) {
$tax = $base_price * $tax_rate;
$total = $base_price + $tax;
return $total;
}
echo calculate_price( 1000 ); // 1100
echo calculate_price( 1000, 0.08 ); // 1080
5.2 WordPressのfunctions.phpで使う関数
<?php
// functions.php:テーマの機能を追加するファイル
// ① スクリプトとスタイルを登録する
function my_theme_enqueue() {
// スタイルシート
wp_enqueue_style(
'my-style',
get_stylesheet_uri(),
[],
'1.0.0'
);
// JavaScript
wp_enqueue_script(
'my-script',
get_template_directory_uri() . '/js/main.js',
[ 'jquery' ],
'1.0.0',
true // フッターに出力
);
}
add_action( 'wp_enqueue_scripts', 'my_theme_enqueue' );
// ② テーマの機能を追加する
function my_theme_setup() {
// アイキャッチ画像を有効化
add_theme_support( 'post-thumbnails' );
// カスタムメニューを登録
register_nav_menus( [
'primary' => 'メインメニュー',
'footer' => 'フッターメニュー',
] );
// タイトルタグを有効化
add_theme_support( 'title-tag' );
}
add_action( 'after_setup_theme', 'my_theme_setup' );
// ③ カスタム関数を作る
function get_reading_time( $post_id = null ) {
if ( ! $post_id ) {
$post_id = get_the_ID();
}
$content = get_post_field( 'post_content', $post_id );
$word_count = mb_strlen( strip_tags( $content ) );
$minutes = ceil( $word_count / 400 ); // 1分400文字として計算
return $minutes;
}
5.3 よく使うWordPressの組み込み関数
<?php
// 投稿情報を取得する
get_the_title() // タイトル(文字列で返す)
the_title() // タイトル(直接出力)
get_permalink() // URLを取得
the_permalink() // URLを出力
get_the_content() // 本文を取得
the_content() // 本文を出力
get_the_excerpt() // 抜粋を取得
the_excerpt() // 抜粋を出力
get_the_date( 'Y/m/d' )// 日付を取得
the_date() // 日付を出力
get_the_ID() // 投稿IDを取得
the_ID() // 投稿IDを出力
// アイキャッチ画像
get_the_post_thumbnail_url( get_the_ID(), 'large' )
the_post_thumbnail( 'medium' )
has_post_thumbnail()
// サイト情報
get_bloginfo( 'name' ) // サイト名
get_bloginfo( 'description' ) // キャッチフレーズ
get_site_url() // サイトURL
home_url( '/' ) // トップページURL
// テーマファイルのパス
get_template_directory_uri() // テーマのURL
get_stylesheet_directory_uri() // 子テーマのURL
// 条件分岐タグ
is_home() // ブログのトップページか
is_front_page() // フロントページか
is_single() // 投稿の個別ページか
is_page() // 固定ページか
is_category() // カテゴリーアーカイブか
is_tag() // タグアーカイブか
is_archive() // アーカイブページか
is_search() // 検索結果ページか
is_404() // 404ページか
is_user_logged_in()// ログイン中か
6. セキュリティ:出力のエスケープ
6.1 必ずエスケープして出力する
<?php
/*
WordPressでデータを出力するときは
必ずエスケープ関数を通す。
XSS(クロスサイトスクリプティング)攻撃を防ぐ。
*/
// ✅ 正しい書き方
echo esc_html( $title ); // HTMLの特殊文字をエスケープ
echo esc_url( $url ); // URLをエスケープ
echo esc_attr( $class_name ); // HTML属性値をエスケープ
echo wp_kses_post( $content ); // 許可されたHTMLタグのみ通す
// ❌ 危険な書き方(そのまま出力)
echo $title; // ユーザーが入力した値をそのまま出力するのは危険
// WordPressの関数はエスケープ済みのものが多い
// the_title() → エスケープ済み
// the_content() → エスケープ済み
// the_permalink() → エスケープ済み
// get_系の関数で取得した値を echo するときは
// 必ずエスケープする
echo esc_html( get_the_title() );
echo esc_url( get_permalink() );
7. テンプレートファイルの分割
7.1 get_template_part() で部品化する
<?php
/*
WordPressではテンプレートを
小さなパーツに分割して管理できる。
get_template_part( 'フォルダ/ファイル名' )
*/
// index.php
get_header();
?>
<main class="main">
<div class="container">
<?php
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
// template-parts/content.php を読み込む
get_template_part( 'template-parts/content' );
endwhile;
the_posts_pagination();
else :
// template-parts/content-none.php を読み込む
get_template_part( 'template-parts/content', 'none' );
endif;
?>
</div>
</main>
<?php get_footer();
<?php
// template-parts/content.php
// カードコンポーネントの例
?>
<article id="post-<?php the_ID(); ?>" <?php post_class( 'card' ); ?>>
<?php if ( has_post_thumbnail() ) : ?>
<a href="<?php the_permalink(); ?>" class="card-image">
<?php the_post_thumbnail( 'medium_large' ); ?>
</a>
<?php endif; ?>
<div class="card-body">
<div class="card-meta">
<time><?php echo get_the_date(); ?></time>
<?php the_category( ' ' ); ?>
</div>
<h2 class="card-title">
<a href="<?php the_permalink(); ?>">
<?php the_title(); ?>
</a>
</h2>
<p class="card-excerpt">
<?php the_excerpt(); ?>
</p>
</div>
</article>
8. 実践チェックリスト
✓ PHPの変数は $ で始まることを意識して書けているか
✓ 連想配列を [ 'key' => 'value' ] の形で定義できているか
✓ HTMLと混在させるときにコロン構文(if ... : ... endif;)を使っているか
✓ foreach でWordPressの投稿一覧やメニューをループ処理できているか
✓ WordPressのメインループ(have_posts / the_post)の流れを理解しているか
✓ functions.php で add_action を使ってフックを登録できているか
✓ データを出力するときに esc_html() / esc_url() でエスケープしているか
✓ get_template_part() でテンプレートを部品に分割して管理できているか
まとめ
今回はWordPressのテーマ開発で必要になるPHPの基礎を解説しました。ポイントをまとめると:
- PHPはサーバーサイドで動く言語でHTMLを生成してからブラウザに送る・JavaScriptとの役割の違いを理解する
- PHPの変数は必ず
$で始まる・文字列の連結は.を使う・JavaScriptとは異なる点に注意する - 連想配列は
[ 'key' => 'value' ]の形で定義する・WordPressのデータはほぼすべて配列で扱う - HTMLとPHPを混在させるときはコロン構文(
if : ... endif;)が読みやすくWordPressのテーマで標準的 foreachはWordPressのメニュー・カスタムフィールドのデータを処理するときに最もよく使う- WordPressのメインループは
have_posts()/while ( have_posts() ) : the_post();の流れで覚える functions.phpではadd_actionを使ってWordPressの処理に機能を追加する- データを出力するときは必ず
esc_html()/esc_url()でエスケープしてXSSを防ぐ get_template_part()でテンプレートをパーツに分割するとコードが整理しやすくなる
次の記事では、WordPressのカスタムフィールドとACF(Advanced Custom Fields)の使い方を解説します。お楽しみに!
コメント