לתבניות בת בוורדפרס פונקציונליות המאפשרת לרשת (מהמילה ירושה) פונקציות ועיצוב מתבנית האב. על ידי שימוש בתבנית בת באפשרותכם לרשת את כל הגדרות העיצוב (CSS) ואת כל הפונקציונליות מתבנית האב ולבצע באלו שינויים כאוות נפשכם, וזאת כאשר תבנית האב נשארת ללא שינוי.
שימוש בתבנית בת (Child Theme) זו הדרך הנוחה ביותר לבצע שינויים בתבנית שלא אתם פיתחתם. אם תבצעו שינויים ישירות בתבנית האב (Parent Theme), ומפתח התבנית יוציא עדכון לאותה תבנית, ביצוע העדכון ידרוס את השינויים שביצעתם.
כאשר אתם יורשים תבנית אב, אתם נדרשים להוסיף את style.css
ואת functions.php
בתבנית הבת. שאר הקבצים של התבנית נורשים מתבנית האב, אם תוסיפו תבנית עמוד (page template) לתבנית הבת היא תדרוס את תבנית העמוד של תבנית האב.
לדוגמה, אם תעתיקו את הקובץ footer.php
מתבנית האב לתבנית הבת, הקובץ שייטען יהיה אך ורק זה שנמצא בתבנית הבת. כנ״ל לגבי single.php
, tag.php
וכדומה… אך דריסה זו אינה מתבצעת לקובץ functions.php
, קובץ זה הוא היחיד שנטען גם מתבנית האב וגם מתבנית הבת.
הקובץ functions.php
בתבנית הבת נטען לפני זה שנמצא בתבנית האב. מכך משתמע שתיאורטית ניתן לדרוס כל פונקציה שקיימת בתבנית האב, אך תוכלו לעשות זאת רק במידה ותבנית האב כתובה נכון…
דוגמה – דריסת פונקציה בתבנית האב
תתייחסו לקוד הבא כפונקציה בתבנית האב המציגה קישורים חברתים, ובמקרה זה מציגה קישור לפייסבוק בלבד.
<?php
function display_social_links()
{
?>
<a href="http://www.facebook.com">Facebook</a>
<?php
}
?>
בכל קבצי התבנית יש לכם אפשרות להציג את הקישורים החברתיים על ידי שימוש בפונקציה זו. נניח ובתבנית הבת נרצה לדרוס פונקציה זו בכדי להוסיף גם קישור לטוויטר, ניתן לעשות זאת במספר דרכים:
1. אופציה ראשונה היא ליצור פונקציה חדשה, אך תאלצו לעבור על כל קבצי התבנית ולהחליף את הפונקציה הקיימת בפונקציה החדשה. אני מניח כי ברורים לכם החסרונות של שיטה זו.
2. אופציה שנייה ומומלצת היא לדרוס את הפונקציה הקיימת כך שלא תאלצו לשנות את קבצי תבנית האב. על מנת לדרוס את הפונקציה המקורית אתם צריכים להוסיף את אותה פונקציה בקובץ functions.php
של תבנית הבת ולשנות אותה בהתאם לצורך שלכם, במקרה שלנו נרצה להוסיף קישור לטוויטר ולכן הפונקציה החדשה בתבנית הבת תראה כך:
<?php
function display_social_links()
{
?>
<a href="http://www.facebook.com">Facebook</a>
<a href="http://www.twitter.com">Twitter</a>
<?php
}
?>
לצערינו קוד זה לא יעבוד ויפיל את האתר שלכם. תקבלו שגיאה כי הפונקציה כבר הוגדרה בתבנית האב. זאת מכיוון והפונקציה בתבנית הבת אינה דורסת את הפונקציה בתבנית האב אלא פשוט תגדיר את הפונקציה לפני שהיא מוגדרת בתבנית האב.
עטיפת הפונקציה בתנאי
בכדי שתהיה לכם האפשרות לדרוס אותה, הפונקציה בתבנית האב צריכה להיות ״עטופה״ בתנאי הנקרא function_exists
, כלומר, הפונקציה בתבנית האב צריכה להראות כך:
<?php
if( !function_exists('display_social_links') )
{
function display_social_links()
{
?>
<a href="http://www.facebook.com">Facebook</a>
<?php
}
}
?>
קוד זה מציב תנאי אשר מבקש להגדיר את הפונקציה display_social_links
רק במידה והפונקציה לא הוגדרה לפני, כלומר, אינכם יכולים לדרוס פונקציות בתבנית האב בשיטה זו כאשר הן אינן עטופות בתנאי המכיל את הפונקציה function_exists
.
במידה ואינן עטופות בתנאי זה ישנן שתי אפשרויות, אחת היא שמפתח התבנית כתב את הקוד בצורה לא נכונה, אופציה שנייה היא שמפתח התבנית התכוון לכך שלא תדרסו פונקציה זו…
יש לכם דרך טובה יותר / הצעות / רעיונות ? שתפו אותנו שכולנו נלמד… 🙂
אחלה פוסט!
תודה יניב ! 🙂
ומה יקרה אם תבנית האב תתעדכן? השינוי יתאפס?
לא יתאפס, זו כל המטרה בתבנית בת….
כתבת ש-הפונקציה בתבנית האב צריכה להיות ״עטופה״ בתנאי. כלומר צריך להכניס את התנאי בקובץ שבתבנית האב? אם כן, מדוע לא ידרס?
אם אין את התנאי לא תוכל לדרוס את הפונקציה. תפקידו של מפתח התבנית או מפתח התוסף לעטוף את הפונקציה המקורית באותו תנאי.
תודה.
בלוג מעולה ומועיל, בהיר ומקצועי. תודה.
על לא דבר, תחזור לבקר ושתף חברים 😉