プラグインの作り方

Tag:

WordPressプラグインの作り方を紹介します。ここでは、設定メニューにサブメニューを追加し、そこからカスタムテーブルにデータを挿入するプラグインを作成していきます。

プラグインヘッダの記述

wp-content/pluginsディレクトリ配下に「dnweb-favorite-wordsディレクトリ」を作成し、その中に「class-dnweb-favorite-words.php」を作成します。

wppl0

「class-dnweb-favorite-words.php」に次のようなコメント(プラグインヘッダ)を記述します。

<?php
/*
  Plugin Name: DNWEB Favorite Words
  Plugin URI:http://www.dn-web64.com/
  Description: お気に入りの言葉を管理するプラグインです。
  Author: DN-Web64
  Version: 1.0
  Author URI: http://www.dn-web64.com/
 */

プラグインヘッダを記述することで、WordPressにプラグインだと認識させることができます。上記のように記述すると管理画面のプラグインメニューで次のように表示されます。
 ↓ 

wppl1

カスタムテーブル生成

プラグインの有効化時にテーブルを作成する処理を記述します。

class DNWEB_Favorite_Words {
    public function __construct() {
        // register_activation_hook関数でプラグイン有効化時に実行される関数を登録
        register_activation_hook(__FILE__, array($this, 'create_custom_tables'));
    }

    public function create_custom_tables() {
        global $wpdb;
        $table_name = $wpdb->prefix . 'favorite_words';

        // dbDelta関数を利用するために必要
        require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

        $sql = "CREATE TABLE $table_name (
                    id mediumint(9) NOT NULL AUTO_INCREMENT,
                    word VARCHAR(255) DEFAULT '' NOT NULL,
                    UNIQUE KEY id (id)
                    );";
        
        // カスタムテーブルを作るには、dbDelta関数を利用することが推奨されている
        dbDelta($sql);
    }
}
$favorite_words = new DNWEB_Favorite_Words();

24行目で、DNWEB_Favorite_Wordsクラスのインスタンスを生成すると、__constructが呼ばれます。__construct内では、プラグインの初期化処理などを記述します。

管理画面の設定メニューにサブメニューを追加

設定メニューにサブメニューを登録する処理を記述します。

add_action('admin_menu', 'favorite_words_admin_menu');

function favorite_words_admin_menu() {
    add_options_page(
            'Favorite_Words',        //クリックされたときにHTMLページタイトルになる。 
            'Favorite_Words',        //サブメニューの管理画面上での名前。 
            'read',                  //このメニューページを利用できる権限
            'favorite-words-admin',  //サブメニューページの識別子。
            'favorite_words_admin'); //サブメニューページのコンテンツを出力する関数。
}

次のように、サブメニューが追加されました。
wppl2

サブメニューページのコンテンツを出力する関数を記述します。

function favorite_words_admin() {
    global $wpdb;
    ?>
    <h2>お気に入りの言葉</h2>
    <form id="favorite-words-form" method="post" action="">
        <?php wp_nonce_field('favorite-words-nonce-key', 'favorite-words-submenu'); ?>

        <p><input type="text" name="favorite-word" value=""></p>
        <p><input type="submit" value="追加"></p>
    </form>
    <ul>
        <?php
        $words = $wpdb->get_results("SELECT word FROM " . $wpdb->prefix . "favorite_words");
        foreach ($words as $word) {
            echo "<li>" . esc_html($word->word) . "</li>";
        }
        ?>
    </ul>
    <?php
}

6行目でwp_nonce_field関数を利用しています。フォームを表示する際は、CSRFを防ぐためwp_nonce_field関数でトークン(12時間ごとに変更され、24時間有効なトークン)を作成しときます。6行目の出力結果は次のようになります。

<input type="hidden" id="favorite-words-submenu" name="favorite-words-submenu" value="e7294034fe" />
<input type="hidden" name="_wp_http_referer" value="/wordpress3/wp-admin/options-general.php?page=favorite-words-admin" />

サブメニューページの表示は次のようになります。
wppl3
まだ、テーブルにデータが登録されてないので、入力フォームしか表示されていません。

データ挿入処理を追加

追加ボタンを押したとき、カスタムテーブルにデータが入力されるように処理を記述します。

add_action('admin_init', 'favorite_words_admin_init');

function favorite_words_admin_init() {
    global $wpdb;

    if (isset($_POST['favorite-words-submenu']) && $_POST['favorite-words-submenu']) {
        if (check_admin_referer('favorite-words-nonce-key', 'favorite-words-submenu')) {
            if (isset($_POST['favorite-word']) && $_POST['favorite-word']) {
                $wpdb->insert(
                        $wpdb->prefix . "favorite_words", array('word' => $_POST['favorite-word'])
                );
            }

            wp_safe_redirect(menu_page_url('favorite-words-admin', false));
        }
    }
}

check_admin_referer関数で正規のルートからアクセスされたか判定しています。その後、フォームで入力された値をカスタムテーブルに挿入しています。

menu_page_url関数は、指定した「メニューページの識別子」をもとにメニューページへのURLを取得します。wp_safe_redirect関数で取得したURLにリダイレクトします。

動作確認です。「おはよう」と入力し追加ボタンを押すと、フォーム画面の下に「おはよう」と表示されます。
wppl4

wppl5

以上、「カスタムテーブル」と「管理画面」を扱った簡単なプラグインの作成例でした。

スポンサーリンク