בפוסט זה אני יוצא מנקודת הנחה שיש לכם ידע בסיסי על הקלאס WP_Query בוורדפרס. נתחיל עם כמה דוגמאות בסיסיות בדומה לאלו שתמצאו ב-WordPress Codex, ואז נעבור לכלי האמיתי: meta_query.
השימוש באלו רלוונטי כשאתם מעוניינים ליצור פילטר כלשהו לפוסטים או חיפוש מתקדם בוורדפרס או בחנות ווקומרס.
כפי שלבטח אתם יודעים, לכל הפוסטים ניתן להוסיף שדות מטא (metadata) תחת הבוקסה ״שדות מיוחדים״, הלא הם Custom Fields.
לדוגמה, אם אתם מעוניינים לשלוף את כל הפוסטים בעלי שם (meta key) הנקרא show_on_homepage ובעלי ערך (meta value) השווה ל-on, תוכלו לבצע זאת כך:
$sv_args = array(
'meta_key' => 'show_on_homepage',
'meta_value' => 'on'
);
$sv_query = new WP_Query( $sv_args );לעומת זאת, אם אתם מעוניינים לשלוף את כל הפוסטים חוץ מאלו בעלי השם והערך המוזכרים מעלה:
$sv_args = array(
'meta_key' => 'show_on_homepage',
'meta_value' => 'on',
'meta_compare' => '!='
);
$sv_query = new WP_Query( $sv_args );הדוגמאות בפוסט מופשטות וחסרים פרמטרים נפוצים של
WP_Queryכגוןposts_per_pageאוpost_type. הוסיפו אותם בקוד שלכם.
אלו דוגמאות בסיסיות. הפוסט הזה בעיקרו עוסק בפרמטר meta_query, שמאפשר לכם לבנות פילטרים מורכבים יותר לפוסטים או למוצרים.
דוגמאות שימוש ב-meta_query
שליפת פוסטים עם ערך ספציפי בשדה המיוחד
דוגמה פשוטה – נשלוף את כל הפוסטים עם שדה מיוחד בשם color ובעל הערך white:
// the meta_key 'color' with the meta_value 'white'
$sv_args = array(
'meta_query' => array(
array(
'key' => 'color',
'value' => 'white'
)
)
);
$sv_query = new WP_Query( $sv_args );אם תיגשו לממשק הניהול של וורדפרס ותסתכלו בעמוד העריכה של כל אחד מהפוסטים שחוזרים בלולאה, תמצאו את השדה המיוחד הבא:

כדי לשלוף את כל הפוסטים חוץ מאלו בעלי שדה color עם הערך white:
$sv_args = array(
'meta_query' => array(
array(
'key' => 'color',
'value' => 'white',
'compare' => '!='
)
)
);
$sv_query = new WP_Query( $sv_args );כעת נשלוף את כל הפוסטים עם הערך white או green:
// custom field name is color and custom field value is 'white' OR 'green'
$sv_args = array(
'meta_query' => array(
array(
'key' => 'color',
'value' => array('white','green'),
'compare' => 'IN'
)
)
);
$sv_query = new WP_Query( $sv_args );שליפת כל הפוסטים (מוצרים בחנות ווקומרס לצורך העניין) חוץ ממוצרים לבנים או ירוקים:
$sv_args = array(
'meta_query' => array(
array(
'key' => 'color',
'value' => array('white','green'),
'compare' => 'NOT IN'
)
)
);
$sv_query = new WP_Query( $sv_args );שליפת כל השדות בטווח נומרי מסוים
לדוגמה, נפלטר בחנות ווקומרס את כל המוצרים שמחירם בין 2000 ל-4000:
// the product price is more than 2000 and less than 4000
$sv_args = array(
'meta_query' => array(
array(
'key' => 'price',
'value' => array( 2000, 4000 ),
'type' => 'numeric',
'compare' => 'BETWEEN'
)
)
);
$sv_query = new WP_Query( $sv_args );השוואה נומרית
בדוגמה הבאה נפלטר את כל המוצרים שמחירם 2000 ומעלה:
$sv_args = array(
'meta_query' => array(
array(
'key' => 'price',
'value' => 2000,
'type' => 'numeric',
'compare' => '>='
)
)
);
$sv_query = new WP_Query( $sv_args );מוצרים שמחירם נמוך מ-4000:
$sv_args = array(
'meta_query' => array(
array(
'key' => 'price',
'value' => 4000,
'type' => 'numeric',
'compare' => '<'
)
)
);
$sv_query = new WP_Query( $sv_args );שליפת פוסטים לפי מספר שדות מיוחדים
נשלב מספר מהדוגמאות שהצגנו קודם:
// the 'color' is 'white' AND the 'price' is more than 2000 and less than 4000
$sv_args = array(
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'show_on_homepage',
'value' => 'on'
),
array(
'relation' => 'OR',
array(
'key' => 'color',
'value' => 'white'
),
array(
'key' => 'price',
'value' => array( 2000, 4000 ),
'type' => 'numeric',
'compare' => 'BETWEEN'
)
)
)
);
$sv_query = new WP_Query( $sv_args );טיפ ביצועים
שאילתות מטא עושות JOIN על טבלת wp_postmeta, מה שיכול להאט אתרים גדולים. אם אתם מפלטרים לפי אותם שדות מטא בתדירות גבוהה, שיקלו להשתמש בטקסונומיה מותאמת – טקסונומיות מאונדקסות כברירת מחדל ומתרחבות טוב יותר. למשתמשי ACF, יש לי פוסט על אופטימיזציית שאילתות בסיס נתונים ב-ACF.
לסיכום
הפרמטר meta_query ב-WP_Query הוא אחד הכלים השימושיים ביותר לבניית לולאות מותאמות. ברגע שמתרגלים לאופרטורים של compare ולמפתח relation לשילוב תנאים, אפשר לפלטר פוסטים לפי כמעט כל מה ששמור ב-Custom Fields.
אני משתמש ב-meta_query כל הזמן באתרי לקוחות, במיוחד בחנויות ווקומרס שבהן סינון המוצרים נהיה מורכב. אם אתם רוצים להעמיק בשאילתות וורדפרס, בדקו את הפוסט שלי על שינוי הלולאה עם pre_get_posts.
שאלות נפוצות
שאלות נפוצות על WP_Query ו-meta_query:
meta_key/meta_value לבין meta_query?
meta_key ו-meta_value הם פרמטרים ישנים לחיפוש פשוט בשדה בודד. meta_query תומך בשדות מרובים, תנאים מקוננים עם יחסי AND/OR, המרת טיפוסים ואופרטורי השוואה מתקדמים. השתמשו ב-meta_query לכל מה שמעבר למקרה הבסיסי ביותר.meta_query?
relation משלהם. המערך החיצוני יכול להיות 'relation' => 'AND' בעוד מערך פנימי משתמש ב-'relation' => 'OR', כמו בדוגמה האחרונה בפוסט.meta_query עובד עם Custom Post Types?
meta_query עובד עם כל סוג פוסט. פשוט הוסיפו 'post_type' => 'your_cpt' לארגומנטים של WP_Query ליד ה-meta_query.meta_query מורכבות עלולות להאט. לנתונים שמפלטרים לפיהם בתדירות גבוהה, שיקלו להשתמש בטקסונומיות מותאמות או להוסיף אינדקס בבסיס הנתונים על מפתחות המטא הרלוונטיים.meta_query מפתח בעל שם (למשל 'price_clause'), ואז הגדירו 'orderby' => 'price_clause' בארגומנטים הראשיים של WP_Query. זה עדיף על שימוש בפרמטר הישן meta_key למיון.
