Respostas:
Use esta função:
function user_id_exists($user){
global $wpdb;
$count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->users WHERE ID = %d", $user));
if($count == 1){ return true; }else{ return false; }
}
Uso:
if(user_id_exists(1)){
//it does exists
} else {
//it doesn't
}
Eu recomendo a solução muito mais simples de Daniel sobre a atualmente selecionada como correta:
$user = get_userdata( $user_id );
if ( $user === false ) {
//user id does not exist
} else {
//user id exists
}
$user_ids = array_filter( $user_ids, 'get_userdata' );
Nesse caso, definitivamente não usarei o get_userdata ($ user_id) enquanto estiver retornando um WP_User, portanto, é mais ganancioso do que apenas uma consulta personalizada.
Sobre a consulta, concordo em usar o método prepare, mas o SELECT COUNT (*) significa que você está retornando todas as colunas , o que é inútil aqui.
Eu recomendaria o uso de SELECIONAR CONTAGEM (ID) não- estável, dessa maneira, estamos trabalhando apenas em uma única coluna que será mais rápida.
Em outro aspecto da declaração de retorno, seria mais legível com uma lógica ternária como:
retornar 1 <$ contagem? verdadeiro falso;
Para resumir, eu teria implementado como:
function user_id_exists( $user_id ) {
global $wpdb;
$count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(ID) FROM $wpdb->users WHERE ID = %d", $user_id ) );
return empty( $count ) || 1 > $count ? false : true;
}
SELECT COUNT(*)
e SELECT COUNT(ID)
ambos retornam uma única coluna ... uma contagem.
Se o desempenho for uma preocupação, use:
function user_id_exists($user_id) {
global $wpdb;
// Check cache:
if (wp_cache_get($user_id, 'users')) return true;
// Check database:
if ($wpdb->get_var($wpdb->prepare("SELECT EXISTS (SELECT 1 FROM $wpdb->users WHERE ID = %d)", $user_id))) return true;
return false;
}
Caso contrário, use get_userdata($user_id) !== false
. A chamada para get_userdata
recuperará uma linha inteira do banco de dados em vez de um único valor, criará um novo objeto WP_User e o armazenará em cache com êxito.
Tente isto não exibirá o aviso como Argumento ausente 2 para wpdb :: prepare ()
function user_id_exists($user_id){
global $wpdb;
$count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->users WHERE ID = %d",$user_id));
if($count == 1){ return true; }else{ return false; }
}
return $count == 1;
Algo que é feito por pelo menos alguns hackers (eu sei porque fui vítima disso pelo menos uma vez) é visitar seu site usando esse tipo de URL
domain.com/?author=0
domain.com/?author=1
etc.
Em uma tentativa bem-sucedida, a saída do site terá dados válidos; além disso, o nome do usuário estará no conteúdo do site e o apelido também estará lá (dependendo da saída das páginas).
Em uma tentativa inválida, o site irá para a página 404 (ou o que estiver definido para ocorrer em um erro de página não encontrada).
Pode ser bastante trivial criar um script usando cURL que pode testar desde digamos author = 0 até author = 999 em um período de tempo relativamente curto e gerar uma lista de nomes de usuários. Eu tive um hacker para fazer isso em um dos meus sites e, em seguida, tente fazer login em cada usuário usando outra lista de senhas populares.
Como você pode imaginar na primeira vez que isso acontece, é um pouco assustador ver que alguém pode facilmente descobrir todos os seus nomes de usuário. Para minha sorte, senhas fortes salvaram o dia naquele momento, tenho certeza que nem todo mundo tem tanta sorte.
Eu testei isso em alguns sites de grandes nomes (que permanecerão sem nome neste post) e parece que ainda não há nada que alguém possa fazer para impedir que isso aconteça. Pessoalmente, acho que é risco de segurança que o wordpress feche.
EDIT :
Aqui no futuro (início de 2016) agora eu sei que existem métodos / plugins que podem impedir esse ataque de enumeração de usuários. Além disso, mudei minha posição sobre o risco de segurança disso e não acho mais que o WordPress deva mudar isso.
$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists