Использовать только аутентификацию WordPress

23 авг. 2016 г., 18:14:12
Просмотры: 285
Голосов: 3

Я хочу создать небольшую игру для пользователей моего сайта на WordPress. Сама игра будет использовать только систему аутентификации из WP, а вся остальная логика будет полностью внешней.

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

Возможно ли полностью обойти WordPress (т.е. отказаться от системы шаблонов и всего, кроме процессов аутентификации) и загружать мою игру напрямую? Мое первое предположение - разместить отдельный скрипт в корне установки сайта, но я не могу понять, как использовать только компоненты аутентификации WordPress - возможно ли использовать таким образом только один компонент движка WordPress?

Может быть, есть альтернативный способ ускорить загрузку страницы с моим игровым скриптом...

2
Комментарии

Чтобы возобновить обсуждение, я бы порекомендовал добавить некоторые детали о том, как вы добавляете свою игру на страницу. Это JavaScript-сниппет? Это отдельный PHP-скрипт, загружаемый внутри шаблона? Игра обращается к внешней базе данных? Может быть множество причин, по которым игра работает медленно, поэтому нам нужно либо сосредоточиться на скорости (что, возможно, лучше обсудить не на WPSE), либо на интеграции компонентов авторизации WP во внешний игровой скрипт...

EAMann EAMann
24 авг. 2016 г. 07:49:03

Никто не может помочь?

Irina Irina
28 авг. 2016 г. 21:12:35
Все ответы на вопрос 3
2

Не уверен, но сейчас в голову приходит первое решение. Вам нужны данные из 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;
    }
}
1 сент. 2016 г. 11:41:35
Комментарии

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

cjbj cjbj
1 сент. 2016 г. 16:43:26

Вы имеете в виду первую строку с include wp-load.php? Да, после этого будет доступ ко всем функциям WP, но вам нужно подключать его через статический путь, что является плохим стилем и ненадежно, так как путь может измениться.

bueltge bueltge
1 сент. 2016 г. 20:34:33
0

Я думаю, причина замедления может быть связана со всеми скриптами, которые WordPress загружает в wp_head(). Если у вас запущено несколько плагинов или любой js/css, который блокирует отрисовку, это сильно скажется на производительности.

Попробуйте загрузить пользовательский файл заголовка, например header-mygame.php, и замените get_header() в вашем шаблоне на get_header('mygame').

В файле header-mygame.php удалите wp_head() и всё остальное, что не требуется для работы вашей игры. Вручную добавьте обратно только необходимые зависимости с помощью тегов <script> и <link>.

То же самое можно сделать с get_footer(), так как WordPress может подключать скрипты и там.

Конечно, это не "правильный" способ подключения ресурсов в WordPress, но, судя по всему, стандартный подход уже обходится, так что...

2 сент. 2016 г. 20:02:10
0

Вот шаги, которые вы можете выполнить, чтобы использовать WordPress только для аутентификации.

  1. Создайте отдельную папку в корне для вашего кода.
  2. Скопируйте wp-config.php в отдельный файл и удалите require_once ABSPATH . 'wp-settings.php';
  3. Подключите скопированный файл wp-config в ваш код
  4. Создайте вспомогательную функцию для вызова WordPress:

    function i_need_wp() {  
        global $table_prefix;
        require_once ABSPATH . 'wp-settings.php';
    }
    
  5. Вызовите i_need_wp() перед использованием аутентификации WordPress.

6 сент. 2016 г. 17:53:43