חיפוש ]

כיצד לבצע מודיפיקציה ושינויים ללולאה של וורדפרס?

אחד המאפיינים החזקים של WordPress הוא ה-WP_Query. זו השאילתא שקובעת איזה תוכן יוצג ובאיזה עמוד. לעיתים קרובות, תרצו לשנות את השאילתא (query) לצרכים הספציפיים שלכם, למשל:

  • לא להציג פוסטים מקטגוריה מסוימת.
  • להגדיל ולהקטין את מספר הפוסטים המוצגים בדף לסוג תוכן מותאם (Custom Post Type) כלשהו.
  • לקבוע אילו פוסטים יוצגו ובאיזה סדר.
  • ליצור לולאה נפרדת כדי להציג תוכן שונה בתוך עמוד מסוים.

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

אפשרויות לשינוי הלולאה של WordPress

לפני שמתחילים, חשוב לציין שלא מומלץ להשתמש ב-query_posts(). כפי שאפשר לראות ב-WordPress Developer Reference, ישנן לא מעט אזהרות לגבי זה. לכן, ישנן שתי דרכים לגשת לכך בהתאם לצרכים שלכם.

1. יצירת לולאה חדשה בתוך תבנית העמוד

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

כשיוצרים לולאות מרובות באותו עמוד, חשוב לאפס את הלולאה לאחר השימוש. עיינו במדריך על 3 דרכים לאפס את הלולאה של WordPress.

2. מודיפיקציה ללולאה הראשית

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

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

השימוש בהוק זה צריך להתבצע דרך קובץ functions.php (או באמצעות תוסף). וורדפרס בונה את הלולאה כדי לדעת איזו תבנית עמוד (Page Template) לטעון, כך שאם תשתמשו בהוק בתוך תבנית העמוד זה יהיה מאוחר מדי.

ודאו שאתם משתמשים בתבנית בת (Child Theme) או בתוסף MU-Plugin לפני הוספת קוד מותאם לקובץ functions.php. לעולם אל תערכו ישירות את קובץ ה-functions.php של תבנית האב.

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

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

ניתן לעשות זאת על ידי שימוש ב-$query->is_main_query().

לאחר מכן יש לוודא שהתנאים נכונים למודיפיקציה שברצונכם לבצע. אם תרצו לבצע אותה רק על עמוד הבית, דאגו שהלולאה שייכת לדף הבית: $query->is_home().

לבסוף, בצעו את השינוי על ידי המתודה $query->set( 'key', 'value' ). כדי להבין את כל השינויים שאפשר לבצע ללולאה, תנו מבט ב-WP_Query Reference.

מספר דוגמאות קונקרטיות

הנה מספר מצבים בהם כדאי להשתמש בפונקציה pre_get_posts כדי לשנות את הלולאה הראשית של WordPress.

למנוע הצגה של קטגוריה מסוימת בבלוג

function my_exclude_category_from_blog( $query ) {
    if ( $query->is_main_query() && $query->is_home() ) {
        $query->set( 'cat', '-4' );
    }
}
add_action( 'pre_get_posts', 'my_exclude_category_from_blog' );

הקוד מעלה מוודא שהלולאה היא הלולאה הראשית ושאתם בעמוד הבית של הבלוג באמצעות is_home(). כאשר תנאים אלו מתקיימים, מזהה הקטגוריה מוגדר ל-'-4', כך שוורדפרס תמנע את הצגת קטגוריה זו.

שינוי מספר הפוסטים בעמוד

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

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

  • הלולאה היא הלולאה הראשית של WordPress.
  • לא נמצאים בלוח הבקרה של WordPress (השינוי ישפיע רק בתצוגת האתר).
  • נמצאים בדף הארכיון של האירועים.
function my_change_event_posts_per_page( $query ) {
    if ( $query->is_main_query() && ! is_admin() && is_post_type_archive( 'event' ) ) {
        $query->set( 'posts_per_page', '12' );
    }
}
add_action( 'pre_get_posts', 'my_change_event_posts_per_page' );

מודיפיקציה ללולאה על בסיס שדות מטא

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

נשמור את תאריך תחילת האירוע וסיומו ב-unix timestamps. למחר תמיד יהיה ערך גדול יותר מהיום, כך שבלולאה אפשר פשוט לוודא אם ערך תאריך הסיום של האירוע גדול יותר מהערך של עכשיו.

לפרטים נוספים על שאילתות מטא בלולאה, עיינו במדריך על סינון פוסטים לפי שדות מטא באמצעות WP_Query.

אם כל התנאים התקיימו, אלו השינויים שיבוצעו ללולאה:

  • שאילתא על שדות המטא כדי לוודא שתאריך הסיום של האירוע גדול מהיום.
  • סידור הפוסטים לפי meta_value_num (הערך של שדה המטא).
  • הגדרת meta_key לתאריך ההתחלה – שדה המטא לפיו יסודרו הפוסטים.
  • הצגת הפוסטים בסדר עולה (ascending) כך שהאירועים הקרובים יוצגו ראשונים.
function my_event_query( $query ) {
    if ( $query->is_main_query() && ! $query->is_feed() && ! is_admin() && $query->is_post_type_archive( 'event' ) ) {
        $meta_query = array(
            array(
                'key'     => 'be_events_manager_end_date',
                'value'   => time(),
                'compare' => '>'
            )
        );
        $query->set( 'meta_query', $meta_query );
        $query->set( 'orderby', 'meta_value_num' );
        $query->set( 'meta_key', 'be_events_manager_start_date' );
        $query->set( 'order', 'ASC' );
    }
}
add_action( 'pre_get_posts', 'my_event_query' );

שאלות נפוצות

שאלות נפוצות בנושא שינוי הלולאה של WordPress:

מה ההבדל בין pre_get_posts לבין WP_Query חדש?
pre_get_posts משנה את הלולאה הראשית (Main Query) של WordPress לפני שהיא רצה. WP_Query חדש יוצר לולאה נוספת ומוסיפה שאילתא למסד הנתונים. השתמשו ב-pre_get_posts כשאתם רוצים לשנות את התוכן הקיים בעמוד, וב-WP_Query חדש כשאתם רוצים להוסיף תוכן נוסף.
למה לא מומלץ להשתמש ב-query_posts()?
query_posts() מחליפה את הלולאה הראשית לחלוטין, מה שגורם לבעיות עם פגינציה, תוספים שמסתמכים על הלולאה הראשית, ותנאי תבנית (conditional tags). בנוסף, היא מבצעת שאילתא נוספת למסד הנתונים שלא לצורך. pre_get_posts פשוט משנה את הפרמטרים של הלולאה הראשית לפני שהיא רצה, ללא שאילתא מיותרת.
האם pre_get_posts משפיע גם על לוח הבקרה?
כן, אם לא תוסיפו תנאי שמוודא שאתם לא בלוח הבקרה. תמיד הוסיפו ! is_admin() לתנאי הפונקציה כדי למנוע השפעה על ממשק הניהול, אלא אם כן אתם רוצים לשנות את השאילתא גם שם.
אפשר להשתמש ב-pre_get_posts כדי לשנות את סדר הפוסטים?
בהחלט. השתמשו ב-$query->set( 'orderby', 'date' ) ו-$query->set( 'order', 'ASC' ) כדי לשנות את סדר המיון. ניתן למיין לפי תאריך, כותרת, מזהה, ערך שדה מטא, סדר אקראי ועוד.
האם שינויי pre_get_posts משפיעים על ביצועי האתר?
שימוש ב-pre_get_posts כמעט ולא משפיע על הביצועים מאחר שהוא משנה שאילתא קיימת במקום ליצור חדשה. עם זאת, meta queries מורכבות (כמו הדוגמה עם האירועים) עשויות להאט את השאילתא אם יש הרבה רשומות ואין אינדקס מתאים על שדות המטא במסד הנתונים.

סיכום

ההוק pre_get_posts הוא כלי עוצמתי שמאפשר לשנות כמעט כל היבט של הלולאה הראשית ב-WordPress. הנקודות החשובות לזכור: תמיד בדקו שאתם משנים את הלולאה הראשית בלבד, הוסיפו תנאי ! is_admin() כדי לא להשפיע על לוח הבקרה, והשתמשו בהוק זה מתוך functions.php ולא מתוך תבנית עמוד.

דיון ותגובות
2 תגובות  ]
  • אייל גורסוי 24 יולי 2015, 2:12

    הרבה יותר נכון להשתמש באובייקט חדש של wp-query מאשר לערוך את הלולאה המקורית. ככה באמת לא דורסים את הלולאה המקורית וניתן תמיד לחזור אליה.

    אגב ה – hook המדובר pre_get_posts נקרא גם בעת שימוש ב- wp_query חדש.

השאירו תגובה

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

Savvy WordPress Development official logo