04
ביונ
2010

וורדפרס: פיתרון באג בהדגשת עמודי אב גם כשצופים בעמוד נכד

מאת: מאור ברזני | תגובות: 0 | נושאים: וורדפרס
תגיות: , , , , |


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

כידוע, כאשר משתמשים בפונקציה wp_list_pages על מנת להציג רשימת עמודים, וורדפרס יודעת להוסיף באופן אוטומטי גם קלאסים של CSS לעמודים השונים (current_page_item), זאת כדי לאפשר לנו לעצב כרצוננו אפקט כלשהו של צבע או רקע וכדו' שיוחל על העמוד הנוכחי בו צופה הגולש. גם עד כאן הכל טוב ויפה.

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

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

חקרתי קצת את הנושא וגיליתי שהקלאס הזה מתווסף כאשר המערכת "יודעת" למנות את כל רמות עמודי האב הקודמים של עמוד מסוים. זאת היא עושה ע"י מערך שהוא חלק מהאובייקט שחוזר עם נתוני העמוד. מערך זה , שנקרא פשוט ancestors, מכיל את רשימת עמודי האב השונים. א-מ-מ-ה, אם תנסו לבדוק בעזרת get_pages את הערכים שחוזרים בתוך האובייקט, תגלו שהמערך הנ"ל לא תמיד מופיע שם, כלומר – וורדפרס במקרים האלה לא יודעת מיהם "האבות הקדומים" של העמוד הנוכחי, ולכן גם מן הסתם לא יתווספו הקלאסים של ה- CSS הרלוונטי.

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

בינתיים, הוצע שם פיתרון חלקי לנושא, שיישומו מוסיף את מערך מספרי האבות הקדומים לעמוד הנוכחי, אבל עדיין לא מוסיף את הקלאס המיוחל של current_page_ancestor. הוספתי המשך פיתרון לעניין, ועכשיו אפשר ליישם את זה ולקבל את התוצאה הדרושה – כאשר גולש יימצא בעמוד נכד (או גם מתחת), יתווסף הקלאס ונוכל לעצבו ב- CSS כרצוננו.

שלבים לפיתרון – זהירות !

שימו לב ! הפיתרון הזה דורש התערבות בקבצי הליבה של וורדפרס! הדבר הזה אינו מומלץ ואינו רצוי למי שאינו בקיא בעניינים אלה, ואף צריך להדגיש כי בעת עדכון גרסה של וורדפרס, כל שינוי שביצעם בקבצי הליבה יידרס!

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

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

שינוי ראשון הוא בקובץ post.php שנמצא בתיקיית wp-includes.

בשורות 3638-3639 יש רק סוגריים שנסגרות , בדיוק במקטע הזה:
[ccwn_php]
$id = $_post->ancestors[] = $_post->post_parent;
while ( $ancestor = $wpdb->get_var( $wpdb->prepare("SELECT `post_parent` FROM $wpdb->posts WHERE ID = %d LIMIT 1", $id) ) ) {
if ( $id == $ancestor )
break;
$id = $_post->ancestors[] = $ancestor;
}
}
[/ccwn_php]
בין השורות 3638-3639, כלומר בין שני סימני סגירת הסוגריים האלה יש להכניס את הקוד כך שנקבל את המקטע כך:

[ccwn_php]
$id = $_post->ancestors[] = $_post->post_parent;
while ( $ancestor = $wpdb->get_var( $wpdb->prepare("SELECT `post_parent` FROM $wpdb->posts WHERE ID = %d LIMIT 1", $id) ) ) {
if ( $id == $ancestor )
break;
$id = $_post->ancestors[] = $ancestor;
}
global $_wp_using_ext_object_cache;
// force a refresh of the cache in case memcached is used
if ( $_wp_using_ext_object_cache )
wp_cache_delete($_post->ID, 'posts');

}
[/ccwn_php]

שינוי זה יוסיף את המערך עם רשימת עמודים הקדומים של העמוד הנוכחי, לתוך האובייקט של העמוד.

שינוי שני הוא בקובץ classes.php שנמצא בתיקיית wp-includes.

שורות 1176-1177 נראות כך:

[ccwn_php]
if ( !empty($current_page) ) {
$_current_page = get_page( $current_page );
[/ccwn_php]

יש להוסיף בין שתי השורות קוד, כך שזה מה שיתקבל –
[ccwn_php]
if ( !empty($current_page) ) {

global $_wp_using_ext_object_cache;
wp_cache_delete($current_page, 'posts');

$_current_page = get_page( $current_page );
[/ccwn_php]
זהו. אם עשיתם הכל נכון, אז כעת עמודים קדומים של עמודי נכד אמורים לקבל את הקלאס CSS בשם current_post_ancestors וניתן לעצב אותו כרצוננו.

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


שתפו גם אחרים:
  • email
  • Print
  • RSS
  • Facebook
  • Twitter
  • LinkedIn
  • Google Bookmarks
  • Live
  • PDF
  • MySpace
  • del.icio.us
  • Digg
  • Technorati
  • Yahoo! Bookmarks
  • Yahoo! Buzz
  • Add to favorites

אין תגובות »

פיד RSS לתגובות בפוסט | טראקבק


הוסף תגובה

CommentLuv badge

TechnoCraft - פתרונות אינטרנט


אֶקְסְפֶּרִימֶנְט דוֹט אֶפֶס - וורדפרס, תוכן, טכנולוגיה ועוד כמה דברים - מופעל באמצעות WordPress | פתרונות אינטרנט