get_userdataは内部でキャッシュしているのでデバッグ時は注意

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で定義されている。

Webエンジニアブログにコメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

get_userdataは内部でキャッシュしているのでデバッグ時は注意の記事にコメントを投稿