PHP
WordPress

wordpressプラグイン開発でwordpressの関数が効かない時

そのwordpress関数はプラガブル関数かもしれません

プラガブル関数の特徴

・wordpress標準関数なのだけれども書き換えができるというもの。
・プラガブル関数はプラグインが読み込まれた後に読み込まれる関数
・今後は増えることはない予定とのこと

参考資料

wiki
こちらのページも参考になりました

以下の場所に定義されています。
wp-includes\pluggable.php

関数名一覧(非推奨関数含まれるので注意です。)

auth_redirect
cache_users/en
check_admin_referer
check_ajax_referer/en
get_avatar
get_currentuserinfo (非推奨)
get_user_by_email/en (非推奨)
get_user_by
get_userdatabylogin (非推奨)
get_userdata
is_user_logged_in
wp_authenticate/en
wp_check_password/en
wp_clear_auth_cookie/en
wp_create_nonce/en
wp_generate_auth_cookie/en
wp_generate_password/en
wp_get_current_user/en
wp_hash_password/en
wp_hash/en
wp_logout
wp_mail
wp_new_user_notification
wp_nonce_tick/en
wp_notify_moderator
wp_notify_postauthor
wp_parse_auth_cookie/en
wp_password_change_notification/en
wp_rand/en
wp_redirect
wp_safe_redirect
wp_salt/en
wp_sanitize_redirect/en
wp_set_auth_cookie/en
wp_set_current_user
wp_set_password/en
wp_text_diff/en
wp_validate_auth_cookie/en
wp_validate_redirect/en
wp_verify_nonce

wp_get_current_userの場合

今回wp_get_current_userを使用していて効かなかったので
体験談をメモしたいと思います。

ソースコード

プラグイン.php
function my_special_function () {
    $my_original_current_user = wp_get_current_user();
    echo <<<TEST
    <p style="font-size: 350px; color: red;">$my_original_current_user->user_login</p>
    TEST;
}

my_special_function ();

エラーメッセージ

Fatal error: Call to undefined function

これは当然といえば当然ですね。
プラガブル関数はプラグインが読み込まれた後に読み込まれますので。

解決策

修正.php
add_action('plugins_loaded','my_special_function');
function my_special_function () {
     $my_original_current_user = wp_get_current_user();
     echo <<<TEST
     <p style="font-size: 350px; color: red;">$my_original_current_user->user_login</p>
     TEST;
}

plugins_loadedというアクションフックは有効なプラグインとプラガブルな関数が読み込まれた後に
実行されるとのことでもう一度このタイミングで実行することでプラガブル関数を実行できるようですね。

覚書

プラガブル関数は上書きできるという体の物だが
基本的には上書きする前にクラスでの継承ができないか
フックが使えないかなどを検討したほうがよさそう。

関数全般について

これはwordpressプラガブル関数に限らずだと思いますが
グローバルに関数を定義する際はif ( !function_exists() )で囲むなり
カプセル化するなり、名前空間をつかうなりして関数名のバッティングを避けるようにするとよい。
※グローバルにはなるべく変数も関数も定義しないほうがよさそう