瞬变是私有的还是公共的?

时间:2013-07-03 作者:Daniel Boccato

WP瞬态是否特定于用户会话,或者是否可以从任何会话的任何位置访问它们?

由于它们是写在DB中的,我可以想象它们在任何地方都是公共的和可访问的,但是有没有办法将它们的范围限制为只有一个用户的会话?

我正在创建的网站不提供登录/Membership选项。我所说的用户是指任何正在查看网站的人-我not 谈论wp_users!

示例:

我加载主页,生成一个随机数,并将其存储到一个瞬态中,该瞬态应可在同一会话中访问。

然而,即使从同一台计算机,但从不同的浏览器或不同的IP,我也不能访问此瞬态。。。

这可能吗?

2 个回复
SO网友:EAMann

瞬态只是过期的数据库密钥。这就像告诉WordPress你想让它记住某一条信息,但时间有限。通常,PHP可以通过任何请求访问瞬态。

但是,由于它们是服务器端的,因此只有当您作为开发人员公开瞬态时,才会向前端用户公开瞬态。

针对您的具体问题,有一个解决方案:

我加载生成一个随机数的主页,并将其存储到一个瞬态中,该瞬态应该可以在同一会话中访问。

我建议将瞬态与cookie配对。基本上,为每个请求生成一个唯一的密钥(可能是time() 和一些随机数),并将其用作用户的会话密钥。然后,您可以仅为该用户存储瞬态。请确保以cookie的方式将此唯一键传递给浏览器,下次同一用户刷新页面时,他们将获得相同的数字。

给你一些untested 伪代码。。。

/**
 * Check the user\'s cookie if they have it.
 * Create one if they don\'t.
 */
function wpa_105249_check_cookie() {
    if ( isset( $_COOKIE[\'wpa_105249_key\'] ) ) {
        $key = (string) $_COOKIE[\'wpa_105249_key\'];
    } else {
        $key = md5( time() . rand() );

        // Set the browser cookie to expire in 30 minutes
        set_cookie( \'wpa_105249_key\', $key, time() + 30 * 60 )
    }

    // Try to grab the transient from the database, if it exists.
    $transient = get_transient( \'wpa_105249_\' . $key );

    // If the transient doesn\'t exist, create it.
    if ( false === $transient ) {
        // Call your function to generate the random number.
        $transient = generate_random_number();

        // Store the transient, but expire in 30 minutes.
        set_transient( \'wpa_105249_\' . $key, $transient, 30 * 60 );
    }

    wp_cache_set( \'wpa_105249_number\', $transient );
}
add_action( \'plugins_loaded\', \'wpa_105249_check_cookie\' );
简单地说,这将:

检查wpa_105249_key 请求中的cookie如果cookie不存在,请创建一个

  • 尝试获取由cookie标识的瞬态如果瞬态不存在,使用函数生成一个新的随机数,并将其存储在瞬态中以备下次使用
  • 在请求缓存中设置随机数
  • 在此之后调用的任何代码-基本上是代码中的任何其他地方-您只需调用以下命令即可获取当前用户的随机数:

    $number = wp_cache_get( \'wpa_105249_number\' );
    

    SO网友:Rarst

    瞬态是持久性存储机制。这意味着,通过使用某个密钥保存瞬态,您将能够使用该密钥检索相同的瞬态(如果该密钥尚未过期,并且此后未刷新缓存)。

    “Public”并不真正适用于它们,因为它们是内部代码概念,访问它们的唯一对象是您的代码,而不是用户的浏览器。

    如果您想在瞬态中存储特定于用户的数据,那么为其提供特定于用户的密钥可能是一个挑战。

    将信息存储在用户的cookie中或使用某种适当的会话机制可能更合适。

    结束

    相关推荐

    Ajax call to transients

    如果我对Wordpress瞬态进行ajax调用,瞬态值是从服务器上的内存中获取的,还是调用数据库?我没有使用任何缓存插件。我的应用程序正在获取标记列表。前端将根据用户类型显示匹配的标记。我假设页面加载时,所有瞬态都会加载。因此,在进行ajax调用时,会从内存中提取瞬态。对