J'essaie de voir s'il existe un moyen de trouver un âge moyen des comptes d'utilisateurs qui est passé par mon site wordpress sans compter l'âge du compte d'administrateur.
Quand je parle d'âge, je ne parle pas de l'âge réel de leur naissance, mais du mandat de leur compte.
Y at-il un moyen simple de déterminer cela?
WordPress enregistre lorsqu'un utilisateur est inscrit dans la table $wpdb->users
(généralement wp_users
) dans la colonne user_registered
. Vous pouvez donc l'utiliser pour calculer l'âge moyen du compte. Il n'y a pas de fonction interne pour cela, vous devrez donc utiliser $wpdb
directement.
Cette réponse stackoverflow contient de bonnes informations sur le calcul de la moyenne d'une série de dates. Traduit en fonctions WordPress et autres:
<?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
));
}
Si vous êtes un utilisateur administrateur, c'est 1
, alors ...
<?php
$avg_age = wpse106440_avg_account_age(1);
... serait l'âge moyen du compte sans l'administrateur.
Si vous voulez, par exemple, exclure tous les utilisateurs de niveau administrateur, vous devrez récupérer les utilisateurs via get_users
de ce rôle, puis exclure le tableau de ces ID (par exemple, NOT IN
). WP ne dispose pas de tables distinctes pour les rôles et les limites, ce qui rend difficile leur interrogation directe en SQL - les fonctionnalités des utilisateurs sont stockées sous la forme d'un tableau sérialisé.
Comme @chrisguitarguy l'a indiqué, il n'y a pas de fonction interne pour le faire. Ci-dessous ma solution suggérée. Il devrait ignorer tout utilisateur ayant le rôle "administrateur".
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'];
Cela donne une moyenne raisonnable une fois testé sur mon serveur. Il renvoie une réponse en "jours", au fait.
Je suis en train de jouer avec quelques variantes. Je peux poster d'autres versions.