在 Wordpress 中添加和显示get_user_meta数组,用于跟踪登录时间戳



我正在尝试跟踪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 服务器错误,并且WP_DEBUG日志显示:

PHP Fatal error:  Uncaught Error: [] operator not supported for strings

所以我一定误解了这应该如何工作。我希望元数据是一个数组,但我需要get_user_meta为真 - 并且get_user_meta codex 说 false 将返回一个数组 - 这会导致嵌套数组问题。另一个答案有条件语句来确保它是一个数组:

if( ! array($user_login_meta) ) {
$user_login_meta = array();
}

但这似乎无助于登录时的服务器错误。有人可以告诉我代码中不正确的地方,和/或指出我错过的答案吗?我很感激你的帮助。

由于以下行,您收到错误:

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()的第一个

最新更新