Вопросы на собеседовании: WordPress-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior WordPress-разработчик.
Смотреть пример резюме: WordPress-разработчик →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
WordPress объединяет PHP-код приложения, базу данных, темы, плагины и загруженные медиафайлы для работы сайта.
- Ядро WordPress отвечает за обработку запросов, админ-панель, API контента, пользователей и общие сервисы.
- Тема управляет представлением, а плагины добавляют или изменяют поведение без правки ядра.
- MySQL или MariaDB хранит контент и настройки, а wp-content/uploads обычно хранит медиафайлы.
Зачем это спрашивают: Интервьюер проверяет, умеете ли вы на базовом уровне разделять ядро, данные, представление, расширения и медиафайлы.
Эти три каталога разделяют администрирование, библиотеки ядра и принадлежащие сайту расширения и ресурсы.
- wp-admin содержит файлы панели управления и административных запросов.
- wp-includes содержит большинство функций, классов и встроенных библиотек ядра WordPress.
- wp-content содержит темы, плагины и загрузки, поэтому пользовательский код должен находиться там, а не в каталогах ядра.
Зачем это спрашивают: Сильный ответ показывает, где должен находиться пользовательский код и почему файлы ядра нельзя считать кодом проекта для редактирования.
WordPress хранит контент, пользователей, комментарии, связи таксономий и настройки в связанных таблицах базы данных.
- wp_posts содержит записи, страницы, вложения и объекты пользовательских типов, а дополнительные поля находятся в wp_postmeta.
- wp_terms и связанные таблицы таксономий представляют рубрики, метки и пользовательские таксономии.
- wp_options хранит общие настройки сайта, а wp_users и wp_usermeta хранят учетные записи и данные пользователей.
Зачем это спрашивают: Интервьюер проверяет понимание общей модели данных, на которой основаны типичные сущности WordPress.
WordPress загружает окружение, разбирает URL, выполняет главный запрос, выбирает шаблон и отправляет готовый ответ.
- Правила перезаписи превращают понятный URL в переменные запроса, описывающие нужный контент.
- WordPress создает главный WP_Query и устанавливает условный контекст, например is_page() или is_archive().
- Загрузчик шаблонов следует иерархии активной темы, а PHP и шаблонные теги формируют HTML-ответ.
Зачем это спрашивают: Интервьюер оценивает концептуальное понимание жизненного цикла запроса, а не знание каждого файла ядра.
Корневой index.php служит фронт-контроллером, который запускает WordPress для обычных запросов к публичной части.
- Правила веб-сервера направляют множество публичных URL в эту единую точку входа.
- Файл загружает wp-blog-header.php, который инициализирует WordPress и запускает вывод шаблона.
- В теме тоже есть index.php, но это последний запасной классический шаблон, а не точка входа приложения.
Зачем это спрашивают: Сильный ответ отличает корневой фронт-контроллер от запасного шаблона классической темы.
Переменные запроса представляют значения, по которым WordPress определяет, какой контент нужно получить.
- Запрос может преобразоваться в значения post_type, name, page_id, category_name или paged.
- WP_Query читает эти значения, строит главный запрос к базе и устанавливает контекст запроса.
- Публичные пользовательские переменные можно добавить фильтром query_vars, когда они действительно нужны функции сайта.
Зачем это спрашивают: Интервьюер проверяет, можете ли вы связать разбор URL с главным запросом контента.
Минимальной классической теме нужны style.css и index.php, чтобы WordPress распознал ее и смог вывести контент.
- style.css содержит заголовок темы с полями вроде Theme Name и также может содержать стили.
- index.php служит запасным вариантом, если более подходящего шаблона нет.
- В реальной теме для удобства поддержки обычно также есть functions.php, header.php, footer.php и специальные шаблоны иерархии.
Зачем это спрашивают: Интервьюер проверяет минимальный контракт классической темы и знание обычных вспомогательных файлов.
Иерархия шаблонов представляет порядок файлов темы, которые WordPress проверяет для текущего запроса.
- Для отдельной записи подходят single-{post-type}-{slug}.php, single-{post-type}.php, single.php, singular.php, а затем index.php.
- Более точные файлы позволяют настроить конкретный контекст без множества условий в одном универсальном шаблоне.
- В классической теме иерархия заканчивается index.php, поэтому запрос выводится даже без специальных файлов.
Зачем это спрашивают: Сильный ответ объясняет и порядок запасных вариантов, и пользу специальных шаблонов.
Условные теги сообщают, какой тип запроса определил WordPress, чтобы тема могла выбрать подходящий для контекста вывод.
- Функции is_front_page(), is_single() и is_archive() возвращают логические значения для распространенных типов запросов.
- Они проверяют сформированный контекст запроса, поэтому большинство из них нужно использовать только после выполнения главного запроса WordPress.
- Я использую их для небольших различий, а для полностью другой разметки предпочитаю иерархию шаблонов.
Зачем это спрашивают: Интервьюер проверяет, умеете ли вы определять контекст запроса без замены иерархии шаблонов одним большим файлом с условиями.
front-page.php отвечает за главную страницу сайта, а home.php отвечает за страницу списка записей.
- Если главной назначена статическая страница, ее может выводить front-page.php.
- Если для записей назначена другая страница, список блога на ней выводит home.php.
- Когда главная показывает последние записи, front-page.php имеет приоритет над home.php, если существуют оба файла.
Зачем это спрашивают: Интервьюер проверяет часто путаемую часть иерархии шаблонов.
single.php обрабатывает отдельные записи, page.php обрабатывает Страницы, а singular.php может быть их общим запасным шаблоном.
- Обычная запись блога попадает в single.php после проверки более точных шаблонов single.
- Страница проходит через пользовательские и специальные шаблоны страниц перед page.php.
- singular.php проверяется, когда для отдельной записи, страницы или пользовательского типа нет более точного шаблона.
Зачем это спрашивают: Сильный ответ связывает каждый файл с контекстом запроса и знает общий запасной шаблон singular.
WordPress выбирает шаблоны по типу архива, а затем переходит к запасным archive.php и index.php.
- category.php, tag.php и taxonomy.php обслуживают архивы встроенных и пользовательских терминов, также доступны более точные варианты.
- author.php и date.php обслуживают архивы по автору и дате.
- archive-{post_type}.php обслуживает архив пользовательского типа записей, если для типа включен архив.
Зачем это спрашивают: Интервьюер проверяет, умеете ли вы выбрать архивный шаблон без множества несвязанных условий в одном файле.
Дочерняя тема наследует родительскую тему и хранит изменения отдельно от ее обновлений.
- Ее style.css указывает каталог родителя в поле Template заголовка.
- Ее шаблоны могут переопределять соответствующие шаблоны родителя, а functions.php загружается в дополнение к родительскому файлу.
- Я использую ее для настройки поддерживаемой сторонней темы, но независимое от темы поведение выношу в плагин.
Зачем это спрашивают: Интервьюер проверяет, умеете ли вы сохранять изменения при обновлениях и правильно разделять представление и поведение.
Я использую функции загрузки шаблонов WordPress вместо копирования общей разметки между файлами.
- get_header(), get_footer() и get_sidebar() загружают соответствующие части темы.
- get_template_part() загружает повторно используемые части вроде content-card.php и поддерживает именованные варианты.
- Эти функции позволяют дочерним темам переопределять части и дают плагинам штатные хуки жизненного цикла загрузки.
Зачем это спрашивают: Сильный ответ называет стандартные API и объясняет, почему прямое подключение файлов менее гибкое.
Цикл перебирает записи из текущего WP_Query и по очереди устанавливает каждую текущей записью.
- have_posts() проверяет наличие следующего результата, а the_post() переходит к нему.
- Внутри цикла шаблонные теги the_title(), the_content() и the_permalink() используют контекст текущей записи.
- Главный цикл темы обычно выводит контент, который WordPress выбрал для данного запроса.
Зачем это спрашивают: Интервьюер проверяет понимание главной связи между результатами WP_Query и шаблонными тегами.
the_post() продвигает запрос и подготавливает глобальные данные записи для шаблонных тегов.
- have_posts() только проверяет наличие следующего результата и не двигает указатель запроса.
- the_post() заставляет функции вроде the_title() обращаться к текущему результату.
- Без него цикл может застрять, а шаблонные теги могут читать устаревший контекст.
Зачем это спрашивают: Сильный ответ отличает проверку состояния итерации от перехода вперед и установки контекста записи.
Я вызываю wp_reset_postdata() после дополнительного цикла WP_Query, в котором использовался the_post().
- Пользовательский цикл меняет глобальную переменную $post, которую используют многие шаблонные теги.
- Сброс восстанавливает текущую запись главного запроса, чтобы последующие теги показали ожидаемый контент.
- wp_reset_query() выполняет более широкий сброс и обычно не нужен для обычного дополнительного WP_Query.
Зачем это спрашивают: Интервьюер проверяет, умеете ли вы не допускать утечки контекста дополнительного цикла в остальную часть шаблона.
Хуки представляют именованные точки расширения, которые позволяют запускать код или менять значения без правки ядра WordPress.
- Действия уведомляют функции обратного вызова о наступлении события или этапа.
- Фильтры передают значение через функции обратного вызова и используют возвращенный результат.
- Плагины и темы регистрируют функции через add_action() или add_filter(), сохраняя слабую связанность с ядром.
Зачем это спрашивают: Интервьюер проверяет понимание механизма расширения, на котором основана настройка WordPress.
Действие выполняет работу в точке хука, а фильтр получает значение и обязан вернуть итоговое значение.
- Функция действия может зарегистрировать тип записи на init или вывести разметку в wp_footer.
- Функция фильтра может изменить excerpt_length или заголовок перед выводом.
- Если забыть вернуть значение из фильтра, оно может стать null и нарушить дальнейшую работу.
Зачем это спрашивают: Сильный ответ приводит конкретные применения и называет требование фильтра возвращать значение.
Приоритет управляет порядком функций, а число принимаемых аргументов определяет, сколько параметров хука получит функция.
- Меньшее число приоритета выполняется раньше, а при одинаковом приоритете действует порядок регистрации.
- Приоритет по умолчанию равен 10 и обычно подходит, если особый порядок не требуется.
- Четвертый параметр должен соответствовать числу передаваемых значений, которые функция собирается принять.
Зачем это спрашивают: Интервьюер проверяет, умеете ли вы зарегистрировать функцию с правильным моментом выполнения и сигнатурой.
Закрытые вопросы
- 21
Когда может понадобиться удалить функцию из хука WordPress?
wordpresshookscallbacks - 22
Какой код должен находиться в functions.php классической темы?
themes - 23
Какова базовая структура плагина WordPress?
wordpressplugins - 24
Для чего нужен заголовок плагина?
plugins - 25
Что должны делать хуки активации и деактивации?
activationhooks - 26
Как плагин должен удалять сохраненные данные при удалении?
plugins - 27
Зачем добавлять префиксы или пространства имен функциям, классам и константам плагина?
pluginskubernetes - 28
Что такое пользовательский тип записей?
cpt - 29
Когда и как нужно регистрировать пользовательский тип записей?
cpt - 30
Что такое пользовательская таксономия?
taxonomies - 31
Когда использовать метаданные записи, а когда настройку option?
- 32
Какие типы данных PHP часто используются в коде WordPress?
wordpress - 33
Как область видимости переменных влияет на PHP-код WordPress?
wordpressscope - 34
Что такое WP_Error и как его обрабатывать?
- 35
Как тема или плагин должны загружать CSS и JavaScript?
cssthemesjavascript - 36
Что означают зависимости, версия и стратегия загрузки при подключении скрипта?
assetsdependencies - 37
Как передать созданные на сервере данные в подключенный JavaScript-файл?
assetsjavascript - 38
Как создать простой пользовательский запрос через WP_Query?
querieswp-query - 39
Как вывести и правильно завершить дополнительный WP_Query?
wp-query - 40
Как правильно изменить главный запрос WordPress?
querieswordpress - 41
Чем отличаются санитизация, валидация и экранирование данных?
validationescaping - 42
Какие функции санитизации WordPress подходят для типичных полей формы?
formsvalidationwordpress - 43
Как выбрать правильную функцию экранирования в WordPress?
escapingwordpress - 44
Что такое nonce WordPress и от чего он защищает?
noncewordpress - 45
Как проверить, может ли пользователь WordPress выполнить действие?
wordpress - 46
Как безопасно выполнить пользовательский SQL-запрос через $wpdb?
sqlquerieswpdb - 47
Что такое блок в современном WordPress?
wordpress - 48
Чем блочная тема отличается от классической темы?
themesblock-themes - 49
Что пользователь может редактировать в Редакторе сайта WordPress?
block-themeswordpress - 50
Для чего используется theme.json?
themesblock-themes - 51
Как бы вы безопасно реализовали шорткод [team_member], принимающий ID сотрудника?
shortcodes - 52
Как бы вы добавили шорткоду атрибуты макета и цвета, не разрешая произвольные HTML и CSS?
cssshortcodes - 53
Как бы вы загружали CSS шорткода только на страницах, где он используется?
cssshortcodes - 54
Как бы вы добавили небольшой виджет контактов в боковую панель классической темы?
themeswidgets - 55
Как бы вы заменили простой устаревший виджет современным решением, удобным для редакторов?
widgets - 56
Как бы вы реализовали публичный тип записей Portfolio с категориями проектов?
cpt - 57
Как бы вы сделали отдельные макеты записи, архива и таксономии для Portfolio в классической теме?
themestaxonomies - 58
Как бы вы исследовали ошибку 404 на страницах Portfolio после смены rewrite slug типа записей?
cpt - 59
Как бы вы реализовали и безопасно сохраняли метабокс «URL клиента» для записей Portfolio?
- 60
Как бы вы создали группу полей ACF Pro для переиспользуемой карточки проекта и безопасно применили ее в теме?
themes - 61
Как бы вы обновили существующие метаданные Portfolio через WP CLI, не загружая все записи одновременно?
- 62
Как бы вы реализовали постраничный список «Последние проекты» через дополнительный WP_Query?
wp-query - 63
Как бы вы исправили повторяющиеся или пропавшие элементы, если постраничный WP_Query также использует offset?
wp-query - 64
Как бы вы показывали по двенадцать записей Portfolio в архиве категории проектов, не затрагивая списки админки и другие запросы?
queries - 65
Как бы вы исправили заголовок страницы, который после пользовательского цикла меняется на название последнего проекта?
- 66
Как бы вы исследовали ситуацию, когда скрипт плагина поставлен в очередь, но отсутствует в готовой странице?
assetsplugins - 67
Как бы вы диагностировали двойную загрузку одной библиотеки JavaScript на странице WordPress?
wordpressjavascript - 68
Как бы вы загружали скрипт галереи только на экране редактирования Portfolio в wp-admin?
- 69
Как бы вы исправили фронтенд-скрипт, запускающийся раньше своей зависимости или целевой разметки?
dependencies - 70
Как бы вы исправили тип записей, зарегистрированный слишком поздно для корректной работы архива и редактора?
cpt - 71
Как бы вы исправили фильтр the_content, из-за которого пропадает содержимое записи?
hooks - 72
Как бы вы заменили callback родительской темы, уже подключенный к wp_footer?
themescallbacks - 73
Как бы вы исследовали белый экран, появившийся после редактирования functions.php?
themes - 74
Как бы вы исследовали предупреждения PHP в debug.log, не показывая их посетителям?
- 75
Как бы вы определили, какой плагин ломает блочный редактор на локальной копии сайта?
gutenbergplugins - 76
Как бы вы изменили макет отдельной записи родительской темы так, чтобы обновления не стирали правку?
themes - 77
Как бы вы изменили макет отдельного товара WooCommerce без редактирования файлов плагина?
pluginswoocommerce - 78
Как бы вы реализовали фронтенд-форму обратной связи в плагине от отправки до подтверждения?
formsplugins - 79
Как бы вы возвращали полезные ошибки валидации из пользовательской формы настроек, не доверяя отправленным значениям?
formsvalidation - 80
Как бы вы защитили административное действие, удаляющее сохраненную заметку Portfolio?
- 81
Как бы вы исправили шаблон, который экранирует данные только при сохранении, но выводит их без обработки в ссылках и атрибутах?
escaping - 82
Как бы вы реализовали AJAX-кнопку «Загрузить еще проекты» для посетителей?
ajax - 83
Как бы вы добавили небольшой endpoint REST API, позволяющий авторизованным редакторам менять статус Portfolio?
restendpoints - 84
Как бы вы безопасно запросили из пользовательской таблицы плагина заказы, созданные после отправленной даты?
queriesplugins - 85
Как бы вы вставили строку в пользовательскую таблицу и обработали ошибку базы данных?
database - 86
Как бы вы сократили лишние запросы к базе в шаблоне, выводящем двадцать карточек проектов?
databasequeries - 87
Как бы вы кэшировали дорогой ответ внешнего API для виджета консоли WordPress?
widgetsapicaching - 88
Как бы вы поддерживали актуальность списка Portfolio в transient после изменений редакторов?
caching - 89
Как бы вы через WP CLI проверили, активны ли плагин и его запланированная задача?
plugins - 90
Как бы вы подготовили исправление дочерней темы в Git для безопасного ревью другим разработчиком?
themesgit - 91
Как бы вы исправили сетку проектов из трех колонок, выходящую за экран на телефонах?
gridschema - 92
Как бы вы организовали и собирали Sass для пользовательской темы, не публикуя случайно source map или дублированный CSS?
cssthemessource-maps - 93
Как бы вы исправили изменение шаблона блочной темы, которое работает в Site Editor, но не появляется после развертывания файлов темы на другом сайте?
themesblock-themesdeployment - 94
Как бы вы создали одну переиспользуемую шапку для всех шаблонов блочной темы?
themesblock-themes - 95
Как бы вы дали редакторам готовую секцию с отзывом, которую можно вставлять и редактировать?
- 96
Как бы вы настроили Query Loop в блочной теме для вывода шести последних записей Portfolio карточками?
themesblock-themesqueries - 97
Как бы вы добавили контролируемую фирменную палитру в блочную тему и убрали произвольный выбор цветов?
formsthemesblock-themes - 98
Как бы вы применили адаптивную шкалу типографики к заголовкам через theme.json?
responsivethemesblock-themes - 99
Как бы вы стандартизировали интервалы секций в блочной теме без пользовательских классов на каждом блоке Group?
themesblock-themes - 100
Как бы вы реализовали простой динамический блок Gutenberg, показывающий имя клиента текущей записи Portfolio?
gutenberg