הסתרת סקשיין אם לא הוזן שדה ACF

  • קטגוריה:כללי

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

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

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

הווידגט.

אז איך פותרים את הבעיה?

בכל ווידגט שאנחנו רוצים שלא יודפס במידה ולא הוזן תוכן בשדה, נכניס קלאס ל section העוטף (תחת לשונית מתקדם) "show-if-acf-fieldname" שאת fieldname נחליף בשם השדה ACF שלנו.
לדוגמה: show-if-acf-address (לשדה שקראנו לו בשם address)
כתבנו קוד מערכתי שמוסיפים ל functions.php שבודק בכל אלמנט אם יש קלאס בשם show-if-acf ובודק מה שם השדה שמוזן אחריו, אחרי שיש לנו את שם השדה, אנו בודקים אם הוא מלא (האם מוזן בו איזשהו ערך)
והמידה ולא מוזן שום ערך,הווידגט הספציפי לא ירונדר (לא יוצג).

// hide section/widget depends on acf field
function get_elementor_element_classes($element){
	$classes = 'widget' == $element->get_type() ? $element->get_settings('_css_classes') : $element->get_settings('css_classes');
	return $classes;
}
function is_string_contains($string,$substing){
	$is_contains = $string && strpos($string, $substing) !== false;
	return $is_contains;
}
add_action( 'elementor/frontend/widget/should_render','lenix_elementor_hide_if_acf',10,2);
add_action( 'elementor/frontend/section/should_render','lenix_elementor_hide_if_acf',10,2);
function lenix_elementor_hide_if_acf($should_render, $element){
	
	$classes = get_elementor_element_classes($element);
	$is_depends = is_string_contains($classes,'show-if-acf');
	if(!$is_depends || !function_exists('get_field')){
		//var_dump($classes);
		return $should_render;
	}
	
	if($is_depends){
		$classes = explode(' ',$classes);
		foreach($classes as $class){
			if(strpos($class, 'show-if-acf') !== false){
				$acf_to_check = str_replace('show-if-acf-','',$class);
				if(!get_field($acf_to_check)){
					return false;
				}
			}
		}
	}
	
	return $should_render;
	
}

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

לפוסט הזה יש 8 תגובות

  1. שרה

    זה עובד מעולה!
    אבל מה עושים עם יש לי באזור שדה קבוע של כותרת ושדה דינאמי
    וכשהדינאמי נעלם אני צריכה שגם הכותרת תעלם
    אשמח לתשובה

      1. יוני פריימן

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

  2. עמוס

    טעות שלי, איך שהוא נמחקו שורות מהקובץ – חזל"ש

  3. עמוס

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

    השינויים בקוד PHP שוחזרו בגלל שגיאה בשורה 190 בקובץ wp-content/themes/hello-elementor/functions.php. נא לתקן ולשמור שנית.

    Uncaught Error: Call to undefined function get_elementor_element_classes() in wp-content/themes/hello-elementor/functions.php:190
    Stack trace:
    #0 wp-includes/class-wp-hook.php(286): lenix_elementor_hide_if_acf(true, Object(ElementorPro\Modules\ThemeBuilder\Widgets\Site_Logo))
    #1 wp-includes/plugin.php(208): WP_Hook->apply_filters(true, Array)
    #2 wp-content/plugins/elementor/includes/base/element-base.php(607): apply_filters('elementor/front…', true, Object(ElementorPro\Modules\ThemeBuilder\Widgets\Site_Logo))
    #3 wp-content/plugins/elementor/includes/base/element-base.php(808): Elementor\Element_Base->print_element()
    #4 wp-content/plugins/elementor/includes/base/element-base.php(592): Elementor\Element_Base->_print_content()
    #5 wp-content/plugins/elementor/includes/base/element-base.php(808): Elementor\Element_Base->print_

  4. יניר

    אחרי העדכון של הקוד כך שיתאים גם להסתרת וידג'טים מופיעה שגיאה בניסיון עדכון הפונקציה
    https://snag.gy/ZdMO8W.jpg

  5. אביב

    עובד מעולה…
    במידה ומישהו מסתבך עם זה (למרות שאני בספק שיש איך), יש תוסף שעושה את אותה פעולה

כתיבת תגובה