---
title: PHP のコードスタイル
sidebar:
  label: コードスタイル
description: Prettier による PHP の自動整形と、WordPress の慣習に合わせた命名、テンプレートでの PHP の書き方
---

PHP の整形は Prettier に任せ、命名などの整形以外のルールは WordPress の慣習に合わせます。

## 自動整形

wp-env-starter では、PHP も CSS・JavaScript と同じく Prettier（`@prettier/plugin-php`）で整形します。
設定はテンプレートの `.prettierrc.json` にあり、インデントは半角スペース 2 つ、文字列はダブルクォートです。

整形はコミット時に lefthook が自動で実行します。
push 前には `pnpm lint` で、整形漏れがないことを確認してください。

:::note[WordPress Coding Standards との違い]
[WordPress Coding Standards](https://developer.wordpress.org/coding-standards/wordpress-coding-standards/php/)（WPCS）はインデントにタブを使うなど、Prettier の出力と一部が異なります。
整形は Prettier の出力を正とし、WPCS の整形ルールには合わせません。
テンプレートの `pnpm lint` には PHP_CodeSniffer（PHPCS）を含めていません。
:::

## 命名

命名は WPCS に合わせます。

| 対象 | 形式 | 例 |
| --- | --- | --- |
| 関数・変数 | スネークケース | `theme_enqueue_assets()`、`$post_id` |
| クラス | 単語の先頭を大文字にしてアンダースコアでつなぐ | `Theme_Menu_Walker` |
| 定数 | 大文字のスネークケース | `VITE_DEV_ORIGIN` |
| ファイル | 小文字のケバブケース | `post-types.php` |
| 独自のフック名 | 小文字のスネークケース | `theme_before_footer` |
| CSS・JavaScript のハンドル名 | 小文字のケバブケース | `theme-script` |

テーマで新しく定義する関数には、`theme_` の接頭辞を付けます。
WordPress の関数はグローバル空間で定義されるため、接頭辞がないとプラグインの関数と名前が衝突し、致命的なエラーになる場合があります。

## テンプレートでの書き方

### HTML と PHP の切り替え

HTML を出力するテンプレートでは、制御構文にコロンを使う代替構文を使います。
波括弧だと、どの `}` がどの `if` や `foreach` を閉じているのかを HTML の中で追いにくくなるためです。

```php
<?php if (have_posts()): ?>
  <ul class="post-list">
    <?php while (have_posts()): the_post(); ?>
      <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; ?>
  </ul>
<?php endif; ?>
```

### ロジックとマークアップの分離

値の取得や加工はテンプレートの先頭（またはヘルパー関数）でまとめて行い、HTML の中では変数を出力するだけにします。
HTML の中に条件分岐や関数呼び出しが入り組むと、表示崩れの原因を探しにくくなるためです。

### 出力時のエスケープ

変数を出力するときは、必ず出力先に合ったエスケープ関数を通します（[セキュリティ](/wordpress/security#出力時のエスケープ)）。
