WordPressのfunctions.phpの書き方

WordPressのfunctions.phpの書き方

CMSとしてのWordPressは大変人気が出ていますが、その一方、functions.phpになんでも書いてしまうことでコードが冗長化する悲劇(?)が絶えません。かくいう私もかつてはズラズラと書き連ね、気づいたら500行超え…ということもありました。しかし、可読性があまりに悪くなるのでお勧めできません。

functions.phpは「弄らない」ぐらいの考えで

特に有料、無料を問わず第三者が作ったものであればなおのこと守るべきでしょう。functions.phpを冗長にすると何も良いことがありません(子テーマを使っていたとしても、結局冗長化する。テーマアップデートで吹き飛ぶなど…)。ので、functions.phpは「弄らない」ぐらいの考えに徹します。私のサイトは自作テーマを使っていますが、基本的に「テーマで提供する機能」と「汎用化できる機能」は分離しています。

functions.phpの理想形

これはあくまで私のコードの場合ですし、もっと良い書き方があるかもしれませんが、参考までに私のfunctions.phpです。非常にシンプルに作っています。

<?php
/**
 * functions.php
 * テーマメイン設定
 */

if ( ! defined( 'ABSPATH' ) ) {
    http_response_code( 403 );
    exit;
}

// 読み込み対象のlibファイル群
$theme_lib_files = [
    'init.php',
    'menu.php',
    'widget.php',
    'image.php',
    'query.php',
    'ogp.php',
    'pagenation.php',
    'shortcode.php',
    'breadcrumbs.php',
    'pluginchecker.php',
    'frontpage.php',
];

// 不正ファイル名除去(セキュリティ)
$theme_lib_files = array_filter( $theme_lib_files, static function ( $file ) {
    return preg_match( '/^[a-z0-9_-]+\.php$/i', $file );
});

$lib_dir = trailingslashit( get_template_directory() ) . 'lib/';

// 読み込み処理
foreach ( $theme_lib_files as $file ) {
    $path = $lib_dir . $file;

    if ( is_readable( $path ) ) {
        require_once $path;
    } else {
        if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
            error_log( sprintf( '[Theme Loader] Missing library file: %s', $path ) );
        }
    }
}

いかがでしょうか、という書き方は嫌いなのですが、このくらいシンプルに抑えています。lib/以下にそれぞれの役割分担してライブラリ化しています。

テーマで保障する機能とプラグインで保障する機能を分ける

意外とこの辺の考えは広まっていないように感じます。Google検索でも「functions.phpに追記してください」という記事が多く出てきます。確かに細かな機能とか自作テーマなら良いのかも知れませんが、個人的には

  • テーマ特有の機能はfunctions.phpに
  • 汎用化できる機能はプラグインに

すべきと考えています。ここで問題になるのはオーバーヘッドですが、functions.phpに一まとめにして、大量のコードになるよりは、皮肉にもプラグインに細かく分けたほうが良いという状況です。例えば有名な「?author=1」(管理者ユーザーが見える)をfunctions.phpで塞いだとします。その後新しいプラグインをインストールしたとします。どうなるかはわかりますね?そのテーマ特有の機能なのでまた書き直さないといけません。面倒です。また、functions.phpで動かす程度の機能であれば、そこまでオーバーヘッドは問題になりません。このサイトでは10個以上の自作プラグインを入れていますが、今までに動作が遅くなったことは一度もありません。

プラグイン化の大きなメリット

プラグイン化のメリットははかり知れません。もちろん、テーマ固有と汎用化できるもので切り離す必要はありますが、先ほどの?author=1を潰したとして、これをプラグインにすればテーマをいくら切り替えても(重複しない限り)はほぼすべてのテーマで動作を保証することができます。私の場合はREST APIの制御、表示制限、admin-ajax.phpの動作制限等様々な制限を入れていますが、プラグイン化したことでほかのテーマでもデフォルトで動かすことができます。

切り分けの考え方

単純に考えるのが一番です。

  • そのテーマでしか提供できない機能はfunctions.phpに
  • ほかのテーマでも使いまわせる機能はプラグインに

するだけです。たったこれだけで、テーマアップデートで機能消滅の危機からも、スパゲッティ地獄からも逃れることができます。何でもかんでもfunctions.phpに書き連ねる文化、そろそろ終わらせませんか?

コメントを投稿する

メールアドレスは公開されませんのでご安心ください。 * が付いている欄は必須項目となります。

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。

ページの先頭