ตรวจสอบว่า wp-login เป็นหน้าปัจจุบันหรือไม่


48

ฉันจะตรวจสอบว่าหน้าปัจจุบันwp-login.phpหรือwp-signup.phpไม่?

มีวิธีแก้ไขปัญหาที่หรูหรากว่าการใช้$_SERVER['REQUEST_URI']หรือไม่?


1
สำหรับการอ้างอิงมีการสนทนา trac ที่เกี่ยวข้องที่นี่core.trac.wordpress.org/ticket/19898
Stephen Harris

คำตอบ:


59

ใช้ทั่วโลก$pagenowซึ่งเป็นชุดทั่วโลกร่วมกันโดย WordPress ที่รันไทม์:

if ( $GLOBALS['pagenow'] === 'wp-login.php' ) {
    // We're on the login page!
}

คุณสามารถตรวจสอบประเภทของหน้าเข้าสู่ระบบเช่นการลงทะเบียน:

if ( $GLOBALS['pagenow'] === 'wp-login.php' && ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] === 'register' ) {
    // We're registering
}

รหัสต่อไปนี้ถูกพิจารณาว่าเป็นมรดกและไม่ควรใช้ ( wp-register.phpถูกเลิกใช้ & ถูกลบทิ้งไปในขณะที่กลับมา):

if ( in_array( $GLOBALS['pagenow'], array( 'wp-login.php', 'wp-register.php' ) ) )
    run_my_funky_plugin();


3
สิ่งนี้ใช้งานได้หรือไม่หากผู้ใช้เปลี่ยน url ของ wp-login.php
Lucas Bustamante

เป็นคำถามที่ดีจาก @LucasBustamante และฉันคิดว่ามันทดสอบได้ง่าย มันสำคัญมากที่จะต้องชี้ให้เห็นและประหยัดเวลาของใครบางคน
Ryan Bayne

1
@ T.Todua ได้ให้คำตอบที่ปลอดภัยและน่าเชื่อถือมากขึ้นดังต่อไปนี้
mopsyd

สำหรับฉันแม้แต่ pagenow บอกว่ามันเป็น index.php ...
trainoasis

17

วิธีที่เชื่อถือได้เท่านั้น:

if( is_wplogin() ){
   ...
}

รหัส:

function is_wplogin(){
    $ABSPATH_MY = str_replace(array('\\','/'), DIRECTORY_SEPARATOR, ABSPATH);
    return ((in_array($ABSPATH_MY.'wp-login.php', get_included_files()) || in_array($ABSPATH_MY.'wp-register.php', get_included_files()) ) || (isset($_GLOBALS['pagenow']) && $GLOBALS['pagenow'] === 'wp-login.php') || $_SERVER['PHP_SELF']== '/wp-login.php');
}

ทำไมจึงปลอดภัยที่สุด

1) บางครั้งหากคุณพยายามตรวจสอบหน้าเข้าสู่ระบบโดยใช้REQUEST_URI(หรือSCRIPT_PATH) คุณจะได้รับค่า INCORRECT เนื่องจากปลั๊กอินจำนวนมากเปลี่ยนURL เข้าสู่ระบบ & ADMIN
2) $pagenowจะให้ค่าที่ไม่ถูกต้องในกรณีนั้นด้วย!

หมายเหตุ:

  • ในบางกรณีอาจไม่ทำงานหากคุณส่งออกฟอร์มเข้าสู่ระบบ (เช่นรหัสย่อหรืออื่น ๆ ) ด้วยตนเองในไฟล์ / หน้าเทมเพลตอื่น ๆ

2
มันยอดเยี่ยมมาก การใช้ไฟล์ที่รวมไว้เพื่อระบุตำแหน่งของผู้เข้าชมไม่ใช่สถานการณ์ที่ฉันพบว่าตัวเองทำ แต่มันสมเหตุสมผลในกรณีนี้
Ryan Bayne

@ RyanBayne ขอบคุณใช่นี่เป็นโอกาสที่หายากเมื่อget_included_files()ดูเหมือนว่าโซลูชันที่แม่นยำที่สุด (เพื่อฉันจะได้)
T.Todua

สำหรับฉันแล้วมันกลับเท็จราวกับว่ามันไม่ใช่หน้า wp-login ... นอกจากนี้ยังมี $ GLOBALS ['pagenow'] ส่งคืน index.php ...
trainoasis

@trainoasis อาจเป็นไปได้ว่าคุณกำลังใช้แบบฟอร์มเข้าสู่ระบบด้วยตนเอง (เช่นรหัสย่อ) ในหน้าแรกหรือเป็นเช่นนั้น?
T.Todua

ไม่ปกติ WP-login.php :) แต่ฉันใช้ Sage และ WooCommerce บางทีนั่นอาจจะเปลี่ยนแปลงสิ่งใด :)
trainoasis

3

วิธีที่ทันสมัยกว่าในการทำเช่นนั้นควรทำงานแม้ว่าจะมีการเปลี่ยน URL การเข้าสู่ระบบ wp โดยปลั๊กอินและเมื่อ WP อยู่ในโฟลเดอร์ย่อย ฯลฯ :

if(stripos($_SERVER["SCRIPT_NAME"], strrchr(wp_login_url(), '/')) !== false){
    /* ... */
}

1
ฉันจะแนะนำว่า บางที OP ต้องการแยกผลลัพธ์จาก wp_login_url () และ oly เปรียบเทียบเส้นทางของเว็บ
Svetoslav Marinov

1
ฉันชอบคำตอบนี้ดีที่สุด return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );เพื่อให้เหมาะสมกับการตั้งค่าของฉันฉันเอ็นดูมันเล็กน้อยเพื่อ: นั่นทำให้ฉันรู้สึกสะอาดขึ้นเล็กน้อย
Ian Dunn

2

$GLOBALS['pagenow']$_SERVER['PHP_SELF']ไม่ทำงานการใช้งาน

if ( in_array( $_SERVER['PHP_SELF'], array( '/wp-login.php', '/wp-register.php' ) ) ){
    // do something.
}

และหากเวิร์ดเพรสของคุณไม่ได้ติดตั้งในโฟลเดอร์เว็บรูทคุณควรใช้พารามิเตอร์บางอย่างเช่นYOUR_WP_PATH/wp-login.phpเพื่อแทนที่องค์ประกอบในอาร์เรย์


1

ฉันได้ติดตั้งแล้วโดยใช้ WordPress ของตัวเอง wp_login_url () วิธีการดังต่อไปนี้:

public static function is_wp_login() {
  $login_path = rtrim( strtolower( parse_url( wp_login_url( '', true ), PHP_URL_PATH ) ), '/' );
  return ( rtrim( strtolower( $_SERVER[ 'REQUEST_URI' ] ), '/' ) == $login_path );
}

เพียงเปรียบเทียบทั้งสองพา ธ (เพราะยากที่จะมั่นใจอย่างแน่นอนเกี่ยวกับการใช้ SSL เนื่องจากอาจถูกยกเลิก) ควรจะเพียงพอ ... หมายความว่าอย่างไรปลั๊กอินหรือนักพัฒนาธีมที่เปลี่ยนแบบฟอร์มการเข้าสู่ระบบเริ่มต้นจะต้องทำ ดังนั้นวิธีที่เหมาะสม ...


หากต้องการละเว้นพารามิเตอร์ URL ให้เปลี่ยนบรรทัดสุดท้ายเป็น: return substr (rtrim (strtolower ($ _SERVER ['REQUEST_URI']), '/'), 0, strlen ($ login_path)) == $ login_path;
mattavatar

0

ฉันสนใจในหน้าลงทะเบียนเท่านั้นไม่ใช่ในหน้าเข้าสู่ระบบ ดังนั้นทุกคนอาจไม่ต้องการสิ่งนี้

$ GLOBALS ['pagenow'] ส่งคืน index.php สำหรับฉัน อาจเป็นเพราะ Buddypress หรือธีมของฉัน

ดังนั้นฉันใช้

is_page('register')

หากคุณตรวจสอบเนื้อความของหน้าการลงทะเบียนมันก็มี ID เช่นกันดังนั้นถ้ามันบอกว่าpage-id-4906คุณสามารถใช้วิธีนี้ได้ถ้ามันทำงานได้ดีกว่า:

is_page('4906')

2
สิ่งนี้จะใช้ได้ก็ต่อเมื่อปลั๊กอินกำลังแก้ไขการเข้าสู่ระบบเริ่มต้น
Michael Ecklund

0

ไม่มีคำตอบปัจจุบันที่ใช้ได้สำหรับฉัน

สิ่งที่ฉันทำคือตรวจสอบว่า$_GETอาร์เรย์มีคีย์ 'หน้า' และค่าของมันคือ 'การลงชื่อเข้าใช้'

if (isset($_GET['page']) && $_GET['page'] == 'sign-in'){
   // you're on login page
}

-1

วิธีแก้ปัญหาบางข้อเสนอที่นี่ใช้งานได้ดังนั้นฉันจึงมาพร้อมกับสิ่งที่เรียบง่ายจริงๆที่ใช้งานได้บนเว็บไซต์ WordPress ทั่วไป (ไม่ได้ทดสอบบน Multisite)

ง่ายเหมือน:

    if( !isset($_GET['action']) ){
        echo 'This is the Login Page.';
    } else { 
        echo 'This is the Register Page.';
    }

โดยคำนึงถึงพารามิเตอร์ url ?action=registerซึ่งจะมีอยู่เมื่อคุณอยู่ในหน้าลงทะเบียนเท่านั้น


2
นั่นไม่ใช่ทางออกที่ดีอย่างแน่นอนคุณสามารถมีพารามิเตอร์ "การกระทำ" ที่ใดก็ได้ในเทมเพลตหรือปลั๊กอินของหน้าเว็บที่กำหนดเองได้หรือไม่? :)
trainoasis

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

-1

ต่อไปนี้เป็นคำตอบ @ T.Todua รุ่น PSR-2 ฉันเพิ่งฟอร์แมตมันอย่างดี สิ่งนี้จะดีกว่าในการปรับแต่งฟังก์ชั่นเช่นการเพิ่มตัวกรองเพื่อการทดสอบ ฯลฯ :

function isLoginPage()
{
    $is_login_page = false;

    $ABSPATH_MY = str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, ABSPATH);

    // Was wp-login.php or wp-register.php included during this execution?
    if (
        in_array($ABSPATH_MY . 'wp-login.php', get_included_files()) ||
        in_array($ABSPATH_MY . 'wp-register.php', get_included_files())
    ) {
        $is_login_page = true;
    }

    // $GLOBALS['pagenow'] is equal to "wp-login.php"?
    if (isset($GLOBALS['pagenow']) && $GLOBALS['pagenow'] === 'wp-login.php') {
        $is_login_page = true;
    }

    // $_SERVER['PHP_SELF'] is equal to "/wp-login.php"?
    if ($_SERVER['PHP_SELF'] == '/wp-login.php') {
        $is_login_page = true;
    }

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