Làm cách nào để tôi gọi wp_get_cản_user () trong một plugin khi các plugin được tải trước pluggable.php?


10

Kết quả hiện tại là "Lỗi nghiêm trọng của PHP: Gọi hàm không xác định wp_get_cản_user ()" có nghĩa, nhưng không có ích.

Tôi cần sử dụng $ current_user.

Đây là mã tôi đang sử dụng:

$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
Các plugin được tải trước khi cắm, nhưng có các móc có sẵn sau đó. Đăng mã mà bạn đang làm việc và chúng tôi có thể giúp bạn tìm ra một cái móc tốt hơn.
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

Tôi biết điều đó không đúng, bit 'init' tôi không hiểu nhưng là một gợi ý từ người khác. Tôi có ấn tượng rằng nó đã làm một cái gì đó như tải một tệp - trong trường hợp của tôi là pluggable.php - thực sự tất cả những gì tôi cần chỉ là $ current_user-> user_login
PAFoster

Câu trả lời:


8

Để thêm vào câu trả lời của @ EAMann, bạn cần phải thực hiện wp_get_current_user()cuộc gọi của mình (hoặc bất kỳ cuộc gọi nào cố gắng truy cập vào một chức năng được xác định trong pluggable.php) trong 'plugins_loaded'hành động.

Vì vậy, nếu bạn đặt cái này trong functions.phptệp của mình , hãy làm như thế này:

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
}

Xin lưu ý rằng chúng tôi không quan tâm đến những gì chức năng này trả về . Chúng tôi đang quan tâm đến khi chức năng này thực thi , cụ thể là, sau khi các pluggable.phptập tin đã nạp và xác định của bạn wp_get_current_user()hoạt động.

Vì vậy, đừng mong đợi làm bất cứ điều gì với giá trị trả về cho hàm này. Thay vào đó, hãy coi chức năng này là điểm khởi đầu cho mọi thứ bạn muốn làm sau khi bạn có thông tin người dùng hiện tại.

Làm điều đó trong một plugin

Để hoàn thiện, đây là cách bạn sẽ truy cập một chức năng có thể cắm tương tự từ trong ngữ cảnh của plugin của riêng bạn:

(đặt tệp này trong tệp .php trong pluginsthư mục của bạn )

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

Tôi đã sử dụng thành công kỹ thuật này cho một loại plugin "Sắp ra mắt" rất đơn giản để chuyển hướng người dùng đến một trang cụ thể nếu họ không đăng nhập bằng wp_safe_redirect().


Làm thế nào bạn sẽ sử dụng một plugins_loadedhành động để chạy wp_safe_redirect()nếu trang quản trị của plugin xuất HTML trước khi header('Location: …')có cơ hội chạy? Tôi gặp sự cố khi một trang được xác định bằng cách sử dụng add_menu_page(…)đầu ra WP (và nội dung và chân trang) khi plugin tải, trước khi plugins_loadedchạy. Tôi muốn có quyền truy cập vào các chức năng bên trong pluggable.php(để truy cập dữ liệu người dùng và thực hiện chuyển hướng) nhưng điều này dường như là không thể. Bạn đã từng sử dụng add_menu_pagevới plugins_loaded?
Quinn Comendant

1
Đừng bận tâm, có vẻ như không thể, nhưng đó không phải là lỗi Tôi đã có lỗi trong mã của mình. Trong thực tế, thứ tự tải chính xác như mong đợi: plugins are includedpluggable.php is included'plugins_loaded' is triggered'load-{page_hook}' is triggered'page_hook' is triggered
Quinn Comendant

3

Vấn đề là bạn đang cố tải mã trực tiếp chứ không phải bằng hook WordPress. WordPress tải một loạt mã theo một thứ tự cụ thể (bạn có thể thấy danh sách các hành động được kích hoạt trong một yêu cầu điển hình trong Codex ).

Bằng cách cố gắng kích hoạt mã của bạn trực tiếp, bạn đang thực thi ngay trước khi pluggable.phpđược tải. Và bạn không nên thử include()trực tiếp tập tin này. Hãy để WordPress làm điều đó cho bạn.

Thay vào đó, hãy xác định chức năng lấy thông tin người dùng:

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

Sau đó, bạn có thể sử dụng chức năng này bất cứ nơi nào trong chủ đề của bạn mà không có vấn đề. Ví dụ:

echo wpse_58429();

Nếu bạn cần sử dụng $current_usermã khác, hãy đảm bảo rằng bạn kích hoạt mã đó bằng hành động WordPress ... đừng gọi trực tiếp nếu không nó sẽ được thực thi trước khi chức năng có sẵn.


0

Có vẻ như bạn đang tải mã của mình trước khi một số chức năng có sẵn. Bạn đã thử chưa:

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

1
Có, nhưng bạn không thể nhận được $ current_user cho đến khi wp_get_civerse_user () khả dụng và vì chức năng đó có trong pluggable.php, nên nó không khả dụng cho đến khi các plugin được tải. Do đó lỗi chức năng không xác định.
PAFoster

0

Chỉ cần thêm chức năng này vào tệp .php plugin của bạn

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

Sau đó gọi nó bất cứ nơi nào bạn muốn để có được trạng thái đăng nhập người dùng. Ví dụ:

echo is_logged_in();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.