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

プラグインで注意が必要な関数 - 自作プラグインで「Call to undefined function」が発生したので調べてみた

説明

先日「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 );
}

関連

お勧めコンテンツ

get_theme_mod(2012年6月9日 登録)

string get_theme_mod( string $name [ , mixed $default = false ] )
現在のテーマ固有のプロパティ値を取得する。

get_the_posts_navigation(2014年12月24日 登録)

string get_the_posts_navigation( [ array $args = array() ] )
アーカイブページ向けのナビゲーションを取得する。

is_404(2009年11月26日 登録)

bool is_404( )
要求されているページが、404ページ(投稿データが見つからない)か調べる。

wp_image_matches_ratio(2016年8月17日 登録)

bool wp_image_matches_ratio( int $source_width, int $source_height, int $target_width, int $target_height )
2つの幅と高さが同じアスペクト比か調べる。

wp_send_json(2012年12月12日 登録)

void wp_send_json( mixed $response, int $status_code = null )
AjaxリクエストのレスポンスとしてJSON情報を返す。

最終更新日時 : 2013-11-27 16:27