删除存储在数组中的用户ID,这些数组本身存储在另一个用户的用户元中

时间:2012-04-02 作者:John

对于公司的协作网站,给定用户的用户ID存储在另一个用户的元数据中。例如:如果用户A正在与用户B协作,则用户A的用户ID将附加到包含多个其他用户ID的数组中,然后update_user_meta 运行以将数组存储在用户B的元数据中。但是,当用户A离开公司时,其帐户将被删除。该操作将从WordPress系统中删除用户ID,但ID仍保留在存储在用户B元数据中的数组中。当查看较大规模的用户时,用户A的ID可能会出现在其他几个用户的元数据中。由于这是一个持续的过程,因此许多用户在其元数据中具有不存在用户的ID。这无缘无故地增加了元数据中存储的数组的大小。而不存在的ID会在站点中使用数据的任何地方不断抛出错误。导致了一片混乱。虽然代码中使用了条件来检查WordPress中是否存在用户ID,但没有理由继续存储这些不相关的ID。

所以问题是:如何从活动用户的元数据中删除不存在的用户ID?

你好,约翰

1 个回复
最合适的回答,由SO网友:Bainternet 整理而成

克服这一问题的最简单方法是创建一个自定义“getter”,从用户元中提取数据,该元将“即时”检查、清理和更新如下:

首先创建一个函数来检查用户是否存在,

function does_user_exists($user_id){
    global $wpdb;
    $user = $wpdb->get_var( $wpdb->prepare( 
        "
            SELECT user_login
            FROM $wpdb->users 
            WHERE ID = %s
        ", 
        $user_id
    ) );
    if ($user == null)
        return false;
    else
        return true;
}
然后创建一个函数来获取元并对其进行验证,

function get_user_collab($user_id){
    $update_flag = false;
    $collabs = get_user_meta($user_id,\'collab_meta_key\',true);
    //loop over ids and check if the user exists, if not then we remove it
    foreach ((array)$collabs as $key => $uid) {
        if (!does_user_exists($uid)){
            unset($collabs[$key]);
            $update_flag = true;
        }
    }
    if ($update_flag)
        update_user_meta($user_id,\'collab_meta_key\',$collabs);

    return $collabs;
}
现在不用打电话了get_user_meta 仅使用get_user_collab

结束

相关推荐