Warning: Invalid argument supplied for foreach() (Wordpress UMP Plugin)

Can anyone tell me what went wrong in the code below to cause the Warning: Invalid argument supplied for foreach(). And how do I fix it? This is a script from the Ultimate Membership Pro plugin ‘shortcode.php’.

foreach ($data['custom_fields'] as $key => $value) {
        if (empty($data['custom_fields'][$key])){
            unset($data['custom_fields'][$key]);
        }
     }

     if (!empty($data['levels'])){

        $fullPath = IHC_PATH . 'public/views/membership_card.php';
        $searchFilename = 'membership_card.php';
        $template = apply_filters('ihc_filter_on_load_template', $fullPath, $searchFilename );
        wp_enqueue_script( 'ihc-print-this' );

        
        if (!empty($data['metas']['ihc_membership_card_custom_css'])){
            $output .=
            "<style>".
                stripslashes($data['metas']['ihc_membership_card_custom_css'])
            ."</style>";
        }
        $output .= '    <script>
                var printhisopt = {
                    importCSS: true,
                    importStyle: true,
                    loadCSS:"'.IHC_URL.'assets/css/style.css",
                    debug: false,
                    printContainer: true,
                    pageTitle: "",
                    removeInline: true,
                    printDelay: 333,
                    header: null,
                    formValues: false,
                };
                        jQuery(document).ready(function(){
                                jQuery(".fa-print-ihc").on("click", function(e){
                                        var idToPrint = jQuery( e.target ).attr( "data-id-to-print" );
                                        jQuery( "#" + idToPrint ).printThis(printhisopt);
                                });
                        });
            </script>';
        foreach ($data['levels'] as $lid => $level_data){
            if (in_array($lid, $exclude_levels)){
                continue;
            }
            ob_start();
            include $template;
            $output .= ob_get_contents();
            ob_end_clean();
        }
     }else{
        $output = '<div class="ihc-additional-message">'. __("No Membership Cards available based on your Subscriptions. SignUp on new Subscriptions or renew the existent one.", 'ihc').'</div>';
     }
 }
 return $output;

Here is the data structure for this foreach loop.

array(1) { [2]=> array(12) { [“id”]=> string(1) “3” [“user_id”]=> string(1) “4” [“level_id”]=> string(1) “2” [“start_time”]=> string(19) “2021-05-15 19:05:21” [“update_time”]=> string(19) “2021-06-15 19:05:27” [“expire_time”]=> string(19) “2021-06-15 19:05:21” [“notification”]=> string(1) “0” [“status”]=> string(1) “1” [“label”]=> string(7) “Monthly” [“level_slug”]=> string(7) “monthly” [“badge_image_url”]=> string(0) “” [“is_expired”]=> bool(false) } }

Source code file: ufile.io/sux2awvl

Which FOREACH is throwing the error? You show two of them and you do not show us the error message.
Most likely one has bad data being sent to it. The array data you showed us is an array of arrays. But, tell us which line is in error and the error message of it.

I’ve found the solution.

if(isset($data['custom_fields']) && is_array($data['custom_fields'])){ //This line was missing previously
	 foreach ($data['custom_fields'] as $key => $value) {
	 	if (empty($data['custom_fields'][$key])){
			unset($data['custom_fields'][$key]);
		}
	 }
	}
	 if (!empty($data['levels'])){

		$fullPath = IHC_PATH . 'public/views/membership_card.php';
		$searchFilename = 'membership_card.php';
		$template = apply_filters('ihc_filter_on_load_template', $fullPath, $searchFilename );
		wp_enqueue_script( 'ihc-print-this' );

		
		if (!empty($data['metas']['ihc_membership_card_custom_css'])){
			$output .=
			"<style>".
				stripslashes($data['metas']['ihc_membership_card_custom_css'])
			."</style>";
		}
		$output .= '	<script>
				var printhisopt = {
					importCSS: true,
		            importStyle: true,
		            loadCSS:"'.IHC_URL.'assets/css/style.css",
		         	debug: false,
		        	printContainer: true,
		        	pageTitle: "",
		        	removeInline: true,
		        	printDelay: 333,
		        	header: null,
		        	formValues: false,
		        };
						jQuery(document).ready(function(){
								jQuery(".fa-print-ihc").on("click", function(e){
										var idToPrint = jQuery( e.target ).attr( "data-id-to-print" );
										jQuery( "#" + idToPrint ).printThis(printhisopt);
								});
						});
			</script>';
	 	foreach ($data['levels'] as $lid => $level_data){
	 		if (in_array($lid, $exclude_levels)){
	 			continue;
	 		}
	 		ob_start();
			include $template;
			$output .= ob_get_contents();
			ob_end_clean();
	 	}
	 }else{
		$output = '<div class="ihc-additional-message">'. __("No Membership Cards available based on your Subscriptions. SignUp on new Subscriptions or renew the existent one.", 'ihc').'</div>';
	 }
 }
 return $output;
Sponsor our Newsletter | Privacy Policy | Terms of Service