Cum ar trebui să conectezi un session_start() atunci când creezi un plugin?
În timp ce învățam mai multe despre sesiuni, am înțeles că session_start()
ar trebui să fie plasat direct după <?php
conform Unde exact trebuie plasat SESSION_START? și am vrut să experimentez creând un plugin care să adauge un session_start()
în header.php
după <?php
. Dar după ce am căutat, am rămas nedumerit în privința procedurii corecte pentru a face acest lucru.
Am căutat despre sesiuni dar am întâlnit o varietate de întrebări și răspunsuri care par să folosească în principal:
init
: Sesiunea nu începewp_head
: Cum să te conectezi la wp_head(); într-un pluginwp_loaded
: Primirea erorii 'headers already sent' de la plugin
Deci, atunci când creezi un plugin care se bazează pe sesiuni pentru a fi adăugate în header.php, care este hook-ul potrivit pentru a adăuga session_start()
?

Nu există nicio ieșire regulată și, prin urmare, niciun antet trimis înainte de template_redirect
pe partea de front-end. Dacă aveți nevoie de sesiuni și pe partea de back-end, utilizați acțiunea wp_loaded
pentru a acoperi ambele.
Exemplu:
add_action( 'template_redirect', function() {
$status = session_status();
if ( PHP_SESSION_DISABLED === $status ) {
// Acesta este motivul pentru care nu vă puteți baza pe sesiuni!
return;
}
if ( PHP_SESSION_NONE === $status ) {
session_start();
}
$_SESSION[ 'foo' ] = 'bar';
});
Rețineți că utilizarea sesiunilor aduce o întreagă serie de probleme foarte complexe în codul dumneavoastră, inclusiv aspecte legate de securitate, scalabilitate (balanțeri de sarcină) și urmărirea problemelor de suport care consumă timp. Nu o recomand.

Ok, dacă sesiunea este proastă, presupun că voi analiza funcția 'set_cookie()' din PHP. Aș presupune că aceeași abordare s-ar aplica ca cea de aici, să folosesc 'template_redirect' sau 'wp_loaded'?

Am găsit acest document mic dar interesant, cel puțin în ceea ce privește problemele cu sesiunile în WP: https://pressjitsu.com/blog/wordpress-sessions-performance/

Iată o altă soluție pentru toate versiunile de PHP pe care le puteți găsi în Pluginul 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();
}
}
Cu această soluție puteți preveni orice problemă legată de sesiuni și o puteți porni oricând aveți nevoie.

Putem folosi metoda simplă prin hook-ul init. Scrieți această funcție în fișierul function.php
function register_my_session() {
if( !session_id() )
session_start();
}
add_action('init', 'register_my_session');
după adăugarea acestei funcții în function.php puteți seta valori în sesiuni astfel:
$_SESSION['user_country'] = 'india';
Obțineți valoarea din sesiune
echo $_SESSION['user_country'];
pentru a șterge valoarea din sesiune
unset($_SESSION["user_country"]);
