Web制作者のためのPHP基礎入門|WordPressテーマ開発で使う変数・条件分岐・ループ・関数


はじめに

前回の記事では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)の使い方を解説します。お楽しみに!

コメント

タイトルとURLをコピーしました