חיפוש ]

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

בדומה לפונקציות ה 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;
?>
PHP

הנה דוגמא בסיסית לקובץ content.php:

<?php 
/* content.php */ 
 
the_title(); 
the_content();
 
?>
PHP

הבעיה עם משתנים ב 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;
 
?>
PHP

כאשר ננסה להשתמש במשתנה $example בתוך content.php הוא פשוט לא יעבוד לנו.

 
<?php 
/* content.php */ 
 
the_title(); 
the_content(); 
echo $example; //Undefined 
 
?>
PHP

הפתרון – להשתמש ב 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;
 
?>
PHP

כעת, כאשר ננסה להשתמש במשתנה $example בתוך content.php, הכל יעבוד כשורה…

 
<?php 
/* content.php */ 
 
the_title(); 
the_content(); 
echo $example;
//The variable is recognized without need of global statement ;) 
 
?>
PHP

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

2 תגובות...

תגובה חדשה

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

Savvy WordPress Development