Como chamo wp_get_current_user () em um plug-in quando plugins são carregados antes do pluggable.php?

10

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

Eu preciso usar $ current_user.

Aqui está o código que estou usando atualmente:

$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; 
}
PAFoster
fonte
11
Os plug-ins são carregados antes do plugável, mas existem ganchos disponíveis bem depois disso. Publique o código com o qual você está trabalhando e poderemos ajudá-lo a encontrar um gancho melhor.
EAMann
$wp->init(); do_action( 'init' ); // Check site status $file='http://taddy.co.uk/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; }
PAFoster
Eu sei que nada disso está certo, o bit 'init' que eu não entendo, mas foi uma sugestão de outra pessoa. Fiquei com a impressão de que fez algo como carga de um arquivo - no meu caso pluggable.php - realmente tudo necessidade I é apenas US $ current_user-> user_login
PAFoster

Respostas:

8

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

Então, se você estiver colocando isso dentro do seu functions.phparquivo, 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 essa função retorna . Estamos interessados ​​em quando essa função é executada , ou seja, após o pluggable.phparquivo ter carregado e definido sua wp_get_current_user()função.

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

Fazendo isso em um plugin

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

(coloque isso dentro de um arquivo .php dentro da sua pluginspasta)

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 essa técnica com êxito para um tipo de plug-in "Em breve" muito simples que redireciona o usuário para uma página específica, se ele não estiver conectado wp_safe_redirect().

Tom Auger
fonte
como você usaria uma plugins_loadedação para executar wp_safe_redirect()se a página de administração de um plug-in gerar HTML antes header('Location: …')que ele possa ser executado? Estou tendo um problema em que uma página definida usando add_menu_page(…)gera o cabeçalho WP (e o conteúdo e o rodapé) quando o plug-in é carregado, muito antes da plugins_loadedexecução. Eu gostaria de ter acesso a funções internas pluggable.php(para acessar dados do usuário e fazer redirecionamentos), mas isso parece impossível. Você usou add_menu_pagecom plugins_loaded?
Comendador Quinn
11
Não importa, parecia impossível, mas não era - eu tive um erro no meu código. De fato, a ordem de carregamento é exatamente como o esperado: plugins are includedpluggable.php is included'plugins_loaded' is triggered'load-{page_hook}' is triggered'page_hook' is triggered
Quinn Comendant
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 disparadas em uma solicitação típica no Codex ).

Ao tentar disparar seu código diretamente, você está executando um pouco antes do pluggable.phpcarregamento. E você não deve tentar include()esse 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 esta função em qualquer lugar do seu tema sem problemas. Por exemplo:

echo wpse_58429();

Se você precisar usar $current_useroutro 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.

EAMann
fonte
0

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

 global $current_user; 
 //print_r($current_user); //all user related information
echo $current_user->ID; //get current user id 
Inato
fonte
11
Sim, mas você não pode obter $ current_user até que wp_get_current_user () esteja disponível e como essa função está em pluggable.php, ela não estará disponível até depois que os plugins forem carregados. Daí o erro de função indefinido.
PAFoster 13/07/12
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 que você deseja obter o status de login do usuário. Por exemplo:

echo is_logged_in();
mahdi azarm
fonte