Bagaimana cara saya memanggil wp_get_current_user () dalam sebuah plugin ketika plugin dimuat sebelum pluggable.php?

10

Hasil saat ini adalah "Kesalahan PHP fatal: Panggil ke fungsi yang tidak terdefinisi wp_get_current_user ()" yang masuk akal, tetapi tidak membantu.

Saya perlu menggunakan $ current_user.

Berikut adalah kode yang saya gunakan saat ini:

$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
sumber
1
Plugin dimuat sebelum dicolokkan, tetapi ada kait yang tersedia setelah itu. Kirimkan kode yang Anda kerjakan dan kami mungkin dapat membantu Anda menemukan pengait yang lebih baik.
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
Saya tahu tidak ada yang benar, bit 'init' saya tidak mengerti tetapi saran dari orang lain. Saya mendapat kesan itu melakukan sesuatu seperti memuat file - dalam kasus saya pluggable.php - benar-benar yang saya butuhkan hanyalah $ current_user-> user_login
PAFoster

Jawaban:

8

Untuk menambahkan jawaban @ EAMann, Anda harus membungkus wp_get_current_user()panggilan Anda (atau panggilan apa pun yang mencoba mengakses fungsi yang ditentukan di dalam pluggable.php) dalam 'plugins_loaded'tindakan.

Jadi, jika Anda meletakkan ini di dalam functions.phpfile Anda , lakukan seperti ini:

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
}

Perhatikan bahwa kami tidak tertarik dengan fungsi yang dikembalikan ini . Kami tertarik ketika fungsi ini mengeksekusi , yaitu, setelah itu pluggable.phpberkas telah dimuat dan didefinisikan Anda wp_get_current_user()fungsi.

Jadi, jangan berharap untuk melakukan apa pun dengan nilai pengembalian untuk fungsi ini. Alih-alih, pertimbangkan fungsi ini sebagai titik awal untuk semua yang ingin Anda lakukan setelah mendapat info pengguna saat ini.

Melakukannya dalam plugin

Demi kelengkapan, inilah cara Anda mengakses fungsi pluggable serupa dari dalam konteks plugin Anda sendiri:

(letakkan ini di dalam file .php di dalam pluginsfolder Anda )

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

Saya telah menggunakan teknik ini dengan sukses untuk jenis plugin "Coming Soon" yang sangat sederhana yang mengarahkan ulang pengguna ke halaman tertentu jika mereka tidak menggunakan login wp_safe_redirect().

Tom Auger
sumber
bagaimana Anda menggunakan plugins_loadedtindakan untuk menjalankan wp_safe_redirect()jika halaman admin plugin menghasilkan HTML sebelum header('Location: …')memiliki kesempatan untuk menjalankan? Saya mengalami masalah ketika halaman didefinisikan menggunakan add_menu_page(…)output WP header (dan konten dan footer) ketika plugin dimuat, jauh sebelum plugins_loadeddijalankan. Saya ingin memiliki akses ke fungsi di dalam pluggable.php(untuk mengakses data pengguna dan melakukan pengalihan) tetapi ini tampaknya mustahil. Apakah Anda menggunakan add_menu_pagedengan plugins_loaded?
Quinn Comendant
1
Sudahlah, sepertinya tidak mungkin, tapi ternyata tidak — saya memiliki kesalahan dalam kode saya. Bahkan urutan muatannya persis seperti yang diharapkan: plugins are includedpluggable.php is included'plugins_loaded' is triggered'load-{page_hook}' is triggered'page_hook' is triggered
Quinn Comendant
3

Masalahnya adalah Anda mencoba memuat kode secara langsung daripada menggunakan pengait WordPress. WordPress memuat banyak kode dalam urutan tertentu (Anda dapat melihat daftar tindakan yang dipecat dalam permintaan khas di Codex ).

Dengan mencoba memecat kode Anda secara langsung, Anda mengeksekusi sebelum pluggable.phpdimuat. Dan Anda tidak boleh mencoba include()file ini secara langsung. Biarkan WordPress melakukan itu untuk Anda.

Alih-alih, tentukan fungsi yang mendapatkan informasi pengguna:

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

Anda kemudian dapat menggunakan fungsi ini di mana saja dalam tema Anda tanpa masalah. Sebagai contoh:

echo wpse_58429();

Jika Anda perlu menggunakan $current_userkode lain, pastikan Anda memecat kode itu dengan tindakan WordPress ... jangan panggil secara langsung atau akan dieksekusi sebelum fungsi tersedia.

EAMann
sumber
0

Sepertinya Anda memuat kode Anda sebelum fungsi tertentu tersedia. Sudahkah Anda mencoba:

 global $current_user; 
 //print_r($current_user); //all user related information
echo $current_user->ID; //get current user id 
Bawaan
sumber
1
Ya, tetapi Anda tidak bisa mendapatkan $ current_user sampai wp_get_current_user () tersedia dan karena fungsi itu ada di pluggable.php, itu tidak tersedia sampai setelah plugin dimuat. Oleh karena itu kesalahan fungsi yang tidak terdefinisi.
PAFoster
0

Cukup tambahkan fungsi ini ke file .php plugin Anda

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

Lalu panggil ke mana saja Anda ingin mendapatkan status login pengguna. Sebagai contoh:

echo is_logged_in();
mahdi azarm
sumber