web-dev-qa-db-fra.com

Restreindre l'accès à wp-login.php

J'ai un formulaire de connexion/enregistrement/mot de passe perdu dans la barre latérale de mon thème. J'utilise l'entrée cachée pour "redirect_to" qui fonctionne bien. Mais lorsque j'appuie sur le bouton de connexion sans rien entrer ni plus particulièrement lorsqu'une erreur se produit, il redirige vers la page wp-login.php.

Je ne veux pas que cela se produise. Si une erreur survient, elle devrait apparaître à la place actuelle. Comment puis-je faire ceci.

Remarque: La même chose est requise pour la fonction de déconnexion. En gros, je ne veux pas montrer la page wp-login.php à n'importe quel prix pour qui que ce soit.

3
booota

L'action wp_login_failed se déclenche en cas d'échec de la connexion en raison d'une mauvaise combinaison nom d'utilisateur/mot de passe. C'est donc un bon point de départ. Ceci est un exemple super simple qui redirige simplement vers la page d'accueil.

<?php
add_action( 'wp_login_failed', 'wpse25628_login_failed', 10, 1 );
/**
 * Catches all failed logins and redirect them to the 
 * websites home page.
 */
function wpse25628_login_failed( $username )
{
    /*
    May want to do something here to give the user feedback
    for instance call `global $user;`, which will be a
    wp_error object, you could append the code as a 
    $_GET variable and adjust your front end according to the
    error message
    */
    wp_redirect(
        home_url(),
        302
    );
    exit();
}

Et, bien sûr, il y a aussi un crochet wp_logout! Peut-être que vous envoyez aux gens une page de remerciement ici au lieu de la page d'accueil.

<?php
add_action( 'wp_logout', 'wpse25628_catch_logout' );
/**
 * When a user logs out, send them back to the home page
 */
function wpse25628_catch_logout()
{
    wp_redirect(
        home_url(),
        302
    );
    exit();
}

Malheureusement, le hook wp_login_failed ne se déclenche pas s'il y a un nom d'utilisateur ou un mot de passe vide. Tout aussi regrettable est le manque de crochets qui sont renvoyés lorsque cela se produit. Il est probablement préférable de valider ce genre de choses côté client avec javascript. Voici un exemple rapide.

jQuery(document).ready(function(){
    jQuery('#loginform').submit(function(e){
        var errors;
        jQuery('#loginform input').each(function(){
            var val = jQuery(this).val()
            if( ! val )
            {   
                errors = true;
            }
        });
        if( errors )
        {
            e.preventDefault();
        }
    });
});
3
chrisguitarguy

Vous pouvez rediriger hors de wp-login et d'autres pages par défaut de cette façon:

add_action('plugins_loaded', 'myAction');
function wpSimpleUserSetup() {
    if (in_array($_SERVER['REQUEST_URI'], array('/wp-login.php', 'wp-login.php?action=register'))) {
        wp_redirect(wp_login_url());
        exit;
    }
}

De plus, la fonction wp_login_url () est connectable, vous pouvez donc la remplacer par la vôtre:

function myLoginUrl( $redirect = '', $force_reauth = false ) {
    return $custom_url;
}
add_filter( 'login_url', 'myLoginUrl', 9999 );
1
user472179