Average Account Age

时间:2013-07-14 作者:user1823055

我想看看是否有办法找到通过我的wordpress站点访问的用户帐户的平均年龄,不包括管理员帐户的年龄。

我说的年龄不是指他们的实际出生年龄,而是指他们账户的使用期限。

有没有一种简单的方法来确定这一点?

2 个回复
SO网友:chrisguitarguy

WordPress记录用户在$wpdb->users (通常wp_users) 列中的表user_registered. 所以你可以用它来计算平均账户年龄。没有用于此的内部函数,因此您必须使用$wpdb 直接地

This stackoverflow answer 有一些关于计算一系列日期平均值的好信息。翻译成WordPress函数等:

<?php
function wpse106440_avg_account_age($ignore=1)
{
   global $wpdb;

    return $wpdb->get_col($wpdb->prepare(
        "SELECT DATEDIFF(CURDATE(), MIN(user_registered)) / (COUNT(ID) - 1)"
        . " FROM {$wpdb->users}"
        . " WHERE ID <> %d",
        $ignore
    ));
}
如果您是管理员,则用户ID为1, 然后

<?php
$avg_age = wpse106440_avg_account_age(1);
。。。将是不包括管理员的平均帐户年龄。

例如,如果要排除所有管理员级别的用户,则必须通过get_users 然后排除这些ID的数组(例如NOT IN). WP没有针对角色和CAP的单独表,因此很难在SQL中直接使用它们进行查询——用户功能存储为序列化数组。

SO网友:s_ha_dum

正如@chrisguitarguy所说,没有内部函数可以做到这一点。下面是我建议的解决方案。它应该忽略任何具有“管理员”角色的用户。

function user_duration_wpse_106440() {
  global $wpdb;
  $admins = get_users(array(\'role\' => \'administrator\',\'fields\' => \'ID\'));
  $today = date_create();
  $sql = "SELECT user_registered FROM {$wpdb->users}";
  if (!empty($admins)) {
    $sql .= " WHERE ID NOT IN (".implode(\',\',$admins).")";
  }
  $users = $wpdb->get_col($sql);
  foreach ($users as $k => $v) {
    $age = date_diff($today,date_create($v));
    $users[$k] = $age->days;
  }
  // return on the average as a string
  // return array_sum($users) / count($users);

  // alternate; return both average and total
  return array(
     \'average\' => (array_sum($users) / count($users)),
     \'total\'   => count($users)
  );
}
// echo user_duration_wpse_106440();
$user_duration = user_duration_wpse_106440();
echo $user_duration[\'average\'];
echo \'<br>\';
echo $user_duration[\'total\'];
在我的服务器上测试时,这给出了一个正常的平均值。顺便说一下,它会在“天”内返回一个答案。

我在玩弄一些变体。我可能会发布其他版本。

结束

相关推荐

Rating system for users

我想在我的wordpress网站上实现一个系统。在我的网站上,有一群用户注册了。这是一个社交网站。我基本上希望有一个分级系统,根据用户的技能对其进行排名。我使用buddy press为用户创建他们自己的配置文件。我几乎想在他们的个人资料中添加一个标准,一个下拉菜单,上面写着给你的游戏技能打分1-10。但问题是,每个人都会把自己排得很高。我几乎想要一个用户可以自己去排名的系统,但如果需要的话,我可以进来修改排名。有什么建议吗?