Перевод статьи из кодекса
Это обзорная статья для разработчиков, здесь дано описание процесса создания страниц и способов, посредством которых плагины могут внедряться в него и изменять. Эта статья будет полезна разработчикам плагинов, которые используют сложные запросы к базе данных и необычную структуру постоянных ссылок, а также для тех разработчиков, которые хотят понять WordPress лучше, добавлять новые функции в ядро WordPress или исправлять баги.
Более детальную информацию можно получить в исходных файлах ядра.
Итак, вот шаги, которые совершает WordPress при принятии решения о том, какую страницу или запись показать при загрузке определенной ссылки в браузере пользователя:
- Когда посетитель жмет на ссылку или вводит URL страницы вашего блога с клавиатуры, WordPress начинает процесс загрузки с нескольких файлов ядра (wp-config.php, wp-settings.php, и так далее.) Если вам интересно узнать более детальную информацию и порядок исполнения, начните исследование файлов ядра с index.php и следуйте по цепочке (каждый файл подгружает другие дополнительные файлы). Вот таким образом можно проследить этот процесс.
- WordPress загружает и инициализирует все активированные плагины (вызывает хуки для инициализации плагинов)
- WordPress загружает “текстовый домен” для интернализации и файл functions.php активной темы.
- WordPress исполняет wp() функцию (расположенную в wp-includes/functions.php), которая вызывает $wp->main() (здесь $wp – это объект класса WP, объявленного в wp-includes/class-wp.php). Исполнение этой функции дает следующие команды:
- Распознать URL и сделать из него запрос с помощью функции WP->parse_request().
- Установить все is_ переменные, которые используются функциями из раздела “Условные теги”. Совершается это с помощью функции $wp_query->parse_query() ($wp_query – это объект класса WP_Query, объявлен в файле wp-includes/query.php). Замечание: не смотря на название этой функции, на самом деле она не делает разбор строк, т.к. это действие уже выполнено на предыдущем шаге функцией WP->parse_request().
- Преобразовать полученный запрос к формату базы данных MySQL и выполнить этот запрос, получив список всех записей с помощью функции WP_Query->get_posts(). Затем сохранить записи в объект $wp_query, чтобы использовать его далее в цикле WordPress.
- Обработать ошибку 404.
- Послать HTTP заголовки.
- Установить некоторые переменные для цикла WordPress.
- WordPress загружает ваш шаблон, для этого он выясняет, какой шаблон использовать в настоящий момент в соответствии с иерархией шаблонов и исполняет этот файл (выполняет код шаблона). Или WordPress вместо этого может запустить один из фидов (например, wp-rss2.php).
- Вообщем, шаблон или фид выполняются и запускают цикл WordPress, который выводит записи блога или статичекую страницу.
- Шаблон или файл фида, скорее всего, выведут не только содержимое страницы, но и ссылки на связанные категории, записи, архивы. Эти ссылки выводятся с использованием встроенных функций WordPress.
Более подробно о функции WP->parse_request()
Как было сказано выше, WP->parse_request() (метод класса WP из wp-includes/class-wp.php) разбирает URL и создает из нее запрос. Вот все шаги, которые совершает эта функция:
- Отсекает переменные GET из URL (то есть, все, что находится после знака ‘?’ в URL). Также отсекает адрес домашней страницы блога (базу).
- С помощью вызова функции $wp_rewrite->wp_rewrite_rules() получает правила, которые действуют в настоящий момент ($wp_rewrite – это объект класса WP_Rewrite, этот класс объявлен в файле wp-includes/rewrite.php). Эти правила представляют собой некий шаблон, с помощью которого происходит распознание структуры постоянных ссылок WordPress для текущей страницы (этот шаблон содержит всю необходимую информацию). Для справки: для страниц архивов категорий по умолчанию задано правило, с помощью которого возможно разобрать ссылку вид ‘category/abc’ и это правило гласит, что нужно вызвать категорию со слагом “abc”, также есть правило для домашней страницы (если после разбора ссылки ничего не осталось, тогда это ссылка на домашнюю страницу).
- Идет по правилам перезаписи (‘rewrite rules’) по порядку до тех пор, пока не отыщется соответствие между правилом и постоянной ссылкой. Если такое соответствие не удалось найти, будет показана страница ошибки 404. Если найдено соответствие, то WordPress разбирает ссылку в соответствии с этим правилом, получая необходимую информацию.
- Составляет массив всех переменных для запроса к базе данных. Для каждой переменной запроса проверяется, была ли она установлена во время разбора ссылки или с помощью POST или GET параметров. Если переменная найдена, то ее значение сохраняется в массиве переменных запроса к базе данных ($wp->query_vars, часть класса WP in wp-includes/class-wp.php).
Что плагины могут изменять
Далее идет обзор того как плагин может изменять основной запрос к базе данных и поведение постоянных ссылок, описанное выше. О многом из этого можно узнать из статьи “произвольный запрос к базе данных”.
- Добавлять, изменять или удалять правила перезаписи, что повлияет на процесс распознания постоянных ссылок.
Это осуществляется не фильтрами и действиями, а с помощью использования функций из wp-includes/rewrite.php, таких как add_rewrite_rule, add_rewrite_endpoint, и так далее. Это может быть немного сложнее, поскольку WP_Rewrite->wp_rewrite_rules() обычно получает заранее сохраненный набор правил (они хранятся в базе данных как настройка с названием “rewrite_rules”). Если вы будете изменять эти правила, то нужно также вызывать функцию $wp_rewrite->flush_rules(), чтобы правила рассчитались заново. Это нужно делать в вашем плагине на действиях активации, деактивации, удаления, поскольку эти хуки происходят на ранней стадии загрузки системы. Очень важно не делать этого во время каждого запроса. Вызывайте эту функцию только во время активации и подобных. - Добавлять или удалять переменные, чтобы повлиять на процесс распознания и сохранения переменных в массив из запросов POST, GET и постоянных ссылок (query_vars фильтр).
- Изменять массив всех переменных, после того как их значения уже сохранены (фильтр request или действие parse_request. Если вы хотите использовать условные теги, то для этого подойдут действия parse_query или pre_get_posts, они происходят после того как переменные is_ установлены).
- Изменять запрос к базе данных после того как он создан из массива всех переменных, используя следующие фильтры:
- posts_where
- posts_join
- posts_groupby
- posts_orderby
- posts_distinct
- posts_fields
- post_limits
- posts_where_paged
- posts_join_paged
- posts_request
- Изменять результаты запроса к базе данных (фильтр the_posts).
- Изменять файл шаблона (template_redirect действие)
1 комментарий на “Процесс загрузки WordPress”