חיפוש ]

שימוש ב Advanced Custom Fields ללא תלות ב Frontend

התוסף Advanced Custom Fields מספק דרך פשוטה  וממשק ויזואלי ליצירת metaboxes. התוצאה מאד אינטואטיבית ונוחה לעריכה על ידי הלקוח. התוסף ACF כולל מספר פונקציות בהן ניתן להשתמש בתבנית שלכם על מנת למשוך את הערכים של אותם השדות ב metaboxes שיצרתם, אך אני ממליץ לכם לא להשתמש בהן.

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

ניתן לבדוק את כמות השאילתות המתבצעת למסד הנתונים על ידי התוסף Query Monitor.

שליפת מידע באמצעות get_post_meta במקום get_field

אין סיבה להשתמש בפונקציה get_field כשאתם יכולים להשתמש בפונקציה של וורדפרס הנקראית get_post_meta. מעבר לכך שהפונקציות ש ACF מספקת מובילה לקריאות רבות יותר למסד הנתונים, במידה ומסיבה כלשהי התוסף הוסר / לא פעיל, הגולשים באתר ייראו שגיאה ודף לבן ריק במקום את האתר שלכם.

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

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

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

שימוש ב get_post_meta עבור repeater field

נאמר ואפשרתם ללקוח יכולת להוסיף סרטונים כאוות נפשו על ידי שימוש ב ACF Repeater Field, והשדות הינם שדה כותרת, שדה URL של הסרטון ותמונה. קריאה לשדה ה meta של ה repeater field בתבנית שלכם באמצעות הקוד הבא תחזיר לכם את מספר הפריטים הקיימים בשדה זה:

get_post_meta( get_the_ID(), 'my_videos', true );

באפשרותכם לבצע לולאה ולעבור על כל אחד מהפריטים (הוידאו) הקיימים ולגשת לערכים שלהם. הנה הדרך בה אני מציג את הסרטון ללא שימוש בפונקציה get_field של  ACF:

$videos = get_post_meta( get_the_ID(), 'my_videos', true );
  if( $videos ) {
    for( $i = 0; $i < $videos; $i++ ) {
      $title = esc_html( get_post_meta( get_the_ID(), 'my_videos_' . $i . '_title', true ) );
      $video = esc_url( get_post_meta( get_the_ID(), 'my_videos_' . $i . '_video', true ) );
      $thumbnail = (int) get_post_meta( get_the_ID(), 'my_videos_' . $i . '_thumbnail', true );

      // Thumbnail field returns image ID, so grab image. If none provided, use default image
      $thumbnail = $thumbnail ? wp_get_attachment_image( $thumbnail, 'medium' ) : '<img src="' . get_stylesheet_directory_uri() . '/images/default-video.png" />';

      // Displayed in two columns, so using column classes
      $class = 0 == $i || 0 == $i % 2 ? 'one-half first' : 'one-half';

      // Build the video box
      echo '<div class="' . $class . '"><a href="' . $video . '">' . $thumbnail . '</a>' . $title . '</div>';

    }
  }

בקוד מעלה ניתן לראות איך להשתמש ב ACF Image Field. המזהה (ID) של התמונה נשמר במסד הנתונים וניתן לקבל בעצם את ה markup של התמונה באמצעות:

 wp_get_attachment_image( $image_id, 'image_size' );

שליפת מידע מ- Options Page של ACF

כאשר אתם מוסיפים metaboxes ל options page של ACF, המידע יישמר בטבלת options ולא כ post meta. כלומר השימוש במקרה זה יהיה שם ה meta_key שבחרתם כאשר תופיע לפניו תחילית (prefix) בשם options_. מאצר והיה ברשותכם עמוד options של ACF שלושה שדות, ניתן יהיה לגשת לאותן שדות תתבצע בצורה הבאה:


  $title = esc_html( get_option( 'options_title' ) );
  $button_text = esc_html( get_option( 'options_button_text' ) );
  $button_url = esc_url( get_option( 'options_button_url' ) );
  
  if( $title && $button_text && $button_url )
    echo '<div class="call-to-action"><div class="wrap"><p>' . $title . '</p><p><a href="' . $button_url . '" class="button">' . $button_text . '</a></p></div></div>';

Term Metadata

בהנחה והוספתם שדה הנקרא ״כותרת משנית״ לקטגוריות, ACF ישמור זאת גם כן בטבלת options בפורמט הבא: [taxonomy]_[term_id]_[field name]

מכאן בכדי לקבל את הערך של שדה הנקרא my_subtitle בדף הארכיון של הקטגוריות, ללא שימוש בפונקציות של ACF, תוכלו להשתמש בקוד הבא:

// Make sure this is a category archive
	if( ! is_category() )
		return;
		
	
	$category = get_term_by( 'slug', get_query_var( 'category_name' ), 'category' );
	$subtitle = esc_html( get_option( 'category_' . $category->term_id . '_my_subtitle' ) );
	if( $subtitle )
		echo '<p class="subtitle">' . $subtitle . '</p>';

עד כאן… 🙂

  • רמי 5 יולי 2016, 14:15

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

    https://GenerateWP.com/generator/

    • Michael 6 יולי 2016, 23:26

      אחלה מאמר רועי.
      רמי, כבל תת-ימי (repeater/groups/loop) יש לכם?

  • אבי 22 אוגוסט 2018, 15:42

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

    <?php echo wpautop(get_post_meta( get_the_ID(), 'repeater_' . $i . '_review', true )); ?>

    ורק אז זה יוסיף את המרווחים הנכונים. מקווה שזה יעזור למישהו…

  • אבי 7 אוקטובר 2018, 17:19

    גיליתי פה בעיה שאולי מישהו יצליח לפתור. שוב לגבי ה WYSIWYG, עם get_post_meta. הוא לא עושה אמבד לסרטוני יוטיוב (כשרק שמים URL של סרטון). ניסיתי להעביר את הפלט דרך apply_filters אבל זה גם לא עזר.

    לצערי נאלצתי להמיר קוד שלם לדרך המובנית של התוסף… אם יש פתרון אשמח לשמוע 🙂

    • רועי יוסף 8 אוקטובר 2018, 3:33

      ואם אתה מחליף את זה לרגע עם get_field זה עובד לך?

  • עמנואל אמירוב 23 נובמבר 2018, 15:52

    קצת הסתבכתי בזה (אני לא מתכנת).

    אני משתמש כרגע בתבנית של אלמנטור ריקה ושבדקתי לגבי את התוסף הזה באינטרנט מצאתי אותך. אז כך, השאלה שלי היא כזאת: לפי מה שאני הבנתי מהפוסט אתה אומר שאני משתמש בתוסף הזה בגלל הסיבוב הארוך של הקוד acf (מתכוון במקום שהנתונים באים ישר מהאתר אלה הוא מגיע לתוסף ואחרי זה לאתר שכך הוא סוחב עוד זמן) יש לי שאלה היא אם אני יעשה את כל מה שאני צריך לעשות לא תיהיה לי באגים או דברים מוזרים שיקראו לאתר שלי?

    תודה רבה לך על כל הפוסטים של האתר שלך זה ממש עזר לי אחד שלא יודע כמעט כלום.

    • רועי יוסף 23 נובמבר 2018, 17:12

      היי עמנואל,

      צר לי אך אני לא מבין את השאלה שלך…

תגובה חדשה

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

Savvy WordPress Development