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

SHORTINIT константа: WordPress среда с минимальной нагрузкой

Меня волновал вопрос: как можно использовать объект $wpdb и Базу Данных сайта с которой я работаю, но чтобы при этом минимально подгружать среду WP. Иногда бывает нужно, при использовании Ajax получить или записать данные в БД и ничего больше: не нужны фильтры, не нужна проверка на авторизацию пользователя, не нужны функции WоrdPress, не нужны всякие проверки и куча подгружаемых функций. В общем, не нужно ничего кроме возможности общаться с Базой Данных привычными для WordPress методами.

Решить такую задачу можно, считав данные подключения к БД из файла wp-config.php и отдельно подключится к БД. Но это не очень удобно и потребует лишнего кода, который по сути уже есть в файлах WordPress. А то получатся очередные костыли.

С версии 3.4 разработчики WordPress позаботились об этом и добавили константу SHORTINIT в wp-settings.php:

// Останавливаем основную загрузку WordPress если нам нужна только база.
if ( SHORTINIT )
	return false;

Работает она так:

// указываем, что нам нужен минимум от WP
define('SHORTINIT', true);

// подгружаем среду WordPress
// WP делает некоторые проверки и подгружает только самое необходимое для подключения к БД
require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );

// тут мы можем общаться с БД. Но практически никакие функции WP работать не будут.
// Глобальные переменные $wp, $wp_query, $wp_the_query не установлены...
global $wpdb;
$result = $wpdb->get_results("SELECT post_title FROM $wpdb->posts WHERE post_type='post'");

if( $result ){
	foreach( $result as $post ){
		echo "$post->post_title <br>";
	}
}

Конкретные числа

Чтобы посмотреть чем отличаются инициализации с SHORTINIT и без. Я замерил: количество SQL запросов, время на выполнение кода и используемая память. Вот что получилось:

require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );
// 5 SQL за 0.1 сек., память: 14.92 mb

define( 'SHORTINIT', true );
require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );
// 0 SQL за 0.02 сек., память: 2.35 mb

Таким образом SHORTINIT, грубо, по всем параметрам снижает нагрузку в 5 раз. Неплохо!

Что работает при 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.

Авторизация при SHORTINIT

Пример проверки авторизации и получения всех прав пользователя с SHORTINIT

В комментариях Александр поделился кодом, который исправно работает, за что ему отдельное спасибо. Далее код бы доработан Михаилом (обернут в функцию) и вот что получилось в итоге:

Первый протестированный вариант кода

Код тестировался на WP 4.5. В ранних или поздних версиях возможно нужно будет изменить проверку...

37 комментариев
Полезные 3 Все
    Войти