В основном, когда браузер впервые сталкивается с элементом, который не должен быть в head, например, с элементом img, он закрывает head и вместо этого запускает body. Так что возможно, что есть что-то перед wp_head, что вызывает проблему.
Вам нужно изучить фактический вывод HTML на наличие ошибок, а не смотреть на PHP, чтобы выяснить, что является причиной проблемы. Попробуйте запустить сайт через validator.w3.org и посмотреть на первые несколько ошибок, которые он найдет.
Вы, вероятно, смотрите на исходник страницы с помощью инспектора браузера, который показывает вам DOM в памяти после того, как браузер исправил его, а не истинный исходник страницы, который, вероятно, будет в другом порядке. В Chrome, например, сравните разницу между использованием Web-инспектора и View->Developer->View Page Source, который покажет вам реальный код вывода до того, как браузер обработает его).
Еще можно попробовать поставить wp_head в самое начало перед head. Может быть есть ошибки в scripts.js, который идет перед head.
В любом случае, это попытка вашего браузера избежать недействительной разметки. Сайт выводит что-то, что не принадлежит тегу head, поэтому браузер закрывает его и открывает тег body. Если не плагины, то может быть в functions.php. Надо смотреть хуки для подключения CSS, JS, jQuery и добавления мета-тегов.
Например, во всех wp_enqueue_script добавить $in_footer = true для вывода скриптов в футере.