מודיפיקציה ללולאה של וורדפרס

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

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

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

במדריך זה לא אתמקד יותר מדי במה שקורה מאחורי הקלעים אלא בשימושים היותר נפוצים של הלולאה והמודיפקציה שלה.

קודם כל, מה לא לעשות. אל תשתמשו ב query_posts(). כפי שאתם יכולים לראות ב WordPress Codex, ישנת לא מעט אזהרות לגבי זה. לכן, ישנן שתי דרכים לגשת לזה בהתאם לצרכים שלכם.

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

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

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

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

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

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

כל הפונקציות שנדגים כאן יהיו בעלות מבנה דומה. דבר ראשון, נוודא כי אנו ניגשים ללולאה הראשית. אם לא נדאג לעשות זאת הקוד ישפיע על כל הלולאות מהתפריטים של וורדפרס ועד לתוסף שלכם שמציג את התגובות האחרונות בסרגל הצד. נבצע זאת על ידי שימוש ב $query->is_main_query(). אפשרות זו נוספה בגירסת וורדפרס 3.3, לגירסאות קודמות יותר אתם נדרשים להשוות את המשתנה $query למשתנה הגלובלי $wp_the_query.

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

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

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

<?php
/**
 * Exclude Category from Blog
 * 
 * @author Roee Yossef
 * @link https://he.savvy.co.il/blog
 *
 */
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://he.savvy.co.il/blog
 *
 */
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://he.savvy.co.il/blog
 *
 */
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://he.savvy.co.il/blog
 *
 */
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' );

עד כאן, אשמח כתמיד לתגובות, הערות ותיקונים במידה ויש… 🙂

רועי יוסף

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

תגובות פייסבוק

{ 2 תגובות… הוסף אחת }
  • אייל גורסוי 24 ביולי 2015, 2:12

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

השאירו תגובה

שיתופים
קראו גם את:
אופטימיזציה תמונות וורדפרס – קידום אתרים
אופטימיזציה לתמונות באתרי וורדפרס – קידום אתרים | SEO

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