在pluggable.php之前加载插件时,如何在插件中调用wp_get_current_user()?


10

当前结果是“ PHP致命错误:调用未定义函数wp_get_current_user()”,这是有道理的,但无济于事。

我需要使用$ current_user。

这是我当前正在使用的代码:

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

1
插件在可插拔之前就已加载,但是在此之后有可用的钩子。发布您正在使用的代码,我们也许可以帮助您找到一个更好的钩子。
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 2012年

我知道所有这些都不对,我不理解“ init”位,但这是别人的建议。我的印象是它确实执行了类似加载文件的操作-在我的情况下为pluggable.php-实际上我只需要$ current_user-> user_login
PAFoster 2012年

Answers:


8

要添加到@EAMann的答案中,您需要在操作中包装您的wp_get_current_user()调用(或任何尝试访问中定义的函数的调用pluggable.php'plugins_loaded'

因此,如果要将其放入functions.php文件中,请按照以下步骤进行操作:

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
}

请注意,我们对该函数返回的结果不感兴趣。我们感兴趣的是,当该功能执行,即pluggable.php文件已加载并定义了wp_get_current_user()功能。

因此,不要期望对该函数的返回值做任何事情。取而代之的是,在获得当前用户的信息后,将此功能视为所有操作的起点。

在插件中完成

为了完整起见,这是从您自己的插件的上下文中访问类似的可插拔函数的方式:

(将此放在文件plugins夹内的.php文件中)

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

我已经成功地将此技术用于非常简单的“即将推出”类型的插件,如果用户未使用登录,则会将该用户重定向到特定页面wp_safe_redirect()


如果插件的管理页面在有机会运行之前输出HTML,您将如何使用plugins_loaded操作来运行?我遇到一个问题,其中使用定义的页面在插件加载时(即在运行之前)输出WP标头(以及内容和页脚)。我想访问内部函数(用于访问用户数据和进行重定向),但这似乎是不可能的。你习惯了吗?wp_safe_redirect()header('Location: …')add_menu_page(…)plugins_loadedpluggable.phpadd_menu_pageplugins_loaded
Quinn Comendant 2015年

1
没关系,这似乎是不可能的,但事实并非如此-我的代码有错误。事实上,加载顺序是完全一样的预期:plugins are included→交通pluggable.php is included→交通'plugins_loaded' is triggered→交通'load-{page_hook}' is triggered→交通'page_hook' is triggered
奎因Comendant

3

问题是您正在尝试直接加载代码,而不是使用WordPress挂钩。WordPress以特定顺序加载一堆代码(您可以在Codex中查看典型请求触发的操作列表)。

通过尝试直接触发代码,您可以在pluggable.php加载之前执行代码。而且您不应该尝试include()直接访问该文件。让WordPress为您做到这一点。

而是定义一个获取用户信息的函数:

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

然后,您可以在主题的任何位置使用此功能,而不会出现问题。例如:

echo wpse_58429();

如果您需要$current_user在其他代码中使用,请确保使用WordPress操作触发该代码...不要直接调用它,否则它将在该功能可用之前执行。


0

某些功能可用之前,您似乎正在加载代码。你有没有尝试过:

 global $current_user; 
 //print_r($current_user); //all user related information
echo $current_user->ID; //get current user id 

1
是的,但是只有在wp_get_current_user()可用并且由于该功能在pluggable.php中才能获得$ current_user,它只有在插件加载后才可用。因此,未定义的函数错误。
PAFoster 2012年

0

只需将此功能添加到您的插件.php文件中

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

然后在要获取用户登录状态的任何地方调用它。例如:

echo is_logged_in();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.