Utilizzare solo l'autenticazione di WordPress
Voglio creare un piccolo gioco per gli utenti del mio sito WP. Il gioco stesso utilizzerà solo il sistema di autenticazione di WP, ma tutta la sua logica sarà completamente esterna.
Attualmente, se uso una pagina WordPress standard con un template personalizzato (incorporando lo script PHP del mio gioco) si carica, ma sembra essere troppo lento per i miei utenti. Lo script del mio gioco utilizza lo stesso database di WP ed è veloce. Per i test l'ho disattivato (lasciando solo un output di test), ma anche questa pagina "vuota" in WP è troppo lenta.
È possibile bypassare completamente WordPress (cioè rinunciare al sistema di template e a tutto tranne i flussi di autenticazione) e caricare il mio gioco direttamente? La mia prima ipotesi sarebbe quella di ospitare uno script separato nella root dell'installazione del mio sito, ma non riesco a capire come utilizzare solo i componenti di autenticazione di WordPress - è possibile usare solo un singolo componente del motore di WordPress in questo modo?
Forse c'è un modo alternativo per velocizzare la pagina che ospita lo script del mio gioco...

Non sono sicuro, ma al momento nella mia mente c'è la prima soluzione. Hai bisogno dei dati da WordPress per l'autenticazione? Se includi il file wp-load.php
hai accesso a WordPress e alle sue funzioni, magari per identificare. Ma includere il file con un percorso statico non è proprio l'ideale e solido.
define( 'WP_USE_THEMES', FALSE );
require( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );
Query e reindirizzamento
Puoi modificare la query con un valore personalizzato e se questo valore esiste puoi reindirizzare tramite un hook al tuo gioco. Dopo questo reindirizzamento avrai accesso a tutte le funzioni di wp, anche per verificare gli utenti. Questa idea funziona solo in front-end, non è una soluzione per modificare pagine nel back-end, solo come suggerimento.
Il seguente codice è solo un esempio per migliorare la query con una stringa personalizzata per identificare e reindirizzare al tuo codice personalizzato.
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 ) {
// Qui c'è il tuo codice personalizzato.
exit();
}
}
L'URL per questo trigger è ad esempio example.com/?fb_plugin_trigger=1
.
Endpoint personalizzato
Anche un'opzione che dovresti provare. Aggiungi un endpoint personalizzato.
add_action( 'init', 'fb_my_endpoint' );
function fb_my_endpoint() {
add_rewrite_endpoint( 'fb_plugin_trigger', EP_ROOT );
}
Dopo questo troverai il valore nell'URL, come example.com/fb_plugin_trigger/
.
Piccolo suggerimento, svuota le regole di riscrittura dopo l'aggiunta dell'endpoint. Inoltre, se non usi i permalink, usa la funzione add_query_arg()
per aggiungere parametri nell'URL per identificare.
Ora puoi anche analizzare questo valore nella query e includere il sorgente del tuo gioco.
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;
}
}

Forse sono ingenuo, ma penserei che dopo aver aggiunto quelle prime due righe di codice hai accesso a is_user_logged_in()
e che questo sarebbe sufficiente. Cosa mi sfugge?

Penserei che la causa del rallentamento sia legata a tutti gli script che WordPress carica in wp_head(). Se stai utilizzando un certo numero di plugin o qualsiasi js/css che è render blocking, vedrai un grande impatto sulle prestazioni.
Prova a caricare un file di header personalizzato come header-mygame.php e sostituisci get_header()
nel tuo file template con get_header('mygame')
.
In header-mygame.php, rimuovi wp_head() e qualsiasi altra cosa non necessaria per far funzionare il tuo gioco. Aggiungi manualmente solo le dipendenze di cui hai bisogno con i tag <script>
e <link>
.
Puoi fare lo stesso con get_footer()
poiché WordPress potrebbe caricare script anche lì.
Ovviamente questo non è il modo "corretto" di caricare gli asset in WordPress, ma sembra che il modo standard di WordPress sia già stato aggirato, quindi...

Ecco i passaggi che puoi seguire per utilizzare WordPress solo per l'autenticazione.
- Crea una cartella separata nella root per il tuo codice.
- Copia wp-config.php in un file separato e rimuovi
require_once ABSPATH . 'wp-settings.php';
- Includi il file wp-config copiato nel tuo codice
Programma una funzione helper per invocare WordPress:
function i_need_wp() { global $table_prefix; require_once ABSPATH . 'wp-settings.php'; }
Chiama
i_need_wp()
prima di utilizzare l'autenticazione di WordPress.
