¿Cómo llamo a wp_get_current_user () en un complemento cuando los complementos se cargan antes de pluggable.php?

10

El resultado actual es "Error fatal de PHP: Llamada a la función indefinida wp_get_current_user ()" que tiene sentido, pero no ayuda.

Necesito usar $ current_user.

Aquí está el código que estoy usando actualmente:

$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
fuente
1
Los complementos se cargan antes de que se puedan enchufar, pero hay ganchos disponibles mucho después de eso. Publique el código con el que está trabajando y podríamos ayudarlo a encontrar un mejor enlace.
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
Sé que nada de eso es correcto, el bit 'init' no lo entiendo, pero fue una sugerencia de otra persona. Tenía la impresión de que hizo algo como cargar un archivo, en mi caso pluggable.php, realmente todo lo que necesito es solo $ current_user-> user_login
PAFoster

Respuestas:

8

Para agregar a la respuesta de @ EAMann, debe ajustar su wp_get_current_user()llamada (o cualquier llamada que intente acceder a una función definida dentro pluggable.php) dentro de la 'plugins_loaded'acción.

Entonces, si está poniendo esto dentro de su functions.phparchivo, hágalo 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;

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

Tenga en cuenta que no estamos interesados ​​en lo que devuelve esta función . Nos interesa cuándo se ejecuta esta función , es decir, después de que el pluggable.phparchivo se haya cargado y definido su wp_get_current_user()función.

Por lo tanto, no espere hacer nada con el valor de retorno para esta función. En cambio, considere esta función como el punto de partida para todo lo que desea hacer una vez que tenga la información del usuario actual.

Haciéndolo en un complemento

En aras de la exhaustividad, así es como accedería a una función conectable similar desde el contexto de su propio complemento:

(pon esto dentro de un archivo .php dentro de tu pluginscarpeta)

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

He utilizado esta técnica con éxito para un tipo de complemento "Próximamente" muy simple que redirige al usuario a una página específica si no está conectado usando wp_safe_redirect().

Tom Auger
fuente
¿cómo usaría una plugins_loadedacción para ejecutar wp_safe_redirect()si la página de administración de un complemento genera HTML antes de que header('Location: …')tenga la oportunidad de ejecutarse? Tengo un problema en el que una página definida usando los add_menu_page(…)resultados del encabezado WP (y el contenido y el pie de página) cuando se carga el complemento, mucho antes de plugins_loadedejecutarse. Me gustaría tener acceso a las funciones internas pluggable.php(para acceder a los datos del usuario y hacer redirecciones), pero esto parece imposible. ¿Has usado add_menu_pagecon plugins_loaded?
Quinn Commandado
1
No importa, parecía imposible, pero no fue así: tuve un error en mi código. De hecho, el orden de carga es exactamente como se esperaba: plugins are includedpluggable.php is included'plugins_loaded' is triggered'load-{page_hook}' is triggered'page_hook' is triggered
Quinn Comendant
3

El problema es que está intentando cargar el código directamente en lugar de hacerlo con un gancho de WordPress. WordPress carga un montón de código en un orden específico (puede ver la lista de acciones activadas en una solicitud típica en el Codex ).

Al intentar disparar su código directamente, está ejecutando justo antes de que pluggable.phpse cargue. Y no debe intentar include()este archivo directamente. Deja que WordPress haga eso por ti.

En su lugar, defina una función que obtenga la información del usuario:

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

Luego puede usar esta función en cualquier parte de su tema sin problemas. Por ejemplo:

echo wpse_58429();

Si necesita usar $current_userotro código, asegúrese de activar ese código con una acción de WordPress ... no lo llame directamente o se ejecutará antes de que la función esté disponible.

EAMann
fuente
0

Parece que está cargando su código antes de que ciertas funciones estén disponibles. Has probado:

 global $current_user; 
 //print_r($current_user); //all user related information
echo $current_user->ID; //get current user id 
Innato
fuente
1
Sí, pero no puede obtener $ current_user hasta que wp_get_current_user () esté disponible y dado que esa función está en pluggable.php, no estará disponible hasta después de que se carguen los complementos. De ahí el error indefinido de la función.
PAFoster
0

Simplemente agregue esta función a su archivo plugin .php

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

Luego llámelo a cualquier lugar donde desee obtener el estado de inicio de sesión del usuario. Por ejemplo:

echo is_logged_in();
Mahdi azarm
fuente