Cómo llamar a wp_get_current_user() en un plugin cuando los plugins se cargan antes que pluggable.php

13 jul 2012, 23:54:48
Vistas: 32.5K
Votos: 11

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; 
}
3
Comentarios

Los plugins se cargan antes que pluggable, pero hay hooks disponibles mucho después de eso. Publica el código con el que estás trabajando y podríamos ayudarte a encontrar un mejor hook.

EAMann EAMann
14 jul 2012 02:31:45

`$wp->init(); do_action( 'init' );

// Verificar estado del sitio $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); }

// 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; }`

PAFoster PAFoster
14 jul 2012 23:15:44

Sé que nada de eso está correcto, la parte de 'init' no la entiendo pero fue una sugerencia de alguien más.

Tenía la impresión de que hacía algo como cargar un archivo - en mi caso pluggable.php - en realidad todo lo que necesito es simplemente $current_user->user_login

PAFoster PAFoster
14 jul 2012 23:20:29
Todas las respuestas a la pregunta 4
2

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().

5 abr 2013 17:59:59
Comentarios

¿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?

Quinn Comendant Quinn Comendant
23 may 2015 03:45:54

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 incluyenpluggable.php se incluyese dispara 'plugins_loaded'se dispara 'load-{page_hook}'se dispara 'page_hook'

Quinn Comendant Quinn Comendant
23 may 2015 04:33:49
0

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.

16 jul 2012 18:37:41
1

Parece que estás cargando tu código antes de que ciertas funciones estén disponibles. ¿Has probado?:

 global $current_user; 
 //print_r($current_user); //toda la información relacionada con el usuario
echo $current_user->ID; //obtener el ID del usuario actual 
14 jul 2012 00:38:51
Comentarios

Sí, pero no puedes obtener $current_user hasta que wp_get_current_user() esté disponible y dado que esa función está en pluggable.php, no está disponible hasta después de que los plugins se carguen. De ahí el error de función no definida.

PAFoster PAFoster
14 jul 2012 02:00:03
0

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();
23 jul 2017 02:24:59