プラグインのクラス化 – WordPressプラグインの開発 9

投稿者: | 2018年2月11日

今まで作成した内容をクラス化します。
プラグインをクラス化するメリットは、他のプラグインやテーマなどと、関数名などの重複を避けやすい点です。
このオンラインヘルプでは関数名などの先頭に fow_ といったプレフィックスを付けています。これでもある程度、重複を避ける効果があるでしょう。しかし、関数が増えてくると、get_data のようなありきたりの関数名を、つい付けてしまうこともあります。あるいは、fow_get_data のようにしても、この程度の単純な関数名であれば、重複する可能性があります。
クラス化すると、クラスの名前と、そのクラスのインスタンスを入れる変数名の重複を気をつけていればよくなります。

ライブラリークラスの作成

まず、ライブラリーとして機能するクラスを作成します。要は、いろいろな関数や定数を入れておくクラスで、必要に応じてプラグインの本体から利用するクラスです。
ライブラリークラスは、onlinehelp_consts.phpに記述します。以下のように修正します。

<?php

/**
 * ライブラリークラス
 */
class Fow_OnlineHelp_Lib
{
    /**
     * DB関連
     */

    // バージョン
    public $fow_online_help_db_version = '1.0.2';

    // テーブル名
    const FOW_OH_TABLES = array(
        'helpbody' => 'fow_oh_helpbody',
        'product' => 'fow_oh_product',
        'category' => 'fow_oh_category',
    );

    /**
     * オプション関連
     */
    const FOW_OH_OPTION_DB_VERSION = 'fow_oh_db_version';
}

クラス名は Fow_OnlineHelp_Lib としています(6行目)。
データベースのバージョンを示す $fow_online_help_db_version は、public のフィールドにします(13行目)。バージョン番号を 1.0.2 に変更しておきましょう(動作確認のため)。$fow_online_help_db_versionはクラスのフィールドになったため、

global $fow_online_help_db_version;  // この行は削除

の行は削除しました。

データベース操作クラスの作成

データベースを操作する関数を、データベース操作用のクラスにまとめます。クラスの名前は Fow_OnlineHelp_DB にします。onlinehelp_db.phpを以下のように修正します。

<?php

/**
 * DB操作クラス
 */
class Fow_OnlineHelp_DB
{
    /**
     * データベースにテーブルを登録する
     */
    public function install_tables()
    {
        global $wpdb;
        global $onlinehelp_lib;

        if ($onlinehelp_lib->fow_online_help_db_version !== get_option(Fow_OnlineHelp_Lib::FOW_OH_OPTION_DB_VERSION, '')) {
            $charset_collate = $wpdb->get_charset_collate();

            // fow_oh_helpbodyテーブルの登録
            $table = $wpdb->prefix . Fow_OnlineHelp_Lib::FOW_OH_TABLES['helpbody'];

            $sql =
                "CREATE TABLE $table (
                help_id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
                title varchar(50) NOT NULL DEFAULT '',
                helpbody text NOT NULL,
                tags varchar(255) NOT NULL DEFAULT '',
                relations varchar(255) NOT NULL DEFAULT '',
                product_id int(11) UNSIGNED NOT NULL DEFAULT '0',
                category_id int(11) UNSIGNED NOT NULL DEFAULT '0',
                created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                PRIMARY KEY  (help_id),
                KEY tags (tags),
                KEY product_id (product_id),
                KEY category_id (category_id)
                ) $charset_collate;";

            require_once ABSPATH . 'wp-admin/includes/upgrade.php';
            dbDelta($sql);

            // fow_oh_productテーブルの登録
            $table = $wpdb->prefix . Fow_OnlineHelp_Lib::FOW_OH_TABLES['product'];

            $sql =
                "CREATE TABLE $table (
                product_id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
                prod_name varchar(60) NOT NULL DEFAULT '',
                created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                PRIMARY KEY  (product_id)
                ) $charset_collate;";

            dbDelta($sql);

            // fow_oh_categoryテーブルの登録
            $table = $wpdb->prefix . Fow_OnlineHelp_Lib::FOW_OH_TABLES['category'];

            $sql =
                "CREATE TABLE $table (
                cat_id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
                cat_name varchar(50) NOT NULL DEFAULT '',
                created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                PRIMARY KEY  (cat_id)
                ) $charset_collate;";

            dbDelta($sql);

            // データベースバージョンの登録
            update_option(Fow_OnlineHelp_Lib::FOW_OH_OPTION_DB_VERSION, $onlinehelp_lib->fow_online_help_db_version);
        }
    }

    /**
     * テーブルにサンプルデータを登録する
     */
    public function install_sample_data()
    {
        global $wpdb;

        $title = 'オンラインヘルプへようこそ';
        $body = 'プラグインのインストールに成功しました。<br />これはサンプルのデータです。これを編集して、最初の項目を作成してください。';

        $data = array(
            'title' => $title,
            'helpbody' => $body,
        );

        $data_format = array(
            '%s',
            '%s',
        );

        $wpdb->insert($wpdb->prefix . Fow_OnlineHelp_Lib::FOW_OH_TABLES['helpbody'], $data, $data_format);
    }
}

各関数の名前が以下のように変わっています(11行目、78行目)。

fow_install_tables → install_tables
fow_install_sample_data → install_sample_data

また、これらの関数はクラスの外からアクセスできるよう、public に指定しています。
先に作成したライブラリークラスにアクセスする必要があるため、ライブラリークラスを入れたグローバル変数 $onlinehelp_lib を宣言します(14行目)。$onlinehelp_libグローバル変数は、後ほど定義します。
データベースのテーブル名などはライブラリークラスのフィールドとなったため、これらを参照している部分のコードを変更しています(16、20、43、57、71、95行目)。

クラスのフィールドにアクセスする方法として、次の2とおりが記述されています。
Fow_OnlineHelp_Lib::FOW_OH_OPTION_DB_VERSION;
$onlinehelp_lib->fow_online_help_db_version;
:: とコロンを2つつなげる方法は、クラスの静的メンバー(static)にアクセスするためのものです。静的メンバーとは定数、static を指定した関数を指します。静的メンバーを参照するには、クラス名::メンバー のように記述します。
-> は、クラスの静的ではないメンバーにアクセスするためのものです。変数や、static 指定のない関数を指します。
静的ではないメンバーへのアクセスは、そのクラスのインスタンスが必要です。つまり、

$instance = new CLASS_NAME();

のようにnewを使用して、$instance->menberのようにアクセスします。

メインファイルの修正

クラス化したプラグインを動作させるには、メインのonlinehelp_main.phpを以下のように修正する必要があります。

const FOW_OH_PLUGIN_DIR = WP_PLUGIN_DIR . '/fow-online-help';

require_once FOW_OH_PLUGIN_DIR . '/onlinehelp_consts.php';
require_once FOW_OH_PLUGIN_DIR . '/onlinehelp_db.php';

/**
 * クラスのインスタンスを生成する
 */
global $onlinehelp_db;
global $onlinehelp_lib;
$onlinehelp_db = new Fow_OnlineHelp_DB();
$onlinehelp_lib = new Fow_OnlineHelp_Lib();

/**
 * フックの登録
 */
register_activation_hook(__FILE__, 'fow_install_tables');

/**
 * プラグインが有効化されたときに実行される関数
 */
function fow_install_tables()
{
    global $onlinehelp_db;
    $onlinehelp_db->install_tables();
    $onlinehelp_db->install_sample_data();
}

/**
 * オンラインヘルプの出力
 */
function print_online_help_system()
{
    return 'ここにオンラインヘルプを表示する';
}
add_shortcode('fow_online_help', 'print_online_help_system');

データベースクラスとライブラリークラスのインスタンスを生成します(22-23行目)。
この2つのクラスは、プラグイン本体などからもアクセスする必要があるため、グローバル変数として定義します(20-21行目)。
プラグインが有効化されたときのフックを1つにし(28行目)、フックで呼び出される関数内で、データベースクラスの関数を実行します(33-38行目)。

ADs
  

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)