この記事は最後に更新してから1年以上経過しています。

プラグインで注意が必要な関数

説明

先日「Login rebuilder」という自作プラグインをアップデートした際、ユーザーさんからエラーになると連絡をいただいた。標準環境では問題なく、どうやら何らかのプラグインが影響しているらしい。

プラグインで発生したエラーの内容は「Call to undefined function wp_get_current_user」だった。より具体的には、プラグインのアップデートで拡張した wp_redirect関数のフィルター処理内で wp_get_current_user関数を呼び出すところで発生していた。wp_get_current_user関数は、どうやらプラグインの読み込み時には定義されていないということらしい。

wp-includes/pluggable.phpはプラグイン読み込みの後で

WordPressの初期化の流れ」を再確認するとコアファイルであるpluggable.phpファイルの読み込みは、有効なプラグインファイルが読み込まれた後になっている。つまり、プラグインファイルの読み込み時は、pluggable.phpファイルで定義される関数は、準備されていないことになる。

pluggable.phpでどんな関数が定義されているかを整理したのが、次の表である。

関数名機能
wp_set_current_user現在のユーザ情報を設定する
wp_get_current_user現在のユーザ情報を取得する
get_currentuserinfo現在のユーザ情報を読み込む
get_userdataユーザIDを指定し、マッチするユーザ情報を取得する
get_user_byユーザ情報の一部を指定し、マッチするユーザ情報を取得する
cache_usersユーザ情報をキャッシュする
wp_mailメールを送信する
wp_authenticateユーザ名とパスワードでログインできるか調べる
wp_logoutログアウトする
wp_validate_auth_cookie認証クッキーが有効か調べる
wp_generate_auth_cookie認証クッキーを生成する
wp_parse_auth_cookie認証クッキーの情報を解析する
wp_set_auth_cookie認証クッキーを設定する
wp_clear_auth_cookie一連の認証クッキーをクリアする
is_user_logged_inログイン済みか調べる
auth_redirect未ログインならばログインページへリダイレクトする
check_admin_referer管理者ページのリファラーをチェックする
check_ajax_refererAJAXリクエストのリファラーをチェックする
wp_redirectリダイレクトする
wp_sanitize_redirectリダイレクトURLをサイタイズする
wp_safe_redirect安全なURLへリダイレクトする
wp_validate_redirectURLが安全か調べる
wp_notify_postauthorコメント/トラックバック/ピンバックの確認メールを送信する
wp_notify_moderatorコメント/トラックバック/ピンバックのモデレートメールを送信する
wp_password_change_notificationパスワード変更時の確認メールを送信する
wp_new_user_notificationユーザ追加時の確認メールを送信する
wp_nonce_tickナンスの元となる時間依存の値を取得する
wp_verify_nonceナンスの確認する
wp_create_nonceナンスを生成する
wp_saltソルトを取得する
wp_hashハッシュ値を取得する
wp_hash_passwordパスワードのハッシュ値を生成する
wp_check_passwordパスワードをチェックする
wp_generate_passwordパスワードを生成する
wp_rand乱数を取得する
wp_set_passwordパスワードを設定する
get_avatarアバターを取得する
wp_text_diffテキストを比較する

pluggable.phpでは、認証に関連した多数の関数が定義されていることがわかる。そしてこれらは、プラグインによって事前に定義できるように設計されている。

今回のプラグインでエラーになった理由は、何らかのプラグインが読み込み時にwp_redirect関数を呼び出したことにより、こちらのプラグインが登録したフィルター関数が呼び出されてしまい、結果的にエラーとなったようだ。このことを踏まえると、プラグインではプラグインファイルの読み込み時に上記の関数を使用しないことはもちろんのこと、プラグインが登録するフィルターやアクション関数内で上記の関数の使用する場合に注意しなければならない。

この対策としては、次に示すように関数が定義されているか事前に確認するのが有効だろう。

if ( function_exists( 'wp_get_current_user' ) ) {
	// wp_get_current_user関数が定義されている場合
	$user = wp_get_current_user();
} else {
	// wp_get_current_user関数が未定義の場合
	$user = (object)array( 'data'=>null );
}

最終更新 : 2013年11月27日 16:27


お勧め

restore_previous_locale(2018年11月21日 更新)

string | bool restore_previous_locale()
直前のロケールへ戻す。

is_email(2017年11月28日 更新)

mixed is_email( string $email [, bool $deprecated = false ] )
文字列がメールアドレス形式か調べる。

is_rtl(2015年8月26日 更新)

bool is_rtl( )
現在のロケールが右書き(文字を右から左へ書き進めること)か調べる。

get_parent_theme_file_path(2018年5月27日 更新)

string get_parent_theme_file_path( string $file = '' )
親テーマ内にあるファイルのパス名を取得する。

is_page(2018年7月4日 更新)

bool is_page( [ mixed $page = '' ] )
要求されているページが、ページか調べる。