סיוון

איך לשייך לתתי קטגוריות את השדות המיוחדים שמשויכים לקטגוריית אב, בתוסף ACF

המוטיבציה

היה הייתה לנו קטגוריה, “בתי ספר” שמה. ולקטגוריה זו היו ילדים רבים – שמות ערים שבהם ישנם בתי ספר של אורט. בכל קטגוריית עיר היו פוסטים – פוסט לכל אחד מבתי הספר של אורט בעיר.

בפוסט של כל בית ספר, רצינו להציג מידע קבוע: כתובת, טלפון, שם מנהל/ת בית הספר, וכד’. את המידע הזה רצינו להציג במקום קבוע ובעיצוב קבוע, ולכן לא רצינו שהוא יהיה חלק מהפוסט, אלא שימולא בנפרד – ויוצג בעיצוב ובמקום הנכון על ידי התבנית.

לשם כך החלטנו להשתמש בתוסף ACF, וליצור שדות מיוחדים לפוסטים האלה.

הצגת מידע נוף באתר: תמונה של מנהל/ת בית הספר, טלפון, דוא"ל, כתובת, אתר בי"ס
אלה השדות המיוחדים שרצינו שיהיה לכל פוסט של בית ספר.
התמונה היא מתוך האתר This Person Does Not Exist

הבעיה

התוסף ACF אכן מאפשר להגדיר קבוצת שדות ולבחור קטגוריה שהקבוצה הזאת תחול על הפוסטים בה – כלומר, שהשדות האלה יופיעו במסך העריכה של פוסט ואפשר יהיה למלא אותן ואחר להציג אותן באתר. דא עקא, שההחלה הזאת לא עוברת בירושה לתתי קטגוריות 😐 . כלומר, כשעורכים פוסט בתת קטגוריה, לא יופיעו השדות המיוחדים למילוי, אלא אם כן תת הקטגוריה הזאת הוגדרה ספציפית כאחת שהקבוצה אמורה לחול עליה.

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

האפשרויות לפתרון

עמדו בפנינו כמה אפשרויות:

האפשרות הראשונה, שעולה בקנה אחד עם אופן התפקוד של ACF, הוא לבחור במפורש את כל תתי הקטגוריות שהשדות המיוחדים האלה צריכה לחול עליהם. הבעיה עם האפשרות הזאת היא שמבחינת התחזוקה השוטפת של האתר זה לא הגיוני: תתי הקטגוריות האלה הן כאמור שמות של הערים, ומטבע הדברים הן משתנות לעתים – כאשר ערים חדשות מצטרפות לבתי ספר של אורט, או חלילה כאשר עיר עוזבת את הרשת –  ולא יתכן לצפות ממי שמזין את התוכן לזכור בכל פעם שמתווספת עיר, ללכת לשדות המיוחדים ולהוסיף את שם העיר החדשה לקטגוריות שהשדות חלים עליהם.

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

בחירת הפתרון התכנותי

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

הפילטר

הדבר הראשון שהגדרתי היה הפילטר שעליו יישב הקוד: acf/location/rule_match/post_taxonomy. כך:

add_filter( 'acf/location/rule_match/post_taxonomy', 'acf_location_rules_match_post', 10, 3 );

חתימת הפונקציה

הפונקציה מקבלת שלושה פרמטרים:

  1. $match – זה המשתנה שמחזירים, והוא בוליאני: האם הפוסט הנוכחי מתאים לחוק או לא. הערך שלו נקבע, אחרי שבודקים את שני המשתנים האחרים.
  2. $rule – מערך שמכיל את החוק שאנו בודקים כעת. יש בו, בין השאר, תא בשם ["param"] שהוא “על איזה סוג פוסט החוק חל”, תא בשם ["value"] שמכיל את הערך של param, כלומר איזה מופע ספציפי של סוג הפוסט שהחוק חל עליו, ותא בשם ["operator"] שאומר מה היחס בין param ל-value. היחס יכול להיות: דומה, שונה, גדול מ-, קטן מ-, וכן הלאה.
  3. $options – מערך שמכיל את הפוסט שאנחנו בודקים כרגע. יכול להיות בו, בין השאר, תא בשם ["post_type"] (התא הזה לא תמיד נמצא ולכן חייבים לבדוק את הימצאותו לפני שמשתמשים בו), ותא בשם ["post_id"].

מהלך הפונקציה

  1. התחלתי בבדיקת ה-options: בדקתי זה ש-$options["post_type"] הוא post ושה-$options["post_id"] שונה מ-0.
  2. הבאתי את הקטגוריות של הפוסט עם get_the_category().
  3. אחרי שווידאתי שיש קטגוריות, אני בודקת את החוק שעליו חלים השדות המיוחדים. במקרה שלנו, $rule["param"] צריך להיות שווה post_taxonomy, בתוך ה-$rule["value"] צריכה להימצא המחרוזת "category:", וה-$rule["operator"] צריך להיות ==. כך נראה האוביקט $rule:
    Array(3) { ["param"]=> string(13) "post_taxonomy" ["operator"]=> string(2) "==" ["value"]=> string(29) "category:schools-and-colleges" }
  4. אם הקטגוריה עליה חלים השדות המיוחדים היא קטגוריית האב של הפוסט הזה, אז $match יקבל ערך חיובי, כלומר יש התאמה וצריך להראות את השדות המיוחדים בפוסט הזה.

וכך נראה כל הקוד:

ביטול המוטיבציה

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

כתבו תגובה

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