この記事は最後に更新してから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_referer | AJAXリクエストのリファラーをチェックする |
wp_redirect | リダイレクトする |
wp_sanitize_redirect | リダイレクトURLをサイタイズする |
wp_safe_redirect | 安全なURLへリダイレクトする |
wp_validate_redirect | URLが安全か調べる |
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
関連
お勧め
get_next_image_link(2021年7月25日 更新)
wp_after_insert_post(2020年12月11日 更新)
wp_save_post_revision(2024年1月10日 更新)
wp_debug_backtrace_summary(2012年6月15日 更新)
nocache_headers(2018年5月27日 更新)