插件的会话替代方案(由于缓存)

时间:2013-11-20 作者:bob_hardy

我正在构建一个插件,从数据库中随机挑选一篇文章,并将结果动态地传递给用户。对于某些方面,我需要知道随机选择的帖子ID。如果没有用于网站缓存的话,会话数据可以很好地实现这一点。缓存站点时,应该根据会话数据动态加载的帖子不会加载任何内容。

我必须使用哪些替代方案$_SESSION?

4 个回复
SO网友:brasofilo

一个类似的问题突然出现在[wp-hackers] 显然Eric Mann\'s插件,WP Session Manager, 就是要走的路。

我还没有分析插件的代码,所以无法说出它的内部工作原理。

皮平·威廉姆森embeds WPSM 在他的简易数字下载插件中。鉴于Pippin\'s review 埃里克是个老牌的wp忍者,我不会再看下去了。当然,在堆栈交换标准中,一个规范的答案需要对所发生的事情有一个完整的技术规范,但我会让另一个接受者知道这一点。

SO网友:Mark Kaplun

作为插件作者,缓存是你无法控制的。你可以让你的插件与主流的缓存插件集成,以提供动态内容,但在网站所有者想要时阻止缓存的整个想法听起来很不确定。

缓存的折衷是,您的站点内容不是完全动态的,如果您的插件需要生成完全动态的内容,那么它就是不兼容的,并且您的插件不能与缓存的站点一起工作。

换句话说,您唯一的实际选择是指导网站所有者如何禁用其缓存以启用插件的功能

SO网友:chifliiiii

您可以集成https://wordpress.org/plugins/wp-session-manager 很容易地插入插件。只需下载插件并将includes文件夹中的所有文件复制到插件中。然后像这样加载它们或创建wrapper 在他们周围:

// let users change the session cookie name
if( ! defined( \'WP_SESSION_COOKIE\' ) ) {
    define( \'WP_SESSION_COOKIE\', \'_wp_session\' );
}

if ( ! class_exists( \'Recursive_ArrayAccess\' ) ) {
    include \'includes/class-recursive-arrayaccess.php\';
}

// Include utilities class
if ( ! class_exists( \'WP_Session_Utils\' ) ) {
    include \'includes/class-wp-session-utils.php\';
}

// Include WP_CLI routines early
if ( defined( \'WP_CLI\' ) && WP_CLI ) {
    include \'includes/wp-cli.php\';
}

// Only include the functionality if it\'s not pre-defined.
if ( ! class_exists( \'WP_Session\' ) ) {
    include \'includes/class-wp-session.php\';
    include \'includes/wp-session.php\';
}
现在,您可以使用如下会话:

$wp_session = WP_Session::get_instance();
$wp_session[\'user_name\'] = \'User Name\';                            // A string
$wp_session[\'user_contact\'] = array( \'email\' => \'[email protected]\' ); // An array
$wp_session[\'user_obj\'] = new WP_User( 1 );   
您没有指定缓存的类型。如果您谈论的是WpEngine、pagely等主机使用的缓存,它们会剥离会话,那么您需要使用我在此处评论的解决方案。

如果您是从WpSuperCache等插件中引用页面缓存,则需要使用ajax在呈现页面后显示结果。这样你就不会受到影响。

SO网友:David Corp

通过iframe加载您的随机帖子。缓存插件将捕获您的iframe url,而不会在随机帖子中使用缓存。php或将其排除。你有没有看到广告每次都在变化,它不依赖于缓存或不缓存。

结束