我有这段代码从页脚手动更改wordpress时区
<form method="post" id="timezone_change">
<select name="timezone_change" onchange='this.form.submit()'>
<option value="3">3</option>
<option value="4">4</option>
</select>
</form>
<?php
if ($_POST['timezone_change'] == '3') { update_option( 'gmt_offset', '+3' ); }
if ($_POST['timezone_change'] == '4') { update_option( 'gmt_offset', '+4' ); }
?>
问题是这会改变所有网站访问者的时区 我希望代码只是每个访问者都有不同的(单独的)时区设置吗?我怎样才能做到这一点
答案 0 :(得分:1)
没有很好的方法以持久的方式执行此操作,您已经存储并识别每个用户。因此......它需要一些数据库和代码jiggery-pokery,以便实际允许根据存储在各种cookie / session / something上的内容来更改日期。
如果您真的认真对待每个帖子上的个人用户时间表,除了显而易见的“神话”之外&#39;我将提供,您需要先创建变量。 gmt_offset
适用于所创建的每个帖子,有点像您所说的全局选项。您必须创建一个仅供用户查看的值。
拥有cookie是存储用户是否选择了时区的数据的一种方式......这当然是一种很好的方法。这方面的例子就是这样做:
set_cookie( "tzDif", $_POST['timezone_change'], time()+(30*24*60*60) );
这会设置一个名为tzDif
的cookie,以获得他们选择的任何值。同样的规则适用于具有语法和赋值的微小差异的会话。这将允许您完全免除自己是否登录,因为它们将被选中并缓存在他们自己的系统上。
如果您想实现这一点......在剩下的答案中跳到底部,这个位将成为另一种选择,使用MySQL。
但是,使用cookies的一个小问题是,我发现它们有点不可靠。
将它们作为SQL变量存储在表中,在可靠性和我喜欢的东西方面要好得多(不过你会这样做)。这需要更多的jiggery-pokery,实际上也需要你改变数据库。
您必须运行一个语句才能添加一个名为&#39; user_gmt_offset
&#39;的整数列。对于wp_users
表,将其默认设置为&#39; 0&#39;。所以......
ALTER TABLE wp_users ADD user_gmt_offset INT NOT NULL DEFAULT 0;
正如Pekka在上面的评论中所说,你必须有一些方法来识别用户。您可以使用自己创建的cookie或会话,也可以在登录时使用wordpress创建的会话。
为简单起见,我将讨论后一种选择。
每当你有一个已经连接到Wordpress标题的页面时,它就可以让你获得它拥有的功能,这很简单。其中一个函数足够轻松地称为update_user_option()
。
该功能的组成类似于上述功能,只需进行一些调整:
update_user_option( USER_ID, OPTION_NAME, OPTION_VALUE, BLOG_SPECIFIC )
他们在很大程度上说话。 USER_ID是您要更改的用户的ID。 OPTION_NAME显然是选项名称的字符串... OPTION_VALUE是您要将其设置为现在的任何值,最后,BLOG_SPECIFIC(默认情况下为false)适用于您希望特定选项特定于博客的情况。
所以在你的情况下......这是你将要使用的代码组合(对tz选择的使用方式进行了微小的改动):
<?php
//Sort out WordPress malarkey and reference all the includes for using it
define('WP_USE_THEMES', false);
require("URL/TO/WP/INSTALLATION/wp-blog-header.php");
//Then let's get the current user information IF AND ONLY IF they
// are logged in... don't want to break things now...
if ( is_user_logged_in() ) {
//Although, if they've not set the timezone yet, we don't want
// it to prematurely fire and break things to null or something
if ( !isset( $_POST['timezone_change'] ) return;
//Get the current user's information now and assign it
// to the wordpress default variable for this stuff
global $current_user;
get_currentuserinfo();
//Now let's do the update
update_user_option( $current_user->ID,
'user_gmt_offset', $_POST['timezone_change'] );
}
?>
假设我在理论上做了正确的事情......这应该将个人用户的价值改变为他们想要的任何时区。那是SQL的解释。
再继续探讨它是如何实现的......你必须去寻找能够获得时间的功能,换句话说...... the_time()
就像我一样回想起来,并改变它来检查一些事情。
您必须检查用户是否已登录/如果已设置Cookie,如果他们不是,则使用数据库中给出的默认值gmt_offset ,如果它们是/它是......使用之前定义的值,无论是在cookie中还是在数据库中。
我不会详细说明如何做到这一点,我认为这篇文章中有足够的细节可能会让我感到困惑,因为我开始漫无目的地将该功能改为其他内容(如下所示)写得太多了。)
我会使用我找到的任何增强功能进行检查并重新更新。
答案 1 :(得分:0)
我知道这是一篇旧帖子,但这条评论对任何需要解决此问题的人都有帮助
WP User Timezone是一个Wordpress插件,它实现了wordpress前端界面的用户时区。从用户的浏览器中检测时区。
答案 2 :(得分:0)
我需要为管理界面和前端界面使用特定于用户的时区。在这里,我找到了WP User Level Timezone
的解决方案