web-dev-qa-db-ja.com

get_current_user_id()は0を返しますか?

現在ログインしているユーザーのIDをWordPressで取得しようとしています。私は以下のコードを使いました:

function users_list()
{
   global $current_user;
   $current_user =  wp_get_current_user();
   echo 'User ID: ' . $current_user->ID ;
   print_r($current_user);

}

上記のコードは次のように空の結果を返します。

WP_User Object ( [data] => [ID] => 0 [caps] => Array ( ) [cap_key] => [roles] => Array ( ) [allcaps] => Array ( ) [filter] => )
5
PHP Learner

Codexの wp_get_current_user() 情報を参照して、関数はグローバル$current_userオブジェクトを利用し、必要に応じて初期化して使用します。他の人が述べているように、get_current_user_id()はバックエンドでこの関数を使います。

/wp-includes/user.php 、323-327行目(このコードの関数定義)を考えてください。最後の部分では、戻り値はreturn ( isset( $user->ID ) ? (int) $user->ID : 0 );です。ログインユーザが何らかの理由で利用できない場合、このコードは0を返します。

この関数を呼び出すには、initまたはそれ以降のアクションを使用してください。アクションの外でそれを呼び出すことはトラブルにつながる可能性があります。詳細は#14024を見てください。

これはwp_get_current_userのドキュメントから来ています。このコードをテンプレート内で使用している場合は、initがすでに呼び出されていることを確認できます。ただし、そのユーザー情報を無作為に取得しただけでは、beforeinitアクションが呼び出されると、現在のユーザーは取得されません。これは、これらのアクションをfunctions.phpに追加するときにユーザーIDを取得した理由を説明しています(これらのアクションはinitの後に行われるため)が、元のコードでは呼び出したときにはわかりません。

これらのさまざまなアクションが呼び出される順序の一般的な考え方については、 Plugin API ページを参照してください。

5
Justin Bell

常にinitアクションの下でget_current_user_id();を使用してください。

以下はその例です。

add_action('init', 'myFunction');

function myFunction(){

 $user_ID= get_current_user_id();   

   echo"User number $user_ID is loggedin";
}
2
Danish Jamil

他の人が言及したように:あなたがこの関数を早く呼び出しすぎると、値0を返すでしょう。

それが「早すぎる」かどうかをチェックする良い方法は、この種のチェックです。

// Do NOT check for action 'set_current_user', but for 'init'!!
if ( ! did_action( 'init' ) ) {
    _doing_it_wrong( __FUNCTION__, 'get_current_user_id() called before the init hook', null );
}
$user_id = get_current_user_id();

私たちがdid_action('set_current_user')を使わない理由は以下のとおりです。

他のコードや他のプラグインがget_current_user_id()を早く呼び出した場合、フックset_current_userが実行されます。しかし、現時点でのユーザーデータは 正しくない なので、このアクションフックに頼るのはお勧めできません - initが実行された場合に限り、正しいユーザーになることを確認できます。

1
Philipp