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

התוסף ACF הוא הדרך הפופולרית ביותר ליצירת metaboxes ו custom fields באתרי וורדפרס.

התוסף 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>';

עד כאן… 🙂

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

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

{ 4 תגובות… הוסף אחת }
  • רמי 5 ביולי 2016, 14:15

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

    https://GenerateWP.com/generator/

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

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

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

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

השאירו תגובה

פעימות