בדומה לפונקציות ה include()
או require()
הסטנדרטיות ב php, וורדפרס מציגה פונקציה משל עצמה על מנת לטעון templates (php files) וזאת נקראית get_template_part()
וכשמה כן היא, נועדה על מנת לקרוא לחלקים של תבניות (template parts) באתרי וורדפרס.
בזמן ששימוש בפונקציה get_template_part()
מספק את מה שאנו צריכים ברוב המקרים, ישנם מצבים בהם השימוש בזו מקשה על מפתחים. אם נדייק, אין אפשרות להעביר משתנים (php variables) ל template part לה אנו קוראים באמצעות get_template_part()
. בואו ניתן מבט על מספר דוגמאות בסיסיות וניתן גם פתרון לבעיה.
מדוע להשתמש ב get_template_part?
במילה אחת (בעצם שתיים) – תבנית בת. אם אתם מעוניינם לשנות קבצים בתבנית שלכם באמצעות תבנית בת, השימוש ב get_template_part()
בא לעזרתכם.
בעיקרון, כאשר אתם קוראים ל get_template_part('some-file')
, וורדפרס תבדוק קודם כל האם אותו קובץ (הנמצא באותה ספרייה) נמצא בתבנית הבת שלכם. במידה והוא נמצא, וורדפרס תטען אותו מתבנית הבת במקום מהתבנית הראשית וזהו פתרון נח המאפשר לשנות את התנהגות התבנית אך לא לגעת בקבצי המקור של התבנית בה אתם משתמשים. הנה דוגמה בסיסית לקובץ בשם loop.php
:
<?php
/* loop.php file includes content.php */
while( have_posts() ):
the_post();
get_template_part( 'content' );
endwhile;
?>
הנה דוגמא בסיסית לקובץ content.php
:
<?php
/* content.php */
the_title();
the_content();
?>
הבעיה עם משתנים ב get_template_part
אך מה אם יש לנו משתנים בקובץ loop.php
ואנו רוצים להשתמש באלו בתוך הקובץ content.php
לו אנו קוראים באמצעות get_template_part()
? תנו מבט בדוגמה הבאה:
<?php
/* Using a variable */
$example = 'This is an example variable';
while( have_posts() ):
the_post();
get_template_part( 'content' );
endwhile;
?>
כאשר ננסה להשתמש במשתנה $example
בתוך content.php
הוא פשוט לא יעבוד לנו.
<?php
/* content.php */
the_title();
the_content();
echo $example; //Undefined
?>
הפתרון – להשתמש ב include ובפונקציה locate_template
אם תחפרו בקוד של וורדפרס, תגלו כי הפונקציה get_template_part
משתמשת בפונקציה אחרת הנקראית locate_template()
אשר זו נועדה לזהות אם חלק התבנית (template_part) לו אנו קוראים נמצא בתבנית הבת. באפשרותה של פונקציה זו לטעון את חלק התבנית (ולנקות את כל המשתנים באמצעות get_template_part
) או פשוט להחזיר לנו את הכתובת של הקובץ עצמו בלי לטעון אותו.
מכאן, שהשימוש ב locate_template()
יחד עם הפונקציה include()
של php, ייתן לנו את התוצאה הרצויה, תנו מבט:
<?php
/* Using a variable */
$example = 'This is an example variable';
while( have_posts() ):
the_post();
//Note: you need to use full file name, in this case content.php and also false arguments to avoid loading the file and return the full path instead
include( locate_template( 'content.php', false, false ) );
endwhile;
?>
כעת, כאשר ננסה להשתמש במשתנה $example
בתוך content.php
, הכל יעבוד כשורה…
<?php
/* content.php */
the_title();
the_content();
echo $example;
//The variable is recognized without need of global statement ;)
?>
אז הכותרת של המאמר קצת מטעה, אך העיקרון די פשוט ומובן. מקווה שיעזור לכם והרגישו חופשי לשתף מחשבות… 🙂
אני חדש בוורדפרס אז לכן יכול להיות שאני לא יודע מספיק טוב, אבל מהתיעוד הרשמי זה נראה שכן ניתן להעביר פרמטרים בפונקציה get_template_part, ניסיתי וזה אכן מעביר. אז אולי זה פיצ'ר שנוסף בהמשך, והבלוג לא מעודכן.
בכל אופן תודה רבה
היי מוטי,
אתה צודק. החל מוורדפרס 5.5 ניתן להעביר ארגומנטים באמצעות get_templete_part. לא ידעתי אז תודה רבה ואעדכן את הפוסט בהתאם… 🙂