get_userdataでキャッシュされたデータを削除するclean_user_cache
wordpressはパフォーマンス向上のため様々な場所でデータをキャッシュしている
get_userdata($id)では、$idで指定したユーザーのデータを、
- users
- usermeta
という二つのグローバルテーブルからデータを取得することができる。以下のようにして$user_infoの中身を確認しているだけでは気付かないが、
$user_info = get_userdata(2); var_dump($user_info);
get_userdataの内部ではデータのキャッシュが行われている。もちろんパフォーマンスアップのためにそのような実装になっているのだと思うが、わけあってquery filter hookを利用して特定の条件に合致する場合には、queryをnullにしてSQLを実行しないようにしてみた。具体的には、グローバルテーブルである、wp_usersとwp_usermetaテーブルに対するSQLを強制的にnullにしてデータを返さないようにした。
フィルターフックの設定
add_filter('query', array($this, 'wp_users_delete') );
独自関数の内容
function wp_users_delete( $query ) { if( strpos($query, 'users') !== false or strpos($query, 'usermeta') !== false ) { $query = null; } return $query; }
上のように設定するとusersとusermetaテーブルに対するSQLは発行されなくなる。しかし、get_userdataを一度目に実行したデータをキャッシュしているので、SQL文が空なのにも関わらずユーザーデータが返される。そのためデバッグ時はキャッシュされたデータを毎回削除する処理を入れておくと開発がしやすくなる。
キャッシュの削除はclean_user_cacheで行うことができ、具体的には以下のように行う。
$user_info = get_userdata(2); clean_user_cache(2); var_dump($user_info);
clean_user_cacheは、
wp-includes/user.phpで定義されている。