כיצד לאפשר HTML במונחים (Terms) של קטגוריות ותגיות

כברירת מחדל, וורדפרס מסירה את רוב ה-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 בתיאורי קטגוריות ותגיות:

למה וורדפרס מסירה HTML מתיאורי קטגוריות?
וורדפרס מריצה את wp_filter_kses על pre_term_description עבור כל המשתמשים, כולל מנהלים. מדובר בברירת מחדל של אבטחה, והיא שומרת רק תגיות inline בסיסיות כמו קישורים, הדגשה ונטוי.
האם זה עובד גם עבור קטגוריות מוצרים ב-WooCommerce?
כן. pre_term_description ו-term_description רצים עבור כל טקסונומיה, כולל product_cat ו-product_tag. בארכיוני המוצרים WooCommerce מדפיס את התיאור דרך wp_kses_post(), כך שסקריפטים מוסרים שם גם אם מנהל שמר אותם.
האם זה מוסיף עורך ויזואלי לשדה התיאור?
לא. השדה נשאר textarea פשוט, ואתם כותבים את ה-HTML בעצמכם. הסניפט רק מונע מוורדפרס להסיר אותו.
דיון ותגובות
[  0 תגובות  ]

השאירו תגובה

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