ฉันจะเรียก wp_get_current_user () ในปลั๊กอินเมื่อโหลดปลั๊กอินก่อน pluggable.php ได้อย่างไร


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

ฉันรู้ว่าไม่ถูกต้องบิต 'init' ที่ฉันไม่เข้าใจ แต่เป็นคำแนะนำจากคนอื่น ฉันอยู่ภายใต้การแสดงผลมันทำอะไรเช่นโหลดไฟล์ - ในกรณีของฉัน pluggable.php - จริงๆทั้งหมดที่ฉันต้องการคือเพียงแค่ $ current_user-> user_login
PAFoster

คำตอบ:


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()ฟังก์ชั่น

ดังนั้นอย่าคาดหวังว่าจะทำอะไรกับค่าตอบแทนสำหรับฟังก์ชันนี้ ให้พิจารณาฟังก์ชั่นนี้เป็นจุดเริ่มต้นสำหรับทุกสิ่งที่คุณต้องการเมื่อคุณได้รับข้อมูลผู้ใช้ปัจจุบัน

ทำในปลั๊กอิน

เพื่อความสมบูรณ์นี่คือวิธีที่คุณจะเข้าถึงฟังก์ชั่นที่เสียบได้เหมือนกันจากภายในบริบทของปลั๊กอินของคุณ:

(ใส่สิ่งนี้ในไฟล์. php ภายใน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() ){
           // ... do stuff for your logged-in user
        }
    }
}

$wpse_58429_plugin = new WPSE_58429();

ผมเคยใช้เทคนิคนี้ประสบความสำเร็จที่ง่ายมาก "เร็ว ๆ นี้" wp_safe_redirect()ประเภทของปลั๊กอินที่เปลี่ยนเส้นทางผู้ใช้ไปยังหน้าเฉพาะถ้าพวกเขาไม่ได้ลงทะเบียนในการใช้


คุณจะใช้การplugins_loadedดำเนินการwp_safe_redirect()อย่างไรหากหน้าผู้ดูแลระบบของปลั๊กอินแสดง HTML ก่อนที่จะheader('Location: …')มีโอกาสเรียกใช้ ฉันมีปัญหาที่เพจที่กำหนดโดยใช้add_menu_page(…)เอาท์พุตส่วนหัว WP (และเนื้อหาและส่วนท้าย) เมื่อปลั๊กอินโหลดดีก่อนที่plugins_loadedจะรัน ฉันต้องการเข้าถึงฟังก์ชั่นภายในpluggable.php(สำหรับเข้าถึงข้อมูลผู้ใช้และทำการเปลี่ยนเส้นทาง) แต่ดูเหมือนว่าเป็นไปไม่ได้ คุณได้ใช้add_menu_pageด้วยplugins_loaded?
Quinn Comendant

1
ไม่เป็นไรดูเหมือนเป็นไปไม่ได้ แต่ไม่ใช่ - ฉันมีข้อผิดพลาดในรหัสของฉัน ในความเป็นจริงเพื่อโหลดจะตรงตามที่คาด: plugins are included→การpluggable.php is included→การ'plugins_loaded' is triggered→การ'load-{page_hook}' is triggered→การ'page_hook' is triggered
ควินน์ Comendant

3

ปัญหาคือคุณกำลังพยายามโหลดรหัสโดยตรงแทนที่จะใช้ WordPress hook 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
ใช่ แต่คุณไม่สามารถรับ $ current_user ได้จนกว่า wp_get_current_user () จะพร้อมใช้งานและเนื่องจากฟังก์ชันนั้นอยู่ใน pluggable.php จึงไม่สามารถใช้ได้จนกว่าจะโหลดปลั๊กอินแล้ว ดังนั้นข้อผิดพลาดฟังก์ชั่นที่ไม่ได้กำหนด
PAFoster

0

เพียงเพิ่มฟังก์ชั่นนี้ลงในไฟล์. php ของปลั๊กอิน

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

จากนั้นโทรไปที่ใดก็ได้ที่คุณต้องการรับสถานะการเข้าสู่ระบบของผู้ใช้ ตัวอย่างเช่น:

echo is_logged_in();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.