Cómo llamar a wp_get_current_user() en un plugin cuando los plugins se cargan antes que pluggable.php
El resultado actual es "PHP Fatal error: Call to undefined function wp_get_current_user()" lo cual tiene sentido, pero no ayuda.
Necesito usar $current_user.
Este es el código que estoy usando actualmente:
$wp->init();
do_action( 'init' ); // Verificar estado del sitio
$file='http://xxxxxxxx.com/wp-admin/wp_includes/pluggable.php';
if ( is_multisite() ) {
if ( true !== ( $file = ms_site_check() ) ) {
require( $file );
die();
}
unset($file);
}
// Obtener información del usuario actual
$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;
}
Para agregar a la respuesta de @EAMann, necesitas envolver tu llamada a wp_get_current_user()
(o cualquier llamada que intente acceder a una función definida dentro de pluggable.php
) dentro de la acción 'plugins_loaded'
.
Entonces, si estás colocando esto dentro de tu archivo functions.php
, hazlo así:
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;
// Haz lo que necesites una vez que tengas la información del usuario
}
Ten en cuenta que no nos interesa lo que esta función devuelva. Nos interesa cuándo se ejecuta esta función, es decir, después de que el archivo pluggable.php
se haya cargado y haya definido tu función wp_get_current_user()
.
Así que no esperes hacer nada con el valor de retorno de esta función. En su lugar, considera esta función como el punto de partida para todo lo que quieras hacer una vez que tengas la información del usuario actual.
Haciéndolo en un plugin
Para ser completos, aquí está cómo accederías a una función pluggable similar desde el contexto de tu propio plugin:
(coloca esto dentro de un archivo .php en tu carpeta 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() ){
// ... haz algo para tu usuario conectado
}
}
}
$wpse_58429_plugin = new WPSE_58429();
He usado esta técnica con éxito para un plugin muy simple tipo "Próximamente" que redirige al usuario a una página específica si no ha iniciado sesión usando wp_safe_redirect()
.

¿Cómo usarías una acción plugins_loaded
para ejecutar wp_safe_redirect()
si la página de administración de un plugin genera HTML antes de que header('Location: …')
tenga la oportunidad de ejecutarse? Tengo un problema donde una página definida usando add_menu_page(…)
muestra el encabezado de WP (y el contenido y el pie de página) cuando el plugin se carga, mucho antes de que se ejecute plugins_loaded
. Me gustaría tener acceso a funciones dentro de pluggable.php
(para acceder a datos de usuario y hacer redirecciones) pero esto parece imposible. ¿Has usado add_menu_page
con plugins_loaded
?

No importa, parecía imposible, pero no lo era—tenía un error en mi código. De hecho, el orden de carga es exactamente como se esperaba: los plugins se incluyen
→ pluggable.php se incluye
→ se dispara 'plugins_loaded'
→ se dispara 'load-{page_hook}'
→ se dispara 'page_hook'

El problema es que estás intentando cargar el código directamente en lugar de usar un hook de WordPress. WordPress carga una serie de códigos en un orden específico (puedes ver la lista de acciones que se ejecutan en una solicitud típica en el Codex).
Al intentar ejecutar tu código directamente, lo estás haciendo justo antes de que se cargue pluggable.php
. Y no deberías intentar hacer include()
de este archivo directamente. Deja que WordPress se encargue de eso.
En su lugar, define una función que obtenga la información del usuario:
function wpse_58429() {
// Obtener la información del usuario actual
$current_user = wp_get_current_user();
if ( !($current_user instanceof WP_User) )
return;
return $current_user->user_login;
}
Luego puedes usar esta función en cualquier parte de tu tema sin problemas. Por ejemplo:
echo wpse_58429();
Si necesitas usar $current_user
en otro código, asegúrate de ejecutar ese código con una acción de WordPress... no lo llames directamente o se ejecutará antes de que la función esté disponible.

Simplemente añade esta función a tu archivo .php del plugin
function is_logged_in(){
if(function_exists( 'is_user_logged_in' )) {
return is_user_logged_in();
}
}
Luego llámala en cualquier lugar donde necesites verificar el estado de login del usuario. Por ejemplo:
echo is_logged_in();
