מונה כניסות וסטטיסטיקות

מצ"ב קוד המאפשר להניב סטטיסטיקות מהירות על הפוסט הפופולרי ביותר וכמה כניסות היו לכל פוסט בחודש האחרון או בכלל. למעשה, יש שתי אפשרויות לקחת את הסטטיסטיקות האלה – אם לא צריך להיעזר בנתונים מצד הלקוח מספיק לשחרר את הקוד שהכנסתי להערה (ונורה בהוק wp_head). אם כן צריך להיעזר בנתונים מצד הלקוח, השאירו את הקוד כמו שהוא. נתונים מצד הלקוח כוללים בעיקר זמן שהות בעמוד, שתוכלו באמצעות תיקון קטן למדוד מרגע שהעמוד מאבד את הפוקוס, או מרגע שנטען, ועד לרגע שמאבד את הפוקוס או עד לרגע שנסגר. כמו כן, יש אפשרות פוטנציאלית לקבל מידע על הדפדפן, מסך, מערכת הפעלה, מאיפה הגיע לעמוד וכו'.

הקוד מחולק ל-3:
1. מה שמגיע מצד השרת – כלומר, איזה מידע צריך להעביר לקליינט מתוך מה שמעובד לשרת. במקרה הזה אני מעביר מידע בסיסי על הקוורי, מה זהות המשתמש ומה זמן יצירת העמוד.
2. מה שעובר בחזרה לשרת באג'אקס (וכמובן בהתאם לאיזה אירוע). במקרה הזה אני שולח בד"כ את זהות המשתמש והקוורי שקיבלתי מהשרת, ביחד עם נתונים נבחרים שליקטתי מהקליינט כמו לדוגמה כמה זמן עבר מרגע שלחצתי בסטופר "התחל" ועד לרגע שבו האירוע של הסגירה נלכד ובו אני לוחץ "הפסק".
3. פקודת אג'אקס שרצה, בה אני מנתח את המידע שהגיע ומזין לדאטהבייס "פעימה". אחרי שיהיו המון פעימות אני צריך לשלוף את המידע עליהן באמצעות שאילתות ממוקדות ויעילות.

את פעולה 3 אני מבצע בפונקציה update_views_counter. על פי סוג הקוורי שקיבלתי אני בוחר איזה מידע להעביר – אם מדובר בעמוד בודד בעל ID אני שומר את זה בעמודה object_id. בהתאם לסוג העמוד אני יודע מה לשמור במה שאני מכנה "מטא". אם מדובר לדוגמה בעמוד קטגוריה, ואני מזהה שמשתנה הקוורי היה is_category, אוכל לסמן ברשומה שמדובר בקטגוריה ששמה X. וכן הלאה. בברירת המחדל אני מעביר info כמערך ריק, אך אילו ארצה אני יכול להעביר גם את מה שאני רוצה.

ב- functions.php אני יכול לשים את הפילטר הבא:

add_filter( 'update_views_counter_info', function ( $info ) {
	$new           = array();
	$new['screen'] = array(
		'width'  => $info['screen']['width'],
		'height' => $info['screen']['height'],
	);

	$new['os'] = $info['navigator']['browserPlatform'];

	$new = array_filter( $new );

	return $new;
} );

בדוגמא זו בחרתי לבדוק מה גודל המסך ומה מערכת ההפעלה של הקליינט, כפי שקיבלתי בכל "פעימה". נניח וארצה לקבל את עמוד הקטגוריה שבה משתמש כלשהוא שהה הכי הרבה זמן, אוכל לחלץ את זה בעזרת שאילתה כגון:

SELECT * FROM `views` WHERE `id` IN (SELECT id FROM `views` WHERE object_id IS NULL) AND `time_spent`>3 AND `meta_value` LIKE '%type-of-pacifiers%'

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

SELECT * FROM `views` WHERE `object_id` IS NOT NULL AND`time_spent`>3

ה-API המינימלי שעשיתי בשלב זה כולל 3 פעולות:
1. הוספה פשוטה של רשומה כשלא לוקחים שום דבר מהקליינט, הפונקציה change_views_counter. במקרה הזה היא מוסיפה רשומה עם זהות המשתמש, העמוד שנכנס אליו וזמן היצירה של העמוד.
2. פונקציה סטטית בשם get_views שניתן להכניס את מס' הפוסט והתקופה שרוצים לקחת (חודש או סה"כ)
3. פונקציה בשם get_top שתחזיר מס' הפ-וסטים שנחליט בעלי כמות הצפיות הרבה ביותר מפוסט-טייפ שנגיד לו (ברירת המחדל: post)

הקוד כפלאגין ניתן להורדהכאן.

נ.ב למה עדיף לשמור את מס' הצפיות בטבלה נפרדת ולא ב- post_meta (כמו לדוגמה בפלאגיןהזה)
א. זה מעמיס לשווא על wp_postmeta
ב. אין חיווי לגבי זהות המבקר
ג. קל מאוד לרמות ולהוסיף צפיות מלאכותיות (בסך הכל לשנות ערך מטא)

טיפים ומאמרים

בחזרה למאמרים