חיפוש ]

שיפור מספר הקריאות למסד הנתונים ב Advanced Custom Fields

לפעמים הפונקציות get_field ו the_field של התוסף Advanced Custom Fields מספיקות עבור עמודים עם מעט שדות מותאמים (Custom Fields). אך עבור עמודים עם הרבה מאד שדות, או עם שדות מאד מורכבים (כמו אלו ב Repeater או Flexible Fields), עלינו להשתמש במשהו קצת יותר מסודר.

פוסט זה תורגם לעברית מפוסט אחר. המקור נכתב על ידי Julien Melissas.

מספר מילים על Advanced Custom Fields

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

אם אתם מעוניינים לדעת עוד על השימוש בתוסף ACF, תנו מבט במאמר מדריך שימוש בסיסי ב Advanced Custom Fields.

נראה דוגמה  – Use Case

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

  • שם החיה – במקרה זה וורדפרס מספקת לנו את הכותרת של סוג התוכן, כלומר שימוש ב – the_title
  • סוג החיה – נאמר וזהו שדה בחירה (Select Box Field) עם האפשרויות כלב, חתול ואחר.
  • תמונת החיה (Image Field).
  • תיאור החיה (ACF wysiwyg).

שימוש בפונקציה the_field

אז יצרנו סוג תוכן מותאם וכעת אנחנו נמצאים בקובץ single-pet.php.  בואו נדפיס את השדות שלנו באמצעות הפונקציה the_field. זכרו כי הפונקציה מבצעת את ההדפסה (echo) עבורינו:

<?php
//Save Variables
$name = the_title();
$type = get_field('type');
$image = get_field('image');
$description = get_field('description');

if($name) {	?>
    <div class="page-header">
        <h1>
			<?php echo $name; ?>
        </h1>
    </div>
<?php }


if($type) {	?>
    <div class="type">
		<?php echo $type; ?>
    </div>
<?php }


if($image) { ?>
    <img src="<?php echo $image ?>" alt="<?php echo $name; ?>">
<?php }


if($description) { ?>
    <div class="description">
		<?php echo $description; ?>
    </div>
<?php }

?>

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

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

שימוש במערך או בעצם בפונקציה get_fields

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

אני בהחלט מעדיף שיטה זו מכיוון והיא יותר יעילה (תקנו אותי אם אני טועה), ועבורי, בהרבה מצבים היא יותר קלה לניווט. אתם יכולים לקרוא עוד על הפוקנציה get_fields בדוקומנטציה של ACF.

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

<?php
//Save Variables
$pet = get_fields();
?>

כעת, נשתמש ב var_dump() בכדי להדפיס את המידע של הכלב גינס בעמוד:

<?php
//Save Variables
$pet = get_fields();

var_dump($pet);
?>

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

Array
(
    [type] => Dog
    [image] => Array
        (
            [ID] => 103
            [id] => 103
            [title] => Just an Image Title
            [filename] => dog.jpg
            [filesize] => 3030
            [url] => https://get-field-example/wp-content/uploads/2018/07/dog.jpg
            [link] => https://get-field-example/test/dog/
            [alt] => Just an Image ALT text
            [author] => 1
            [description] => Just an Image Description
             => Just an Image Caption
            [name] => dog
            [status] => inherit
            [uploaded_to] => 96
            [date] => 2018-07-04 18:17:10
            [modified] => 2018-07-04 18:20:03
            [menu_order] => 0
            [mime_type] => image/jpeg
            [type] => image
            [subtype] => jpeg
            [icon] => https://get-field-example/wp-includes/images/media/default.png
            [width] => 225
            [height] => 224
            [sizes] => Array
                (
                    [thumbnail] => https://get-field-example/wp-content/uploads/2018/07/dog-150x150.jpg
                    [thumbnail-width] => 150
                    [thumbnail-height] => 150
                    [medium] => https://get-field-example/wp-content/uploads/2018/07/dog.jpg
                    [medium-width] => 225
                    [medium-height] => 224
                    [medium_large] => https://get-field-example/wp-content/uploads/2018/07/dog.jpg
                    [medium_large-width] => 225
                    [medium_large-height] => 224
                    [large] => https://get-field-example/wp-content/uploads/2018/07/dog.jpg
                    [large-width] => 225
                    [large-height] => 224
                )

        )

    [description] => 
Objectively matrix interoperable convergence.
)

מאד סקסי אתם לא חושבים? המידע מסודר בצורה מושלמת ומוכן לשימוש כשנמצא לנכון. בואו נכניס את המידע הרצוי למשתנים ונדפיס את הערכים. שימו לב שאנו מושכים את המידע עבור המשתנים היישר מהמערך השמור במשתנה $pet.

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

<?php

//Save Variables
$pet         = get_fields();
$name        = the_title();
$type        = $pet["type"];
$image       = $pet["image"];
$image_url   = $image["sizes"]["medium"];
$image_alt   = $image["alt"];
$description = $pet["description"];


if ( $name ) { ?>
    <div class="page-header">
        <h1>
			<?php echo $name; ?>
        </h1>
    </div>
<?php }


if ( $type ) { ?>
    <div class="type">
		<?php echo $type; ?>
    </div>
<?php }


if ( $image ) { ?>
    <img src="<?php echo $image_url; ?>" alt="<?php echo $image_alt; ?>">
<?php }


if ( $description ) { ?>
    <div class="description">
		<?php echo $description; ?>
    </div>
<?php }
?>

זוהי רק דרך פשוטה לשיפור מספר הקריאות למסד הנתונים ב Advanced Custom Fields. סוף.

2 תגובות...
  • דוד 5 יולי 2018, 12:59

    לא בונה בוורדפרס ולכן מדבר באופן כללי – להבנתי לא נכון להשתמש ב get_field בכלל, רק אם צריכים שדה אחד בדיוק. לא רואה סיבה להפעיל את אותה שאילתת SQL יותר מפעם אחת, גם אם אין לך 100 שדות בעמוד, מה אם יש לך 10,000 חיות בטבלה?

    בכל פלטפורמה מקבילה ניתן לקבל את תוצאות השאילתא בתוך מערך או טבלה. במידה ורוצים לחסוך טעינת שדות מרובים שלא נצרכים (כאן בעמוד השתמשת רק ב-4) באמת מומלץ לכתוב שאילתת SQL ספציפית.

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

  • אלרון 25 ספטמבר 2020, 7:01

    אני מתבייש לומר שחידשת לי. בושות! תודה שהערת את תשומת ליבי

תגובה חדשה

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

Savvy WordPress Development