אחד המאפיינים החזקים של וורדפרס הוא ה WP Query. זו השאילתא שקובעת איזה תוכן יוצג ובאיזה עמוד. לעיתים קרובות, תרצו לשנות את השאילתא (query) לצרכים הספציפיים שלכם, למשל:
- לא להציג פוסטים מקטגורייה מסויימת.
- להגדיל ולהקטין את מספר הפוסטים המוצגים בדף לסוג תוכן מותאם (Custom Post Type) כלשהו.
- לקבוע אילו פוסטים יוצגו ובאיזה סדר.
- ליצור לולאה נפרדת בכדי להציג תוכן שונה בתוך עמוד מסויים.
ניתן לבצע שינויים ללולאה באמצעות ההוק ()pre_get_posts שוורדפרס מספקת לנו. לא אתמקד יותר מדי במה שקורה מאחורי הקלעים במדריך זה אך נתאר מספר דרכים לשנות את הלולאה באמצעות pre_get_posts.
אפשרויות לשינוי הלולאה של וורדפרס
משפט אחד לפני שנתחיל, נאמר כי ממש לא רצוי להשתמש ב query_posts()
. כפי שאתם יכולים לראות ב WordPress Codex ישנם לא מעט אזהרות לגבי זה. לכן, ישנן שתי דרכים לגשת לכך וזאת בהתאם לצרכים שלכם.
1. יצירת לולאה חדשה בתוך תבנית העמוד
זהו מצב בו הכי נכון להשתמש כאשר התוכן שאתם מעוניינים להציג נטען יחד עם התוכן של העמוד הנוכחי. לדוגמה, אם יש לכם עמוד המציג תוכן על מדינת ישראל וברצונכם להציג את חמשת הפוסטים האחרונים על מדינת ישראל בתחתית העמוד, נכון יהיה ליצור לולאה חדשה.
2. מודיפקציה ללולאה הראשית
אם ברצונכם לשנות את התוכן שמוצג בעמוד מסויים, סביר להניח שתרצו לבצע מודיפיקציה על הלולאה הראשית (Main Query). שלושת הדוגמאות הראשונות שהצגתי מעלה דורשות מודיפיקציה ללולאה הראשית.
וורדפרס מספקת הוק נורא שימושי כפי שציינו הנקרא pre_get_posts
. הוק זה נקרא ברגע שכל הגדרות הלולאה כבר מוכנות אך בדיוק רגע לפני שהלולאה עצמה רצה. כאן אנחנו נכנסים לתמונה ומבצעים שינוי להגדרות הלולאה.
השימוש בהוק זה צריך להתבצע דרך קובץ functions.php
(או באמצעות פלאגין). וורדפרס בונה את הלולאה בכדי לדעת איזו תבנית עמוד (Page Template) לטעון, כך שאם תשמשו בהוק בתוך תבנית העמוד זה יהיה מאוחר מדי.
אם אתם מעוניינים לקרוא בהרחבה על תבניות עמוד (וההיררכיה שלכם) בוורדפרס תנו מבט בקישור המצורף.
כל הפונקציות שנדגים כאן יהיו בעלות מבנה דומה. דבר ראשון, נוודא כי אנו ניגשים ללולאה הראשית. אם לא נדאג לעשות זאת הקוד ישפיע על כל הלולאות מהתפריטים של וורדפרס ועד לתוסף שלכם שמציג את התגובות האחרונות בסרגל הצד.
נבצע זאת על ידי שימוש ב $query->is_main_query()
. אפשרות זו נוספה בגירסת וורדפרס 3.3, לגירסאות קודמות יותר אתם נדרשים להשוות את המשתנה $query
למשתנה הגלובלי $wp_the_query
.
לאחר מכן נוודא כי התנאים נכונים למודיפיקציה שברצוננו לבצע. אם תרצו לבצע אותה רק על עמוד הבית, נדאג לכך שהלולאה שייכת לדף הבית $query->is_home()
.
לבסוף, נבצע את השינוי על ידי המטודה $query->set( 'key', 'value')
. בכדי להבין את כל השינויים שיש באפשרותכם לבצע ללולאה תנו מבט ב WP_Query Codex page.
מספר דוגמאות קונקרטיות
בואו נראה מספר מצבים בהם נרצה להשתמש בפונקציה pre_get_posts בכדי לשנות את הלולאה הראשית של וורדפרס.
למנוע הצגה של קטגוריה מסויימת בבלוג
<?php
/**
* Exclude Category from Blog
*
* @author Roee Yossef
* @link https://savvy.co.il
*
*/
function my_exclude_category_from_blog( $query ) {
global $wp_the_query;
if( $wp_the_query === $query && $query->is_home() ) {
$query->set( 'cat', '-4' );
}
}
add_action( 'pre_get_posts', 'my_exclude_category_from_blog' );
אנו מוודאים בקוד מעלה כי הלולאה היא אכן הלולאה הראשית ומוודאים כי אנחנו בעמוד הבית של הבלוג על ידיis_home()
. כאשר תנאים אלו מתקיימים אנו מגדירים שמזהה הקטגוריה שווה ל '4-'
, כך שוורדפרס תמנע את הצגת קטגוריה זו.
אם הנכם משתמשים בוורפרס גירסת 3.2 ומטה, הקוד אמור להראות כך:
<?php
/**
* Exclude Category from Blog
*
* @author Roee Yossef
* @link https://savvy.co.il
*
*/
function my_exclude_category_from_blog( $query ) {
global $wp_the_query;
if( $wp_the_query === $query && $query->is_home() ) {
$query->set( 'cat', '-4' );
}
}
add_action( 'pre_get_posts', 'my_exclude_category_from_blog' );
שינוי מספר הפוסטים בעמוד
נניח כי ברשותכם סוג תוכן מותאם הנקרא events
המציג אירועים. אתם מציגים את האירועים בשלוש עמודות באתר, כך שבמקום ברירת המחדל של 10 פוסטים בכל עמוד תרצו להציג 12. אם תגשו בלוח הבקרה להגדרות > קריאה ותשנו את מספר הפוסטים לכל עמוד זה ישפיע על כלל הפוסטים בבלוג כולל האירועים.
נשתמש ב pre_get_posts
על מנת לבצע מודיפיקציה להגדרה posts_per_page
רק כאשר התנאים הבאים מתקיימים:
- אנו בלולאה הראשית של וורדפרס.
- אנו לא נמצאים בלוח הבקרה של וורדפרס (אנו רוצים שזה ישפיע אך ורק בתצוגת האתר).
- רק בדף הארכיון של האירועים.
<?php
/**
* Change Posts Per Page for Event Archive
*
* @author Roee Yossef
* @link https://savvy.co.il
*
*/
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
. למחר תמיד יהיה ערך גדול יותר מהיום, כך שבלולאה אנו יכולים פשוט לוודא אם ערך תאריך הסיום של האירוע גדול יותר מהערך של עכשיו.
להסבר על יצירת שדות מטא אין מקום במדריך זה…
אם כל התנאים התקיימו, אלו השינויים שנבצע ללואה:
- נבצע שאילתא על שדות המטא בכדי לוודא שתאריך הסיום של האירוע גדול מהיום.
- נסדר את הפוסטים לפי
meta_value_num
(הערך של שדה המטא). - נגדיר
meta_key
לתאריך ההתחלה כך שזה בעצם זה יהיה שדה המטא לפיו יסודרו הפוסטים. - נגדיר שהפוסטים יוצגו בסדר עולה (ascending) כך שהפוסטים הקרובים יוצגו ראשונים.
<?php
/**
* Customize Event Query using Post Meta
*
* @author Roee Yossef
* @link https://savvy.co.il
*
*/
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' );
עד כאן, אשמח כתמיד לתגובות, הערות ותיקונים במידה ויש… 🙂
הרבה יותר נכון להשתמש באובייקט חדש של wp-query מאשר לערוך את הלולאה המקורית. ככה באמת לא דורסים את הלולאה המקורית וניתן תמיד לחזור אליה.
אגב ה – hook המדובר pre_get_posts נקרא גם בעת שימוש ב- wp_query חדש.
אתה בהחלט צודק אייל ! 🙂