הסתרת סקשיין אם לא הוזן שדה 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. עובד מעולה…
    במידה ומישהו מסתבך עם זה (למרות שאני בספק שיש איך), יש תוסף שעושה את אותה פעולה

כתיבת תגובה

סגירת תפריט

היי, קוראים לי יוני.

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

השארו מעודכנים!

הרשמו עכשיו וקבלו כל מאמר חדש ישר למייל!