プラグインの作成とか開発って聞くと凄く難しそうなイメージがあったんですが、実際にやってみると簡易的なものであればかなり手軽に作成できたので、触りだけですが備忘録兼ねて紹介します。
また、いろいろとカスタマイズしている場合にカオスになりがちなfunctions.phpですが、それをプラグインを使って少しでも管理しやすくする方法も併せて紹介します。

プラグインってなに?

wp create plugins 01

そもそもプラグインとは...

プラグインは、WordPressの機能を拡張するためのツールです。
WordPressのコアは、柔軟性を保つため、不必要なコードでふくれあがってしまわないように設計されています。ユーザーそれぞれが特定のニーズに合ったプラグインを利用して、カスタム機能を取り入れられるように作られています。

プラグイン – WordPress Codex 日本語版

上記のようにCodexにも載っていますが、要はWordPressのコアプログラムをいじらなくても、サイトの見栄えを変えたり機能を追加・強化したりすることが簡単にできるものです。

WordPressを触ったことがある人なら一度は目にしたことがあるものだと、スパム対策してくれる「Akismet」やマルチバイト文字の取り扱いに関する不具合を修正してくれる「WP Multibyte Patch」をはじめ、その他有名なものだとお問い合わせフォームを手軽に実装できる「Contact Form 7」やページナビゲーションを簡単に実装・拡張できる「WP-PageNavi」なども全てプラグインとなります。

プラグインの作成方法

先ほど紹介したようなプラグインを作ってみたい場合はある程度の知識がもちろん必要になるのですが、WordPressのプラグイン自体はとても簡単に作成できます。(少なくとも僕は予想以上に簡単にできたのでびっくりしました)
Codexにも記載されていますが、下記を記述したPHPファイルを/wp-content/plugin/に入れるだけでプラグインとして動きます。

<?php
/*
Plugin Name: (プラグインの名前)
Plugin URI: (プラグインの説明と更新を示すページの URI)
Description: (プラグインの短い説明)
Version: (プラグインのバージョン番号。例: 1.0)
Author: (プラグイン作者の名前)
Author URI: (プラグイン作者の URI)
License: (ライセンス名の「スラッグ」 例: GPL2)
*/

// ここにコードを記述

?>

上記のようなプラグイン情報をPHPファイルに記述して、あとはコードを書けばプラグインとして機能してくれます。
ちなみにプラグインとして認識するのに最低限必要なのはPlugin Nameだけなので、特に公開する予定もなく完全に自分用のプラグインとかであれば他の部分は省いても問題ないようです。

以下はいずれみプラグイン作成時に参考にさせてもらったサイトやスライドになり、今回のエントリーはプラグイン作成方法といっても本当に触り部分だけなので、もっと本格的なものを作りたいとかもっと詳しく知りたい場合はひと通り見てみてください。
特に「webOpixel」さんではプラグインの作成方法が丁寧に説明されており、中級編としてデータベース(テーブル)を利用する方法もまとめられていて参考になります。

スニペット管理用のプラグインを作成する

以前からカスタマイズすればする程カオス化していくfunctions.phpをどうにかしたいと思っておりいろいろと調べたところ、いろいろと方法がある中(他の方法は忘れましたが...)でプラグイン化するのが個人的に一番管理もしやすく手軽でいいなと思い実装してみました。
今回プラグインの作成方法を調べた大きな理由でもあります。

下記はどちらも毎回functions.phpへ書いているようなことをプラグイン化して手間を省こうというものなのですが、ひとつのファイルで完結させる方法とスニペット毎に分けて管理しやすくする方法になります。

全てひとつのPHPファイルに記述してプラグイン化する

先ほど紹介したベースとなるPHPの「ここにコードを記述」部分にスニペットを全て記述してプラグイン化する方法です。
例えば、必ずアイキャッチを利用するのであればadd_theme_support( 'post-thumbnails' );を書いておいたり、ログイン画面のロゴ変更やアップデート通知を消すなどの管理画面に関連するものなどで必ず書いていることがあればそれらを書いておき、あとはサイト制作時にこのプラグインを有効化するだけで適応されるので、毎回functions.phpに記述する手間を省けます。
また、プラグイン化することによって、テーマを変更したときなどもわざわざfunctions.phpからfunctions.phpへコピペしたりする必要もなくなります。

今回はサンプルとして管理画面周りで毎回記述するようなものをプラグイン化したものを作ってみました。
プラグイン名は管理画面のカスタマイズなのでMy Admin Settingにし、ファイル名はmy-admin-setting.phpにしました。

ちなみに、今回サンプルで記述している管理画面周りのカスタマイズはこれ以外にも沢山あり、以前エントリーにまとめたので興味がある方はこちらを参考にしてみてください。

my-admin-setting.php
<?php
/*
Plugin Name: My Admin Setting
Description: 管理画面カスタマイズ
Version: 1.0
*/

// ログイン画面のロゴを変更
add_action( 'login_head', 'custom_login_logo' );
function custom_login_logo() {
  echo '<style type="text/css">h1 a { background: url('.get_bloginfo( 'template_directory' ).'/images/login-logo.png) no-repeat center center !important; }</style>';
}


// 管理バーの項目非表示
add_action( 'wp_before_admin_bar_render', 'hide_before_admin_bar_render' );
function hide_before_admin_bar_render() {
  global $wp_admin_bar;
  $wp_admin_bar->remove_menu( 'wp-logo' );
  $wp_admin_bar->remove_menu( 'updates' );
}


// 各アップデート通知の非表示
add_filter( 'pre_site_transient_update_core', '__return_zero' );
remove_action( 'wp_version_check', 'wp_version_check' );
remove_action( 'admin_init', '_maybe_update_core' );

add_action( 'admin_menu', 'remove_counts' );
function remove_counts() {
  global $menu,$submenu;
  $menu[65][0] = 'プラグイン';
  $submenu['index.php'][10][0] = '更新';
}


// ダッシュボードのウィジェットを非表示
add_action( 'wp_dashboard_setup', 'remove_dashboard_widgets' );
function remove_dashboard_widgets() {
  global $wp_meta_boxes;
  unset( $wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links'] );  // 被リンク
  unset( $wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins'] );         // プラグイン
  unset( $wp_meta_boxes['dashboard']['side']['core']['dashboard_primary'] );           // ブログ
  unset( $wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary'] );         // フォーラム
}

?>

作成したプラグインがプラグイン一覧に表示されたイメージ

上記コードを/wp-content/plugin/にアップして管理画面を確認するとイメージのようにプラグイン一覧に表示され、あとはプラグインを有効化すれば上記の各スニペットが適応されます。

複数のスニペットをまとめてプラグイン化する

上記方法でテーマ内にあるfunctions.phpはスッキリしたし、テーマ変更時にわざわざやっていたコピペの面倒などもなくなったと思うのですが、プラグイン化したスニペットが沢山あった場合に結局見辛くカオス化したファイルとなってしまいます…。
先ほどのサンプル程度の数ならパッと見でわかりますが、例えば20個のスニペットを入れたりとかすると、パッと見ではどんなスニペット書いているかは分かり辛いです。
これから紹介する方法は、スニペットをプラグイン化したものを更に管理しやすい状態にする方法になります。

まず/wp-content/plugin/に任意の名前でディレクトリを作成します。
今回はサンプルで先ほど使用した名前を用いてmy-admin-settingというディレクトリで作成し、次にそのディレクトリ内にmy-admin-setting.phpというファイルを作成して下記を記述します。

my-admin-setting.php
<?php
/*
Plugin Name: My Admin Setting
Description: 管理画面カスタマイズ
Version: 1.0
*/

$hack_dir = trailingslashit( dirname( __FILE__ ) ) . 'snippets/';
opendir($hack_dir);
while ( ( $ent = readdir() ) !== false ) {
  if ( ! is_dir( $ent ) && strtolower( substr( $ent, -4 ) ) == '.php' ) {
    include_once( $hack_dir.$ent );
  }
}
closedir();

?>

上記を記述後、次に先ほど作成したディレクトリ内にサブディレクトリを作成し、今回はサンプルとしてsnippetsという名前でサブディレクトリを作成しています。

ここまでやって管理画面でプラグインを有効化すると/wp-content/plugin/my-admin-setting/snippets/内にあるPHPファイルが全て読み込まれるようになります。
例えば、ログイン画面のロゴを変更するものを記述したものをcustom-login-logo.phpに、ダッシュボードのウィジェットを非表示にするものをremove-dashboard-widgets.phpにというように、各スニペットをひとつずつPHPファイルに記述してアップすればそれらが全て適応されるようになります。

プラグイン作成時のファイル構成イメージ

他にも追加したくなった場合は同様にPHPファイルを作成して/snippets/へアップし、逆にもう必要ないと思ったら/snippets/から該当のPHPファイルを消すだけです。

この方法でスニペットを管理するようにすれば、例えば予め30個ぐらいのスニペットを詰め込んだベースみたいなものを用意しておいてプラグインを有効化。
あとは、そのサイトに必要なければ該当ファイルをディレクトリから消していくだけみたいな使い方ができます。

もちろんこれが便利なのかどうかは案件内容や制作者によると思いますが、個人的には凄く良いなと感じて、これからこの方法でスニペットを管理していこうかなと思ったので備忘録兼ねて紹介させてもらいました。

この方法は以下のエントリーを参考にしました。