Search

דריסת פונקציות בתבנית אב על ידי תבנית בת

לתבניות בת בוורדפרס פונקציונליות המאפשרת לרשת (מהמילה ירושה) פונקציות ועיצוב מתבנית האב. על ידי שימוש בתבנית בת באפשרותכם לרשת את כל הגדרות העיצוב (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.

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

יש לכם דרך טובה יותר / הצעות / רעיונות ? שתפו אותנו שכולנו נלמד… 🙂

רועי יוסף
רועי יוסף

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

8 תגובות...
  • יניב 2 ספטמבר 2015, 17:59

    אחלה פוסט!

  • shmuel 13 ינואר 2021, 2:47

    ומה יקרה אם תבנית האב תתעדכן? השינוי יתאפס?

    • רועי יוסף 13 ינואר 2021, 17:59

      לא יתאפס, זו כל המטרה בתבנית בת….

      • shmuel 13 ינואר 2021, 18:35

        כתבת ש-הפונקציה בתבנית האב צריכה להיות ״עטופה״ בתנאי. כלומר צריך להכניס את התנאי בקובץ שבתבנית האב? אם כן, מדוע לא ידרס?

        • רועי יוסף 13 ינואר 2021, 19:17

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

  • shmuel 13 ינואר 2021, 20:09

    תודה.
    בלוג מעולה ומועיל, בהיר ומקצועי. תודה.

תגובה חדשה

Up!
לבלוג