前回作成したウィジェットに挨拶文を表示するプラグインに、管理画面でオプションを更新・保存できるように拡張します。

1.追加したメソッド

プラグインの有効化・削除時の処理と管理画面でのオプションの保存の2種類のプログラムを追加しました。お行儀の良いプラグインを作成するのならば、管理画面と同時にプラグインの有効化・削除時の処理も作るべきと思います。

1.1 プラグイン有効化・停止・削除時に実行する

追加したオプションは、ワードプレスのデーターベースの「wp_options」テーブルに保存されます。もしこのプラグインを削除した時に削除時の処理がなければ、データーベースに無駄なデータとして永遠に残ってしまいます。プラグインが削除されたら使用していたオプションのデータも残らず削除した方が良いですよね。

このプログラムではプラグインを有効化した時にオプションの値を初期化し、プラグインを削除した時にオプションのデータをデータベースから削除します。今回はプラグインを停止した時の処理は行っていませんので、実際のソースコードでは省略しています。

コンストラクタにそれらのメソッドを登録します。プラグイン削除時に呼ばれるメソッドはスタティックである必要があります。ですので配列ではなく、「Greeting::uninstall」と登録します。


class Greeting {

	private $options;

	public function __construct() {
		// 管理画面でプラグインを有効化した時に呼ばれるメソッドを登録
		register_activation_hook(__FILE__, array($this, 'activation'));

		// 管理画面でプラグインを停止した時に呼ばれるメソッドを登録
		register_deactivation_hook(__FILE__, array($this, 'deactivation'));

		// 管理画面でプラグインを削除した時に呼ばれるメソッドを登録(このメソッドはスタティック)
		register_uninstall_hook(__FILE__, 'Greeting::uninstall');
	}

	// 管理画面でプラグインを有効化した時に呼ばれる
	public function activation() {

		// 初めての有効化の時は、バージョンと初期の文字列を保存する
		$this->options = get_option('greeting_option');
		if (! $this->options) {
			$setting = array (
				'version' => '1.0.0',
				'text' => '、よろしくお願いします',
			);
			update_option("greeting_option", $setting);
		}
	}

	// 管理画面でプラグインを停止した時に呼ばれる
	public function deactivation() {
		// このプラグインでは何もしない
	}

	// 管理画面でプラグインを削除した時に呼ばれる(staticメッソド)
	public static function uninstall() {
		// オプションをデータベースから削除する
		delete_option('greeting_option');
	}

プラグイン有効化した時に、オプションが保存されているかチェックし、データがあれば何もしないで、データがなければ初めての有効化になるためバージョンと初期の文字列を記録しています。

バージョンを保存することで将来バージョンアップした時に利用者が使用しているバージョンと新たに有効化するバージョンを比較して更新する時の判断に使用します。

プラグイン削除のデバッグをする時は、ソースファイルを別のところに保存してから実行しないと、ソースファイルが消えてしまいますので注意しましょう。

1.2 管理画面の設定で値を保存する

管理画面にメニューとオプション設定用の画面を作成します。メニューは「設定」項目の中に作りました。


class Greeting {

	private $options;

	// コンストラクター
	public function __construct() {

		// 管理画面にメニューを追加します
		add_action('admin_menu', array($this, 'add_plugin_page'));

		// オプション設定画面の初期化
		add_action('admin_init', array($this, 'page_init'));
	}

	// 管理画面の「設定」に「Greeting設定」メニューを追加する
	public function add_plugin_page() {

		add_options_page('Greeting設定', 'Greeting設定', 'manage_options', 'greeting_option', array($this, 'show_admin_page'));
	}

	// オプション設定画面を表示する
	public function show_admin_page() {

		echo '<div class="wrap">';
			echo '<h2>テキスト設定</h2>';
			echo '<form method="post" action="options.php">';
				settings_fields('greeting_option_group');
				do_settings_sections('greeting_option');
				submit_button();
			echo '</form>';
		echo '</div>';
	}

	// オプション設定画面の初期化
	public function page_init() {

		// データ無害化するためのコールバック関数登録
		register_setting('greeting_option_group', 'greeting_option', array($this, 'sanitize_callback'));

		// 設定セクションの追加
		add_settings_section('greeting_option_section_id', '', '', 'greeting_option');

		// 設定フィールドの追加
		add_settings_field('text', '追加するテキスト', array($this, 'set_text'), 'greeting_option', 'greeting_option_section_id');
	}

	// テキスト入力画面作成
	public function set_text() {

		// 既にデータが入力されていたら表示する
		$this->options = get_option('greeting_option');
		$text = isset($this->options['text']) ? $this->options['text'] : '';

		echo '<input type="text" name="greeting_option[text]" value="' . esc_attr( $text ) . '" />';
	}

	// テキスト入力チェック
	public function sanitize_callback($input) {

		$new_input = array();
		if ($input['text']) {
			$new_input['text'] = $input['text'];
		}
		return $new_input;
	}

メッソド「set_text」のテキスト入力の画面作成で、inputタグのname属性には、「オプション名[キー]」を指定します。 基本的に「greeting_option」、「greeting_option_group」、「greeting_option_section_id」の文字列を変更すれば、オプション設定のプログラムは使いまわしできます。

設定するオプションを増やす場合はメソッド「page_init」に「add_settings_field」を追加して処理するメソッドを作成し、「sanitize_callback」に値をチェックする処理を記述します。

作成したオプション設定画面は、以下のようになります。 ブログ048管理画面

2.ソースコード


<?php
/*
Plugin Name: greeting
Plugin URI: http://blog.raizzenet.com/how-to-make-wordpress-plug-in/
Description: サイドバーに挨拶を表示するプラグイン
Version: 1.0.0
Author: issey
Author URI: http://blog.raizzenet.com/
License: GPL v2 or later
*/

if (class_exists('Greeting')) {
	$greeting = new Greeting();
}

class Greeting {

	private $options;

	// コンストラクター
	public function __construct() {

		// ショートコードを追加する
		add_shortcode('greeting', array($this, 'show'));

		// ウィジェットのテキストでショートコードを実行可能にする
		add_filter('widget_text', 'do_shortcode');

		// 管理画面でプラグインを有効化した時に呼ばれるメソッドを登録
		register_activation_hook(__FILE__, array($this, 'activation'));

		// 管理画面でプラグインを削除した時に呼ばれるメソッドを登録(このメソッドはスタティック)
		register_uninstall_hook(__FILE__, 'Greeting::uninstall');

		// 管理画面にメニューを追加します
		add_action('admin_menu', array($this, 'add_plugin_page'));

		// オプション設定画面の初期化
		add_action('admin_init', array($this, 'page_init'));
	}

	// 管理画面でプラグインを有効化した時に呼ばれる
	public function activation() {

		// 初めての有効化の時は、バージョンと初期の文字列を保存する
		$this->options = get_option('greeting_option');
		if (! $this->options) {
			$setting = array (
				'version' => '1.0.0',
				'text' => '、よろしくお願いします',
			);
			update_option("greeting_option", $setting);
		}
	}

	// 管理画面でプラグインを削除した時に呼ばれる
	public static function uninstall() {
		// オプションをデータベースから削除する
		delete_option('greeting_option');
	}

	// 管理画面の「設定」に「Greeting設定」メニューを追加する
	public function add_plugin_page() {
		add_options_page('Greeting設定', 'Greeting設定', 'manage_options', 'greeting_option', array($this, 'show_admin_page'));
	}

	// オプション設定画面を表示する
	public function show_admin_page() {

		echo '<div class="wrap">';
			echo '<h2>テキスト設定</h2>';
			echo '<form method="post" action="options.php">';
				settings_fields('greeting_option_group');
				do_settings_sections('greeting_option');
				submit_button();
			echo '</form>';
		echo '</div>';
	}

	// オプション設定画面の初期化
	public function page_init() {
		register_setting('greeting_option_group', 'greeting_option', array($this, 'sanitize_callback'));
		add_settings_section('greeting_option_section_id', '', '', 'greeting_option');
		add_settings_field('text', '追加するテキスト', array($this, 'set_text'), 'greeting_option', 'greeting_option_section_id');
	}

	// テキスト入力の作成
	public function set_text() {

		$this->options = get_option('greeting_option');
		$text = isset($this->options['text']) ? $this->options['text'] : '';

		echo '<input type="text" name="greeting_option[text]" value="' . esc_attr( $text ) . '" />';
	}

	// テキスト入力チェック
	public function sanitize_callback($input) {

		$new_input = array();
		if ($input['text']) {
			$new_input['text'] = $input['text'];
		}
		return $new_input;
	}

	// あいさつを表示する
	public function show() {

		$t = intval(date_i18n('G'));
		if ($t > 5 && $t < 10) {
			$str = 'おはようございます〜';
		} elseif ($t >= 10 && $t < 18) {
			$str = 'こんにちは〜';
		} else {
			$str = 'こんばんは〜';
		}
		// オプションに値が設定されていたら、文字列の最後に追加する
		$this->options = get_option('greeting_option');
		if (isset($this->options['text'])) {
			$str .= $this->options['text'];
		}
		return $str;
	}
}
?>

こちらも設定ページの作成 - WordPress Codex 日本語版参考にしてみてください。