Webサイト

WordPressのfunctions.phpとは?役割や書き方について徹底解説!

WordPressを触り始めた、自分でテーマを構築してみたい、という方の多くが通るであろう「functions.phpって何者?」という疑問があるかと思います。

このファイルはWordPressテーマの基本、いや、基幹ファイルと言っても過言ではありません。その役割やできることについて知っておくことは、すなわち自分の構築するテーマを知ることと同義です。

そこで本記事では、WordPressテーマの基幹ファイル「functions.php」の概要や仕組み、具体的な書き方をわかりやすく解説します。

functions.phpとは?

functions.phpはWordPressテーマの中核的な存在のファイルで、テーマに必要なPHP関数や設定をまとめる役割を担います。

フィルターやアクションを登録して機能追加したり、テーマ全体の動作を制御したりすることができます。

本節では、所属テーマの基幹ファイルとしての位置づけ、依存設定の記述、動作の仕組みを解説していきます。

所属テーマの基幹ファイル

functions.phpは、それが所属しているテーマに固有のPHP関数や設定を集約する基幹ファイルです。テーマを有効化すると自動的に読み込まれ、WordPressコアやプラグインと連携しながら動作します。

一言で表現するなら、テーマの挙動をフックで拡張する『ミニプラグイン置き場』です。

ファイルをテーマフォルダ直下に配置するだけで有効化され、他テーマへの影響を防ぎつつスタイルやスクリプトの読み込み、フィルター・アクションの登録、カスタム投稿タイプの宣言、 ウィジェットエリアの追加など、テーマ固有の機能拡張を一元管理できます。

テーマディレクトリとfunctions.phpの関係性は以下のイメージです。

wp-content
├── themes
│   ├── theme-dir # <-テーマディレクトリ
│   │   ├── functions.php

テーマ依存の設定を書くファイル

また、functions.phpでは、テーマ固有の機能や見た目をまとめて管理できます。

例えば、「特定固定ページ内に記事のアーカイブを表示したい時の関数」や「ページネーションの状況によってスタイルを変える動的処理」など、サイトのテーマに固有な処理を持たせたい時など。

また、wp_enqueue_style/wp_enqueue_scriptを使って、テーマ固有のCSSやJSを適切なタイミングで読み込むことも可能です。これにより、ユーザーのアクセスしたディレクトリパス次第で見た目や挙動を変えることもできます。

これらは全て、テーマに依存した設定であり、functions.phpによって制御ができるのです。

functions.phpが働く仕組み

functions.phpは、WordPressがテーマを読み込む際に自動で実行されるファイルで、リクエストのたびに呼び起こされています。そのため、ここで定義した関数や処理内容は常にテーマ全体へ浸透します。

それゆえ、便利なfunctions.phpですが、ここに重い処理を書きすぎたりリクエストごとに処理すべきではない内容を記述してしまうと、かえってサイトに負荷をかけてしまうこともあるんですね。

functions.phpが働くまでの流れとしては以下のようになります:

順序ファイル役割
1/index.phpフロントコントローラ
2/wp-blog-header.phpWP起動・クエリ解決
3/wp-load.php設定ファイル読み込み
4/wp-config.phpサイト固有設定
5/wp-settings.phpWordPress本体ブートストラップ
6テーマディレクトリ/functions.php

全体のフローとしては以下のツリー図がイメージしやすいでしょう。

/index.php
  └─ wp-blog-header.php
       └─ wp-load.php
            └─ wp-config.php
                 └─ wp-settings.php
                      └─ 有効なテーマディレクトリ/functions.php # これをinclude

functions.phpの役割・できること

そんなテーマに必要な各種機能を集中管理するfunctions.phpですが、具体的にはどんな役割を担ってくれるのでしょうか?

本節では、functions.phpの具体的な役割を順に見ていきましょう。

テーマ全体のフック駆動

フックとは、システムのコアがリクエストの通過点で鳴らす合図のようなもので、「ここでこの処理をしてください」と各所へ指示を送る構造のイメージです。

WordPressでは、functions.phpを起点にWordPressコアやプラグインが用意するアクション・フィルターフックに独自処理を紐づけるため、テーマの処理はぜんぶWordPressが投げるフック(合図)にfuncitonsが参加して実行するという設計になっています。

例えば、wp_enqueue_でスタイル・スクリプトを一括で読み込んだり、wp_headやwp_footerにメタ情報やトラッキングコードを差し込んだりなど。

このようなテーマ各所のタイミングを捉えた関数登録を行うことで、見た目や機能追加、外部サービス連携などを柔軟に実現できるようになるのです。

テーマ機能の宣言

functions.phpでは、テーマの開発者が独自に定義する関数を宣言しておくこともできます。

テーマ全体がfunctions.phpを通して作動することを前提とすると当然ですが、ある意味でここに宣言した関数のグローバル化が可能になるのです。

例えば、カスタム投稿タイプのタグやカテゴリー(タクソノミー)を、自分の好みの形に整形して返却したい時、functions.phpにPHP関数を定義すれば使用可能になります。

また、この関数の使用が許可される場所の制限も可能なため、保守性を高めるような記述も自由です。

テーマアセットの管理

テーマアセット、つまり/assetsに書かれるCSS・JavaScriptの管理もfunctions.phpで行えます。

functions.php内でwp_enqueue_style・wp_enqueue_scriptを使い、CSSやJSを登録・読み込むと、ファイル同士の依存関係やバージョンを明示でき、かつキャッシュ対策もしやすくなります。

たとえば以下のような記述です。

function mytheme_js() {
	wp_enqueue_script('mytheme-script', get_template_directory_uri().
		'/assets/js/main.js', [], '1.0', true);
}
add_action('wp_enqueue_scripts', 'mytheme_js');

上記の記述では、/assets/js/main.jsのスクリプトバージョン1.0を読み込むという意味になっています。

カスタム投稿タイプ・タクソノミーの設定

さらに、functions.phpはカスタム投稿タイプ・タクソノミーの設定もできます。

それぞれの意味は以下のとおりです。

  • カスタム投稿タイプ
    • post_type=post以外にユーザーが独自定義する投稿オブジェクトタイプ
  • タクソノミー
    • 投稿タイプに関連するリレーショナルなタグやカテゴリーの呼び名

functions.phpの記述でそれぞれを設定するには、register_post_type()、register_taxonomy()関数を初期化アクションフックに追加することで実現可能です。

ショートコードの設定

また、functions.phpでは独自のショートコードの定義が可能です。

ショートコードとは、WordPressのエディタ画面でUI操作ができる、ブロックの埋め込みのようなものです。ショートコードを使うと簡単にブロック内にカスタム記述をすることができます。

ショートコードの宣言については、add_shortcode()関数の使用により実現します。

functions.phpの書き方

WordPressのfunctions.phpの書き方は至ってシンプルで、PHP記述に慣れた人であればすぐに修得が可能です。

ただし、WordPress独自のグローバス関数などがあるため、最初は覚えるのに苦労する人も少なくないはず。

そこで、本節ではWordPressのfunctions.phpでよく使われる記述をご紹介したいかと思います。

function宣言

functions.phpで独自の機能を追加するには、まず関数を定義します。基本の書き方は「function 関数名() { 処理内容 }」です。これはPHPの関数を定義する際の構文になります。

関数名の前に独自の接頭辞(プレフィックス)を付けておくと、他のテーマやプラグインとの名前の重複を避けられるので、施すといいでしょう。

作った関数をWordPressと連携させるには、add_action()やadd_filter()を使います。これらは前節の「フック駆動」にあたる仕組みで、WordPressの動作タイミングに合わせて関数を実行できます。

例として、Contact Form 7というフォームを構築できるプラグインのタグにIDやクラスを追加する場合は以下のように書きます。

function my_wpcf7_form_id_attr() {
    $my_id = "contact-form";
    return $my_id;
}
add_filter('wpcf7_form_id_attr', 'my_wpcf7_form_id_attr');

function my_wpcf7_form_class_attr($class) {
    $my_class = "custom-form " . $class;
    return $my_class;
}
add_filter('wpcf7_form_class_attr', 'my_wpcf7_form_class_attr');

add_actionフック宣言

add_actionは、WordPressの特定のタイミングで自作の関数を実行させる仕組みです。「ページが表示される前に」「管理画面が開いたときに」など、様々な場面で処理を追加できます。

基本の書き方はこちら:

add_action('フック名: 文字列', '実行する関数名: 文字列', 優先度: 数値, 引数の数: 数値);

優先度と引数の数は省略可能です。優先度は数字が小さいほど先に実行され、デフォルトは10です。

また、よく使われるテーマのアセット管理関数をフックさせる場合にもadd_action()を使います。

function mytheme_enqueue_scripts() {
    wp_enqueue_style('mytheme-style', 
        get_template_directory_uri() . '/style.css');
    wp_enqueue_script('mytheme-script', 
        get_template_directory_uri() . '/js/script.js', 
        array('jquery'), '1.0', true);
}
add_action('wp_enqueue_scripts', 'mytheme_enqueue_scripts');

ちなみに、フック名によって実行のタイミング(いつフックの内容を実行するか)が変わってきますので、こちらも併せて参考にしてください。

フック名いつ走るのか
muplugins_loaded必須プラグイン読み込み後
plugins_loaded有効プラグイン読み込み後
setup_themeテーマ読み込み開始時
initWPコア初期化
wp_loadedWP完全ロード後
よく使われるフック名

register_post_typeカスタム投稿タイプ宣言

register_post_typeは、WordPress標準の「投稿」「固定ページ」以外に、独自の投稿タイプを作成する関数です。

例えば「商品」「お知らせ」「実績」など、サイトに合わせたコンテンツ管理ができるようになります。

「商品」というカスタム投稿タイプを登録したい場合は以下のようになります。

function create_custom_post_type() {
    register_post_type('product',  // 投稿タイプのスラッグ
        array(
            'labels' => array(
                'name' => '商品',
                'singular_name' => '商品'
            ),
            'public' => true,
            'has_archive' => true,
            'supports' => array('title', 'editor', 'thumbnail'),
            'menu_position' => 5
        )
    );
}
add_action('init', 'create_custom_post_type');

主な設定項目としては以下があります。

  • public: trueで公開(必須)
  • has_archive: trueで一覧ページ(アーカイブページ)を生成可能に
  • supports: 使用する機能の指定

register_taxonomyタクソノミー宣言

register_taxonomyは、投稿を分類する独自の仕組みを作る関数です。

WordPressには標準で「カテゴリー」「タグ」がありますが、これらとは別に「商品カテゴリー」「制作実績の業種」など、投稿タイプに合わせた分類を追加できます。

基本的な書き方:

function create_custom_taxonomy() {
    register_taxonomy(
        'genre',           // タクソノミーの名前(スラッグ)
        'product',         // 適用する投稿タイプ
        array(
            'labels' => array(
                'name' => '商品カテゴリー',
                'singular_name' => 'カテゴリー'
            ),
            'hierarchical' => true,      // true:階層型、false:タグ型
            'public' => true,
            'show_in_rest' => true,      // ブロックエディタ対応
            'rewrite' => array('slug' => 'product-cat')
        )
    );
}
add_action('init', 'create_custom_taxonomy');

タクソノミーの階層型とタグ型の違い

また、タクソノミーには「階層型」と「タグ型」のに種類が存在します。

  • 階層型(hierarchical: true)
    • 親子関係が作れる。カテゴリーのような使い方
    • 例:家電 > テレビ > 液晶テレビ
  • タグ型(hierarchical: false)
    • 並列な関係。タグのような使い方
    • 例:赤色、青色、黄色

add_rewrite_ruleリライトルール宣言

add_rewrite_ruleは、WordPressのURL構造をカスタマイズする関数です。標準のパーマリンクでは実現できない、独自のURL形式を作れます。

基本的な書き方:

function my_custom_rewrite_rules() {
    add_rewrite_rule(
        '^products/([0-9]+)/?$',                    // URLパターン(正規表現)
        'index.php?post_type=product&p=$matches[1]', // 変換先
        'top'                                        // 優先度
    );
}
add_action('init', 'my_custom_rewrite_rules');

上記の例では、example.com/products/123/というURLで、商品ID:123のページを表示できるようになります。

add_rewrite_rule使用時の注意点

  • 正規表現の知識が必要
  • 既存のURLと競合しないよう注意
  • flush_rewrite_rules()は負荷が高いため、頻繁に実行しない

add_rewrite_ruleは高度な機能ですが、独自のURL設計が必要な場合には強力なツールです。

まずはシンプルなパターンから試してみましょう。

まとめ

WordPressの基本中の基本であるfunctions.phpの解説、いかがだったでしょうか?

実は、開発者の学習にとって本当にいいのは「WP公式のドキュメントを読み漁ること」です。

ぜひ、この記事は参考程度にしていただけますと幸いです。

この記事の著者

児玉慶一(ケーイチ)

児玉慶一

執行役員/ AI・ITエンジニア

SNS Xアカウント

愛称: ケーイチ
1999年2月生まれ。大学へ現役進学後数ヶ月で通信キャリアの営業代理店を経験。営業商材をもとに100名規模の学生団体を構築。個人事業主として2018年〜2020年2月まで活動したのち、2020年4月に広告営業事業を営む株式会社TOYを創業。同時期にITの可能性を感じプログラミングを始め、現在はITエンジニアとして活動中。2021年にLeograph株式会社に参画し、AI研究開発やWebアプリ開発などを手掛ける。 「Don't repeat yourself(重複作業をなくそう)」「Garbage in, Garbage out(無意味なデータは、無意味な結果をもたらす)」をモットーにエンジニア業務をこなす。
【得意領域】
業務効率化AIモデル開発
事業課題、戦略工程からシステム開発
Webマーケティング戦略からSaaS開発