Come agganciare session_start() nello sviluppo di un plugin WordPress?
Sto imparando di più sulle sessioni e ho capito che session_start()
dovrebbe essere posizionato direttamente dopo <?php
come spiegato in Dove devo inserire esattamente SESSION_START?. Voglio sperimentare creando un plugin che aggiunga session_start()
a header.php
dopo il tag <?php
, ma dopo aver cercato non sono riuscito a capire la procedura corretta per farlo.
Ho cercato informazioni sulle sessioni ma ho trovato varie domande e risposte che suggeriscono diversi approcci:
init
: La sessione non si avviawp_head
: Agganciarsi a wp_head() in un pluginwp_loaded
: Errore di header già inviati da un plugin
Quindi, quando si sviluppa un plugin che dipende dalle sessioni da aggiungere a header.php, qual è l'hook appropriato per inserire session_start()
?

Non c'è un output regolare e quindi nessun header inviato prima di template_redirect
sul front end. Se hai bisogno di sessioni anche sul back end, usa l'azione wp_loaded
per coprire entrambi.
Esempio:
add_action( 'template_redirect', function() {
$status = session_status();
if ( PHP_SESSION_DISABLED === $status ) {
// Ecco perché non puoi affidarti alle sessioni!
return;
}
if ( PHP_SESSION_NONE === $status ) {
session_start();
}
$_SESSION[ 'foo' ] = 'bar';
});
Tieni presente che l'uso delle sessioni aggiunge un intero insieme di problemi molto complessi al tuo codice, tra cui sicurezza, scalabilità (load balancer) e il seguire problemi di supporto che richiedono tempo. Non lo consiglio.

Ok, se la sessione non funziona suppongo che guarderò la funzione 'set_cookie()' di PHP. Presumo che lo stesso approccio si applichi come hai fatto qui, usando 'template_redirect' o 'wp_loaded'?

Ho trovato questo piccolo documento illuminante almeno per quanto riguarda i problemi con le sessioni in WP: https://pressjitsu.com/blog/wordpress-sessions-performance/

Ecco un'altra soluzione compatibile con tutte le versioni di PHP che puoi trovare all'interno del Plugin CF Geo:
if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
if(function_exists('session_status') && session_status() == PHP_SESSION_NONE) {
session_start(array(
'cache_limiter' => 'private_no_expire',
'read_and_close' => false,
));
}
}
else if (version_compare(PHP_VERSION, '5.4.0') >= 0)
{
if (function_exists('session_status') && session_status() == PHP_SESSION_NONE) {
session_cache_limiter('private_no_expire');
session_start();
}
}
else
{
if(session_id() == '') {
if(version_compare(PHP_VERSION, '4.0.0') >= 0){
session_cache_limiter('private_no_expire');
}
session_start();
}
}
Con questa soluzione puoi prevenire qualsiasi problema con le sessioni e avviarla quando necessario.

Possiamo utilizzare il modo semplice con l'hook init. Scrivi questa funzione nel file function.php
function register_my_session() {
if( !session_id() )
session_start();
}
add_action('init', 'register_my_session');
Dopo aver aggiunto questa funzione in function.php puoi impostare valori nelle sessioni come
$_SESSION['user_country'] = 'italia';
Ottenere il valore della sessione
echo $_SESSION['user_country'];
Per eliminare il valore della sessione
unset($_SESSION["user_country"]);
