כברירת מחדל, וורדפרס מסירה את רוב ה-HTML מתיאור (description) של קטגוריות ותגיות בזמן השמירה. רק רשימה קצרה של תגיות inline נשארת, כך שכותרות, רשימות, תמונות ופסקאות עם class נעלמות ברגע שאתם לוחצים על ״עדכון״.
זה בעייתי כשאתם משתמשים בעמודי קטגוריה כעמודי נחיתה עם תוכן פתיחה אמיתי (אגב, זו אחת הדרכים הפשוטות יותר לשפר את ה-SEO של עמודי קטגוריה). הסניפט הבא מאפשר HTML בתיאור של קטגוריות, תגיות וטקסונומיות מותאמות.
הקוד
הוסיפו את הקוד הבא לקובץ functions.php של תבנית הבת שלכם או לתוסף מותאם:
/**
* Allow HTML in term (category, tag) descriptions
*/
foreach ( array( 'pre_term_description' ) as $filter ) {
remove_filter( $filter, 'wp_filter_kses' );
if ( ! current_user_can( 'unfiltered_html' ) ) {
add_filter( $filter, 'wp_filter_post_kses' );
}
}
foreach ( array( 'term_description' ) as $filter ) {
remove_filter( $filter, 'wp_kses_data' );
}
כיצד זה עובד
וורדפרס מסננת את תיאורי המונחים באמצעות שני פילטרים, והסניפט מסיר את שניהם. למידע נוסף על הוספה והסרה של פילטרים, הציצו בפוסט הבנת הוקים בוורדפרס.
pre_term_descriptionרץ לפני שהתיאור נשמר. וורדפרס מחברת אליו אתwp_filter_kses, שמסיר הכול חוץ מכמה תגיות בסיסיות.term_descriptionרץ כשהתיאור מוצג. בממשק הניהול בלבד, וורדפרס מוסיפה אליו אתwp_kses_data, שהיה מסיר שוב את ה-HTML בטבלת רשימת המונחים.
ההתניה current_user_can( 'unfiltered_html' ) שומרת על הבטיחות. משתמשים בעלי היכולת (capability) הזו יכולים לשמור כל HTML, בדיוק כמו בעורך הפוסטים.
כל שאר המשתמשים שיכולים לערוך מונחים מקבלים את wp_filter_post_kses, רשימת התגיות המותרות (allowlist) שבה וורדפרס משתמשת עבור תוכן פוסטים. תגיות כמו <h2>, <ul> ו-<img> יעבדו, אבל <script> לא.
שימו לב, אל תסירו את wp_filter_kses בלי להוסיף את אותה חלופה. פעולה כזו תאפשר לכל משתמש שיכול לערוך מונחים לשמור סקריפטים שירוצו אצל כל גולש באתר.
מה משתנה לאחר הוספת הקוד
הפילטרים חלים על כל הטקסונומיות, כך שהסניפט מכסה קטגוריות, תגיות, טקסונומיות מותאמות וגם קטגוריות מוצרים של WooCommerce.
| מצב | HTML מותר |
|---|---|
| ברירת מחדל, כל המשתמשים | a, abbr, acronym, b, blockquote, cite, code, del, em, i, q, s, strike, strong |
עם הסניפט, משתמשים בעלי unfiltered_html |
כל HTML |
| עם הסניפט, שאר המשתמשים | רשימת התגיות המותרות של תוכן פוסטים |
קחו בחשבון שלושה דברים:
- תיאורים ישנים לא ישוחזרו. ה-HTML הוסר עוד לפני שהגיע למסד הנתונים, לכן הזינו אותו מחדש לאחר הוספת הקוד.
- ב-Multisite, רק ל-Super Admin יש
unfiltered_html. מנהלי האתרים מקבלים את רשימת התגיות המותרות של פוסטים. אותו הדבר חל על כל המשתמשים אםDISALLOW_UNFILTERED_HTMLמוגדר בקובץwp-config.php. - התבנית שלכם צריכה להדפיס את התיאור.
term_description(),the_archive_description()ובלוק Term Description מדפיסים כולם את ה-HTML השמור. תבנית שמבצעת escaping לתיאור תציג את התגיות כטקסט.
אם אתם בונים טקסונומיות משלכם, הציצו בפוסט כיצד ליצור ולשלוף טקסונומיות מותאמות. התיעוד של wp_filter_kses() מתאר את פונקציית הסינון שהסניפט מחליף.
שאלות נפוצות
הנה כמה שאלות נפוצות על HTML בתיאורי קטגוריות ותגיות:
wp_filter_kses על pre_term_description עבור כל המשתמשים, כולל מנהלים. מדובר בברירת מחדל של אבטחה, והיא שומרת רק תגיות inline בסיסיות כמו קישורים, הדגשה ונטוי.
pre_term_description ו-term_description רצים עבור כל טקסונומיה, כולל product_cat ו-product_tag. בארכיוני המוצרים WooCommerce מדפיס את התיאור דרך wp_kses_post(), כך שסקריפטים מוסרים שם גם אם מנהל שמר אותם.