WordPressソースコードリーディングで現在のユーザを取得するところについての記述

WordPressのソースコードを徘徊してたら、面白いところが見つかりました。
ちなみに、僕のソースコードを読む時の戦略は、「眺める」ことです。わけわかめでも大丈夫。だんだんわかってくるから、重要なことは、毎日読むことだと思います。
金かかる学習プラットフォームや、本を買うよりいいと思います。
決して、自然言語を読むように読んではいけません。
僕は、PhpStormがいいと聞いていたので、PhpStormを使っています。ソースコードのトレースもスムーズにできるので、便利です。
では、解説していきたいと思います。

```　
/**
 * Retrieves the current user object.
 *
 * Will set the current user, if the current user is not set. The current user
 * will be set to the logged-in person. If no user is logged-in, then it will
 * set the current user to 0, which is invalid and won't have any permissions.
 *
 * This function is used by the pluggable functions wp_get_current_user() and
 * get_currentuserinfo(), the latter of which is deprecated but used for backward
 * compatibility.
 *
 * @since 4.5.0
 * @access private
 *
 * @see wp_get_current_user()
 * @global WP_User $current_user Checks if the current user is set.
 *
 * @return WP_User Current WP_User instance.
 */
function _wp_get_current_user() {
	global $current_user;

	if ( ! empty( $current_user ) ) {
		if ( $current_user instanceof WP_User ) {
			return $current_user;
		}

		// Upgrade stdClass to WP_User
		if ( is_object( $current_user ) && isset( $current_user->ID ) ) {
			$cur_id = $current_user->ID;
			$current_user = null;
			wp_set_current_user( $cur_id );
			return $current_user;
		}

		// $current_user has a junk value. Force to WP_User with ID 0.
		$current_user = null;
		wp_set_current_user( 0 );
		return $current_user;
	}

	if ( defined('XMLRPC_REQUEST') && XMLRPC_REQUEST ) {
		wp_set_current_user( 0 );
		return $current_user;
	}

	/**
	 * Filters the current user.
	 *
	 * The default filters use this to determine the current user from the
	 * request's cookies, if available.
	 *
	 * Returning a value of false will effectively short-circuit setting
	 * the current user.
	 *
	 * @since 3.9.0
	 *
	 * @param int|bool $user_id User ID if one has been determined, false otherwise.
	 */
	$user_id = apply_filters( 'determine_current_user', false );
	if ( ! $user_id ) {
		wp_set_current_user( 0 );
		return $current_user;
	}

	wp_set_current_user( $user_id );

	return $current_user;
}
```
この関数は、現在のユーザを設定します。ログインしているユーザがいる場合は、ログインしているユーザとして設定し、誰もログインしていないときは、０を返します。
この関数は、Pluggableである関数、wp_get_current_user()から呼び出されることがあります。

```
	global $current_user;
```
このグローバルというのは、\$current_userをグローバル変数とします。\$current_userは、現在のユーザーをグローバルで格納しているようです。

```
	if ( ! empty( $current_user ) ) {
		if ( $current_user instanceof WP_User ) {
			return $current_user;
		}

		// Upgrade stdClass to WP_User
		if ( is_object( $current_user ) && isset( $current_user->ID ) ) {
			$cur_id = $current_user->ID;
			$current_user = null;
			wp_set_current_user( $cur_id );
			return $current_user;
		}

		// $current_user has a junk value. Force to WP_User with ID 0.
		$current_user = null;
		wp_set_current_user( 0 );
		return $current_user;
	}
```
この部分では、if ( ! empty( \$current_user ) ) {  によって、現在のユーザが設定されているかどうかをチェックして、設定されていたら、

```
		if ( $current_user instanceof WP_User ) {
			return $current_user;
		}
```
この部分により、\$current_userが、WP_Userのインスタンスであるかどうかをチェックします。インスタンスであったなら、\$current_userを返り値として、関数を返します。普通ですよね

```
		// Upgrade stdClass to WP_User
		if ( is_object( $current_user ) && isset( $current_user->ID ) ) {
			$cur_id = $current_user->ID;
			$current_user = null;
			wp_set_current_user( $cur_id );
			return $current_user;
		}
```
\$current_userが、stdClassである可能性を考えています。そんなことあるんですね。\$current\_user->IDが設定されていた場合、wp\_set\_current\_user( \$cur\_id );によって、\$cur\_idを\$current\_userにセットした後、\$current\_userを返します。
この関数だけ見ると、\$current\_userに、\$cur\_idがセットされていないように感じますが、一応設定されているようです。
ただ、ちょっとやるべきプロセスがあるようで、単純な代入ではないようです。では、wp\_set\_current\_user( $cur\_id );によって、どのようなプロセスが実行されているかを見てみましょう。

```
function wp_set_current_user($id, $name = '') {
	global $current_user;

	// If `$id` matches the user who's already current, there's nothing to do.
	if ( isset( $current_user )
		&& ( $current_user instanceof WP_User )
		&& ( $id == $current_user->ID )
		&& ( null !== $id )
	) {
		return $current_user;
	}

	$current_user = new WP_User( $id, $name );

	setup_userdata( $current_user->ID );

	/**
	 * Fires after the current user is set.
	 *
	 * @since 2.0.1
	 */
	do_action( 'set_current_user' );

	return $current_user;
}
```
`$current_user = new WP_User( $id, $name );`によって、ユーザーidを設定していますね。あとは、`setup_userdata( $current_user->ID );`を起動しており、また、`do_action( 'set_current_user' );`を起動しています。
`function setup_userdata($for_user_id = '') `は、後方互換性のためのもののようで、こういうアプリを作るときは、後方互換性は重要になってくるのかもしれません。
`do_action( 'set_current_user' );`では、'set_current_user'で指定された関数をフックするようです。ちょっとなぜフックする必要があるのかはよくわからないです。


最初のソースコードに、`XMLRPC_REQUEST`という謎のキーワードがありますが、XMLRPCリクエストという、そういうリクエストが存在するようですね。
https://ja.wikipedia.org/wiki/XML-RPC
これは、XMLRPCリクエストには、ユーザーという概念がない（と僕は予測する）ので、`wp_set_current_user( 0 );`によって、カレントユーザーを０に設定して、返すんだと思います。

ところで、最近、ソースコードを読んで実行させずに、本ばっかり読むことは、「恋愛本ばかり読んで、女性に触れようとしない」（女性の場合は、（女性→男性）に読み替えてください。）のと同じかなと思い始めました。