Respuestas:
Utiliza esta función:
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
}
Recomiendo encarecidamente la solución mucho más simple de Daniel sobre la seleccionada actualmente como correcta:
$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' );
En este caso, definitivamente no usaré get_userdata ($ user_id) mientras devuelve un WP_User, por lo que es más codicioso que solo una consulta personalizada.
Acerca de la consulta, acepto usar el método de preparación, pero SELECT COUNT (*) significa que está devolviendo todas las columnas , lo cual es inútil aquí.
Recomendaría usar SELECT COUNT (ID) en su lugar, de esta manera solo estamos trabajando en una sola columna que será más rápida.
En otro aspecto para la declaración de devolución, sería más legible con una lógica ternaria como:
volver 1 <$ cuenta? verdadero Falso;
En resumen, lo habría 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(*)
y SELECT COUNT(ID)
ambos devuelven una sola columna ... un recuento.
Si el rendimiento es una preocupación, 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;
}
De lo contrario, use get_userdata($user_id) !== false
. La llamada a get_userdata
recuperará una fila completa de la base de datos en lugar de un solo valor, creará un nuevo objeto WP_User y lo almacenará en caché en caso de éxito.
Pruebe Esto no le mostrará la advertencia como Falta el argumento 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 hacen al menos unos pocos hackers (lo sé porque jugué víctima de esto al menos una vez) es visitar su sitio utilizando este tipo de URL
domain.com/?author=0
domain.com/?author=1
etc.
En un intento exitoso, la salida del sitio tendrá datos válidos, además el nombre del usuario estará en el contenido del sitio web y el apodo también puede estar allí (dependiendo de la salida de las páginas).
En un intento no válido, el sitio irá a la página 404 (o lo que sea que ocurra en un error de página no encontrada).
Puede ser bastante trivial construir un script usando cURL que pueda probar desde say author = 0 hasta author = 999 en un tiempo relativamente corto y generar una lista de nombres de usuario. Hice que un hacker hiciera esto para uno de mis sitios y luego intentara iniciar sesión en cada usuario utilizando otra lista de contraseñas populares.
Como puede imaginar la primera vez que esto sucede, da un poco de miedo ver que alguien puede encontrar fácilmente todos sus nombres de usuario. Por suerte para mí, las contraseñas seguras se salvaron ese día, estoy seguro de que no todos tienen tanta suerte.
He probado esto contra un par de sitios web de renombre (que permanecerán sin nombre en esta publicación) y parece que todavía no hay nada que nadie pueda hacer para evitar que esto suceda. Personalmente, creo que es un riesgo de seguridad que WordPress se cierre.
EDITAR :
Aquí en el futuro (principios de 2016) ahora sé que hay métodos / complementos que pueden frustrar este ataque de enumeración de usuarios. Además, he cambiado mi postura sobre el riesgo de seguridad de esto y ya no creo que WordPress deba cambiar esto.
$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists