Come agganciare session_start() nello sviluppo di un plugin WordPress?

24 ago 2016, 22:03:13
Visualizzazioni: 13.7K
Voti: 5

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:

Quindi, quando si sviluppa un plugin che dipende dalle sessioni da aggiungere a header.php, qual è l'hook appropriato per inserire session_start()?

4
Commenti

Solo qualche spunto di riflessione riguardo alle sessioni. Alcuni dicono che dovresti aggiungerlo nel config.

Howdy_McGee Howdy_McGee
24 ago 2016 22:10:13

Davvero? Non ne ho mai sentito parlare prima. Non è un problema per un plugin modificare il config? Potrebbe portare a un'altra domanda dopo la ricerca.

user9447 user9447
24 ago 2016 22:11:38

In realtà, dovresti avviare una sessione solo se non è già stata avviata. if ( !session_id() ) { session_start(); } quindi non penso sia davvero importante, ma dovrebbe sicuramente essere verificato prima di utilizzare $_SESSION. Ma sono curioso di sapere se qualcuno ha una spiegazione migliore

bynicolas bynicolas
24 ago 2016 22:28:43

@bynicolas sì, ne sono consapevole, ma ero più interessato a dove indirizzare la sessione per il suo posizionamento.

user9447 user9447
24 ago 2016 22:32:37
Tutte le risposte alla domanda 3
2

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.

25 ago 2016 00:18:34
Commenti

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'?

user9447 user9447
25 ago 2016 01:52:17

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

MikeiLL MikeiLL
25 mar 2017 06:57:17
0

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.

21 dic 2018 15:29:28
1

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"]);
8 lug 2021 13:48:06
Commenti

Dovresti eseguire l'escape dei valori della sessione prima di stamparli.

fuxia fuxia
8 lug 2021 18:54:53