在Wordpress中的get_user_meta中添加并显示数组,以跟踪登录时间戳

时间:2018-03-19 21:22:02

标签: php wordpress

我正在尝试跟踪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();
}

但这似乎没有帮助登录时出现服务器错误。有人能告诉我代码中的错误,并且/或者指向我错过的答案吗?我很感激帮助。

1 个答案:

答案 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()删除第一个用户