דף הבית » טריקים וטיפים, מומלצים

שדה נסתר בטופס התגובות, והצגתו אך ורק בממשק הניהול

7 בפברואר 2011 | מאת אסף צ'רטקוף | 12 תגובות | תגיות: , , , , , , , , , ,

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

מגירסה 3.0 ואילך, כמעצבי תבניות קיבלנו הרבה שליטה על טופס התגובות.

למשל, הפונקציה הפשוטה:

comment_form();

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

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

נתחיל מיצירת השדה הנוסף (הערה: את כל הפונקציות הבאות נוסיף בקובץ functions.php של התבנית).

function new_comment_field( $fields ) {
    $fields['new'] = '<label for="phone">טלפון</label>';
    return $fields;
}
add_filter( 'comment_form_default_fields', 'new_comment_field' );

מה עשינו כאן? השתמשנו בפילטר "comment_form_default_fields", שבעצם מוסיף בצורה מאוד פיזית את השדה הנוסף, עם כל הHTML המלוכלך שלנו מסביב לו. במקרה הזה, השתמשתי בדיוק באותם התגים והגדרות css כדי שהשדה ישתלב בצורה טובה בטופס. התוצאה של שלב זה היא:

הוספת שדה נוסף לטופס התגובות

הוספת שדה נוסף לטופס התגובות

אוקי. אז עכשיו אנחנו יודעים שכשהגולש לוחץ על "שלח", המשתנה $_POST['phone'], יחזיק את הטלפון. עכשיו רק עלינו לשמור אותו במסד הנתונים יחד עם שאר הנתונים של טופס התגובה.

באופן עקרוני, הדבר הנכון לעשות כאן עכשיו הוא להשתמש בפעולה (Action hook) "manage_comments_custom_column" כדי ליצור טור חדש בטבלת התגובות (שיוצר את הטור גם בעמוד התגובות בממשק הניהול – edit-comments.php), ובפילטר (Filter hook) "manage_comments_columns" – כדי להציג בתא הנכון בכל טור תוכן שמגיע מטופס התגובות.

מה הבעיה? בניגוד לפילטרים של טבלאות הפוסטים (manage_posts_columns), העמודים (manage_pages_columns), המדיה (manage_media_columns) ואפילו הקישורים (manage_links_columns), הפילטר המקביל לטבלה של התגובות… עוד לא קיים. (אגב, אתם יכולים למצוא כאן את רשימת כל הפילטרים והפעולות, מסודרים לפי גירסה, עם רפרנס לקוד).

הפתרון

היו הייתה טבלה קטנה וחמודה שעונה לשם 'comment_meta". בעזרת הפונקציה

add_comment_meta();

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

function add_comment_meta_settings( $comment_id ) {
    add_comment_meta( $comment_id, 'user_phone', $_POST['phone'], true );
}
add_action ( 'comment_post', 'add_comment_meta_settings', 1 );

הפעולה "comment_post" מפעילה את הפונקציה add_meta_settings בעת פרסום התגובה.

הפונקציה "add_comment_setting" מזינה לתגובה שמספרה comment_id (שהיא בעצם הנוכחית) את תוכן המשתנה שמגיע מהטופס, ומסמנת את הmeta_key שלה כ"user_phone". הערך האחרון בפונקציה הוא ערך בולאני שמאפשר או חוסם את האפשרות להזין תוכן לאותו הmeta_key במקום אחר. true חוסם, flase מאפשר.

הצגת הטלפון בתוכן התגובה

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

function add_phone( $c ) {
    $referrer = get_comment_meta( get_comment_ID(), 'user_phone', true );
    if ( $referrer )
        return '<strong>טלפון: </strong>'. $referrer .''.$c;
    else
        return $c;
}
add_filter( 'comment_text', 'add_phone' );

הפונקציה add_phone עושה בדיוק את זה.

כך זה נראה בטבלת התגובות בממשק הניהול:

הוספת התוכן מהשדה הנוסף אל ממשק הניהול

הוספת התוכן מהשדה הנוסף אל ממשק הניהול

אחרון חביב – אי הצגת הטלפון בתגובות עצמן

כעת התוכן מהטבלה comment_meta, מתווסף לתוכן התגובה בכל מקום בו היא מוצגת, כולל בתגובות באתר עצמו:

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

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

אך מכיוון שהרעיון היה כאן להציג את הטלפון רק בממשק הניהול עלינו להסיר בתחילת דף התגובות את הפילטר comment_text שהפעלנו (בקובץ בו מוצגות התגובות – הגיוני שזה יהיה comments.php) ממש בהתחלת הקובץ:

<?php
/**
* The template for displaying Comments.
*
* @package WordPress
*
*/

remove_filter( 'comment_text', 'add_phone' );
?>

ואז נפעיל שוב את הפילטר בסוף הקובץ (חשוב מאוד – הפעלת הפילטר מחדש חייבת לקרות רק אחרי הפונקציה comment_form):

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

והנה הסתרנו את השדה הנוסף

והנה הסתרנו את השדה הנוסף

רק נקווה שהפילטר manage_comments_columns יבוא במהרה.

מאת אסף צ'רטקוף

בימים CTO בחברת innovinet - Online Marketing ועובד בעיקר על Wordpress, בלילות משתדל לעדכן את בידיים - קיימות בסגנון עשה זאת בעצמך, שבנוי, איך לא - על Wordpress.

12 תגובות »

  • עמית כותב :

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

  • יובל כותב :

    פוסט מצוין.

    שימושי מאוד למגוון שימושים.

  • אסף צ'רטקוף כותב :

    @עמית, כשאתה אומר לשלב ברישום משתמשים (ללא תוסף), אתה מתכוון להוספת שדות לטופס רישום המשתמש, ולהוסיף את המידע לטבלת המשתמשים, אני מבין נכון?

  • עמית כותב :

    @אסף צ'רטקוף כן, טופס רישום בקדמת האתר (לא בwp-login.php) באיזשהו עמוד עם שדות נוספים כמו טוויטר/פייסבוק וכו'.

  • רמי כותב :

    טיפ מעולה. אסף, תודה על השיתוף.

    יש לי שאלה לגבי המידע שמגיע במייל.

    בתפריט "הגדרות" -> "דיון" ניתן לבחור "התראות באימייל".

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

  • אסף צ'רטקוף כותב :

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

  • מאור כותב :

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

    לפי מה שבדקתי, זה ה design כרגע בקוד
    שימו לב ב wp-includes/comment-template.php
    בשורות 1561-1573
    מה שעשיתי בינתיים כדי לפתור את זה, הוא שימוש בפילטר – comment_form_logged_in
    והוספה של השדה גם שם, אבל זו כפילות ודרך לעקוף את הבעיה, לא פיתרון של ממש לדעתי.
    פתחתי על זה טיקט ב trac ונראה מה יגידו שם החבר'ה…

  • רמי כותב :

    מאור, צרף קישור לטיקט.

  • אלכס כותב :

    היי אני מנסה להוסיף שדה בwordprress 3.4 אבל זה לא עובד יש למשהו מושג למה ?

  • אופיר כותב :

    האם ניתן להוסיף שדה להכנסת קובץ ?

  • רמי כותב :

    אופיר, תראה האם התוסף הזה עוזר לך.

הוסף תגובה !

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

תגיות HTML מורשות לשימוש:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>