העברת משתנים באמצעות get_template_part בוורדפרס

כאשר משתמשים בפונקציה get_template_part, המשתנים מקובץ ה php שקורא לה אינם עוברים ל template part עצמו.

בדומה לפונקציות ה include() או require() הסטנדרטיות ב php, וורדפרס מציגה פונקציה משל עצמה על מנת לטעון templates (php files) וזאת נקראית get_template_part() וכשמה כן היא, נועדה על מנת לקרוא לחלקים של תבניות (template parts) באתרי וורדפרס.

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

במקרה שלי נתקלתי בבעיה זו כאשר רציתי להעביר משתנים של Advanced Custom Fields ל template part מסויים.

מדוע להשתמש ב get_template_part ?

במילה אחת (בעצם שתיים) – תבנית בת. אם אתם מעוניינם לשנות קבצים בתבנית שלכם באמצעות תבנית בת, השימוש ב get_template_part() בא לעזרתכם.

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

<?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 ;) 
 
?>

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

רועי יוסף

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

תגובות פייסבוק

{ 0 תגובות… הוסף אחת }

השאירו תגובה

שיתופים
קראו גם את:
מדריך למתחילים - הגדרת התוסף W3 Total Cache
מדריך למתחילים – הגדרת התוסף W3 Total Cache

התוסף (Total Cache (W3TC אשר פותח על ידי ה CTO של Mashable הידועים הוא ללא...