web-dev-qa-db-ja.com

平均アカウント年齢

管理者アカウントの年齢を含まずに、私のワードプレスサイトを通過したユーザーアカウントの平均年齢を見つける方法があるかどうかを確認しようとしています。

私が年齢を言うとき、私は彼らの実際の出生年齢ではなく彼らのアカウントの保有期間を意味します。

これを判断する簡単な方法はありますか?

1
user1823055

WordPressは、ユーザーが$wpdb->users(通常はwp_users)テーブルの列user_registeredに登録された日時を記録します。だからあなたは平均アカウント年齢を計算するためにそれを使用することができます。このための内部関数はありませんので、$wpdbを直接使わなければなりません。

このスタックオーバーフローの回答 は、一連の日付の平均値を計算するための優れた情報を提供します。 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にはロールとキャップのための個別のテーブルがないため、SQLで直接クエリすることは困難です。ユーザー機能はシリアル化された配列として格納されます。

2
chrisguitarguy

@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'];

私のサーバーでテストしたときの平均的な結果はこれでわかります。ちなみに、答えは「日数」で返ってきます。

私はいくつかの亜種をいじっています。他のバージョンを投稿することがあります。

0
s_ha_dum