Como faço para chamar wp_get_current_user () em um plugin quando plugins são carregados antes de pluggable.php?

9

O resultado atual é "PHP Erro fatal: Chame a função indefinida wp_get_current_user ()", o que faz sentido, mas não ajuda.

Eu preciso usar $ current_user.

Aqui está o código que estou usando no momento:

$wp->init(); 
do_action( 'init' ); // Check site status 
$file='http://xxxxxxxx.com/wp-admin/wp_includes/pluggable.php'; 
if ( is_multisite() ) { 
    if ( true !== ( $file = ms_site_check() ) ) { 
        require( $file );
        die(); 
    } 
    unset($file); 
}

// Get the current user's info 
$current_user = wp_get_current_user(); 

if ( !($current_user instanceof WP_User) ) 
    return; 

echo $current_user->user_login; 

function paf_uname(){ 
    return $current_user->user_login; 
}
    
por PAFoster 13.07.2012 / 22:54

4 respostas

7

Para adicionar à resposta do @ EAMann, você precisa agrupar sua chamada wp_get_current_user() (ou qualquer chamada que tente acessar uma função definida em pluggable.php ) dentro da ação 'plugins_loaded' .

Então, se você colocar isso no arquivo functions.php , faça assim:

add_action( 'plugins_loaded', 'get_user_info' );

function get_user_info(){
  $current_user = wp_get_current_user(); 

  if ( !($current_user instanceof WP_User) ) 
    return; 

  echo $current_user->user_login;

  // Do the remaining stuff that has to happen once you've gotten your user info
}

Observe que não estamos interessados no que esta função retorna . Estamos interessados em quando esta função executa , ou seja, após o arquivo pluggable.php carregou e definiu sua função wp_get_current_user() .

Portanto, não espere fazer nada com o valor de retorno para essa função. Em vez disso, considere essa função como o ponto de partida de tudo o que você deseja fazer depois de obter as informações do usuário atual.

Fazendo isso em um plugin

Por questão de integridade, aqui está como você acessaria uma função conectável semelhante dentro do contexto do seu próprio plugin:

(coloque isso dentro de um arquivo .php dentro da pasta plugins )

class WPSE_58429 {
    public function __construct(){
        add_action( 'plugins_loaded', array( $this, 'check_if_user_logged_in' ) );
    }

    public function check_if_user_logged_in(){
        if ( is_user_logged_in() ){
           // ... do stuff for your logged-in user
        }
    }
}

$wpse_58429_plugin = new WPSE_58429();

Eu usei esta técnica com sucesso para um tipo de plugin "Coming Soon" muito simples que redireciona o usuário para uma página específica se ele não estiver logado usando wp_safe_redirect() .

    
por Tom Auger 05.04.2013 / 16:59
3

O problema é que você está tentando carregar o código diretamente, e não com um gancho do WordPress. O WordPress carrega um monte de código em uma ordem específica (você pode ver a lista de ações acionadas em uma solicitação típica no Codex ).

Ao tentar disparar seu código diretamente, você está executando pouco antes de pluggable.php ser carregado. E você não deve tentar include() este arquivo diretamente. Deixe o WordPress fazer isso por você.

Em vez disso, defina uma função que obtenha as informações do usuário:

function wpse_58429() {
    // Get the current user's info 
    $current_user = wp_get_current_user(); 

    if ( !($current_user instanceof WP_User) ) 
        return; 

    return $current_user->user_login; 
}

Você pode usar essa função em qualquer lugar do seu tema sem problemas. Por exemplo:

echo wpse_58429();

Se você precisar usar $current_user em outro código, certifique-se de disparar esse código com uma ação do WordPress ... não o chame diretamente ou ele será executado antes que a função esteja disponível.

    
por EAMann 16.07.2012 / 17:37
0

Parece que você está carregando seu código antes que certas funções estejam disponíveis. Você já tentou:

 global $current_user; 
 //print_r($current_user); //all user related information
echo $current_user->ID; //get current user id 
    
por Innate 13.07.2012 / 23:38
0

Basta adicionar esta função ao seu arquivo .php do plugin

function is_logged_in(){
    if(function_exists( 'is_user_logged_in' )) {
        return is_user_logged_in();
    }
}

Em seguida, chame-o em qualquer lugar para obter o status de login do usuário. Por exemplo:

echo is_logged_in();
    
por mahdi azarm 23.07.2017 / 01:24