Come verificare se un utente esiste tramite un ID specifico
Consiglierei vivamente la soluzione molto più semplice di Daniel rispetto a quella attualmente selezionata come corretta:
$user = get_userdata( $user_id );
if ( $user === false ) {
// l'ID utente non esiste
} else {
// l'ID utente esiste
}

Mi piace molto di più rispetto a creare una funzione apposita solo per questo. Nel mio caso dovevo comunque lavorare con i dati utente, quindi... +1

In questo caso sicuramente non userei get_userdata( $user_id ) poiché restituisce un oggetto WP_User, risultando quindi più avido di risorse rispetto a una query personalizzata.
Per quanto riguarda la query, concordo sull'uso del metodo prepare, ma SELECT COUNT(*) significa che stai restituendo tutte le colonne, il che è inutile in questo contesto.
Consiglierei invece di usare SELECT COUNT(ID), in questo modo lavoriamo solo su una singola colonna rendendo l'operazione più veloce.
Un altro aspetto riguardo alla dichiarazione di return, sarebbe più leggibile con una logica ternaria come:
return 1 < $count ? true : false;
Per riassumere, l'avrei implementato così:
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;
}

Solo per informazione, SELECT COUNT(*)
e SELECT COUNT(ID)
restituiscono entrambi una singola colonna... un conteggio.

Se le prestazioni sono una preoccupazione, utilizza:
function user_id_exists($user_id) {
global $wpdb;
// Controlla la cache:
if (wp_cache_get($user_id, 'users')) return true;
// Controlla il database:
if ($wpdb->get_var($wpdb->prepare("SELECT EXISTS (SELECT 1 FROM $wpdb->users WHERE ID = %d)", $user_id))) return true;
return false;
}
Altrimenti, utilizza get_userdata($user_id) !== false
. La chiamata a get_userdata
recupererà un'intera riga dal database invece di un singolo valore, creerà un nuovo oggetto WP_User e lo memorizzerà nella cache in caso di successo.

Usa questa funzione:
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; }
}
Utilizzo:
if(user_id_exists(1)){
//esiste
} else {
//non esiste
}

puoi anche utilizzare questo metodo: $user = get_userdata( $user_id );
if ( $user == false ){
//l'ID utente non esiste
} else {
//l'ID utente esiste

Qualcosa che viene fatto almeno da alcuni hacker (lo so perché sono stato vittima almeno una volta) è visitare il tuo sito utilizzando questo tipo di URL
domain.com/?author=0
domain.com/?author=1
ecc.
In caso di tentativo riuscito, l'output del sito conterrà dati validi, inoltre il nicename dell'utente sarà presente nel contenuto del sito web e potrebbe esserci anche il nickname (a seconda dell'output delle pagine).
In caso di tentativo non valido, il sito reindirizzerà alla pagina 404 (o a qualsiasi altra cosa sia impostata per un errore di pagina non trovata).
Può essere piuttosto banale creare uno script utilizzando cURL che possa testare da, ad esempio, author=0 fino a author=999 in un tempo relativamente breve e generare un elenco di nomi utente. Un hacker ha fatto questo su uno dei miei siti e poi ha provato ad accedere a ciascun utente utilizzando un altro elenco di password comuni.
Come puoi immaginare, la prima volta che accade è un po' spaventoso vedere che qualcuno può scoprire abbastanza facilmente tutti i tuoi nomi utente. Fortunatamente per me, password complesse hanno salvato la situazione quella volta, ma sono sicuro che non tutti sono stati così fortunati.
Ho testato questo su un paio di siti web importanti (che rimarranno anonimi in questo post) e sembra che al momento non ci sia nulla che si possa fare per impedire che accada. Personalmente penso che sia un rischio per la sicurezza che WordPress dovrebbe chiudere.
AGGIORNAMENTO:
Qui nel futuro (inizio 2016) ora so che esistono metodi/plugin che possono contrastare questo attacco di enumerazione degli utenti. Inoltre ho cambiato la mia posizione sul rischio per la sicurezza di questo problema e non penso più che WordPress debba modificare questo comportamento.

Prova Questo non ti mostrerà il warning come Argomento 2 mancante per 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; }
}

Questa funzione che sto utilizzando non cambia necessariamente come viene recuperato il conteggio rispetto alle altre risposte qui presenti, semplifica semplicemente il valore di ritorno come booleano confrontando strettamente il conteggio con 1.
/**
* Determina se un utente esiste in base all'ID utente
*
* @global wpdb $wpdb Oggetto di astrazione del database di WordPress.
*
* @param int $user_id L'ID utente di WordPress da verificare.
*
* @return bool True se l'ID utente esiste, false altrimenti.
*/
function user_id_exists($user_id)
{
global $wpdb;
return 1 === (int)$wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->users WHERE ID = %d", $user_id));
}
