WordPress как на ладони
wordpress jino

Как загружается ядро WordPress

При работе с темами, плагинами и вообще с любым кодом 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

Теперь немного пояснений, чтобы все визуальное стало реальным...

Существует три варианта загрузки, хотя на самом деле их чуть больше, но это три основных:

  • Загрузка фронтэнда (темы)
  • Загрузка админки
  • Загрузка через AJAX запрос

Во всех трех случаях всегда загружается основная часть - файл wp-load.php - это ядро WordPress. Т.е. ядро загружается всегда и везде.

Прежде чем переходить к каждому типу загрузки, давайте разберем порядок загрузки самого ядра.

Загрузка ядра WordPress

wp-load.php
	wp-config.php
		wp-settings.php
			// Подключаются самые базовые функции (подключение к БД $wpdb и система хуков)
			// Подключаются базовые хуки (фильтры)

			// SHORTINIT: Остановка загрузки, где есть только самое базовое:
			if( SHORTINIT ) return false;

			// подключается вся среда WordPress: базовые функции, хуки

			// подключаются must-use плагины и срабатывает событие:
			do_action( 'muplugins_loaded' );

			// подключаются активированные плагины и срабатывает событие:
			do_action( 'plugins_loaded' );

			// устанавливаются глобальные переменные: 
			// wp_the_query, wp_query, wp_rewrite, wp, wp_widget_factory, wp_roles и т.д.

			do_action( 'setup_theme' );
			// устанавливается текущая тема
			// functions.php (child) - сначала подключается functions.php дочерней темы 
			// functions.php (parent) - затем подключается functions.php основной темы 
			do_action( 'after_setup_theme' );

			// определяется текущий пользователь. 
			// Хотя его можно определить уже после события 'plugins_loaded'

			// init событие. Когда среда WP, плагины и тема активированны,
			// но на экран еще ничего не выведено:
			do_action( 'init' );

			// проверка статуса сайта для мультисайтовой сборки

			// тоже самое что init только после проверки статуса.
			// до этой строки работа PHP может не дойти...
			do_action( 'wp_loaded' );

Обратите внимание, что при загрузки ядра всегда подключаются файл темы functions.php, даже в админке WordPress, т.е. не важно, нужна нам тема или нет, 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.

Загрузка фронтэнда (темы)

Любые фронтэнд запросы отправляются в файл index.php в корневой папке домена. И это значит, что WordPress загружается с темой. Для констатации этого факта определяется константа WP_USE_THEMES. Так например хук template_redirect будет работать только, если определена эта константа.

А дальше процесс загрузки фонтенда выглядит так:

index.php
	// определяется константа WP_USE_THEMES

	wp-blog-header.php
		// ЯДРО
		require_once( dirname(__FILE__) . '/wp-load.php' );

		// установка основного запроса WordPress (среды WordPress). Тут определяется что за страница загружается
		wp();

		// подключение нужного файла шаблона темы 'template-loader.php'
		require_once( ABSPATH . WPINC . '/template-loader.php' );

Больше тут добавить в общем-то нечего...

Подробнее про установку основного запроса и среду WP, читайте в описании функции wp(). Также есть полезная картинка о том как работает запрос WordPress:

Как работают функции запросов в WordPress

Про подключение нужно файла темы читайте: Иерархия шаблона.

Загрузка админки

Админка WordPress никак не связана с «корневым» файлом index.php. Вся её загрузка начинается с файла wp-admin/admin.php.

Первое и главной что там происходит - это определяется константа WP_ADMIN, которая говорит всему коду который выполняется потом, что мы находится в админке.

wp-admin/admin.php
	// определяется константа WP_ADMIN
	define( 'WP_ADMIN', true );

	// ЯДРО
	require_once(dirname(dirname(__FILE__)) . '/wp-load.php');

	// проверяется необходимость Апгрейда WordPress

	// подключаются файлы (дополнительные функции) админки
	require_once(ABSPATH . 'wp-admin/includes/admin.php');

	// Проверяет авторизован ли пользователь, перед тем как допустить его на любую страницу
	// если прав недостаточно, то юзер «улетит» на страницу авторизации
	auth_redirect();

	// хук админки
	do_action( 'admin_init' );

	// устанавливается данные текущей страницы
	set_current_screen();

	// шапка 
	require_once(ABSPATH . 'wp-admin/admin-header.php');

	// контент - тут логика разветвляется и контент загружается
	// либо от плагина
	// либо никакой, потому что это импорт данных
	// либо родные файлы адмники, например, wp-admin/options-general.php

	// подвал
	include(ABSPATH . 'wp-admin/admin-footer.php');

Загрузка через AJAX запрос

Отправлять AJAX запросы принято в файл wp-admin/admin-ajax.php, с него и начинается загрузка WordPress при AJAX запросах.

Давайте и тут разберем порядок загрузки, а затем немного пояснений.

wp-admin/admin.php
	// определяется константа WP_ADMIN
	define( 'WP_ADMIN', true );

	// ЯДРО
	require_once(dirname(dirname(__FILE__)) . '/wp-load.php');

	// Проверяется наличие параметра запроса 'action' он должен быть определен для любого AJAX запроса.
	if( empty( $_REQUEST['action'] ) ) die( '0' );

	// подключаются файлы (дополнительные функции) админки
	require_once(ABSPATH . 'wp-admin/includes/admin.php');

	// подключаются обработчики Ajax запросов ядра WordPress
	require_once( ABSPATH . 'wp-admin/includes/ajax-actions.php' );

	// хук админки
	do_action( 'admin_init' );

	// проверка и исправление значений параметра action связанных с ядром WordPress и добавление нужного хука
	add_action( 'wp_ajax_' . $_GET['action'], 'wp_ajax_' . str_replace( '-', '_', $_GET['action'] ), 1 );

	// проверка прав пользователя и запуск нужного хука
	do_action( 'wp_ajax_' . $_REQUEST['action'] );
	// или 
	do_action( 'wp_ajax_nopriv_' . $_REQUEST['action'] );

	// Ответ AJAX по умолчанию
	die( '0' );

При 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 Комментариев нет

Здравствуйте, !

Ваш комментарий