# WordPressのbody_class()解説

# WordPressのbody_class() 完全解説

## 目次

1. [body_class()とは](#bodyclass-とは)

2. [基本的な使い方](#基本的な使い方)

3. [出力される主なクラス](#出力される主なクラス)

4. [カスタムクラスの追加](#カスタムクラスの追加)

5. [実践的な使用例](#実践的な使用例)

6. [注意事項](#注意事項)

7. [トラブルシューティング](#トラブルシューティング)

## body_class() とは

`body_class()`は、WordPressが提供する重要なテンプレート関数の一つです。この関数は、HTMLの`<body>`タグに**自動的にCSSクラスを追加**してくれます。

### なぜ重要なのか?

– ページの種類に応じて**自動的に適切なクラス**が付与される

– CSSで**ページごとに異なるスタイル**を適用できる

– JavaScriptで**特定のページでのみ動作**するコードを書ける

– WordPressの**標準的な実装方法**

## 基本的な使い方

### ステップ1: テーマファイルで基本実装

`header.php`または`index.php`の`<body>`タグに追加します:

“`php

<!DOCTYPE html>

<html <?php language_attributes(); ?>>

<head>

    <meta charset=”<?php bloginfo(‘charset’); ?>”>

    <meta name=”viewport” content=”width=device-width, initial-scale=1″>

    <?php wp_head(); ?>

</head>

<body <?php body_class(); ?>>

    <!– サイトの内容 –>

“`

### ステップ2: 実際の出力を確認

ブラウザで表示されるHTMLの例:

“`html

<!– トップページの場合 –>

<body class=”home blog logged-in admin-bar no-customize-support”>

<!– 投稿ページの場合 –>

<body class=”single single-post postid-123 single-format-standard logged-in admin-bar”>

<!– 固定ページの場合 –>

<body class=”page page-id-456 page-template-default logged-in admin-bar”>

“`

## 出力される主なクラス

### ページタイプ別クラス

| ページタイプ | 追加されるクラス | 説明 |

|————|—————–|——|

| トップページ | `home` | フロントページ |

| ブログ投稿一覧 | `blog` | 投稿の一覧ページ |

| 個別投稿 | `single`, `single-post` | 投稿の詳細ページ |

| 固定ページ | `page`, `page-id-{ID}` | 固定ページ |

| カテゴリーページ | `category`, `category-{スラッグ}` | カテゴリー別一覧 |

| 検索結果 | `search`, `search-results` | 検索結果ページ |

| 404エラー | `error404` | 404エラーページ |

### ユーザー状態別クラス

“`php

// ログイン状態

logged-in          // ログイン済み

logged-out         // 未ログイン

// 管理者権限

admin-bar          // 管理バーが表示されている

no-admin-bar       // 管理バーが非表示

// テーマサポート

customize-support  // カスタマイザーがサポートされている

no-customize-support // カスタマイザーが無効

“`

## カスタムクラスの追加

### 方法1: 直接指定

“`php

<body <?php body_class(‘my-custom-class another-class’); ?>>

“`

出力例:

“`html

<body class=”home blog my-custom-class another-class logged-in admin-bar”>

“`

### 方法2: 配列で指定

“`php

<?php

$custom_classes = array(‘custom-layout’, ‘special-page’);

?>

<body <?php body_class($custom_classes); ?>>

“`

### 方法3: フィルターフックを使用(推奨)

`functions.php`に追加:

“`php

/**

 * body_classにカスタムクラスを追加

 */

function add_custom_body_classes($classes) {

    // 全ページに追加

    $classes[] = ‘my-theme-class’;

    // 条件分岐での追加

    if (is_front_page()) {

        $classes[] = ‘front-page-custom’;

    }

    if (is_single()) {

        global $post;

        $classes[] = ‘post-‘ . $post->post_name; // スラッグを追加

    }

    // モバイル判定(例)

    if (wp_is_mobile()) {

        $classes[] = ‘mobile-device’;

    } else {

        $classes[] = ‘desktop-device’;

    }

    return $classes;

}

add_filter(‘body_class’, ‘add_custom_body_classes’);

“`

## 実践的な使用例

### CSS での活用例

“`css

/* トップページのみのスタイル */

.home .hero-section {

    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);

    height: 100vh;

}

/* 投稿ページのみのスタイル */

.single-post .content {

    max-width: 800px;

    margin: 0 auto;

}

/* ログイン状態での表示調整 */

.logged-in .site-header {

    margin-top: 32px; /* 管理バーの高さ分 */

}

/* カテゴリー別のスタイル */

.category-technology .post-title {

    color: #2196F3;

}

.category-design .post-title {

    color: #E91E63;

}

/* モバイル専用スタイル */

.mobile-device .navigation {

    display: none;

}

.mobile-device .mobile-menu {

    display: block;

}

“`

### JavaScript での活用例

“`javascript

// ページタイプに応じた処理

document.addEventListener(‘DOMContentLoaded’, function() {

    const body = document.body;

    // トップページでのみスライダーを初期化

    if (body.classList.contains(‘home’)) {

        initializeSlider();

    }

    // 投稿ページでのみ目次を生成

    if (body.classList.contains(‘single-post’)) {

        generateTableOfContents();

    }

    // ログイン状態の場合の処理

    if (body.classList.contains(‘logged-in’)) {

        adjustLayoutForAdminBar();

    }

});

function initializeSlider() {

    // スライダーの初期化コード

    console.log(‘スライダーを初期化しました’);

}

function generateTableOfContents() {

    // 目次生成コード

    console.log(‘目次を生成しました’);

}

function adjustLayoutForAdminBar() {

    // 管理バー用のレイアウト調整

    console.log(‘管理バー用にレイアウトを調整しました’);

}

“`

## 注意事項

### ⚠️ 重要な注意点

1. **必ず`<body>`タグ内で使用**

   “`php

   <!– ❌ 間違い –>

   <html <?php body_class(); ?>>

   <!– ✅ 正解 –>

   <body <?php body_class(); ?>>

   “`

2. **エスケープは不要**

   – `body_class()`は内部で適切にエスケープ処理されています

   – 独自でエスケープする必要はありません

3. **PHPタグの位置**

   “`php

   <!– ✅ 正解 –>

   <body <?php body_class(); ?>>

   <!– ❌ 間違い(スペースが入る) –>

   <body class=”<?php body_class(); ?>”>

   “`

4. **クラス名の命名規則**

   “`php

   // ✅ 推奨

   $classes[] = ‘my-custom-class’;

   $classes[] = ‘header-fixed’;

   // ❌ 避けるべき

   $classes[] = ‘myCustomClass’;  // キャメルケース

   $classes[] = ‘my_custom_class’; // アンダースコア

   “`

### 🔍 デバッグ方法

#### コマンドライン(WP-CLI)での確認

“`bash

# WordPressの状態確認

wp core version

wp theme list

wp plugin list –status=active

# 特定のページのbody_classを確認(カスタムスクリプトが必要)

wp eval “

global \$wp_query;

\$wp_query->is_home = true;

\$classes = get_body_class();

echo implode(‘ ‘, \$classes);

“`

#### ブラウザでの確認方法

“`javascript

// 開発者ツールのコンソールで実行

console.log(‘Body classes:’, document.body.className);

// 特定のクラスの存在確認

console.log(‘Is home page:’, document.body.classList.contains(‘home’));

console.log(‘Is logged in:’, document.body.classList.contains(‘logged-in’));

“`

#### PHPでのデバッグ

“`php

// functions.phpまたはテンプレートファイルに一時的に追加

function debug_body_classes($classes) {

    error_log(‘Body classes: ‘ . implode(‘, ‘, $classes));

    return $classes;

}

add_filter(‘body_class’, ‘debug_body_classes’);

// または直接出力

if (WP_DEBUG) {

    $classes = get_body_class();

    echo ‘<!– Body classes: ‘ . implode(‘, ‘, $classes) . ‘ –>’;

}

“`

## トラブルシューティング

### よくある問題と解決方法

#### 1. クラスが追加されない

**症状**: カスタムクラスが出力されない

**原因と解決**:

“`php

// ❌ 間違い:戻り値を返していない

function add_custom_classes($classes) {

    $classes[] = ‘custom-class’;

    // return文がない

}

// ✅ 正解:必ずreturnする

function add_custom_classes($classes) {

    $classes[] = ‘custom-class’;

    return $classes; // これが必要

}

add_filter(‘body_class’, ‘add_custom_classes’);

“`

#### 2. 重複するクラス

**症状**: 同じクラスが複数回出力される

**解決方法**:

“`php

function add_unique_classes($classes) {

    $new_classes = array(‘custom-class’, ‘another-class’);

    // array_uniqueで重複を除去

    $classes = array_merge($classes, $new_classes);

    return array_unique($classes);

}

add_filter(‘body_class’, ‘add_unique_classes’);

“`

#### 3. 条件分岐が効かない

**症状**: `is_home()`などの条件が期待通りに動作しない

**解決方法**:

“`php

function conditional_body_classes($classes) {

    // wp_head実行後に確実に判定

    if (is_admin()) {

        return $classes; // 管理画面では何もしない

    }

    // より確実な条件分岐

    global $wp_query;

    if ($wp_query->is_home() && $wp_query->is_front_page()) {

        $classes[] = ‘true-homepage’;

    } elseif ($wp_query->is_home()) {

        $classes[] = ‘blog-homepage’;

    }

    return $classes;

}

add_filter(‘body_class’, ‘conditional_body_classes’);

“`

### パフォーマンス最適化

“`php

/**

 * パフォーマンスを考慮したbody_class追加

 */

function optimized_body_classes($classes) {

    // 重い処理はキャッシュを活用

    $cache_key = ‘body_class_’ . get_the_ID();

    $cached_classes = wp_cache_get($cache_key);

    if ($cached_classes === false) {

        $new_classes = array();

        // 重い処理をここに

        if (is_single()) {

            $post_meta = get_post_meta(get_the_ID(), ‘custom_layout’, true);

            if ($post_meta) {

                $new_classes[] = ‘layout-‘ . $post_meta;

            }

        }

        wp_cache_set($cache_key, $new_classes, ”, 3600); // 1時間キャッシュ

        $cached_classes = $new_classes;

    }

    return array_merge($classes, $cached_classes);

}

add_filter(‘body_class’, ‘optimized_body_classes’);

“`

これで`body_class()`の完全な解説が完成しました!初学者の方でも段階的に理解できるよう、基本から応用まで幅広くカバーしています。