טיפ וורדפרס: הגבלת מידות בעת העלאת תמונות לספריה
לפעמים יש אתרי אינטרנט בהם נרצה לקבוע הגבלה על מידות של תמונות שמעולות לשרת. בטיפ קצר זה נלמד איך אפשר להגביל מידות מינימום או מקסימום לתמונות, בעת העלאת התמונות לספריית המדיה, ומתן שגיאה אם התמונה שהועלתה חורגת מהגבלות אלה
בשאלה באתר WordPress Answers נשאלה שאלה מעניינת: "נדרשת לי דרך להגביל כותבים באתר מהעלאת תמונות הקטנות מממדים מסוימים. למשל, אני רוצה לאפשר העלאת תמונות שהן לפחות בגודל של 400 פיקסל על 400 פיקסל. אם האימאג' קטן יותר, הכותב צריך לקבל הודעת שגיאה שמידות התמונה קטנות מדי."
אפשר פשוט להוסיף עוד מידות חיתוך לכל תמונה
לא מזמן נדרשתי לסוגיה הזאת. באחד מהאתרים שפיתחתי מזיני התוכן הם לא אנשים מאוד טכנולוגיים, והיה צריך למנוע מהם להעלות תמונות גדולות מדי, ולא לאפשר בכלל העלאה לשרת של תמונות במידות גדולות יותר.
נכון שאפשר בקלות רבה עם וורדפרס להגדיר מידות של תמונה בעזרת add_image_size ולהשתמש בתמונה כדי להציג באתר, אך הדבר אומר שכל תמונה שעולה לשרת נחתכת לעוד גודל, מה שאומר עוד זמן בעת העלאת התמונה, ועוד נפח דיסק בטווח הרחוק (זה אתר עם הרבה תוכן ובכל תוכן יש תמונה אחת לפחות). אפשר היה גם להשתמש ב-timthumb, שהוא סקריפט php שחותך תמונות on-the-fly, כדי להציג את הגודל המתאים.
כחלק ממחשבה על פיתרון שמתאים למקרה הדנן, הוחלט שמאחר שאין כל סיבה נדרשת שיעלו לשרת תמונות במידות גדולות מהמקסימום שנדרש לתצוגה, יש להגביל את מידות הקובץ בעת ההעלאה עצמה.
וורדפרס לשירותך, פונקציית פילטר בשבילך
וורדפרס, כמו בוורדפרס, מלאה כידוע ב"ווים" (hooks) רבים, שונים וטובים שהיא מאפשרת במערכת הליבה, כדי להתממשק אליה כמעט בכל נקודה אפשרית ולעשות מניפולציות ושינויים בתפקוד ברירת המחדל של המערכת. גם במקרה הזה, קיים פילטר במערכת (wp_handle_upload_prefilter) הפועל בנקודה שבה מועלה קובץ לשרת, כאשר הוא עדיין בתיקייה זמנית בשרת ולפני שהוא נרשם בספריית המדיה. בנקודה הזו אפשר להוסיף בדיקה על הקובץ שהועלה לשרת, ולמשל להתנות עליו הגבלה במידות (מינימום/מקסימום, טווח, מידה מדויקת). במידה שהקובץ לא עומד בתנאי, אפשר להחזיר לפילטר הודעת שגיאה, שתוצג בממשק הניהול, והקובץ עצמו יימחק מהשרת ולא יירשם כלל בספריית המדיה.
את הקוד הבא יש להוסיף לקובץ הפונקציות functions.php של ערכת העיצוב שלכם, או לקובץ פונקציות מותאם אישית. לאחר מכן יש לשמור את הקובץ ולהעלות לשרת (לאחר גיבוי הקובץ הקיים):
[ccwn_php]
add_filter('wp_handle_upload_prefilter','tc_handle_upload_prefilter');
function tc_handle_upload_prefilter($file)
{
$img=getimagesize($file['tmp_name']);
$minimum = array('width' => '640', 'height' => '480');
$width = $img[0];
$height = $img[1];
if ($width < $minimum['width'] ) return array("error"=>"Image dimensions are too small. Minimum width is {$minimum['width']}px. Uploaded image width is $width px");
elseif ($height < $minimum['height'])
return array("error"=>"Image dimensions are too small. Minimum height is {$minimum['height']}px. Uploaded image width is $width px");
else
return $file;
}
[/ccwn_php]
בדוגמה הנ"ל מיושם המקרה הפרטי שהבאתי בתשובה, ובה קביעת מידות מינימום לתמונה. אפשר כמובן לשנות את הפונקציה או לעשות אותה מורכבת יותר ולהתאים אותה לצרכים ספציפיים נוספים. אם רוצים מידות שונות, אפשר לשנות את המספרים 640 לרוחב, ו-480 לאורך, שמופיעים בשורה מס' 6. את הודעות השגיאה אפשר לשנות בשורות 11 ו-14, יש שם גם את ההודעה עצמה וגם את המשתנים שמכילים את המידות של התמונה שהועלתה ומהי מידת ההגבלה שנקבעה.
11 תגובות »
פיד RSS לתגובות בפוסט | טראקבק
מעולה, תודה.
בדיוק בזמן 🙂
שמחתי, בכיף 🙂
תודה על עזרתך הרבה, מאור !!
בבקשה ובשמחה
תודה על הפוסט..
אבל סתם מעניין אותי לדעת מה יקרה ברגע שנעלה מוזיקה-וידאו-או סתם קובץ (שהוא לא תמונה), ואיך המערכת תתמודד עם השורה 5 (getimagesize)?
אולי צריך להכניס איזה תנאי קטן? או אולי הפונ' הזו פועלת רק על תמונות? לא נראה לי..
מה אומר? ניסית את זה כבר?
.-= פורסם לאחרונה אצל Yakir Sitbon.. תשע"א באוזנייים שלי =-.
לא ניסיתי את זה, כי השימושים שלי לזה היו באתר שממילא מעלים אליו רק אימאג'ים ולא קבצים אחרים. אם רוצים לעשות את זה קצת יותר גנרי אז אכן אפשר להוסיף תנאי שיבדוק קודם אם מדובר בקובץ שהוא אימאג' ורק אז לטפל בקובץ.
אגב, php יודעת להשתמש בפונקציה getimagesize גם על קבצי swf, אבל לוורדפרס זה פחות רלוונטי, כי כברירת מחדל אי אפשר להעלות קבצי swf לספריה המדיה, כפי הנראה בשל שיקולי אבטחה.
אז לפחות היית מעדכן את זה.
כי זה הדבר שהכי בלט לי בעין שראיתי את הפונקציה.
.-= פורסם לאחרונה אצל Yakir Sitbon.. תשע"א באוזנייים שלי =-.
שאפו מאור על הפוסט! נהנה לקרוא את הבלוג שלך. מחכה לעוד תוכן מעניין.
טיפ די שימושי לאתרים שמכילים המון תמונות, בעיקר לצלמים שמעלים מאות תמונות לאתר.
+1 על הפוסט הזה.
ומי שלא מעוניין להתעסק עם קוד יש תוסף שעושה את אותה העבודה: Auto Image Resizer
אחלה, תודה
השתמשתי בזה (אחרי שינויים קלים) כדי לקבוע גודל מקסימום לתמונות. עובד יופי.
שימושי מאוד. כמובן שהייתי מרחיב את הפונקציה לעוד הגבלות אבל כבסיס זה מצוין. תודה רבה!