我正在尝试跟踪Wordpress用户的登录日期/时间。我希望能够跟踪用户登录的最后10次。为此,我需要能够在用户元数据中保存数组。我下面的代码不起作用,我无法弄清楚原因。我在这个网站上发现了其他一些似乎涉及类似主题的问题,但他们的解决方案似乎与我的相矛盾。我的代码:
function drick_track_user_login($user_login, $user) {
$meta_key = 'drick_login_times';
$user_login_meta = get_user_meta( $user->ID, $meta_key, true);
$number_of_timestamps = count($user_login_meta);
if( ! array($user_login_meta) ) {
$user_login_meta = array();
}
if( $number_of_timestamps < 10 ) {
$user_login_meta[] = time();
} else {
array_pop($user_login_meta);
$user_login_meta[] = time();
}
update_user_meta( $user->ID, $meta_key, $user_login_meta);
}
add_action('wp_login','drick_track_user_login', 10, 2);
我想要发生的是当触发wp_login操作时,该函数会检查'drick_login_times'数组中的时间戳值是多少。如果超过10,要删除最后一个,然后在最新时间添加。
我在多个答案中看到,如果你对get_user_meta函数中的第三个参数没有“true”,它将创建嵌套数组(我见过它)。但是,如果我将其设置为“false”,则登录时会出现500 Server错误,并且WP_DEBUG日志显示:
PHP Fatal error: Uncaught Error: [] operator not supported for strings
所以我必须误解这应该如何运作。我希望元数据是一个数组,但我需要get_user_meta为true - 并且get_user_meta codex表示false将返回一个数组 - 这会导致嵌套数组问题。另一个答案是条件语句,以确保它是一个数组:
if( ! array($user_login_meta) ) {
$user_login_meta = array();
}
但这似乎没有帮助登录时出现服务器错误。有人能告诉我代码中的错误,并且/或者指向我错过的答案吗?我很感激帮助。
答案 0 :(得分:1)
由于这一行,您收到错误:
if( ! array($user_login_meta) ) {
在这里,您只需使用函数array()创建array
,而无需在某个变量中保存它的阶段。因此,您永远不会到达此行$user_login_meta = array();
。
这是工作代码:
function drick_track_user_login($user_login, $user)
{
$meta_key = 'drick_login_times';
$user_login_meta = get_user_meta($user->ID, $meta_key, true);
$number_of_timestamps = count($user_login_meta);
if (!is_array($user_login_meta)) {
$var[] = $user_login_meta;
}else{
$var = $user_login_meta;
}
if ($number_of_timestamps < 10) {
$var[] = time();
} else {
array_shift($var);
$var[] = time();
}
update_user_meta($user->ID, $meta_key, $var);
}
add_action('wp_login', 'drick_track_user_login', 10, 2);
我们检查,如果我们使用函数is_array() array
,如果没有,则创建它(将在用户第一次进入时工作)。在其他情况下,我们将使用$var = $user_login_meta;
。
此外,使用array_pop(),您将删除上传的用户的最后一个日志。我认为您应该使用array_shift()删除第一个用户