本気で作りたい人向け、WordPressプラグインの作成方法


投稿日:2015年9月17日
  • 109
  • 0



実際にプラグインを開発してみてわかった、かゆいところに手が届く解説

wordpress-plugin_01

WordPressでは、その人気にふさわしく多くのプラグインが用意されています。
それに合わせて、プラグインの作り方を解説するサイトも多く、Codexにも解説ページが用意されています。

情報が豊富なのは良いことなのですが、今回SNSのカウントをキャッシュするプラグイン「Step by Step Social Count Cache」を開発するに当たり、「これは先に解説して欲しかった…」「え、なんでこれ解説がないの?」と悶々とすることが多々ありました。

そこで、初めてプラグインを作成する方がハマりやすいポイントも含めて解説します。


WordPressプラグインの解説、全体の目次


このページの目次


まずプラグインの名前を考える

何を当たり前のことを」と思うかもしれませんが、これがとても重要です。プラグイン名プラグインのフォルダ名プラグインのPHPファイル名は、全て一意(ユニーク)である必要があります。
また、プラグイン固有のテンプレートタグも、WordPressのタグはもちろん、他のプラグインと被ると動作しません

多数のプラグインが公開されているので、get_postsや、populer_postといったよくありそうな名前は避ける必要があります。
わかり易い名前を付ける」という命名規則の基本と逆行するところがありますが仕方ありません。

一意性を確保しつつ、わかり易い名前を」となると、どうしても名前が長くなるようで、公式サイトを少し探しただけで「NextGEN Facebook – Complete Meta Tags for FB, Google, Pinterest, Twitter, LinkedIn & More」という名前のプラグインを見つけました。
さすがにこれは長過ぎる気がしますが一意な名前をつけるのに苦労しているさまが伺い知れます

そうなると有効なのが「接頭辞」を付けることです。しかし「wp_」や、「post_」といったありがちな接頭辞だと意味がありません。
簡単なのは自分のスクリーンネームやサイトの略称などを付けることです。私の場合なら「oxy_」としたり、「oxynotes_」等とすれば被る可能性をかなり減らすことができます。ただし、屋号なんかは避けたほうが良いようです。
他にも機能の頭文字を取るという方法もあります。私の作成したプラグインでは「step by step」から頭文字を取って「sbs_」という接頭辞を付けました。

ということでまずはオリジナルの接頭辞を考えてみてください。


WordPressのプラグインについて理解する

プラグインには大きく分けて2つのアプローチがあります。
1つはフックを使う方法。もう1つはテンプレートタグを追加する方法です。

WordPressにおけるフックとは何か

Codexいわく「WordPress はプラグインを WordPress 本体に “引っ張り込む (hook into)” ためのフックを提供しています。」とのこと。
具体的に何を使って引っ張り込むのかというと、アクションフックと、フィルターフックがあります。
(当初フックをfook(引っ掛ける)と解説していましたが、正しくはhookでした。修正してお詫びします。)

アクションフックとは何か

アクションフックとは名前の通り、何らかの動作をフラグにするフックです。例えばWordPress全体を読み込んだ時に実行されるアクションはwp_loaded。フッターを読み込んだ時に実行されるアクションはwp_footerといった具合です。

WordPressには沢山のアクションフックが用意されています。

詳しくは「Codexのアクションフック一覧ページ」をご覧ください。

フィルターフックとは何か

アクションフックは動作をフラグにしていましたが、フィルターフックデータをフラグにします。例えばユーザーが投稿したデータをフィルターするにはcontent_save_pre。データベースから取得した投稿の抜粋をフィルターするにはget_the_excerptといった具合です。

フィルターフックも詳しくは「Codexのフィルターフック一覧ページ」をご覧ください。

テンプレートタグとは何か

テンプレートタグWordPressで定義された関数です。
普段テンプレートファイルを編集する際にも使っています。投稿のコンテンツを表示するthe_content()だったり、タイトルを表示するthe_title()などです。

プラグインではWordPressで用意されたものではなく、新しいテンプレートタグを追加することで、新しい機能を追加します。

テンプレートタグも詳しくは「Codexのテンプレートタグ一覧ページ」をご覧ください。


プラグインの設計とファイル構成を考える

プラグインの最小構成はPHPファイルのみです。
現実的にはREADMEファイルや、翻訳ファイルなどで構成されるため、多くの場合プラグイン専用のディレクトリを作って管理します。

プラグインディレクトリの構成は自由に決められます。
今回は実際にプラグインを作った経験から、こうしておけばよかったというお勧めを紹介します。

まずプラグインディレクトリに沢山のPHPファイルがあるとメインファイルがわかりにくいので外部ファイルとして読み込むものは「lib」や「inc」といったディレクトリを作成してまとめます。

翻訳ファイルはlanguagesディレクトリにまとめる決まりがあるので作成するとして、他にも画像を使う場合は「imagesディレクトリ」、jQueryなどは「jsディレクトリ」といった具合にまとめるとわかりやすいと思います。

もちろんプラグインの機能によって様々ですが、とりあえずは以下のように作成しておくと、わかりやすいと思います。

プラグインディレクトリ
├ lib(メインファイルから分離したPHPファイル)
├ images(画像ファイル)
├ js(JavaScriptファイル)
├ style(CSS)
└ languages(翻訳ファイル)
 plugin.php(プラグインのメインファイル)
 readme.txt(READMEフィアル)

実際にプラグインを作成する

まずは簡単な「Hello World」を表示するプラグインを作り、段々と実践的なプラグインを作成します。
ただ、名前を考えるのも面倒なので解説で作成するプラグイン名は「Hello World」にします。

WordPressのデバッグを有効にする

これからプラグインを開発するにあたり、まずはデバックを有効にします。これを有効にすると非推奨になった関数をメッセージで表示したり、引数の型が間違っているなどエラーの詳細が表示されるようになります。

WordPressのルートディレクトリにある「wp-config.php」を開いて、以下のコードを追加します。

define('WP_DEBUG',true);

既にfalseがある場合は上書きしてください。


プラグインの基本情報を追加する

プラグインのメインファイルに「標準プラグイン情報」というメタ情報を記載します。

WordPressはプラグインディレクトリにあるファイルを走査して、「標準プラグイン情報」を探します。
ファイル名にかかわらず「標準プラグイン情報」が記述されているファイルをはじめに実行するので注意してください。

Codexの標準プラグイン情報に関する解説

具体的な書式は以下のようになっています。

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

それでは実際にプラグインを作成してみましょう。

まずWordPressのプラグインディレクトリに「hello-world」というディレクトリを作成してください。(スペースはハイフンで埋めます)
続いて「hello-worldディレクトリ」に「hello-world.php」というファイルを作成して標準プラグイン情報を記述します。

<?php
/*
Plugin Name: Hello World
Plugin URI: 
Description: Hello Worldを表示する
Version: 1.0.0
Author:oxy
Author URI: http://example.com
License: GPL2
*/
?>

最小構成はPlugin Nameだけで動作しますが、めんどくさがらずに全部入力しておきましょう。
Plugin URIはプラグインをWordPressの公式サイトにアップロードするときに入力するので空欄にしておいてください。

詳しくは後述しますが、LicenseGPL2にしておいてください。

またプラグインで作成するファイルは全てUTF-8のBOMなしで保存してください。


プラグインのライセンスを追加する

Licenseに指定したGPL2はWordPressと同じライセンスです。簡単に解説すると「誰でもプラグインを自由に使用でき、再配布や改変をした場合でも同じ条件を継承する」というライセンスです。

2017/9/13 追記

WordPress公式のPlugin Handbookなる解説ページでライセンスについて解説されています。
ライセンスの文言も最新のものが掲載されています。詳しくはIncluding a Software Licenseページを参照してください。

ライセンスを有効にするには以下の記述が必須になります。
上で追加した「プラグインの基本情報」の後に続けて記述してください。

<?php
/*  Copyright 作成年 プラグイン作者名 (email : プラグイン作者のメールアドレス)

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License, version 2, as
	published by the Free Software Foundation.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
?>

変更するのは「作成年」「ラグイン作者名」「プラグイン作者のメールアドレス」の3点のみです。
他の文言を1文字でも変更するとライセンスが無効になるので注意してください。

今回は以下のようにしました。

<?php
/*  Copyright 2015 Oxy (email : oxy@oxynotes.com)

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License, version 2, as
	published by the Free Software Foundation.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
?>

ここまででプラグインの入れ物ができました。
まだ何の機能も付いていませんが、プラグインページを開いて、記述した内容が正しく反映されているか確認しくてださい。

wordpress-plugin01

これから様々なテストを行うので、有効化しておいてください。


プラグインの概略と、外枠を作成しました。
次の投稿「WordPressプラグインの仕組みとクラスを利用したより実践的な解説」ではフックやテンプレートタグを使って動作させます。


現在のページを共有する



現在のページに関連する記事

本気で作りたい人向け、WordPressプラグインの作成方法 WordPressプラグインを公式プラグインディレクトリへ追加する方法
本気で作りたい人向け、WordPressプラグインの作成方法 WordPressプラグインの仕組みとクラスを利用したより実践的な解説
本気で作りたい人向け、WordPressプラグインの作成方法 WordPressプラグイン用の設定を追加する方法
本気で作りたい人向け、WordPressプラグインの作成方法 WordPressのコメント欄に追加された「次回のコメントで使用するため…」を削除する方法
本気で作りたい人向け、WordPressプラグインの作成方法 WordPressのテンプレートタグを使ってコメントフォームをカスタマイズする方法
本気で作りたい人向け、WordPressプラグインの作成方法 W3 Total Cacheの設定を通して学ぶ、WordPressを高速化するキャッシュの仕組み
本気で作りたい人向け、WordPressプラグインの作成方法 WordPress Popular Postsでページビューがカウントされない場合に試す4つのこと

おすすめの記事

WordPressの最速キャッシュを探せ!APC、memcached、Transients APIを比較

WordPressの最速キャッシュを探せ!APC、memcached、Transients…

初めてでも理解できるようになる「Google Chrome機能拡張の開発」

初めてでも理解できるようになる「Google Chrome機能拡張の開発」

WordPressに「トップへ戻る」ボタンを設置して、フックの仕組みについて学ぼう

WordPressに「トップへ戻る」ボタンを設置して、フックの仕組み…

ClamAVとClamSMTPを利用してPostfixのメールをウイルスチェック

ClamAVとClamSMTPを利用してPostfixのメールをウイルスチェック

Windows 10でネットワークが不安定になった際の対策まとめ

Windows 10でネットワークが不安定になった際の対策まとめ

Adblock対策プラグイン「End of Adblock Cycle」を作成しました

Adblock対策プラグイン「End of Adblock Cycle」を作成しました

メールのエラーコードと、メールサーバのmaillog解析方法まとめ

メールのエラーコードと、メールサーバのmaillog解析方法まとめ

作業効率を飛躍的に向上させる!実務で使うIllustratorのショートカット一覧

作業効率を飛躍的に向上させる!実務で使うIllustratorのショー…


いただいたコメントなど

  1. ピンバック: WordPressのプラグインを開発したい人向けのおすすめ記事30選 | NESTonline Blog

  2. シュウム のコメント:

    この続きはどこに行けば、、、

  3. munyagu のコメント:

    プラグインを作成して配布しようとしているのですが、GPL2について質問させてください。
    ご説明の中でライセンスを有効にするために記述する、としている文章が、GNUが公表している記述とも、Wordpressに添付されているlicense.txtの記述とも多少異なっているようです。
    「他の文言を1文字でも変更するとライセンスが無効になる」ということはないのではないでしょうか?

    また、GNUのHOW TOページ(https://www.gnu.org/licenses/gpl-howto.html)では、
    「あなたのプログラムの配布のどこかに、ライセンスそれ自身のコピーも含めるようにすべきです。」
    とあります。
    GPLの一般公衆利用許諾契約書の条項を配布物に含める必要はないでしょうか?

    http://munyagu.com/

    • oxy のコメント:

      コメントありがとうございます。
      質問の件ですが、私は法律の専門家ではありません。そのため、あくまで専門外の人間によるアドバイスと捉えてください。

      そもそもGPLとは「ソフトウェアは自由であるべき(Wikiより)」という思想のもとに、オープンソフトウェアのルールを体系化したものです。WordPressやプラグインを自由に利用できるのはGPLのおかげです。

      このページで紹介しているGPL2の文言は「WordPress Codexのプラグインの解説ページ」にて紹介されているものです。
      munyaguさんがGNUのHOW TOページとして紹介しているページはGPL3の書き方です。そのため細かな指定が異なるのだと思います。

      また、GPL2なら常に同じ文言でないといけないわけではありません。

      例えばプラグイン独自のオプションを利用する方法は「Including a Software License」に掲載されています。この方法を取ればGPL2の範囲でプラグイン作者が独自のオプションを指定することができます。
      他にもGPL2の中にもいくつかのバージョンが存在します。

      どのようなオプションが許可されているかを調べるには英語のドキュメントを正確に読む必要があります。また、各国の法律も関連しており、法律の知識も要求されます。GPLドキュメントの文言が専門的で難しいのはそのためです。そのような改変を素人(専門家の方ならすいません)が行うのは間違いのもとです。有効な記述がわかっていながら改変し、ライセンスが無効になるような無用なリスクを背負う必要はありません。(専門家の考えた)慣習に則って、他のプラグインと合わせておくのが生産的だと思います。

      GPLの一般公衆利用許諾契約書ですが、私の知る限り添付しているプラグインはありません。また、全ての制作物(プラグイン)に契約書の添付が必要という趣旨では無いと思います。もし添付するなら「WordPress本体に1つだけ含める」というのが現実的だと思います。

  4. munyagu のコメント:

    ご回答ありがとうございます。

    まず、私は改変したいと質問したのではなく、記事内の
    「他の文言を1文字でも変更するとライセンスが無効になるので注意してください。」
    という記述は必ずしも正しくはないのではないですか、という質問でした。
    理由は、記載内の英文がWordPressに添付されているものや、GNUが公開しているものと異なっているためで、どちらの記載方法でも良いのかな、と思ったためです。

    もうすこし詳細に調べて見ましたが、”このページで紹介しているGPL2の文言は「WordPress Codexのプラグインの解説ページ」にて紹介されているものです。”と記事中にありますが、紹介されている「WordPress Codexのプラグインの解説ページ」には「最新はプラグインディベロッパーハンドブックをお読みください。」とあり、そちらの最新ではGNUやWordpressに含まれるものに沿った記述になっています。
    どちらの記載方法でも良いというよりは、この記事での記述内容が少々古いままということでしょうか?

    また、一般公衆利用許諾契約書は、WordPressに標準添付されているakismetや、私がよく使うToolset Types、プラグインの参考にしたDisable XML-RPC Pingbackなどのプラグインや、私が使っているbaskerville、huemanなどのテーマに含まれているので、GNUでの指示通りに添付した方が良いものと思いました。
    確かに、添付していないプラグインやテーマも多いようですね。

    しかしすでに現在WordPress本体に1つだけ含まれている状態ではありませんので、GNUの指示どおりに添付するようにしたいと思います。

    重ねてご回答ありがとうございました。

    • oxy のコメント:

      繰り返しになりますが、
      「他の文言を1文字でも変更するとライセンスが無効になるので注意してください。」
      という説明は
      「この記事の記述が唯一正しいGPL2の記述方法です」
      という意味ではありません。

      ライセンスは各国の法律にも関連しており、特別な専門知識が必要になります。
      そのなかでも特に重要な項目に、ソフトウエア開発者の免責があります。
      実際にアメリカではライセンス絡みの訴訟は日常茶飯事です。

      そのため「改変や、編集のミスで、文言が変更になるとライセンスが無効になるので注意してください」という趣旨です。

      最新の記述方法を調べるのは大切なことです。(補足すれば、この記事を作成するにあたり、当時の最新プラグインの記述も確認しました)
      ただ、専門的な知識がないのなら、一般的に使われているライセンスの記述を、独自のものにするのはリスクが高すぎます。(一般的であれば必ずしも正しいという意味ではありません)少なくとも法律の専門知識を持ち合わせていない私が「初めてプラグインを作成する人に向けた記事」では不適切だと考えます。

      ライセンスに関する専門知識のある方が、より正確な記述をすることに関しては大賛成です。
      私は専門外なので、専門家の方にCodexのライセンスに関する記述を訂正していただければ助かります。

  5. 無名 のコメント:

    すごくどうでもいいコメントですが、フックはhookです。
    fookはFワードです。

    • oxy のコメント:

      ご指摘ありがとうございます。
      たくさんのツッコミを頂いていましたが、やっとこ重い腰を上げて修正させていただきました。
      その他、同様の訂正を頂いた方々にもこのコメントにて感謝とお詫びとさせていただきます。

コメントを残す

コメントは認証制のため、すぐには反映されません。

プログラミングに関する質問は「日本語でプログラミングの悩みを解決するQ&Aサイト sukegra」をご利用ください。