wp-includes/pluggable.phpをrequire_onceしちゃ駄目という話

INDEX

  1. 前置き
  2. 問題となったコード
  3. やっちゃ駄目な解決方法
  4. pluggable.phpはオーバーライドできる関数なのでreuqire_onceしちゃ駄目
  5. 修正後のコード

前置き

WordPress でスニペットを簡単に管理する方法 : dogmap.jpを参考にこれまでfunctions.phpに記述していたスニペットをプラグインで管理するようにしました。簡潔に説明するとプラグインディレクトリ下にスニペット格納用ディレクトリを設置して、スニペットが必要な時にはその中にphpファイルを保存していく、というものです。

そこでいくつかファイルを放り込んで行ったのですがとある箇所でエラーが発生したのでその解決方法なり原因をシェアします。

問題となったコード

	if ( !current_user_can( 'edit_users' ) ) {

		function remove_menus() {
			global $menu;

			unset( $menu[2] ); // ダッシュボード
			unset( $menu[5] ); // 投稿
			// 省略
			unset( $menu[80] ); // 設定
		}

		add_action( 'admin_menu', 'remove_menus' );
	}
	

エラーが発生したのが上記コードです。
特定権限ユーザ以下の場合、管理画面のメニューを表示しないというものです。

エラー内容は次の通り。

Fatal error: Call to undefined function wp_get_current_user() in C:\xampp\htdocs\wordpress\wp-includes\capabilities.php on line 1187

wp-includes/capabilities.phpの1187行目にあるwp_get_current_user()が未定義とのこと。
で、wp_get_current_user()はwp-includes/pluggable.phpで定義されているからどうやらpluggable.phpがプラグイン読み込み時に読み込まれていないのが問題らしい。

	function current_user_can( $capability ) {
	$current_user = wp_get_current_user();

	if ( empty( $current_user ) )
		return false;

	$args = array_slice( func_get_args(), 1 );
	$args = array_merge( array( $capability ), $args );

	return call_user_func_array( array( $current_user, 'has_cap' ), $args );
	}
	

やっちゃ駄目な解決方法

上記エラー内容で検索を掛けるとよく目にした解決方法がこちら。

	// プラグインの先頭でpluggable.phpをrequire_onceする
	require_once ( ABSPATH.WPINC . '/pluggable.php');
	if ( !current_user_can( 'edit_users' ) ) {
		// 省略
	}
	

これでエラーが出ず処理も問題なく行われるようになったのですが(実際これでしばらく動かしてしまっていました)Ktai Styleプラグインを入れると以下のエラーが出るように。
auth_redirect()の関数名が重複してしまっているとのこと。
どうやら上記解決方法は問題がある模様・・・

Fatal error: Cannot redeclare auth_redirect() (previously declared in C:\xampp\htdocs\wordpress\wp-includes\pluggable.php:731) in C:\xampp\htdocs\wordpress\wp-content\plugins\ktai-style\admin\pluggable-override.php on line 13

pluggable.phpはオーバーライドできる関数なのでreuqire_onceしちゃ駄目

ここらでよくわからなくなったのでtwitterでつぶやいて見ることに。

https://twitter.com/#!/jim0912/status/176716235998900225

@jim0912さんからダメとのご意見を頂いたのでやはり問題のある方法みたいだったので更に調べて見ることに。

そこで参考になったのが以下のサイト。

要はpluggable.php内の関数はプラグインでの再定義を意図した関数であるから先に定義するなっ、と。
例えばwp_get_current_user()を例にとると

  1. プラグインでwp_get_current_user関数を再定義
  2. pluggable.php読み込み時にwp_get_current_user関数が定義されていれば飛ばし、定義されていなれけばpluggable.php内のwp_get_current_user関数を読み込む

という流れになります。
なので先のKtai Styleの場合で、pluggable.phpをrequire_onceしてしまっていると以下のような流れになってバッティングしてしまいます。

  1. プラグインの先頭でpluggable.phpがrequire_onceされ関数が先に定義されてしまう
  2. Ktai Styleプラグインが読み込まれpluggable.phpで使用されている関数と同じ物を定義(←バッティング)

修正後のコード

というわけでフックを使いましょう、というご意見を頂いたので以下の様にしてみました。
一応問題はないと思いますがフック等の理解がまだ微妙なので合ってるか分かりません・・・

		function remove_menus() {
			if ( !current_user_can( 'edit_users' ) ) {
				global $menu;
	
				unset( $menu[2] ); // ダッシュボード
				unset( $menu[5] ); // 投稿
				// 省略
				unset( $menu[80] ); // 設定
			}
		}
		add_action( 'admin_init', 'remove_menus' );
	

NetBeans IDE 7.1でプラグインを無効化したら動かなくなった対処法

NetBeans IDE 7.1は動作が軽いので愛用してるのですが更に軽くできないかと “ツール > プラグイン > インストール済み” を見ると有効になっているプラグインがいっぱい。
「PHP Smarty フレームワーク」とか使ってないし・・・と不要っぽいプラグインを無効化していったら動かなくなったので対処法を。
NetBeans IDE 7.1 プラグイン画面

起動しても何も表示されないorz

プラグインを適当に無効化した後再起動すると下の様な感じに。
エディターもプロジェクトもメニューすら表示されていません。
NetBeans IDE 動作しないよ

右下を見ると何やら赤い警告が。クリックしてみると。
エラー警告
更に警告の詳細を見てみる。
エラー警告詳細
Javaらしきエラーが表示されているようですがさっぱりわかりません。

というわけでいつものようにGoogle先生に頼ることに。
プラグインを無効にしたのだからその設定ファイルがあるはず。ということで辿り着いたのがこちら。
自分実験室 : netbeansプラグインの有効・無効化を直接切り替える

プラグインの有効・無効を直接切替える

プラグインの設定ファイルは “C:\Users\(ユーザ名)\.netbeans\7.1\config\Modules\” にxmlファイルで格納されているとのこと。
プラグイン設定ファイル郡

これらxmlファイルにプラグインの有効・無効の設定が保存されているので全て有効にしていくことに。
以下はzencodingプラグイン設定xmlファイルの中身です。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//NetBeans//DTD Module Status 1.0//EN"
                        "http://www.netbeans.org/dtds/module-status-1_0.dtd">
<module name="org.lorenzos.zencoding">
    <param name="autoload">false</param>
    <param name="eager">false</param>
    <param name="enabled">false</param>
    <param name="jar">modules/org-lorenzos-zencoding.jar</param>
    <param name="reloadable">false</param>
</module>
	

7行目に有効・無効の設定値enabledがあるので有効にするために値をtrueに変更します。
動かなくなった原因はコアプラグインを無効化したことだろうけど、どれが原因かわからなかったので取り敢えず全ての設定をtrueに修正しました。

そしてNetBeans IDEを再起動!
みごとメニューも表示され問題なく動作もするのですがまだ右下に警告が。

キャッシュがどーとか、ロックが掛かってるとか・・・よくわかりません。
でも “C:\Users\(ユーザ名)\.netbeans\7.1\var\cache\” あたりが原因かな、ということでchcheフォルダをバックアップを取った後削除。
再度再起動。
ようやくエラーも表示されず見慣れた画面が表示されました。

というわけで、設定はあまり弄り過ぎないようにという教訓でした。

第1回WordPressお茶会 – WordBench香川 – WordPressのインストール

ローカル環境が整ったのでWordPressをインストールしていきます。
今回はドキュメントルートの確認(Windows7 64bit環境 / Mac OS X 64bit環境)の項で作成した wbkagawa フォルダにWordPressをインストールしたいと思います。

WordPress本体の準備

WordPress | 日本語 サイトの「WordPress 3.2.1 をダウンロード .zip — 4.2 MB」(2011/11/15現在)よりWordPressをダウンロードして解凍してください。

展開された wordpress フォルダを wbkagawa フォルダへ移動させておいてください。

データベースの準備

WordPressはMySQLデータベースを必要とします。
XAMPP、MAMPは共にMySQL管理ツールphpMyAdminがインストールされているのでこちらを使用してデータベースを作成していきます。
phpMyAdminの場所は以下を参照ください。
(なおphpMyAdminのキャプチャ画面はXAMPPのphpMyAdmin3.4.5の為、MAMP環境では多少仕様が異なります。)

Windows7 64bit環境
Mac OS X 64bit環境

phpMyAdminのログイン画面が表示されるのでXAMPPのセキュリティで設定したMySQL rootパスワードを入力してください。
(Mac OS Xではログイン画面は表示されません。(ハンズオン時に説明予定))

phpMyAdminのホーム画面です。「データベース」よりデータベースを作成していきます。

「新規データベースを作成する」のテキストボックスにデータベース名(今回はwbkagawa)を入力して「作成」をクリック。

wbkagawaデータベースが作成されました。

WordPressのインストール

WordPress本体、データベースの準備が完了したのでWordPressをインストールしていきます。
http://localhost/wbkagawa/wordpress/ へアクセスして「設定ファイルを作成する」をクリック。

データベース関連の説明を一通り読んで「次に進みましょう!」をクリック。

「データベース名」は先程作成した”wbkagawa”。
「ユーザ名」はXAMPPの場合”root”、「パスワード」はセキュリティの項で設定したパスワード、MAMPの場合は「ユーザ名」「パスワード」共に”root”(MAMPのデフォルト設定です)。
(今回はローカル環境なのでroot権限にしていますが、本番環境では別途ユーザを作成、パスワードも推測し難いものを設定してください。)
「データベースのホスト名」と「テーブル接頭辞」はデフォルトのまま。

設定に間違えがあったりMySQLを起動してない場合以下のようなエラーが表示されるので再度設定を確認してください。

問題なければインストール準備完了となるので、「インストール実行」をクリック。

「ユーザ名」はデフォルトの”admin”以外の任意のユーザ名を入力。
「メールアドレス」に登録したアドレスに本来ならログインURL、ユーザ名、パスワードが届きますが今回はローカルでのメール送信設定を行なっていないため届きません。パスワードは後程必要となるので控えておいてください。
その他入力が完了したら「WordPressをインストール」をクリック。

以上でWordPressインストール完了です。「ログイン」をクリックしてログイン画面へ。

登録したユーザ名・パスワードを入力して「ログイン」。