Wp load php что за файл
В процессе загрузки WordPress происходит множество событий. К каждому из этих событий можно привязать функцию, которая выполнит какое-то действие ( action ) или изменит данные ( filter ). Отправка формы не является исключением — мы можем «прицепить» свою функцию к подходящему хуку и обработать POST-данные.
Кодекс WordPress говорит, что данные формы нужно отправлять на admin-post.php в директории wp-admin . А сама форма должна содержать поле action . Посмотрим на исходный код этого скрипта:
Все очень просто:
- когда пользователь не авторизован
- если action не установлен, происходит событие admin_post_nopriv
- если action установлен, происходит событие admin_post_nopriv_
- если action не установлен, происходит событие admin_post
- если action установлен, происходит событие admin_post_
Все вышеописанные хуки можно применить и для GET запроса, если адрес примерно такой:
Загрузка AJAX запроса
Отправлять AJAX запросы принято в файл wp-admin/admin-ajax.php, с него и начинается загрузка WordPress при AJAX запросах.
Давайте и тут разберем порядок загрузки, а затем немного пояснений.
При AJAX запросе также устанавливается константа WP_ADMIN . Это значит, что любой AJAX запрос выглядит для ядра, как запрос в админ часть, даже если этот запрос делается с фронта. Это не всегда нужно, но так принято в WordPress по причинам стандартизации и удобства использования.
Далее загружается ядро, в котором срабатывают все хуки. Т.е. подключаются и запускаются все плагины, срабатывает код файла functions.php , срабатывает событие init . Т.е. полностью загружается и обрабатывается ядро WordPress.
Теперь, когда ядро обработано, дополнительно подключаются все PHP функции админ-панели (хотя часто они не нужны) и запускается один из AJAX хуков (зависит от авторизации): wp_ajax_(action) или wp_ajax_nopriv_(action) .
Запуск AJAX хука это последний этап - AJAX операция выполнена и она должна прервать работу PHP и вывести на экран какие-либо данные - обычно это либо просто строка, либо строка в json формате.
Кстати, для удобного json ответа при AJAX запросах в WP есть специальная функция - wp_json_encode() и две функции производные от нее:
В этом посте речь пойдет о том, какие бывают названия у файлов темы WordPress и за показ какой страницы на сайте отвечает каждый из них. Это очень важные, нужные, и в тоже время очень простые, для понимания, знания. Ими должен обладать каждый, кто работает с WordPress. Ниже полностью расписана структура файлов темы WordPress и порядок их подключения (иерархия).
Об иерархии файлов темы я упоминал в статье «Условные теги в WordPress». А ниже тоже самое, только описано подругому (надеюсь более понятно).
24. Выполнение функции wp()
Теперь WordPress вызывает функцию wp() из файла wp-includes/functions.php . Эта функция устанавливает основной запрос, т.е. среду WordPress.
Посмотрим на код, как устанавливается среда WordPress:
Фильтр request срабатывает в конце метода WP::parse_request() , позволяя изменить свойство WP::query_vars , которое содержит переменные запроса, используемые в методе WP::query_posts() .
Фильтр parse_request срабытывает в конце метода WP::parse_request() , сразу после фильтра request . В фильтр передается экземпляр класса WP по ссылке, так что можно изменить не только переменную класса $query_vars , но и другие переменные.
Фильтр pre_get_posts срабатывает абсолютно для всех запросов, не только для основного. Для основного запроса (из кода выше) он срабатывает во время вызова метода WP::query_posts() , т.е. после request и parse_request .
Фильтр wp срабытывает в конце метода WP::main() , в этот момент записи уже получены. В фильтр передается экземпляр класса WP по ссылке. Это самое раннее событие, когда работают условные теги.
27. Загрузка основного шаблона (темы)
WordPress начинает загружать файлы текущей активной темы в соответствии с ее иерархией. Как правило, все начинается с файла, который содержит главный цикл.
Загрузка Админки
Админка WordPress никак не связана с «корневым» файлом index.php . Вся её загрузка начинается с файла wp-admin/admin.php.
Первое и главной что там происходит - это определяется константа WP_ADMIN , которая говорит всему коду который выполняется потом, что мы находится в админке.
Что работает при SHORTINIT
При использовании SHORTINIT система фильтров: apply_filters() do_action() уже работает. Фильтры прописаны основные (файл: /wp-includes/default-filters.php) Те что вы указывали в functions.php вашей темы и многие другие работать не будут.
Из привычных функций: esc_attr() , is_single() , the_content() , get_permalink() и т.д. не работает ни одна. Вот все функции которые подключаются - см. /wp-settings.php:
Include files required for initialization.
Load early WordPress files.
Пример того как работает иерархия
- category-plugins.php
- category-25.php
- category.php
- archive.php
- index.php
Иерархия, в данном случае — это последовательная проверка на существование файла шаблона. Для контента одной страницы на сайте, может подходить несколько файлов. Проверка какой именно файл будет использован идет по-очереди. Т.е. в WordPress есть список подходящих названий файлов, каждое из названий проверяется по очереди на физическое существование такого файла, как только WordPress видит что файл существует поиск подходящего файла прекращается и найденный файл используется в качестве шаблона.
18. Загрузка файла functions.php дочерней темы
Файл functions.php содержит набор функций, применимых для каждой темы оформления индивидуально. При использовании дочерней темы, на на данном этапе будет загружен functions.php именно дочерней темы.
14. Запуск события plugins_loaded
Т.е. будет вызвана функция do_action() с параметром plugins_loaded . Как следствие — будут вызваны все функции, привязанные к этому событию с помощью add_action() .
28. Запуск события shutdown
В самом конце, перед завершением исполнения всего PHP-кода WordPress запускает последнее событие shutdown . На этом этапе работа WordPress закончена.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Порядок загрузки (теория)
Понять логику загрузки не так сложно, как может показаться на первый взгляд. Для этого давайте взглянем на эту, столь любимую мной, картинку:
Существует 4 варианта загрузки. На самом деле их чуть больше, но это основные:
- Загрузка Фронтэнда (темы).
- Загрузка REST запроса.
- Загрузка Админки.
- Загрузка AJAX запроса (admin-ajax.php).
Во всех случаях загружается ядро WordPress - файл wp-load.php . Ядро загружается всегда и везде!
Прежде чем переходить к каждому типу загрузки, нужно разобраться как загружается само ядро.
4. Загрузка файла advanced-cache.php
Загрузка advanced-cache.php , если этот файл существует. В терминологии плагинов WordPress этот файл является так называемым «вкраплением». Он создается автоматически, если на сайте установлен один из кеш-плагинов. Этот файл содержит конфигурационную информацию для работы кеширования.
26. Загрузка feed-шаблона для RSS
Если запрашиваемый контент относится к RSS-feed, WordPress загружает соответствующий feed-шаблон.
5. Загрузка файла wp-content/db.php
WordPress позволяет разработчикам создавать свои абстрактные слои БД и загружать их через файл db.php . Как правило, этот файл используется кеш-плагинами для оптимизации работы БД. Поэтому, если такой файл существует, он загружается на этом этапе.
Архивы
Рубрика
- category-.php
- category-.php
- category.php
- archive.php
- paged.php (если страница пагинации)
- index.php
Метка
- tag-.php
- tag-.php
- tag.php
- archive.php
- paged.php (если страница пагинации)
- index.php
Таксономия
- taxonomy--.php
- taxonomy-.php
- taxonomy.php
- archive.php
- paged.php (если страница пагинации)
- index.php
- archive-.php
- archive.php
- paged.php (если страница пагинации)
- index.php
- author-.php
- author-.php
- author.php
- archive.php
- paged.php (если страница пагинации)
- index.php
- date.php
- archive.php
- paged.php (если страница пагинации )
- index.php
Типы страниц и названия файлов
Теперь когда мы понимаем как работает иерархия, давайте посмотрим на все варианты названий файлов, которые WordPress пытается найти при посещении той или иной страницы сайта.
Полная схема для всех видов страниц и подходящих для них файлов выглядит так:
Теперь, я распишу эту картинку, сделаю из неё список страниц сайта и подходящие для них php файлы темы.
Файлы из списка ниже должны находится в папке темы.
404 страница
Главная страница
- front-page.php
- Логика постоянных страниц, когда для главной выбрана страница в настройках.
- home.php
- index.php
Загрузка Фронт-энда (темы)
Любые Фронтэнд запросы отправляются в файл index.php в корневой папке домена. Это означает, что WordPress загружается с темой. Для констатации этого факта в index.php определяется константа WP_USE_THEMES . Так например хук template_redirect из файла template-loader.php будет работать только, если определена эта константа.
Процесс загрузки Фронта выглядит так:
Подробнее про установку основного запроса и среду WP, читайте в описании функции wp().
Смотрите также картинку о том, как работает запрос WordPress:
19. Загрузка файла functions.php родительской темы
Если используется дочерняя тема, то после загрузки functions.php из дочерней темы будет загружен functions.php родительской темы.
20. Запуск события after_setup_theme
Событие запускается после того, как WordPress определился с тем, какая тема оформления активна на данный момент, и загрузил ее файл functions.php .
Как это работает в коде ядра
За всю логику: какой файл подключать, отвечает файл ядра wp-includes/template-loader.php. Если разобраться, в нем все описано. Но, это занятие не особо интересное, поэтому я его распишу.
Прежде всего. template-loader.php подключается после того как загрузится вся среда WordPress. После того, как отработает файл wp-load.php и обработается основной запрос - функция wp(). Т.е. template-loader.php подключается в самом-самом конце PHP скрипта.
Дальше идут проверки по всем условным тегам где выясняется какой файл шаблона подходит под текущий запрос. Проверяется условный тег, затем еще один и еще. Как только один из условных тегов сработал, вызывается соответствующая функция, которая находит подходящий файл шаблона и возвращает путь до него. Все такие функции описаны в get_query_template().
Дальше - путь до файла шаблона определен! Теперь путь проходит через фильтр template_include. Который позволяет нам изменить путь до файла шаблона для текущего запроса.
Готово - файл шаблона подключается в PHP, таким образом запускается визуальная часть генерации страницы.
11. Запуск события muplugins_loaded
Т.е. будет вызвана функция do_action() с параметром muplugins_loaded . Как следствие — будут вызваны все функции, привязанные к этому событию с помощью add_action() .
12. Загрузка всех активированных плагинов
Список активированных плагинов хранится в таблице wp_options базы данных, имя опции — active_plugins . Таким образом на этапе загрузки игнорируются все установленные, но неактивные плагины.
22. Запуск события init
На данном этапе WordPress загрузил уже все необходимое для работы. Это самое популярное событие у разработчиков — ядро загружено, плагины и тема активированны, пользователь авторизован, но на экран еще ничего не выведено.
9. Загрузка библиотеки локализации
Загрузка файла wp-includes/l10n.php для включения системы локализации. На данном этапе будет учтен выбранный язык, региональные параметры и файлы для перевода.
Другие файлы темы
Также, в WordPress есть общепринятые подключаемые файлы. Он не участвуют в иерархии, а просто подключаются вручную там где нужно. Например файл sidebar.php подключается в файле шаблона темы с помощью функции get_sidebar().
Список таких «подключаемых» файлов:
- functions.php - всегда подключается автоматически при загрузке темы.
- header.php - get_header()
- sidebar.php - get_sidebar()
- footer.php - get_footer()
- searchform.php - get_search_form()
3. Загрузка файла wp-settings.php
Установка значений констант WP_MEMORY_LIMIT , WP_MAX_MEMORY_LIMIT , WP_DEBUG , SCRIPT_DEBUG , WP_CONTENT_DIR , WP_CACHE и других.
Записи
Запись (запись post)
- single-post-.php
- single-post.php
- single.php
- singular.php
- index.php
Произвольный тип записи
- .php (для древовидного типа с поддержкой шаблонов. С WP 4.7)
- single--.php
- single--.php
- single-.php
- single.php
- singular.php
- index.php
Вложение
- .php
- .php
- -.php
- attachment.php
- single-attachment-.php (позволяет указать шаблон для отдельной картинки)
- single-attachment.php (тоже что и attachment.php)
- single.php
- singular.php
- index.php
Под началом и концом MIME типа, имеется виду первая и последняя часть MIME типа, разделенная / . Например, MIME-тип текстового файла: 'text/plain' и значит будет проверяться наличие файл text.php , затем plain.php , затем text-plain.php .
Полный список MIME типов смотрите в описании get_allowed_mime_types().
25. Запуск события template_redirect
Событие происходит прямо перед тем, как WordPress определяет, какой шаблон должен быть использован.
21. Настройка текущего пользователя
Теперь WordPress загружает объект текущего пользователя. Это позволяет понять, какие запросы могут быть выполнены в дальнейшем в соответствии с текущей ролью пользователя и его привилегиями.
Загрузка REST запроса
REST запрос на 90% обрабатывается также как и запрос для фронтенда. Его также начинает обрабатывать файл index.php . Через правила перезаписи (ЧПУ) устанавливается параметр запроса rest_route=маршрут .
Процесс загрузки REST запроса выглядит так:
Пояснения к работе wp() и хуку parse_request
Функция wp() вызывает метод WP::main(), он делает следующие действия по порядку:
Этот метод устанавливает текущего пользователя для обычных (не REST) запросов. см. wp_get_current_user().
Позднее (если это REST запрос), на хуке аутентификации rest_authentication_errors авторизованный юзер будет обнулен при неправильном nonce коде. Смотрите:
Этот метод устанавливает параметры текущего запроса $wp->query_vars .
В конце WP::parse_request() срабатывает хук parse_request на котором всегда висит функция rest_api_loaded():
rest_api_loaded() проверяет параметр запроса $GLOBALS['wp']->query_vars['rest_route'] . Если это REST запрос, то запускается логика REST (логика обработки запросов для обычных страниц тут заканчивается).
Устанавливается константа define( 'REST_REQUEST', true ) .
Запускается REST сервер rest_get_server().
При запуске срабатывает хук rest_api_init. На нём в имеющийся сервер добавляются свои маршруты.
При обработке запроса проверяется доступность текущего маршрута, маршрут обрабатывается, возвращается ответ REST сервера в виде объекта WP_REST_Response.
При обработке запроса срабатывают следующие полезные хуки (в указанном порядке):
Таким образом
За обработку REST запроса отвечает функция rest_api_loaded().
REST запрос выглядит точно также как обычный фронтэнд запрос. До момента установки основного запроса WordPress функцией wp() . В ней как и в обычном фронтэнд запросе устанавливается текущий юзер. Но:
- НЕ устанавливаются заголовки WP::send_headers() .
- НЕ происходит основного запроса WP::query_posts() .
- НЕ обрабатывается 404 страница WP::handle_404() .
- НЕ вызывается файл template-loader.php , который определяет шаблон страницы.
- НЕ работает хук редиректов template_redirect .
Заголовки REST ответа ставит REST сервер, также он делает соответствующий запрос в БД или что-угодно еще.
23. Запуск события widget_init
Событие позволяет регистрировать виджеты и выполнять код, необходимый для их работы.
15. Загрузка Rewrite Rules
10. Загрузка must use плагинов
Загрузка обязательных к использованию плагинов. Это плагины, которые устанавливаются в специальную папку mu-plugins и которые всегда активны для сайта и сайтов сети.
Фильтры
Иерархию файлов можно изменить через динамические фильтры:
(type)_template_hierarchy - фильтрует массив названий файлов иерархии, по которому будет идти поиск нужного файла. С WP 4.7.
Все варианты параметра type смотрите в одноименном параметр $type функции get_query_template(). Вот они:
Итак, пользователь набрал в адресной строке браузера URL WordPress-сайта и нажал Enter. Произошел резолвинг доменного имени, и браузер обратился по конкретному IP-адресу к хостинг-серверу с запросом на загрузку сайта. Что происходит дальше в последующие доли секунды, пока сайт не отобразится в окне браузера?
6. Подключение к базе данных
8. Загрузка файла wp-content/sunrise.php
Если сайт является частью сети (режим Multisite), то будет загружен файл wp-content/sunrise.php .
13. Загрузка файла pluggable.php
Файл pluggable.php хранит функции, которые могут быть переопределены WordPress-плагинами. WordPress проверит, определены ли функции из файла pluggable.php какими-то другими активными плагинами. Если нет, будут определены функции из pluggable.php .
Плагин «Форма обратной связи»
Давайте применим полученные знания на практике и создадим плагин, который позволит добавить на сайт форму обратной связи. Создаем директорию tokmakov-feedback и внутри нее — файл tokmakov-feedback.php .
Для начала зарегистрируем шорткод [tokmakov-feedback] :
У нас есть скрытое поле формы action со значением tokmakov_feedback — значит, нам доступны два хука:
- admin_post_nopriv_tokmakov_feedback
- admin_post_tokmakov_feedback
Форму мы должны обработать независимо от того, залогинился пользователь или нет:
Что ж, давайте напишем функцию, которая будет обрабатывать данные формы и отправлять письмо администратору:
Поскольку мы используем суперглобальный массив $_SESSION , давайте стартанем сессию при наступлении события init :
Если при проверке данных формы были обнаружены ошибки, элемент массива $_SESSION с ключом tokmakov_feedback будет содержать вот что:
Если данные формы были успешно отправлены, этот элемент массива будет таким:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Меня волновал вопрос: как можно использовать объект $wpdb и Базу Данных сайта с которой я работаю, но чтобы при этом минимально подгружать среду WP. Иногда бывает нужно, при использовании Ajax получить или записать данные в БД и ничего больше: не нужны фильтры, не нужна проверка на авторизацию пользователя, не нужны функции WоrdPress, не нужны всякие проверки и куча подгружаемых функций. В общем, не нужно ничего кроме возможности общаться с Базой Данных привычными для WordPress методами.
Решить такую задачу можно, считав данные подключения к БД из файла wp-config.php и отдельно подключится к БД. Но это не очень удобно и потребует лишнего кода, который по сути уже есть в файлах WordPress. А то получатся очередные костыли.
С версии 3.4 разработчики WordPress позаботились об этом и добавили константу SHORTINIT в wp-settings.php:
Работает она так:
7. Загрузка файла object-cache.php или wp-includes/cache.php
Загрузка файла object-cache.php , если такой есть. Если нет, попытка загрузить файл cache.php в директории wp-includes . Если и этого файла нет, то следующий шаг.
2. Загрузка файла wp-config.php
Это главный конфигурационный файл, содержит информацию для подключения к базе данных и устанавливает некторые константы.
Загрузка ядра WordPress
Ядро WP загружается при любом запросе: фронт, аякс, админка, REST .
При загрузки ядра всегда подключаются файл темы functions.php , даже в админке. Т.е. не важно, нужна нам тема или нет, functions.php работает и поэтому его можно поставить в один ряд с плагинами. Сделано так для удобства, чтобы любой код можно было «сунуть» в наш, потому и любимый, файл functions.php . Такое поведение не логично с точки зрения программирования, но очень удобно с точки зрения разработки.
Ядро, как мы видим, находится в файле wp-settings.php , но перед ним вызывается wp-load.php . Нужно это для того, чтобы найти файл wp-config.php . Дело в том, что wp-config.php может находится в одной папке со всеми файлами wordPress, а может быть вынесен в родительскую папку. Задача wp-load.php отыскать файл конфигурации и подключить его . Если его нигде нет, то WP предложит его создать. Собственно, ровно это происходит при установке WordPress.
После того, как файл конфигурации найден, он подключается. В нем указываются все важные константы, параметры подключения к базе данных и т.д. И затем подключается ядро - файл wp-settings.php .
Встраивания (embeds)
Чтобы изменить только контент встраивания, можно в теме создать файл embed-content.php и описать там HTML. Оригинальный HTML находится в файле движка /wp-includes/theme-compat/embed-content.php
1. Загрузка файла wp-load.php
Все начинается с загрузки файла wp-load.php в корневом каталоге сайта.
16. Инициализация $wp_query, $wp_rewrite, $wp
Инициализация глобальных переменных:
- $wp_query — содержит экземпляр класса WP_Query
- $wp_rewrite — содержит экземпляр класса WP_Rewrite
- $wp — содержит экземпляр класса WP
Авторизация при SHORTINIT
Пример проверки авторизации и получения всех прав пользователя с SHORTINIT
В комментариях Александр поделился кодом, который исправно работает, за что ему отдельное спасибо. Далее код бы доработан Михаилом (обернут в функцию) и вот что получилось в итоге:
Первый протестированный вариант кода
Код тестировался на WP 4.5. В ранних или поздних версиях возможно нужно будет изменить проверку.
При работе с темами, плагинами и вообще с любым кодом WordPress, включая хаки в популярном файле темы functions.php . Хорошо бы знать в какой последовательности подключаются php файлы движка, когда срабатывают важные хуки и какие важные константы определены. В этой статье поговорим о такой последовательности загрузки.
Примеры
Чтобы было понятнее, возьмем простую задачу: нам нужно подключить какой-то код в админ-панели WordPress и только там - код не должен срабатывать во фронте или при AJAX запросах. Кто-то скажет, что достаточно сделать проверку с помощью is_admin(), однако это не так, потому что is_admin() вернет true и при AJAX запросе в файл admin-ajax.php .
Или например, можно подключить какую-то логику на хук admin_init и потом долго недоумевать, а почему моя логика работает и при запросах AJAX. Или почему она мешает плагинам, которые работают с AJAX.
Или вот еще пример из комментария. Когда в файле темы functions.php выполняется какой-то код, который зависит от другого кода подключаемого через хук init. Например, вы создали тип записи во время хука init и в самом файле functions.php выполняете проверку, которая опирается на этот новый тип записи и ожидаете что код будет работать, но это не так, потому что прямой код в functions.php срабатывает раньше чем событие init .
Таких примеров можно привести много. Но чтобы так не ошибаться, нужно разобраться и понять последовательность загрузки ядра WordPress. Этим мы и займемся.
- Порядок загрузки (теория)
- Загрузка ядра WordPress
- Загрузка Фронт-энда (темы)
- Загрузка REST запроса
- Загрузка Админки
- Загрузка AJAX запроса
- Занимательная картинка о том, как загружается WordPress
17. Запуск события setup_theme
Т.е. будет вызвана функция do_action() с параметром setup_theme . Как следствие — будут вызваны все функции, привязанные к этому событию с помощью add_action() .
Конкретные числа
Чтобы посмотреть чем отличаются инициализации с SHORTINIT и без. Я замерил: количество SQL запросов, время на выполнение кода и используемая память. Вот что получилось:
Таким образом SHORTINIT, грубо, по всем параметрам снижает нагрузку в 5 раз. Неплохо!
Читайте также: