Vérifiez si wp-login est la page actuelle

Réponses:

59

Utilisez le global $pagenow, qui est un ensemble global commun défini par WordPress lors de l'exécution:

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

Vous pouvez également vérifier le type de page de connexion, par exemple l'enregistrement:

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

Le code suivant est considéré comme étant hérité et ne doit pas être utilisé (il wp-register.phpétait obsolète puis supprimé depuis longtemps):

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

TheDeadMedic
la source
3
Cela fonctionne-t-il si l'utilisateur change d'URL wp-login.php?
Lucas Bustamante
Bonne question de @LucasBustamante et je suppose que c'est facile à tester. Il est très important de signaler et de sauver du temps à quelqu'un.
Ryan Bayne
1
@ T.Todua a fourni une réponse plus sûre et plus fiable ci-dessous .
Mopsyd
Pour moi, même pagenow dit que c'est index.php ...
trainoasis
17

LE SEUL MANIER FIABLE:

if( is_wplogin() ){
   ...
}

code:

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

Pourquoi c'est le plus sûr?

1) Parfois, si vous essayez de vérifier la page de connexion en utilisant REQUEST_URI(ou SCRIPT_PATH), vous obtiendrez des valeurs inexactes, car de nombreux plugins changent les URL LOGIN & ADMIN .
2) $pagenowvous donnera une valeur incorrecte aussi dans ce cas!

Remarques:

  • Dans certains cas, cela pourrait ne pas fonctionner si vous générez manuellement le formulaire de connexion (c.-à-d. Avec un code court, etc.) sur d'autres fichiers / pages de modèle.
T.Todua
la source
2
C'est fantastique. Utiliser des fichiers inclus pour déterminer l'emplacement d'un visiteur n'est pas un scénario que je me suis déjà imaginé mais c'est logique dans ce cas.
Ryan Bayne
@RyanBayne thnx, oui, c’est la rare occasion où get_included_files()la solution semble la plus précise (du moins pour moi).
T.Todua
Pour moi, cela retourne false, comme si ce n'était pas une page wp-login ... Aussi, même $ GLOBALS ['pagenow'] renvoie index.php ...
trainoasis
@trainoasis probablement que vous utilisez le formulaire de connexion manuelle (comme un shortcode) sur la page d'accueil ou comme ça?
T.Todua
Non, normal wp-login.php :) Mais j'utilise Sage et WooCommerce, peut-être que cela change les choses :)
trainoasis
3

Plus moderne, cela devrait fonctionner même lorsque l'URL wp-login est modifiée par les plugins et que WP se trouve dans un sous-dossier, etc.:

if(stripos($_SERVER["SCRIPT_NAME"], strrchr(wp_login_url(), '/')) !== false){
    /* ... */
}
Firsh - LetsWP.io
la source
1
J'allais suggérer cela. Peut-être que l'OP doit analyser les résultats de wp_login_url () et oly pour comparer le chemin Web.
Svetoslav Marinov le
1
J'aime cette réponse le meilleur. Pour répondre à mes préférences, je retouché légèrement à: return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );. Cela me semble un peu plus propre.
Ian Dunn
2

$GLOBALS['pagenow']ne fonctionne pas, utilisez $_SERVER['PHP_SELF'].

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

et si votre wordpress n’est pas installé dans le dossier racine Web, vous devez utiliser certains paramètres comme YOUR_WP_PATH/wp-login.phppour remplacer les éléments du tableau.

dallaslu
la source
1

Je l'ai implémenté en utilisant la propre méthode wp_login_url () de WordPress comme suit:

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

Il ne suffit que de comparer les deux chemins (car il est difficile d’être absolument sûr de l’utilisation de SSL car il peut être résilié) ... Cela signifie cependant qu’un développeur de plug-in ou de thème qui modifie le formulaire de connexion par défaut doit avoir effectué donc le bon chemin ...

Mavawie
la source
Pour ignorer les paramètres d'URL, remplacez la dernière ligne par: return substr (rtrim (strtolower ($ _SERVER ['REQUEST_URI']), '/'), 0, strlen ($ login_path)) == $ login_path;
mattavatar le
0

Je ne suis intéressé que par la page d'inscription, pas par la page de connexion. Donc, cela pourrait ne pas être recherché par tout le monde.

$ GLOBALS ['pagenow'] renvoie index.php pour moi. Peut-être à cause de buddypress ou de mon thème.

Alors j'ai utilisé

is_page('register')

Si vous inspectez le corps de la page d'enregistrement, celle-ci possède également l'ID. Par conséquent, si elle indique page-id-4906 , vous pouvez l'utiliser de cette manière si cela fonctionne mieux:

is_page('4906')
zeta
la source
2
Ceci n'est valable que si un plugin est en train de modifier le login par défaut.
Michael Ecklund
0

Aucune des réponses actuelles n'a fonctionné pour moi.

Ce que j'ai fait était de vérifier si $_GETarray a une clé 'page' et si sa valeur est 'connexion'.

if (isset($_GET['page']) && $_GET['page'] == 'sign-in'){
   // you're on login page
}
Rafael Carneiro de Moraes
la source
-1

Quelques solutions proposées ici ont fonctionné, alors je suis arrivé avec quelque chose de très simple qui fonctionne sur un site WordPress ordinaire (non testé sur Multisite).

Aussi simple que:

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

Il prend en compte le paramètre url ?action=register, qui n'existe que lorsque vous êtes sur la page d'inscription.

Adriano Monecchi
la source
2
Ce n'est certainement pas une bonne solution, vous pourriez avoir le paramètre "action" n'importe où dans vos modèles de page ou plugins personnalisés, non? :)
trainoasis
En effet. Cela peut fonctionner pour une simple vérification lors de la mise en file d'attente de fichiers ou de l'exécution de fonctions de modèle simples sur la page de connexion, mais il existe des moyens plus sûrs d'y parvenir à coup sûr.
Adriano Monecchi
-1

Voici une version PSR-2 de la réponse @ T.Todua. Je viens de le formater bien. Il est préférable de manipuler la fonction, par exemple en ajoutant un filtre à des fins de test, etc.:

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;
}
Lucas Bustamante
la source