Date de naissance, âge et anniversaire

de | 20 mai 2015

De nombreuses snippets existent un peu partout pour traiter de ce sujet souvent évoqué, l’idée est juste de les regrouper, de montrer comment utiliser les filtres et améliorer les formulaires Xprofile.

Date de naissance

Par défaut, un champ Xprofile de type « Sélecteur de date » se présente sous la forme de 3 listes déroulantes :

  1. liste « Jours » : de 1 à 31
  2. liste « Mois » : de « Janvier » à « Décembre »
  3. liste « Années » : de 2037 à 1902

La liste des années est standard, et nous souhaitons pouvoir l’adapter par exemple pour renseigner une date de naissance (inutile de commencer par l’année 2037 !)

Objectif : la liste des années doit afficher les années – de manière décroissante – depuis l’année dernière jusqu’à l’année 1902.

Snippet à ajouter à functions.php dans le theme, ou dans bp-custom.php :

function birth_date( $html, $type, $day, $month, $year, $id, $date ) {
   if ( $type == 'year' ) :
	$html = '';
	$html = sprintf( '<option value="" %1$s>%2$s</option>', selected( $year, 0, false ), /* translators: no option picked in select box */ __( '----', 'buddypress' ) );

	for ( $i = date('Y')-0; $i > 1901; $i-- ) {
		$html .= sprintf( '<option value="%1$s" %2$s>%3$s</option>', (int) $i, selected( $year, $i, false ), (int) $i );
	}
	endif;
   return $html;
}
add_filter( 'bp_get_the_profile_field_datebox', 'birth_date', 10, 7 );

Cette snippet va appliquer ce formattage de liste déroulante des années à l’ensemble des champs Xprofile de type « Sélecteurs de date ».

Si on ne veut appliquer le formattage qu’à un seul champ (par exemple, le champ « Date de naissance »), il faut utiliser son id et transformer la condition if ( $type == 'year' ) par if ( $id == XX && $type == 'year' ), où XX est l’Id du champ.

Age

De nombreuses fonctions existent déjà pour trouver l’âge d’une personne en fonction de sa date de naissance. En voici une pour vous éviter de chercher, à ajouter dans functions.php :

function age($date) {
   $age = date('Y') - $date;
   if (date('md') < date('md', strtotime($date))) {
      return $age - 1;
   }
   return $age;
}

Ici, on suppose que $date est au format MySQL, telle qu’on peut la récupérer via  xprofile_get_field_data( 'Date de naissance' ) ou xprofile_get_field_data( XX ) où XX est l’Id du champ. Voir cet article pour un exemple d’utilisation de la fonction xprofile_get_field_data, en dehors de la boucle du profil.

Donc, pour indiquer l’âge d’une personne : echo age( xprofile_get_field_data( 'Date de naissance' ) );

A ajouter dans member-header.php ou ailleurs…

Anniversaire

Supposons que vous vouliez afficher un message sur le profil du membre indiquant son anniversaire, on utilise le même code que précédemment en testant l’égalité plutôt que l’inégalité de la date anniversaire (mois et jour) :

echo date('md') == date('md', strtotime( xprofile_get_field_data( 'Date de naissance' ) ) ) ? 'Bon anniversaire !' : '';

 

Partagez...Tweet about this on TwitterShare on Google+Share on FacebookEmail this to someone