WordPressプラグインを自作する方法

WordPress大好きな私ですが、テーマを自作することが多く、プラグインを自作することは中々ありませんでした。ですが、いろんなサービスのAPIを勉強していく中で、WordPressプラグインとして開発したらいいかもと思 […]

WordPress大好きな私ですが、テーマを自作することが多く、プラグインを自作することは中々ありませんでした。ですが、いろんなサービスのAPIを勉強していく中で、WordPressプラグインとして開発したらいいかもと思う事が多くあります。

今までは自作CMSにAPIを導入したいと考えていましたが、WordPressプラグインとして開発していくことが増えるかもしれないので、今後のために、今回はWordPressプラグインの開発に関する情報をメモしたいと思います。

参考

知っておくと便利なフックの知識

WordPressは無料で簡単に使えることで有名ですが、特に評価できるのは拡張性の高さです。その拡張性の高さを支える仕組みのひとつが「フック」です。プラグインを作成するのなら、WordPressのフックという仕組みを知ることで、より機能的なプラグインを開発することができます。

この記事を書くまで知りませんでしたが、フックという仕組みはプログラミングのテクニックで、WordPress独自の仕組みではないようです。

フックとは?

フックとは特定の処理が実行される際に、他の処理を実行させる機能です。フックという言葉通り、特定の処理に他の処理を引っ掛けるイメージです。

WordPressのフックの対象には「アクション」と「フィルタ」の2種類があります。アクションとフィルタの違いについては詳しく書きませんが、アクションは受取った情報に何らかの処理を行い、何も返さない処理で、フィルタは受取った情報に何らかのフィルタリング処理を行い、結果を返す処理です。

例えば、投稿が更新された時に通知メールをサイト管理者に自動送信したい時には、save_postというアクションに対してメール送信処理をフックします。フィルタは、テーマ作成時にもたまに使用しますが、カテゴリの一覧出力時や投稿タイトルの出力時に余計な文字を省いたりする時、つまり何かを出力する時に、追加で処理をフックする時に使います。

プラグインを実際に作成しよう

プラグインを作るといっても、フックについて知っていれば、難しいことは特にありません。WordPressのリファレンスとか見て進めていけばあとは、処理を書いていくだけです。なので、チュートリアル風にまずはプラグインをひとつ作っていく様子をメモしていきたいと思います。

今回作るプラグイン

今回は「タームの並び順を設定できるようにするプラグイン」を作成したいと思います。既に同様の機能を持つプラグインも存在しますので、そちらを参考に進めていきたいと思います。

基本的に、デフォルトの状態で情報を持たせられない物は、メタとして登録する事が多いのですが、参考にしているプラグインではタームテーブルに新しくカラムを追加して並び順を管理しているので、同じようにしたいと思います。

プラグインとして認識させる

まず初めに、基礎部分を作成して、プラグインを認識させましょう。今回は「custom_term_order」という名前(識別子)でプラグインを作成します。この名前は、公式のプラグインに存在しない名前を使用してください。

WordPressのプラグイン検索で、同じ名前のプラグインがヒットした場合、違う名前を付けるようにしましょう。名前を決めたら、その名前でディレクトリとphpファイルを作成し、下記の様にコメントでプラグインの情報を記載します。

<?php

/**
 * Plugin Name: Custom Term Order by mAlpha
 * Description: タームの並び順を手動で設定できるようにします。
 * Version:     1.0.0
 * Author:      mAlpha
 * Author URI:  https://malpha.pupu.jp/memo/
 */
 

ここまで作成したら、作成したディレクトリごとwp-content/pluginsにアップロードしてください。WordPressのプラグイン管理画面でアップロードしたプラグインが認識されて、有効化ができれば成功です。あとはプログラムを書いていくだけです。

プラグインが有効化された時の処理

プラグインが有効化された時に、term_orderというカラムが用意されているかを確認し、無い場合は追加する処理を作成します。新たにディレクトリとPHPファイルを作成し、その中で処理を記述していきます。まずDBを操作するモデルクラスを作成しましょう。

<?php

class MAL_CTO_Model
{
    public function check_column()
    {
        global $wpdb;

        $query  = "SHOW COLUMNS FROM $wpdb->terms LIKE 'term_order'";
        $result = $wpdb->query($query);

        return ($result === 0);
    }

    public function add_column()
    {
        global $wpdb;

        $query = "ALTER TABLE $wpdb->terms ADD `term_order` INT(4) NULL DEFAULT '0'";
        return $wpdb->query($query);
    }
}

カラムが存在するか確認する関数とカラムを追加する関数です。単一責任になるように確認と追加で処理を分けています。$wpdbを使ってDB操作を行う以外特殊なことをはしていませんので、説明は省きます。次にコントローラークラスを作成します。コントローラーは各アクションやフィルターにフックする関数を管理します。

<?php

class MAL_CTO_Controller
{
    private MAL_CTO_Model $model;

    public function __construct()
    {
        $this->model = new MAL_CTO_Model();
    }

    public function activated()
    {
        if ($this->model->check_column()) {
            $this->model->add_column();
        }
    }
}

プラグインが有効化された時のための関数を作成しておきます。カラムが無かったら作るというシンプルな作りです。次に、先ほど作成したcustom_term_order.phpに処理を記述していきます。

<?php

/**
 * Plugin Name: Custom Term Order by mAlpha
 * Description: タームの並び順を手動で設定できるようにします。
 * Version:     1.0.0
 * Author:      mAlpha
 * Author URI:  https://malpha.pupu.jp/memo/
 */

require_once __DIR__ . '/class/mal_cto_controller.php';
require_once __DIR__ . '/class/mal_cto_model.php';

global $mal_cto_controller;
global $mal_cto_model;

$mal_cto_controller = new MAL_CTO_Controller();
$mal_cto_model      = new MAL_CTO_Model();

register_activation_hook(__FILE__, [$mal_cto_controller, 'activated']);

このプラグインのベースとなるファイルなので、できるだけフックの登録だけを記述して、見れば何にどの処理をフックしているのか、分かるように作ってます。プラグインが有効化された時にフックしたいので、register_activation_hook()を使います。

この関数は、指定したプラグインが有効化された時のフックを登録します。第一引数はプラグインの指定で、パス名を渡します。基本的には__FILE__を渡せば大丈夫です。第2引数はどの処理をフックさせるかで、今回の場合、クラスの関数を指定する必要がありますので、配列で渡しています。クラスを使用していない場合は、関数名だけを文字列で渡してください。

ここまで出来たらファイルをアップロードして動作確認を行いましょう。プラグインが正常に有効化できて、タームテーブルに新しくカラムが追加されていれば成功です。

長くなるので続きは他のメモに書いていきたいと思います。

まとめ

プラグイン自体はまだ途中なので、また続きは別のメモにまとめます。フックの仕組みを理解していれば、プラグインを開発する事は難しくないし、WordPressでできる事の幅が大きく広がります。

また、プラグインはテーマを変更しても機能が使えなくなることもないので、よく使う機能や拡張機能はプラグインで行うことで、運用性もあがります。今後は勉強して作ったプロトタイプなどは、WordPressプラグインとして使用し、いろいろ試していこうかと思います。