Было несколько проблем с ответом mjangda, поэтому я выкладываю версию, которая работает с WordPress 3.2
Основные проблемы были с оператором возврата. Он должен возвращать объект WP_User. Другая проблема была связана с недостаточным приоритетом.
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;
}