ניסן

תצוגת גיל דינמית

בעמודי אודות לפעמים מקובל לכתוב, בין שאר הנתונים, את הגיל. העניין הוא שהגיל משתנה מדי שנה, ובעוד שתכלס אנחנו שמחים על זה באופן כללי, כאן זה יוצר אי נוחות קלה כי צריך לעדכן את החלק הזה כל הזמן, ומי בכלל זוכר לעשות את זה. חיפשתי פתרון תכנותי שיעדכן את הגיל עם חלוף השנים, ומצאתי כזה ב-stackoverflow. יצרתי מזה shortcode והכנסתי אותו במקום המתאים בעמוד האודות שלי. זה עובד אצלי כבר כמה שנים, ורק עכשיו חשבתי לשתף אתכם. מה שחביב בקוד הזה הוא שהוא מאוד קצר- 2-3 פונקציות PHP – והפונקציה הכי מגניבה בו היא diff של DateTime שמחשבת הפרש בין שני תאריכים :

/**
* Function to calculate my age.
* Taken from http://stackoverflow.com/a/3776832/278
**/
function mop_get_my_age_shortcode(){
$tz = new DateTimeZone('Europe/Brussels');
$age = DateTime::createFromFormat('d/m/Y', '25/04/1974', $tz)
 ->diff(new DateTime('now', $tz))
 ->y;
 return $age;
}

add_shortcode( 'my-age', 'mop_get_my_age_shortcode' );

מקסים ונהדר, אבל עם כל זאת שהוא עובד, אני בעצם לא חוגגת את התאריך הלועזי שלי אלא את העברי. מאחר שאין פונקציית diff לתאריכים עבריים (ה-diff לא מתאים לשנות ירח, ועוד מעוברות…) הבנתי שאין מנוס מלכתוב משהו קצת יותר ארוך. חששתי שזה יהיה מפלצתי, אבל זה יחסית סביר בעיניי (אולי זה נראה קצת ארוך, אבל זה מפני שיש הרבה הערות):

add_shortcode( 'my-age', 'leketshibolim_get_my_hebrew_age_shortcode' );

/**
* Get my age according to Hebrew date
**/
function leketshibolim_get_my_hebrew_age_shortcode(){
 
 /*** What's the current year - Gregorian and Jewish ***/
 // First get get this Gregorian year
 $this_G_year = date( 'Y' );
 // Then get this Hebrew year
 $this_J_date = gregoriantojd( date( 'm' ), date( 'd' ), $this_G_year ); // first convert Gregorian date to Julian
 $this_H_date_num = explode( "/", jdtojewish( $this_J_date ) ); // get the Jewish date in numbers (i.e., 11/19/5774), and separate them into an array, so can be passed to jewishtojd
 $this_H_year_num = $this_H_date_num[2];
 
 /*** When does my Hebrew date fall this year in Gregorian ***/
 $birth_J_date_this_year = jewishtojd(9,4,$this_H_year_num); // first in Julian
 $birth_G_date_this_year = new DateTime(jdtogregorian($birth_J_date_this_year)); // the in Gregorian
 
 /*** Calculate age: ***/
 // How many years have passed since I was born
 $birth_G_year = 1974;
 $years_diff = $this_G_year - $birth_G_year;
 // Has my birthday come this year yet?
 $today = new DateTime('now');
 $birthday_not_yet = $birth_G_date_this_year > $today;
 // A little hack: using boolean $birthday_not_yet as int :) 
 $my_age = $years_diff - $birthday_not_yet;
 // Return my age
 return $my_age;
}

וזה מה שקורה בקוד הזה:

  1. משיגים את השנה הלועזית הנוכחית, ואת השנה העברית הנוכחית
  2. מחשבים מה התאריך הלועזי שבו יוצא יום ההולדת העברי השנה. למשל, נולדתי ב-ד’ באייר, אז השנה זה יוצר ב-19/4/18.
  3. מחשבים את הפרש השנים בין השנה הנוכחית לשנת הלידה
  4. בודקים אם יום ההולדת חל השנה. התשובה היא בוליאנית: אם כן – הערך של הבדיקה הוא 0. אם לא – הערך של הבדיקה הוא 1.
  5. תחכום: מפחיתים את ערך הבדיקה (הבוליאני) מהפרש השנים. אם הערך הוא 0, כלומר יום ההולדת כבר חל השנה, הפרש השנים נותר כמות שהוא. אם הערך שלו הוא 1, כלומר יום ההולדת עוד לא חל השנה, מפחיתים 1 מהפרש השנים.
  6. זהו!

כרגע התאריך שלי הוא hard coded בפונקציה, כי תכלס רק אני משתמשת בה. אבל יכולתי לשכלל את השורטקוד בכך שהייתי מאפשרת משתנה שהוא התאריך. זה היה מאריך את הקוד (בקצת) כי הייתי צריכה להוסיף בפונקציה בדיקה של תקינות התאריך והבחנה אם זה תאריך לועזי או עברי. בינתיים, מחישובי עלות-תועלת, אני משאירה זאת כך.

 

כתבו תגובה

כתובת הדוא"ל שלכם לא תוצג.