2009-11-26 8 views
8

Estoy trabajando en un portal basado en Wordpress que se integra con un comercio electrónico hecho a medida. El comercio electrónico también funciona como un "panel de control": todos los roles se configuran allí. Algunos usuarios son grabados pero 'inactivos'; no deberían poder iniciar sesión en Wordpress. Por esta razón, necesito conectarme al sistema de inicio de sesión de Wordpress.¿Cómo me conecto al sistema de inicio de sesión de Wordpress para detener a algunos usuarios programáticamente?

Si un usuario es, por ejemplo, "bad_james", no puede iniciar sesión, incluso si tiene un inicio de sesión de WP y una PWD válidos. El panel de administración de WP no proporciona una bandera para bloquear a los usuarios.

¿Hay alguna manera de implementar un filtro de inicio de sesión?

Saludos,
Davide

Respuesta

9

Usted puede sobrecargar la función wp_authenticate (ver la función en el código aquí: http://core.trac.wordpress.org/browser/trunk/wp-includes/pluggable.php) y devolver una WP_error si no desea permitir que el usuario inicie sesión.

O mejor, utilice el filtro authenticate y devuelva nulo si no desea que el usuario inicie sesión, p.

add_filter('authenticate', 'check_login', 10, 3); 
function check_login($user, $username, $password) { 
    $user = get_userdatabylogin($username); 

    if(/* check to see if user is allowed */) { 
     return null; 
    } 
    return $user; 
} 
+7

Para que el filtro para trabajar, tuve que cambiar la prioridad de 10 a 40. WordPress núcleo tiene algunos filtros para autenticarse con las prioridades de 20 y 30. Ajuste nuestra prioridad a 40 asegura nuestro filtro se ejecuta la última . – joeljoeljoel

+1

get_userdatabylogin está en desuso. Debería cambiarlo a '$ user = get_user_by ('login', 'loginname');' – Cam

8

Hay algunos problemas con respuesta mjangda así que estoy publicar una versión que funciona con WordPress 3.2

Los principales problemas eran con la instrucción de retorno. Debería devolver un objeto WP_User. El otro problema era que la prioridad no era lo suficientemente alta.

add_filter('authenticate', 'check_login', 100, 3); 
function check_login($user, $username, $password) { 
    // this filter is called on the log in page 
    // make sure we have a username before we move forward 
    if (!empty($username)) { 
     $user_data = $user->data; 

     if (/* check to see if user is allowed */) { 
      // stop login 
      return null; 
     } 
     else { 
      return $user; 
     } 
    } 

    return $user; 
} 
Cuestiones relacionadas