您真的不应该注释掉或修改 wp_unregister_globals。查看 http://silvermapleweb.com/using-the-php-session-in-wordpress/ 以获取如何在 Wordpress 中实现会话而不与 wp_unregister_globals 混淆的示例。
我用这个,效果很好:
add_action('init', 'myStartSession', 1);
function myStartSession() {
if(!session_id()) {
session_start();
}
}
我还会考虑将会话数据存储在数据库中而不是文件中,尤其是当您处于共享服务器环境中时。该服务器上的任何其他人都可能访问您的站点会话数据并接管用户会话。
在我最近的插件中,我在 Wordpress 数据库中创建了一个新表来存储会话数据,然后使用 set_session_save_handler 来更改行为。所以我的开始会话脚本变成了这样:
add_action('init', 'myStartSession', 1);
function myStartSession() {
if(!session_id()) {
session_set_save_handler('open_session', 'close_session', 'read_session', 'write_session', 'destroy_session', 'clean_session');
session_start();
}
}
add_action( 'session_gc', 'session_gc');
if ( ! wp_next_scheduled( 'session_gc' ) )
{
wp_schedule_event( time(), 'hourly', 'session_gc' );
}
function open_session()
{
return true;
}
function close_session()
{
return true;
}
function read_session($sessionid)
{
global $wpdb;
$session_table_name = $wpdb -> prefix . "sessions";
$query = $wpdb->prepare(
"SELECT data FROM $session_table_name
WHERE id = %s",
$sessionid);
$result = $wpdb -> get_var($query);
if ($result)
{
return $result;
} else
{
return '';
}
}
function write_session($sessionid,$data)
{
global $wpdb;
$session_table_name = $wpdb -> prefix . "sessions";
$rowsaffected = $wpdb->replace(
$session_table_name,
array(
'id' => $sessionid,
'data' => $data
),
array(
'%s',
'%s'
));
return true;
}
function destroy_session($sessionid)
{
global $wpdb;
$session_table_name = $wpdb -> prefix . "sessions";
$rowsaffected = $wpdb->delete($session_table_name,array('id' => $sessionid),array('%s'));
$_SESSION = array();
return true;
}
function clean_session($expire)
{
global $wpdb;
$session_table_name = $wpdb -> prefix . "sessions";
$wpdb->query(
$wpdb->prepare(
"DELETE FROM $session_table_name
WHERE DATE_ADD(last_accessed, INTERVAL %d SECOND) < NOW()",
$expire
)
);
return true;
}
function session_gc() {
global $wpdb;
$session_table_name = $wpdb -> prefix . "sessions";
$query = "DELETE FROM $session_table_name WHERE last_accessed < date_sub(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)";
$wpdb->query($query);
}
有关从 Wordpress 外部访问 $wpdb 类的提示,请参阅 http://www.stormyfrog.com/using-wpdb-outside-wordpress/。您可以简单地包含 wp-load.php,然后我认为您将免费获得会话行为,因为我很确定 init 挂钩是在 wp-load.php 之后出现的,当然,缺点是您将开销将 Wordpress 加载到您可能不想要的页面中。