אתם מנסים לתת למשתמשים שלכם – כולל אורחים – אפשרות להעלות קבצים דרך טופס של JetFormBuilder. אתם אפילו הולכים לפי הספר: נכנסים ל־User Access של שדה המדיה, בוחרים באופציה המבטיחה “Any user (incl. Guest)”, אומרים לעצמכם “סבבה, זה אמור לעבוד”…
אבל בפועל? הקבצים לא עולים.
הם לא נשמרים בפוסט, לא מופיעים בפרופיל המשתמש, ולפעמים אפילו לא מגיעים לספריית המדיה.
אז מה עושים?
JetFormBuilder בעצמם הבינו את הבעיה, וסיפקו קוד PHP פשוט שאמור לטפל בה. הקוד משתמש ב־Hook פנימי שנקרא jet-form-builder/media-field/before-upload ומאפשר להפעיל הרשאות העלאה גם עבור משתמשים אורחים.
add_action(
'jet-form-builder/media-field/before-upload',
function ( $parser ) {
$class_name = $parser->get_context()->get_class_name();
// בדיקה אם יש קלאס בשם allow-insert-attachments
if ( ! $class_name || false === strpos( $class_name, 'allow-insert-attachments' ) ) {
return;
}
// מאפשר העלאה גם לאורחים
$parser->get_context()->allow_for_guest();
// מגדיר שהערך שישמר יהיה מזהה הקובץ (ID)
$parser->get_context()->update_setting( 'insert_attachment', true );
$parser->get_context()->update_setting( 'value_format', 'id' );
}
);
את הקוד הזה יש להכניס לקובץ functions.php של התבנית או כקוד מותאם באתר.
בשדה התמונה בטופס פשוט מוסיפים את הקלאס allow-insert-attachments, וזה אמור לעבוד.
וזה באמת עובד — אבל רק כל עוד יש שדה אחד בטופס.
למה הקוד נופל כשיש שני שדות?
כאשר מוסיפים שני שדות תמונה עם אותו קלאס, הקוד מתבצע עבור כל אחד מהם – אך JetFormBuilder לא יודע להתמודד עם פעולות כפולות כאלה בזמן אמת, מה שמוביל לשגיאת שרת (500) או כשל בהעלאה.
הפתרון שלי: שיפור הקוד כך שיתמוך בכמה שדות
שדרגתי את הקוד כך שהוא יזהה כל שדה בנפרד לפי השם שלו (name) ויבצע את הפעולה רק פעם אחת לכל שדה. כך אפשר להוסיף כמה שדות מדיה בטופס, כולם יתמכו בהעלאה ע”י אורחים – בלי לקרוס ובלי בעיות.
הנה הגרסה המשופרת של הקוד:
add_action(
'jet-form-builder/media-field/before-upload',
function ( $parser ) {
$context = $parser->get_context();
// בדיקה אם יש קלאס בשם allow-insert-attachments
$class_name = $context->get_class_name();
if ( ! $class_name || strpos( $class_name, 'allow-insert-attachments' ) === false ) {
return;
}
// בדיקה אם כבר טיפלנו בשדה הזה – מונע כפילויות
static $configured_fields = [];
$field_name = $context->get_name();
if ( in_array( $field_name, $configured_fields, true ) ) {
return;
}
// מאפשר העלאה גם לאורחים
$context->allow_for_guest();
// מגדיר שהערך שישמר יהיה מזהה הקובץ (ID)
$context->update_setting( 'insert_attachment', true );
$context->update_setting( 'value_format', 'id' );
// מסמן שהשדה טופל
$configured_fields[] = $field_name;
}
);
אז אם גם אתם ניסיתם לאפשר העלאת קבצים לאורחים דרך טפסי JetFormBuilder, ונתקלתם בתסכול מהעובדה שזה פשוט לא עובד – כנראה שזה הפתרון שחיפשתם.
הגרסה המעודכנת של הקוד לא רק פותרת את הבעיה – היא גם מכינה אתכם לסיטואציות מתקדמות יותר שבהן יש כמה שדות תמונה בטופס אחד.