2018年08月01日
Docker for Mac を使って WordPress の...
2018年07月29日
Docker for Mac のインストール
2018年07月08日
Docker 便利コマンドあれこれ
2018年07月08日
オライリーの Docker 本(Docker Up &...
2018年07月05日
iPad mini 2 を購入しました
2018年07月04日
Docker で Jenkins するときのあれこれ

HOME > カテゴリ(WordPress)の記事

初心者向け WordPress プラグイン作成 に関する覚書



Twitter Tools を拡張するプラグインを作ったので、それで学んだ WordPress のプラグインの基本構造をメモ。

Twitter Tools プラグインを拡張するプラグインを作ってみました。ってことで簡単な、WordPress プラグインの作り方や、お作法がなんとなくわかった(つもりになってきた)ので、プラグイン全体の構造に関する覚書として一応メモ。

プラグインをつくるためには、

  1. PHP の基本的な文法
  2. フォームデータの受け渡し方法
  3. WordPress のアクションフック、フィルターフックとは何ぞや?

がある程度わかった上で、プラグインの作成 – WordPress Codex 日本語版 を一読すれば、簡単に理解できると思います。

それでは早速プラグインの作り方。

プラグイン冒頭に、

/*
Plugin Name: プラグイン名
Plugin URI: 自分のホームページアドレスとか
Description: プラグインの説明
Version: バージョン
Author: 作者名
Author URI: 自分のホームページアドレスとか
License: GPL2

  Copyright 2012 (H) (email : dev@ontheroad.jp)

  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
*/

を書くのはお約束として・・、

プラグイン実装に必要なことは、

  1. プラグインオブジェクトの class 定義
  2. プラグインを初期化する関数の定義
  3. HTTP リクエストを処理する関数の定義
  4. プラグイン設定画面を描画する関数の定義

となります。もちろん、実装方法に決まりはないのでこうしなければ成らないという事ではないのでひとつの実装例として参考になれば。

参考:プラグインの作成 – WordPress Codex 日本語版
参考:WordPress コーディング基準 – WordPress Codex 日本語版

1. プラグインオブジェクトの class 定義

プラグインオブジェクトの class を定義します。最低限必要なのは、

  1. メンバ変数
  2. DB から値を取得してメンバ変数にセットする関数
  3. HTTP リクエストの値を取得してメンバ変数にセットする関数
  4. メンバ変数の値を DB へセットする関数

です。例えばこんな感じ。

class my_plugin {

  // コンストラクタ
  function my_plugin() {

    // メンバ変数名を配列に入れておくと便利
    $this->options = array(
      '変数1'
      , '変数1'
      , '変数2'
      , '変数3'
      , '変数4'
      , '変数5'
    );

    // メンバ変数の定義
    $this->変数1 = '1';
    $this->変数2 = '1';
    $this->変数3 = '1';
    $this->変数4 = '1';
    $this->変数5 = '1';
  }

  function my_plugin_get_db_settings(){
    // DB の値をメンバ変数にセットする処理。
  }

  function my_plugin_fetch_http_request() {
    // HTTP リクエストの値(POSTリクエスト)を取得して、
    // メンバ変数にセットする処理
  }

  function my_plugin_update_db_settings() {
    // メンバ変数の値を DB へ書き込む処理
  }
} // end of class my_plugin()

メンバ変数名を配列に入れておくと、メンバ変数に値をセットする場合や、メンバ変数の値を DB にセットするときに楽ちんになります。

例えば、DB のデータを取得する場合は、

function get_db_settings(){
  foreach ( $this->options as $option ) {
    $value = get_option( 'prefix_'.$option );
    $this->$option = $value;
  }
}

こんな感じで、foreach() でループさせてあげればおっけー。DB へのデータセットや、HTTP リクエストの値取得も基本的には同じ。

ようは、<form> データのフォーム名(HTTPリクエスト)と、メンバ変数と、DB のキーを1セットにして、同じ変数名で管理することが基本コンセプト。

ただ、DB に値をセットする場合は(DB のキーは)、なんらかしらのプレフィックスを付けておいた方が良いと思う。option テーブルは WordPress 本体や他のプラグインなんかが利用するので、自分のプラグインが使っているキーを区別するため。

参考:関数リファレンス/get option – WordPress Codex 日本語版

2. プラグインを初期化する関数の実装

アクションフック(init 又は admin_init)に、プラグインを初期化する関数をフックする。初期化する関数の中で、プラグイン本体のオブジェクトを生成して、DB からデータを取得してメンバ変数に格納。

たとえば、こんな感じ。

function init() {
  global $my_plugin;
  $my_plugin = new my_plugin;
  $ex_tt->get_db_settings();
}
add_action( 'admin_init', 'init' );

設定画面が読み込まれると、アクションフック(admin_init)がヒットして、init 関数が呼び出される。

init 関数にて、プラグインオブジェクトを生成し、DB から値を取得して生成したプラグインオブジェクトのメンバ変数にセットする。プラグインオブジェクトは global で保持

参考:プラグイン API – WordPress Codex 日本語版
参考:プラグイン API/アクションフック一覧 – WordPress Codex 日本語版
参考:プラグイン API/フィルターフック一覧 – WordPress Codex 日本語版

3. HTTP リクエストを処理する関数の実装

アクションフック(admin_init)に、HTTP リクエストを処理する関数をフックする。その関数の中で、プラグインの設定画面から飛んでくる HTTP リクエストを処理して、リダイレクト。パラメーターに正しく処理されたかどうかを付けとく。

こんな感じ。

add_action( 'admin_init', 'request_handler', 10 );

function request_handler() {

  if ( !empty( $_POST[ 'action' ] ) ) {

    switch( $_POST[ 'action' ] ) {
      case '処理1':
        // 必要な処理
        wp_redirect(admin_url('options-general.php?page=myplugin/myplugin.php&処理1=true'));
        die();
        break;

      case '処理2':
        // 必要な処理
        wp_redirect(admin_url('options-general.php?page=myplugin/myplugin.php&処理2=true'));
        die();
        break;

    }
  }
}

4. プラグイン設定画面を描画する関数の実装

アクションフック(admin_menu)に、管理画面を表示する関数をフックする。その関数の中で、プラグインの設定画面(DB の値をアップデートするフォーム(<form>))を出力する。フォームの送り先(action属性)は、「admin_url( ‘options-general.php’ )」。

たとえば、こんな感じ。

add_action( 'admin_menu', 'plugin_menu' );

function plugin_menu() {
  if( current_user_can( 'manage_options' ) ) {
    add_options_page( '設定', 'myPlugin', 8, __FILE__, 'option_form' );
  }
}

function option_form() {

    ・・・HTML(メッセージ表示)・・・

  echo '

処理1 OK

'; } else {   echo '

処理1 NG

'; }

のような感じで、処理内容に応じてメッセージを表示するようにすればそれっぽい。

ここまでの、

  1. プラグインオブジェクトの class 定義
  2. プラグインを初期化する関数の定義
  3. HTTP リクエストを処理する関数の定義
  4. プラグイン設定画面を描画する関数の定義

を実装すればプラグインの完成です。

まとめ

どんなプラグインでも基本的にこの構造で実装できる(はず)。

独自の DB テーブルを使うようなプラグインは、プラグイン有効化したときに、テーブルを作成したりなどの処理が必要になるけど、それ以外は、この構造でいけると思う。

基本的にはこの構造をベースにしつつ、ソースコード管理のために、関数を分けたり、ソースファイルを分けたりと適時修正すればおっけー。

でわでわ。

ブログランキング・にほんブログ村へ
このエントリーをはてなブックマークに追加




この記事にコメントする





Copyright © 2012 - 2013 MacBook Air とWordPressでこうなった All rights reserved
Designed by Theme Junkie. Powered by WordPress.