Kiểm tra xem wp-login có phải là trang hiện tại không


Câu trả lời:


59

Sử dụng toàn cầu $pagenow, là một toàn cầu phổ biến được thiết lập bởi WordPress khi chạy:

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

Bạn cũng có thể kiểm tra loại trang đăng nhập, ví dụ đăng ký:

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

Mã sau đây được coi là di sản và không nên được sử dụng ( wp-register.phpđã bị phản đối và sau đó bị xóa khá lâu):

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


3
Điều này có hoạt động nếu người dùng thay đổi url wp-login.php của mình không?
Lucas Bustamante

Câu hỏi hay từ @LucasBustamante và tôi cho rằng nó dễ dàng được kiểm tra. Nó rất quan trọng để chỉ ra và tiết kiệm thời gian của ai đó.
Ryan Bayne

1
@ T.Todua đã cung cấp một câu trả lời an toàn và đáng tin cậy hơn dưới đây .
mopsyd 22/03/18

Đối với tôi, ngay cả pagenow cũng nói đó là index.php ...
trainoocation

17

CÁCH ĐÁNG TIN CẬY:

if( is_wplogin() ){
   ...
}

mã:

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

Tại sao nó an toàn nhất?

1) Đôi khi, nếu bạn cố kiểm tra trang đăng nhập bằng cách sử dụng REQUEST_URI(hoặc SCRIPT_PATH), bạn sẽ nhận được GIÁ TRỊ TUYỆT VỜI, vì nhiều plugin thay đổi url ĐĂNG NHẬP & ADMIN .
2) $pagenowsẽ cung cấp cho bạn giá trị không chính xác trong trường hợp đó!

Ghi chú:

  • Trong một số trường hợp, nó có thể không hoạt động nếu bạn xuất mẫu đăng nhập (nghĩa là bằng shortcode hoặc vv) theo cách thủ công trên các tệp / trang mẫu khác.

2
Cái này thật tuyệt. Sử dụng các tệp được bao gồm để xác định vị trí của khách truy cập không phải là một kịch bản tôi từng thấy mình đang làm nhưng nó có ý nghĩa trong trường hợp này.
Ryan Bayne

@RyanBayne thnx, vâng, đây là dịp hiếm hoi khi get_included_files()giải pháp có vẻ chính xác nhất (ít nhất là đối với tôi).
T.Todua

Đối với tôi, nó trả về false, như thể nó không phải là trang đăng nhập wp ... Ngoài ra, ngay cả $ GLOBALS ['pagenow'] cũng trả về index.php ...
trainoocation

@trainoocation có lẽ bạn đang sử dụng hình thức đăng nhập thủ công (như shortcode) trên trang chủ hoặc như thế?
T.Todua

Không, wp-login.php bình thường :) Nhưng tôi đang sử dụng Sage và WooC Commerce, có lẽ điều đó sẽ thay đổi mọi thứ bằng cách nào đó :)
trainoocation

3

Cách hiện đại hơn để làm điều đó, nó sẽ hoạt động ngay cả khi URL đăng nhập wp bị thay đổi bởi các plugin và khi WP ở trong thư mục con, v.v .:

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

1
Tôi sẽ đề nghị rằng. Có lẽ OP cần phân tích kết quả từ wp_login_url () và oly so sánh đường dẫn web.
Svetoslav Marinov

1
Tôi thích câu trả lời này tốt nhất. Để phù hợp với sở thích của tôi, tôi tinh chỉnh nó một chút để : return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );. Điều đó cảm thấy sạch sẽ hơn một chút với tôi.
Ian Dunn

2

$GLOBALS['pagenow']không làm việc, sử dụng $_SERVER['PHP_SELF'].

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

và nếu wordpress của bạn không được cài đặt trong thư mục gốc của web, bạn nên sử dụng một số thông số như YOUR_WP_PATH/wp-login.phpđể thay thế các thành phần trong mảng.


1

Tôi đã triển khai nó bằng phương thức wp_login_url () của WordPress như sau:

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

Chỉ cần so sánh cả hai đường dẫn (vì khó có thể hoàn toàn chắc chắn về việc sử dụng SSL vì nó có thể bị chấm dứt) là đủ ... Tuy nhiên, điều đó có nghĩa là một plugin hoặc nhà phát triển chủ đề thay đổi hình thức đăng nhập mặc định phải thực hiện vì vậy cách thích hợp ...


Để bỏ qua các tham số url, hãy thay đổi dòng cuối cùng thành: return return (rtrim (strtolower ($ _SERVER ['REQUEST_URI']), '/'), 0, strlen ($ login_path)) == $ login_path;
mattavatar

0

Tôi chỉ quan tâm đến trang đăng ký, không phải trong trang đăng nhập. Vì vậy, điều này có thể không phải ai cũng muốn.

$ GLOBALS ['pagenow'] trả về index.php cho tôi. Có lẽ vì bạn thân hoặc chủ đề của tôi.

Vì vậy, tôi đã sử dụng

is_page('register')

Nếu bạn kiểm tra phần thân của trang đăng ký, nó cũng có ID, vì vậy nếu nó nói trang-id-4906 , bạn có thể sử dụng nó theo cách này nếu nó hoạt động tốt hơn:

is_page('4906')

2
Điều này chỉ hợp lệ nếu một plugin đang sửa đổi đăng nhập mặc định.
Michael Ecklund

0

Không có câu trả lời hiện tại làm việc cho tôi.

Những gì tôi đã làm là kiểm tra xem $_GETmảng có khóa 'trang' hay không và giá trị của nó có phải là 'đăng nhập' hay không.

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

-1

Một vài giải pháp được đề xuất ở đây đã hoạt động, vì vậy tôi đã đưa ra một thứ thực sự đơn giản hoạt động trên một trang web WordPress thông thường (không được thử nghiệm trên Multisite).

Đơn giản như:

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

Nó tính đến tham số url ?action=register, chỉ tồn tại khi bạn ở trên trang đăng ký.


2
Đó chắc chắn không phải là một giải pháp tốt, bạn có thể có tham số "hành động" ở bất cứ đâu trong các mẫu hoặc plugin trang tùy chỉnh của mình, phải không? :)
đào tạo

Thật. Nó có thể hoạt động để kiểm tra đơn giản trong khi xử lý các tệp hoặc thực hiện các chức năng mẫu đơn giản trên trang đăng nhập, nhưng có nhiều cách an toàn hơn để đạt được điều đó.
Adriano Monecchi

-1

Đây là phiên bản PSR-2 của câu trả lời @ T.Todua. Tôi chỉ định dạng nó độc đáo. Điều này tốt hơn để thao tác chức năng, chẳng hạn như thêm bộ lọc cho mục đích thử nghiệm, v.v .:

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