¿Cuál es el hook adecuado para session_start() al desarrollar un plugin?
Al investigar más sobre sesiones, he aprendido que session_start()
debería colocarse directamente después de <?php
según ¿Dónde exactamente debo poner SESSION_START? y quería experimentar creando un plugin que agregue session_start()
a header.php
después de su <?php
, pero después de buscar, no he encontrado un procedimiento claro para hacer esto.
Busqué información sobre sesiones pero encontré varias preguntas y respuestas que principalmente usan:
init
: La sesión no se iniciawp_head
: Conectar a wp_head(); en un pluginwp_loaded
: Error de headers already sent desde un plugin
Entonces, al desarrollar un plugin que depende de sesiones para ser agregado a header.php, ¿cuál es el hook apropiado para agregar session_start()
?

No hay una salida regular y por lo tanto no se envía ninguna cabecera antes de template_redirect
en el front end. Si necesitas sesiones también en el back end, usa la acción wp_loaded
para cubrir ambos.
Ejemplo:
add_action( 'template_redirect', function() {
$status = session_status();
if ( PHP_SESSION_DISABLED === $status ) {
// ¡Por eso no puedes confiar en las sesiones!
return;
}
if ( PHP_SESSION_NONE === $status ) {
session_start();
}
$_SESSION[ 'foo' ] = 'bar';
});
Ten en cuenta que el uso de sesiones añade un conjunto de problemas muy complejos a tu código, incluyendo seguridad, escalabilidad (balanceadores de carga) y problemas de soporte que consumen tiempo. No lo recomiendo.

Ok, si la sesión es mala, supongo que miraré la función 'set_cookie()' de PHP. Asumiría que el mismo enfoque aplicaría como tienes aquí, ¿usar 'template_redirect' o 'wp_loaded'?

Encontré este pequeño documento revelador al menos en lo que respecta a problemas con sesiones en WP: https://pressjitsu.com/blog/wordpress-sessions-performance/

Aquí hay otra solución para todo tipo de versiones de PHP que puedes encontrar dentro 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 esta solución puedes prevenir cualquier problema con las sesiones e iniciarlas cuando lo necesites.

Podemos usar la forma fácil mediante el hook init. Escribe esta función en el function.php
function register_my_session() {
if( !session_id() )
session_start();
}
add_action('init', 'register_my_session');
Después de agregar esta función en function.php puedes establecer valores en las sesiones como
$_SESSION['user_country'] = 'india';
Obtener valor de sesión
echo $_SESSION['user_country'];
Para destruir el valor de sesión
unset($_SESSION["user_country"]);
