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

הדבר נכון בחלקו, מפני שזה נכון שהאתגרים שעומדים בפני מפתחי ווב אחרים "אמיתיים" הם אחרים מוורדפרס, אבל נושא הפוסט יהיה אחר: העובדה שאין OOP ו-MVC אינה רק אסתטית, כך שהקוד מכוער. הוא גם בנוי לא נכון, ובעיקר לא מעודד את מפתח הוורדפרס לעשות זום אאוט ולהבין את וורדפרס כמערכת שבכל זאת מבוססת על OOP, להבין אותה ברמה של קלאסים (כפי שהיא באמת), וכ-MVC. העובדה היא שאם מסתכלים על הבסיס, כל מה שצריך בתבנית הוא רק functions.php שמתפקד על תקן המודל, style.css שמתפקד על תקן הוויו ו-index.php שמתפקד על תקן הקונטרולר.

יכול להיות שפונקציות השירות של וורדפרס וקיצור הדרך שאיפשרו לבנות תבניות ייעודיות עבור מצבים שונים של התבנית, הם מקור הבעיה. הקבצים single.php, category.php, sidebar.php, archive.php, page.php וכו', והיכולת ליצור כמה קבצים כאלה עבור מצבים שונים הופכת את תיקיית השורש של התבנית למרובת קבצים, מה שמתחיל את הבלאגן. במקום שהכל יהיה מסודר לתיקיות ומינימליסטי, אנו מוצאים את עצמנו כבר בשלב התחלתי בבלאגן אמיתי. מה אם כך עושים?

הדבר הראשון שיש לעשות הוא להכיר את הפונקציה get_template_part, שהוא בעצם מצב פרטי של locate_template. מדובר בחלופה של include ו-require ב-PHP, שמאפשר להפנות לקבצים אחרים במערכת הקבצים ולשלב אותם בקוד. ההגבלה שהיא גם הדבר הנכון הוא לכתוב את כל הקבצים של התבנית תחת תיקיית התבנית. בצירוף עם משתני ה-Query ניתן בקלות לצמצם את הכל רק לקובץ index.php שירכז תנאים של "אם מצב הקוורי הוא מסוים, הפנה לעמוד מסוים" ולרכז את הכל בתת-תיקייה. התיקייה עצמה תקרא controllers.

ברמת ה-view עדיף ליצור תת-תיקיה בשם views ובה שלוש תתי-תיקיות לפחות: css, js ו-images. ולהפנות מקובץ ה-style.css בעזרת import לתוך התיקיות הללו (או בעזרת wp_enqueue_style), תוך שבפוטר (או בהדר בעזרת wp_enqueue_script) מפנים לקבצי הג'אווהסקריפט.

דבר זהה ניתן לעשות גם ב-functions.php אלא שצריך לשים לב שחלק מהפונקציות (ועל כך ארחיב בפוסט אחר) חייבות להתבצע בתוכו ולא בקובץ אחר, כמו לדוגמה רישום ווידג'טים או הוספת אקשנים מסויימים. על אותו עקרון חלק מהפעולות חייביות להיות מבוצעות רק ב-index.php ולא יכולות להתבצע בקבצים פנימיים. מרגע שנדע את זה, נבצע את מה שצריך איפה, והשאר בקבצים פנימיים.

ספציפית בחרתי אני לכתוב סקריפט קצר שיטען אוטומטית מתוך תיקיה בשם models את כל הקבצים שהכללתי שם, ממוינים לפי קומפוננטה ותפקיד ומסודרים בצורה של קלאסים (כך שרק אם יצרתי אובייקט בקונטרולר יופעלו). את הסקריפט אני מפעיל מ-functions.php והוא פחות או יותר הפונקציה היחידה שכתובה שם. הקוד כדלהלן:

define(MODEL, 'models/');

function loadModels()
{
  $dir = __DIR__ . "/models";
  $files = scandir($dir);

  foreach ($files as $file) {
    if (!($file == '.' || $file == '..')) {
    $fname = explode(".", $file);
    get_template_part(MODEL.$fname[0]);
    }
  }
}

זהו. למען האמת אני ממליץ מעבר לשלושת הקבצים ההכרחיים בכל זאת לנסח שני קבצים של "קיצורי דרך לוורדפרס" על מנת לאפשר להשתמש בפונקציות המערכת החשובות get_header ו-get_footer שטוענות בהתאם את header.php ו-footer.php. הסיבה היא שאם אנחנו רוצים להכליל בקלות הדר בעמוד ונשתמש ב-get_header (או פוטר בהתאמה) מבלי שהגדרנו header.php, וורדפרס יכלול את ההדר והפוטר הדיפולטיביים שלו מהתבנית ב-wp_includes, שלא תמיד יתאים לצרכינו. ולכן חמישה קבצים בלבד בתיקיית השורש: index.php, functions.php, style.css, header.php, footer.php ; ו-4 תיקיות: models, views, controller ולמהדרין גם assets או resources אם לא רוצים לכלול תחת views קבצים כגון קבצי שפה, ספריות מיוחדות וכו'.

אני אגב יוצר במודל, ועל כך בפוסט אחר, שלושה קלאסים מאסט:

  • post שעושה extend ל-WP_Post וכולל פונקציות שימושיות שבא לי לעשות לפוסטים, כמו גם פרופרטיז הכרחיים כ-featured image, custom fields וכו'.
  • config שכולל את הקבועים (אלה שמגדירים ע"י define) ושלל משתנים גלובליים שיהיו בשימוש בתבנית.
  • util שכולל פונקציות שימושיות שאני רוצה ליצור כסטטיות (או ללא קשר לקלאס) ואין להן מקום בקלאסים אחרים, כגון getResources(), getSprite() וכן הלאה.

2 thoughts on MVC בוורדפרס

  • מאמר יפה אבל נחמד להשוות לג'ומלה שכן תומכת בכל בתכנות מונחה עצמים, ואם כך מה "החסרון" של ג'ומלה לעומת וורדפרס?

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *