Search

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

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

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

החל מוורדפרס 5.5 ניתן להעביר ארגומנטים באמצעות get_templete_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 ;) 
 
?>

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

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

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

2 תגובות...

תגובה חדשה

ניווט מהיר

Up!
לבלוג