Как проверить существует ли пользователь по заданному ID
Существует ли способ проверить, существует ли ID пользователя? Я хочу создать функцию, похожую на username_exists()
, но которая будет возвращать существует ли ID или нет.

Я настоятельно рекомендую гораздо более простое решение Даниэля вместо текущего выбранного как правильное:
$user = get_userdata( $user_id );
if ( $user === false ) {
// ID пользователя не существует
} else {
// ID пользователя существует
}

Мне этот вариант нравится гораздо больше, чем создание отдельной функции только для этого. В моём случае всё равно приходилось работать с userdata, так что… +1

В данном случае я определенно не буду использовать get_userdata( $user_id ), так как он возвращает WP_User, что делает его более ресурсоемким по сравнению с кастомным запросом.
Что касается запроса, я согласен с использованием метода prepare, но SELECT COUNT(*) означает, что вы возвращаете все столбцы, что здесь излишне.
Я бы рекомендовал использовать SELECT COUNT(ID) вместо этого, таким образом мы работаем только с одним столбцом, что будет быстрее.
Еще один аспект возвращаемого выражения — его можно сделать более читаемым с помощью тернарной логики, например:
return 1 < $count ? true : false;
Подводя итог, я бы реализовал это следующим образом:
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(*)
и SELECT COUNT(ID)
оба возвращают один столбец... количество.

Если важна производительность, используйте:
function user_id_exists($user_id) {
global $wpdb;
// Проверка кеша:
if (wp_cache_get($user_id, 'users')) return true;
// Проверка базы данных:
if ($wpdb->get_var($wpdb->prepare("SELECT EXISTS (SELECT 1 FROM $wpdb->users WHERE ID = %d)", $user_id))) return true;
return false;
}
В противном случае используйте get_userdata($user_id) !== false
. Вызов get_userdata
извлечёт всю строку из базы данных вместо одного значения, создаст новый объект WP_User и закеширует его при успешном выполнении.

Используйте эту функцию:
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; }
}
Использование:
if(user_id_exists(1)){
//пользователь существует
} else {
//пользователя не существует
}

также можно использовать этот метод: $user = get_userdata( $user_id );
if ( $user == false ){
// пользователь с таким ID не существует
} else {
// пользователь с таким ID существует

Нечто, что делают некоторые хакеры (я знаю, потому что сам как минимум один раз стал жертвой этого) — это посещение вашего сайта с использованием URL такого типа:
domain.com/?author=0
domain.com/?author=1
и так далее.
При успешной попытке вывод сайта будет содержать валидные данные, включая пользовательский nicename в контенте сайта, а также, возможно, и nickname (в зависимости от вывода страницы).
При неудачной попытке сайт перейдет на страницу 404 (или ту, что настроена для ошибки "страница не найдена").
Создать скрипт с использованием cURL, который тестирует, скажем, от author=0 до author=999 за относительно короткое время и выводит список имен пользователей, может быть довольно тривиально. Один хакер проделал это с моим сайтом, а затем попытался войти в систему под каждым пользователем, используя список популярных паролей.
Как вы можете себе представить, первый раз, когда это происходит, немного пугает осознавать, что кто-то может довольно легко узнать все ваши имена пользователей. К счастью для меня, тогда меня спасли надежные пароли. Уверен, не всем так везет.
Я тестировал это на паре крупных сайтов (которые останутся неназванными в этом посте), и, похоже, пока что никто ничего не может сделать, чтобы предотвратить это. Лично я считаю, что это дыра в безопасности, которую WordPress должен устранить.
ОБНОВЛЕНИЕ:
Теперь, в будущем (начало 2016 года), я знаю, что существуют методы/плагины, которые могут предотвратить эту атаку на перечисление пользователей. Кроме того, я изменил свою позицию относительно риска безопасности и больше не считаю, что WordPress должен что-то менять в этом.

Попробуйте этот вариант, чтобы избежать предупреждения "Missing argument 2 for 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; }
}

Эта функция, которую я использую, не обязательно меняет способ получения количества из других ответов здесь, она просто упрощает возвращаемое значение до булевого, строго сравнивая количество с 1.
/**
* Определяет, существует ли пользователь по его идентификатору
*
* @global wpdb $wpdb Объект абстракции базы данных WordPress.
*
* @param int $user_id Идентификатор пользователя WordPress для проверки.
*
* @return bool True, если пользователь с указанным ID существует, иначе false.
*/
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));
}
