¿Cuál es el hook adecuado para session_start() al desarrollar un plugin?

24 ago 2016, 22:03:13
Vistas: 13.7K
Votos: 5

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:

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()?

4
Comentarios

Solo un poco de reflexión sobre las sesiones. Algunos dicen que deberías agregarlo en la configuración.

Howdy_McGee Howdy_McGee
24 ago 2016 22:10:13

¿En serio? Nunca había escuchado eso antes. ¿No es malo que un plugin modifique la configuración? Eso podría llevar a otra pregunta después de buscar.

user9447 user9447
24 ago 2016 22:11:38

En realidad, solo iniciarías una sesión si no se ha iniciado ya. if ( !session_id() ) { session_start(); } así que no creo que sea realmente importante, pero definitivamente debería verificarse antes de necesitar usar $_SESSION. Pero tengo curiosidad si alguien tiene una mejor explicación.

bynicolas bynicolas
24 ago 2016 22:28:43

@bynicolas sí, soy consciente de eso pero estaba más interesado en dónde dirigir la sesión para su ubicación.

user9447 user9447
24 ago 2016 22:32:37
Todas las respuestas a la pregunta 3
2

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.

25 ago 2016 00:18:34
Comentarios

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

user9447 user9447
25 ago 2016 01:52:17

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/

MikeiLL MikeiLL
25 mar 2017 06:57:17
0

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.

21 dic 2018 15:29:28
1

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

Debes escapar los valores de sesión antes de imprimirlos.

fuxia fuxia
8 jul 2021 18:54:53