Использовать только аутентификацию WordPress
Я хочу создать небольшую игру для пользователей моего сайта на WordPress. Сама игра будет использовать только систему аутентификации из WP, а вся остальная логика будет полностью внешней.
Сейчас, если я использую стандартную страницу WordPress с пользовательским шаблоном (встраивая мой PHP-скрипт игры), она загружается, но кажется слишком медленной для моих пользователей. Мой игровой скрипт использует ту же базу данных, что и WP, и работает быстро. Для тестов я отключил его (оставил только тестовый вывод), но даже эта "пустая" страница в WP слишком медленная.
Возможно ли полностью обойти WordPress (т.е. отказаться от системы шаблонов и всего, кроме процессов аутентификации) и загружать мою игру напрямую? Мое первое предположение - разместить отдельный скрипт в корне установки сайта, но я не могу понять, как использовать только компоненты аутентификации WordPress - возможно ли использовать таким образом только один компонент движка WordPress?
Может быть, есть альтернативный способ ускорить загрузку страницы с моим игровым скриптом...

Не уверен, но сейчас в голову приходит первое решение. Вам нужны данные из WordPress для аутентификации. Если подключить файл wp-load.php
, у вас будет доступ к WordPress и его функциям, возможно, для идентификации. Но включать файл с жестким путем не очень надежно.
define( 'WP_USE_THEMES', FALSE );
require( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );
Запрос и перенаправление
Вы можете изменить запрос, добавив кастомное значение, и если это значение существует, можно перенаправить через хук в вашу игру. После этого перенаправления у вас будет доступ ко всем функциям WordPress, включая проверку пользователей. Эта идея работает только во фронтенде, а не в бэкенде, только как подсказка.
Следующий код — всего лишь пример, как добавить кастомную строку в запрос для идентификации и перенаправить на ваш кастомный код.
add_filter( 'query_vars', 'fb_plugin_add_trigger', 10, 1 );
function fb_plugin_add_trigger( $vars ) {
$vars[] = 'fb_plugin_trigger';
return $vars;
}
add_action('template_redirect', 'fb_plugin_trigger_check');
function fb_plugin_trigger_check() {
if ( (int) get_query_var('fb_plugin_trigger') === 1 ) {
// Здесь ваш кастомный код.
exit();
}
}
URL для этого триггера будет выглядеть, например, так: example.com/?fb_plugin_trigger=1
.
Кастомный эндпоинт
Еще один вариант, который стоит попробовать — добавить кастомный эндпоинт.
add_action( 'init', 'fb_my_endpoint' );
function fb_my_endpoint() {
add_rewrite_endpoint( 'fb_plugin_trigger', EP_ROOT );
}
После этого значение можно будет увидеть в URL, например: example.com/fb_plugin_trigger/
.
Небольшая подсказка: сбросьте правила перезаписи (rewrite rules) после добавления эндпоинта. Также, если вы не используете ЧПУ (постоянные ссылки), воспользуйтесь функцией add_query_arg()
, чтобы добавить параметры в URL для идентификации.
Теперь вы можете обработать это значение в запросе и подключить исходный код вашей игры.
add_action( 'parse_query', 'fb_parse_query' );
function fb_parse_query( $query ) {
if ( isset( $query->query_vars['my_api'] ) ) {
include( plugin_dir_path( __FILE__ ) . 'game/index.php');
exit;
}
}

Возможно, я наивен, но мне кажется, что после добавления этих первых двух строк кода у вас будет доступ к is_user_logged_in()
, и этого должно быть достаточно. Что я упускаю?

Я думаю, причина замедления может быть связана со всеми скриптами, которые WordPress загружает в wp_head(). Если у вас запущено несколько плагинов или любой js/css, который блокирует отрисовку, это сильно скажется на производительности.
Попробуйте загрузить пользовательский файл заголовка, например header-mygame.php, и замените get_header()
в вашем шаблоне на get_header('mygame')
.
В файле header-mygame.php удалите wp_head() и всё остальное, что не требуется для работы вашей игры. Вручную добавьте обратно только необходимые зависимости с помощью тегов <script>
и <link>
.
То же самое можно сделать с get_footer()
, так как WordPress может подключать скрипты и там.
Конечно, это не "правильный" способ подключения ресурсов в WordPress, но, судя по всему, стандартный подход уже обходится, так что...

Вот шаги, которые вы можете выполнить, чтобы использовать WordPress только для аутентификации.
- Создайте отдельную папку в корне для вашего кода.
- Скопируйте wp-config.php в отдельный файл и удалите
require_once ABSPATH . 'wp-settings.php';
- Подключите скопированный файл wp-config в ваш код
Создайте вспомогательную функцию для вызова WordPress:
function i_need_wp() { global $table_prefix; require_once ABSPATH . 'wp-settings.php'; }
Вызовите
i_need_wp()
перед использованием аутентификации WordPress.
