https://t.me/RX1948
Server : Apache
System : Linux server.lienzindia.com 4.18.0-348.7.1.el8_5.x86_64 #1 SMP Wed Dec 22 13:25:12 UTC 2021 x86_64
User : plutus ( 1007)
PHP Version : 7.4.33
Disable Function : NONE
Directory :  /home/plutus/public_html/wp-content/plugins/ubermenu/includes/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/plutus/public_html/wp-content/plugins/ubermenu/includes/functions.php
<?php

add_action( 'plugins_loaded' , 'ubermenu_load_gutenberg_block' );
function ubermenu_load_gutenberg_block(){
	if( function_exists( 'register_block_type' ) ){
		include_once( 'gutenberg/gutenberg.php' );
	}
}

add_action( 'plugins_loaded' , 'ubermenu_load_textdomain' );
function ubermenu_load_textdomain(){
	load_plugin_textdomain( 'ubermenu' , false , UBERMENU_BASEDIR.'/languages' );
}


add_filter( 'wp' , 'ubermenu_wp_actions' );
function ubermenu_wp_actions(){

	//Exclude UberMenu Advanced Items from other menus
	if( ubermenu_op( 'exclude_advanced_ubermenu_items' , 'general' ) === 'on' ){
		add_filter( 'wp_nav_menu_objects' , 'ubermenu_exclude_advanced_items' , 20, 2 );
	}

}

function ubermenu_register_style( $handle , $src = '', $deps = array() , $ver = false , $media = 'all' ){
	_UBERMENU()->register_stylesheet( $handle , $src , $deps , $ver , $media );
}
function ubermenu_enqueue_style( $handle , $src = '', $deps = array() , $ver = false , $media = 'all' ){
	_UBERMENU()->load_stylesheet( $handle , $src , $deps , $ver , $media );
}
function ubermenu_register_script( $handle , $src = '', $deps = array() , $ver = false , $in_footer = false ){
	_UBERMENU()->register_script( $handle , $src , $deps , $ver , $in_footer );
}
function ubermenu_enqueue_script( $handle , $src = '', $deps = array() , $ver = false , $in_footer = false ){
	_UBERMENU()->load_script( $handle , $src , $deps , $ver , $in_footer );
}

function ubermenu_load_assets(){

	$assets = UBERMENU_URL . 'assets/';

	//Load Core UberMenu CSS unless disabled
	if( ubermenu_op( 'load_ubermenu_css' , 'general' ) != 'off' ){
		wp_register_style( 'ubermenu' , $assets.'css/ubermenu.min.css' , false , UBERMENU_VERSION );

		//wp_enqueue_style( 'ubermenu' );
		ubermenu_enqueue_style( 'ubermenu' );
	}

	//Load Required Skins
	$instances = ubermenu_get_menu_instances( true );
	foreach( $instances as $instance ){
		$skin = ubermenu_op( 'skin' , $instance );
		ubermenu_enqueue_skin( $skin );
	}

	//
	//Font Awesome
	//

	//Font Awesome CSSFonts
	$load_fa_solid = 				ubermenu_op( 'load_fontawesome_fontcss_solid' , 'general' ) !== 'off';
	$load_fa_brands = 			ubermenu_op( 'load_fontawesome_fontcss_brands' , 'general' ) !== 'off';
	$load_fa_regular = 			ubermenu_op( 'load_fontawesome_fontcss_regular' , 'general' ) !== 'off';
	$load_fa_core = 				$load_fa_solid || $load_fa_brands || $load_fa_regular;
	$load_fa_all = 					$load_fa_solid && $load_fa_brands && $load_fa_regular;


	if( $load_fa_all )				ubermenu_enqueue_style( 'ubermenu-font-awesome-all' , 	UBERMENU_URL .'assets/fontawesome/css/all.min.css' , false , false );
	else{
		if( $load_fa_core ) 		ubermenu_enqueue_style( 'ubermenu-font-awesome-core' , 	UBERMENU_URL .'assets/fontawesome/css/fontawesome.min.css' , false , false );
		if( $load_fa_solid ) 		ubermenu_enqueue_style( 'ubermenu-font-awesome-solid' , UBERMENU_URL .'assets/fontawesome/css/solid.min.css' , false , false );
		if( $load_fa_brands ) 	ubermenu_enqueue_style( 'ubermenu-font-awesome-brands' , UBERMENU_URL .'assets/fontawesome/css/brands.min.css' , false , false );
		if( $load_fa_regular ) 	ubermenu_enqueue_style( 'ubermenu-font-awesome-regular' , UBERMENU_URL .'assets/fontawesome/css/regular.min.css' , false , false );
	}

	//Font Awesome SVG
	$load_fasvg_solid = 		ubermenu_op( 'load_fontawesome_svg_solid' , 'general' ) !== 'off';
	$load_fasvg_brands = 		ubermenu_op( 'load_fontawesome_svg_brands' , 'general' ) !== 'off';
	$load_fasvg_regular = 	ubermenu_op( 'load_fontawesome_svg_regular' , 'general' ) !== 'off';
	$load_fasvg_core = 			$load_fasvg_solid || $load_fasvg_brands || $load_fasvg_regular;
	$load_fasvg_all = 			$load_fasvg_solid && $load_fasvg_brands && $load_fasvg_regular;

	if( $load_fasvg_all )		ubermenu_enqueue_script( 'ubermenu-font-awesome-js-all' , UBERMENU_URL.'assets/fontawesome/js/all.min.js' , false , false , false );
	else{
		if( $load_fasvg_solid ) 	ubermenu_enqueue_script( 'ubermenu-font-awesome-js-solid' , UBERMENU_URL.'assets/fontawesome/js/solid.min.js' , false , false , false );
		if( $load_fasvg_brands ) 	ubermenu_enqueue_script( 'ubermenu-font-awesome-js-brands' , UBERMENU_URL.'assets/fontawesome/js/brands.min.js' , false , false , false );
		if( $load_fasvg_regular ) ubermenu_enqueue_script( 'ubermenu-font-awesome-js-regular' , UBERMENU_URL.'assets/fontawesome/js/regular.min.js' , false , false , false );
		//Core needs to be loaded last
		if( $load_fasvg_core ) 		ubermenu_enqueue_script( 'ubermenu-font-awesome-js-core' , UBERMENU_URL.'assets/fontawesome/js/fontawesome.min.js' , false , false , false );
	}

	//Font Awesome 4 shim
	if( ubermenu_op( 'load_fontawesome4_shim' , 'general' ) == 'on' ){
		//wp_enqueue_script( 'ubermenu-font-awesome4-shim' , UBERMENU_URL.'assets/fontawesome/svg/js/fa-v4-shims.min.js' , false , false , false );
		ubermenu_enqueue_script( 'ubermenu-font-awesome4-shim' , UBERMENU_URL.'assets/fontawesome/js/v4-shims.min.js' , false , false , false );
	}
	add_filter( 'script_loader_tag', 'ubermenu_fontawesome_defer', 10, 2 );


	// if( ubermenu_op( 'load_fontawesome' , 'general' ) != 'off' ){
	// 	//font awesome 4
	// 	//wp_enqueue_style( 'ubermenu-font-awesome' , $assets.'css/fontawesome/css/font-awesome.min.css' , false , '4.3' );
	//
	// 	//wp_enqueue_style( 'ubermenu-font-awesome' , 'https://use.fontawesome.com/releases/v5.0.7/css/all.css' , false );
	//
	// 	//font awesome 5
	// 	//wp_enqueue_style( 'ubermenu-font-awesome' , 'https://use.fontawesome.com/releases/v5.0.7/css/all.css' , false );
	// 	wp_enqueue_script( 'ubermenu-font-awesome-js' , UBERMENU_URL.'assets/fontawesome/svg/js/fontawesome-all.min.js' , false , false , false );
	// 	add_filter( 'script_loader_tag', 'ubermenu_fontawesome_defer', 10, 2 );

	// }




	//Custom Stylesheet
	if( ubermenu_op( 'load_custom_css' , 'general' ) == 'on' ){
		ubermenu_enqueue_style( 'ubermenu-custom-stylesheet' , UBERMENU_URL.'custom/custom.css' , false , UBERMENU_VERSION );
	}



	//jQuery
	ubermenu_enqueue_script( 'jquery' );

	//Google Maps
	if( ubermenu_op( 'load_google_maps' , 'general' ) == 'on' ){
		//Google Maps API
    $gmaps_uri = '//maps.googleapis.com/maps/api/js';

    $query_params = array();

    //API Key
    $api_key = trim( ubermenu_op( 'google_maps_api_key' , 'general' ) );
    if( $api_key ){
      $query_params['key'] = $api_key;
    }

    //Language
    $language = trim( ubermenu_op( 'google_maps_language' , 'general' ) );
    if( $language ){
      $query_params['language'] = $language;
    }

    //Region
    $region = trim( ubermenu_op( 'google_maps_region' , 'general' ) );
    if( $region ){
      $query_params['region'] = $region;
    }

    $query = http_build_query( $query_params );

    $gmaps_uri.= '?'.$query;

    ubermenu_register_script( 'google-maps', $gmaps_uri , array( 'jquery' ), null , true );
	}

	//UberMenu JS
	if( SCRIPT_DEBUG ){
		ubermenu_enqueue_script( 'ubermenu' , $assets.'js/ubermenu.js' , array( 'jquery' ) , UBERMENU_VERSION , UBERMENU_JS_IN_FOOTER );
	}
	else{
		ubermenu_enqueue_script( 'ubermenu' , $assets.'js/ubermenu.min.js' , array( 'jquery' ) , UBERMENU_VERSION , UBERMENU_JS_IN_FOOTER );
	}

	$responsive_breakpoint = intval( ubermenu_op( 'responsive_breakpoint', 'general' ) );
	if( $responsive_breakpoint == 0 ) $responsive_breakpoint = 959;

	// $config_data = array();
	// $configs = ubermenu_get_menu_instances(true);
	// foreach( $configs as $config_id ){
	// 	$config_data[$config_id] = array(
	// 		//add data here
	// 	);
	// }

	$localized_data = array(
		'remove_conflicts'	=> ubermenu_op( 'remove_conflicts' , 'general' ),
		'reposition_on_load'=> ubermenu_op( 'reposition_on_load' , 'general' ),
		'intent_delay'		=> ubermenu_op( 'intent_delay' , 'general' ),
		'intent_interval'	=> ubermenu_op( 'intent_interval' , 'general' ),
		'intent_threshold'	=> ubermenu_op( 'intent_threshold' , 'general' ),
		'scrollto_offset'	=> ubermenu_op( 'scrollto_offset' , 'general' ),
		'scrollto_duration'	=> ubermenu_op( 'scrollto_duration' , 'general' ),
		'responsive_breakpoint' => $responsive_breakpoint,
		'accessible'		=> ubermenu_op( 'accessible', 'general' ),
		'retractor_display_strategy' => ubermenu_op( 'retractor_display_strategy' , 'general' ),
		'touch_off_close'	=> ubermenu_op( 'touch_off_close' , 'general' ),
		'submenu_indicator_close_mobile' => ubermenu_op( 'submenu_indicator_close_mobile' , 'general' ),
		'collapse_after_scroll'	=> ubermenu_op( 'collapse_after_scroll' , 'general' ),
		'v'					=> UBERMENU_VERSION,
		'configurations'	=> ubermenu_get_menu_instances(true),
		'ajax_url' 			=> admin_url( 'admin-ajax.php' ),
		'plugin_url'		=> UBERMENU_URL,
		'disable_mobile' 	=> ubermenu_op( 'disable_mobile' , 'main' ),	//just for troubleshooting
		'prefix_boost'	=> ubermenu_op( 'custom_prefix' , 'general' ),
		'use_core_svgs' => ubermenu_op( 'use_core_svgs', 'general' ),

		//accessibility
		'aria_role_navigation'	=> ubermenu_op( 'aria_role_navigation' , 'general' ),
		'aria_nav_label'	=> ubermenu_op( 'aria_nav_label' , 'general' ),
		'aria_expanded' => ubermenu_op( 'aria_expanded' , 'general' ),
		'aria_hidden'	=> ubermenu_op( 'aria_hidden' , 'general' ),
		'aria_controls' => ubermenu_op( 'aria_controls' , 'general' ),
		'aria_responsive_toggle' => ubermenu_op( 'aria_responsive_toggle' , 'general' ),
		'icon_tag' => ubermenu_op( 'icon_tag', 'main' ), // grab from main since no global
		'esc_close_mobile' => ubermenu_op( 'esc_close_mobile', 'general' ),


		//info
		'theme_locations' => get_registered_nav_menus(),

		//configs
		//'configs' => $config_data,
	);

	$localized_data = apply_filters( 'ubermenu_json_data' , $localized_data );

	wp_localize_script( 'ubermenu' , 'ubermenu_data' , $localized_data );

	//Custom JS
	if( ubermenu_op( 'load_custom_js' , 'general' ) == 'on' ){
		ubermenu_enqueue_script( 'ubermenu-custom' , UBERMENU_URL.'custom/custom.js' , array( 'jquery' ) , UBERMENU_VERSION , UBERMENU_JS_IN_FOOTER );
	}


	//wp_register_script( 'ubermenu-customizer' , $assets . 'admin/assets/customizer.js' , array( 'jquery' ) , UBERMENU_VERSION , true );
}
add_action( 'wp_enqueue_scripts' , 'ubermenu_load_assets' , 21 );


function ubermenu_fontawesome_defer( $tag, $handle ) {
    if( 'ubermenu-font-awesome-js-all' === $handle || 'ubermenu-font-awesome-js-solid' === $handle || 'ubermenu-font-awesome-js-brands' === $handle || 'ubermenu-font-awesome4-shim' === $handle ) {
        $tag = str_replace( ' src', ' defer src', $tag );
    }
    return $tag;
}

function ubermenu_inject_custom_css(){
	echo '<style id="ubermenu-custom-generated-css">';
	//echo ubermenu_generate_custom_styles();
	echo ubermenu_get_custom_styles();

	global $is_IE;
	if( $is_IE ){
		echo "\n@media \\0screen { .ubermenu .ubermenu-image { width: auto } } /* Prevent height distortion in IE8. */\n";
	}
	echo "\n</style>";
}
add_action( 'wp_head' , 'ubermenu_inject_custom_css' );


function ubermenu_get_skin_ops(){

	$registered_skins = _UBERMENU()->get_skins();
	if( !is_array( $registered_skins ) ) return array();
	$ops = array();
	foreach( $registered_skins as $id => $skin ){
		$ops[$id] = $skin['title'];
	}
	return $ops;

}
function ubermenu_register_skin( $id, $title, $path , $classes = '' ){
	_UBERMENU()->register_skin( $id , $title , $path , $classes );
}

add_action( 'init' , 'ubermenu_register_skins' );
function ubermenu_register_skins(){

	$main = UBERMENU_URL . 'assets/css/skins/';
	//Custom prefix booster
	if( ubermenu_op( 'custom_prefix' , 'general' ) ){
		$uploads_url = wp_upload_dir();
		$uploads_url = trailingslashit( $uploads_url['baseurl'] );
		$main = $uploads_url . 'ubermenu/';
	}



	ubermenu_register_skin( 'minimal' , 'Minimal base (for customizing)' , $main.'minimal.css' );

	ubermenu_register_skin( 'grey-white' , 'Black &amp; White' , $main.'blackwhite.css' );
	ubermenu_register_skin( 'black-white-2' , 'Black &amp; White 2.0' , $main.'blackwhite2.css' , 'ubermenu-has-border' );
	ubermenu_register_skin( 'vanilla' , 'Vanilla' , $main.'vanilla.css' );
	ubermenu_register_skin( 'vanilla-bar' , 'Vanilla Bar' , $main.'vanilla_bar.css' , 'ubermenu-has-border' );

}


function ubermenu_enqueue_skin( $skin ){
	ubermenu_enqueue_style( 'ubermenu-'.$skin );
}


function ubermenu_init_actions(){
	add_action( 'ubermenu_register_icons' , 'ubermenu_register_default_icons' , 10 );
	do_action( 'ubermenu_register_icons' );
}
add_action( 'after_setup_theme' , 'ubermenu_init_actions' , 20 );

function ubermenu_setup_easy_integration(){
	if( ubermenu_op( 'ubermenu_theme_location' , 'general' ) == 'on' ){
		register_nav_menu( 'ubermenu' , 'UberMenu [Easy Integration]' );
	}
}
add_action( 'init' , 'ubermenu_setup_easy_integration' );


function ubermenu_get_menu_instances( $main = false ){
	$instances = get_option( UBERMENU_MENU_INSTANCES , array() );

	if( $main ){
		$instances[] = 'main';
	}

	return $instances;
}


function ubermenu_get_nav_menu_ops(){
	$menus = wp_get_nav_menus( array('orderby' => 'name') );
	$m = array( '_none' => 'Select Menu' );
	foreach( $menus as $menu ){
		$m[$menu->term_id] = $menu->name;
	}
	return $m;
}

function ubermenu_get_theme_location_ops(){
	$locs = get_registered_nav_menus();
	//$default = array( '_none' => 'Select Theme Location or use Menu Setting' );
	//$locs = array_unshift( $default, $locs );
	//$locs = $default + $locs;

	$menus = get_nav_menu_locations();
	foreach( $locs as $loc_id => $loc_name ){

		if( isset( $menus[$loc_id] ) && $menus[$loc_id] ){
			$locs[$loc_id].= ' <span class="ubermenu-assigned"><strong>' . wp_get_nav_menu_object( $menus[$loc_id] )->name .'</strong></span>';
		}
		else{
			$locs[$loc_id].= ' <span class="ubermenu-assigned ubermenu-assigned-none">No menu assigned</span>';
		}
	}

	return $locs;
}




/*
 * By Instance
 *
 * $integration_type - 'api' or 'auto'
 */
function ubermenu_get_nav_menu_args( $args , $integration_type , $config_id = 0 ){

	if( isset( $args['uber_segment'] ) ) return $args; //Ignore segments

	$theme_location = '';
	$nav_menu_id = 0;
	$strict_mode = ubermenu_op( 'strict_mode' , 'general' ) == 'off' ? false : true;

	//Determine theme_location
	//Determine config_id (if not passed)
	//Determine nav_menu_id
	switch( $integration_type ){


		case 'auto':

			//Is it UberMenu?

			//Check for assigned Theme Location

			//For automatic integration, if there is no theme_location, we can't do anything
			if( $strict_mode && ( !isset( $args['theme_location'] ) || !$args['theme_location'] ) ){
				return $args;
			}

			//Determine Menu Instance ID by theme_location
			if( isset( $args['theme_location'] ) && $args['theme_location'] ){
				$theme_location = $args['theme_location'];
				$config_id = ubermenu_get_menu_instance_by_theme_location( $theme_location );
			}
			//[Non-strict mode] If there is no theme location at this point, we must have
			//strict mode disabled.  Therefore, default to Main instance
			else{
				$config_id = 'main';

				//However, in this case we require a 'menu' param to be passed
				if( isset( $args['menu'] ) && $args['menu'] ){
					$nav_menu_id = $args['menu'];
				}
				//If we don't have a theme location or menu parameter, the menu is indetermined
				else{
					$nav_menu_id = '_undetermined_';
				}
			}

			//If this theme location is not activated, ignore it
			if( !$config_id ) return $args;

			//Find nav_menu_id
			//look up the ID based on the theme location, assuming it exists

			if( $theme_location && has_nav_menu( $theme_location ) ){
				$menus = get_nav_menu_locations();
				$nav_menu_id = $menus[$theme_location];
			}

			//Check that we're on the right theme location instance
			if( $theme_location ){
				//Count this theme location instance
				_UBERMENU()->count_theme_location( $theme_location );

				//Determine what instance we're targeting
				$target_instance = ubermenu_op( 'theme_location_instance' , $config_id );
				if( is_numeric( $target_instance ) ){
					$target_instance = (int) $target_instance;
				}
				else if( $target_instance == '' ){
					$target_instance = 0;
				}
				else{
					ubermenu_admin_notice( __( 'Theme Location Instance should be an integer or leave blank.  Defaulting to 0.' , 'ubermenu' ) );
					$target_instance = 0;
				}

				//If we're not targeting all instances
				if( $target_instance > 0 ){

					//Check that the target theme location instance is the current theme location instance
					//If it isn't, then ignore
					if( $target_instance !== _UBERMENU()->get_theme_location_count( $theme_location ) ){
						return $args;
					}
				}

				//Ignore Mobile?
				if( ubermenu_op( 'disable_mobile' , $config_id ) == 'on' && ubermenu_is_mobile() ){
					return $args;
				}
			}

			break;


		case 'api':

			//instance_id
			if( $config_id != 'main' ){
				$instances = ubermenu_get_menu_instances();
				if( array_search( $config_id , $instances ) === false ){
					$notice = '<strong>'.$config_id.'</strong> '. __( 'is not a valid Configuration ID.  Please pass a valid Configuration ID to the ubermenu() function.' , 'ubermenu' );
					ubermenu_admin_notice( $notice );
				}
			}

			//Always UberMenu
			$theme_location = ( isset( $args['theme_location'] ) && $args['theme_location'] )
								? $args['theme_location'] : 0;


			//If a Menu ID was passed in the args, use that
			if( isset( $args['menu'] ) && $args['menu'] ){
				$nav_menu_id = $args['menu'];
			}
			//No Menu ID was passed, get the assigned menu based on the instance
			else{
				$_menu_id = ubermenu_op( 'nav_menu_id' , $config_id );

				if( $_menu_id  && $_menu_id != '_none' ){
					$nav_menu_id = $_menu_id;
				}
				else{
					//No menu passed, no menu assigned, try the theme location
					if( $theme_location && has_nav_menu( $theme_location ) ){
						$menus = get_nav_menu_locations();
						$nav_menu_id = $menus[$theme_location];
					}
				}

				//Setup args
				if( $nav_menu_id ){
					$args['menu'] = $nav_menu_id;	//TODO ...
				}
			}

			//Don't know what the nav menu ID is still
			if( !$nav_menu_id ){
				if( !$theme_location ) $args['theme_location'] = '__um_undetermined__';
			}

			//If a theme location was used, count it.  But we don't care if this is the target
			//or not, since the API was used
			if( $theme_location ){
				_UBERMENU()->count_theme_location( $theme_location );
			}

			break;

	}




	//Allow filtering to a different Configuration at this point
	$config_id = apply_filters( 'ubermenu_configuration_id' , $config_id , $args );


	//UL attributes - since we can't add anything to the nav tag
	$ul_atts = array();

	//Menu title is used for the aria-label on the nav tag, but this can be filtered
	$nav_menu_ob = wp_get_nav_menu_object( $nav_menu_id );
	$menu_title = $nav_menu_ob ? $nav_menu_ob->name : '';
	$menu_title = apply_filters( 'ubermenu_menu_title' , $menu_title , $nav_menu_id , $config_id , $args );
	if( $menu_title ) $ul_atts['data-title'] = $menu_title;

	//Walk the array
	array_walk( $ul_atts , function( &$val , $att ) {
		//$ul_atts_str.= $att.'='.$val.' ';
		$val = "$att=\"$val\"";
	});
	//Combine the values
	$ul_atts_str = ' '.implode( ' ' , $ul_atts );	//beginning space is important

	//Basics
	$args['container_class'] 	= 'ubermenu ubermenu-nojs';
	$args['menu_class']			= 'ubermenu-nav';
	$args['walker']				= new UberMenuWalker;
	$args['uber_instance']		= $config_id;
	$args['fallback_cb']		= 'ubermenu_fallback_cb';
	$args['depth']				= 0;
	$args['items_wrap']			= '<ul id="%1$s" class="%2$s"'.$ul_atts_str.'>%3$s</ul>';
	$args['link_before']		= '';
	$args['link_after']			= '';
	$args['uber_integration_type'] = $integration_type;


	//Make sure nav menu ID is a string so that it can be used as part of the ID
	if( is_object( $nav_menu_id ) ){
		if( isset( $nav_menu_id->term_id ) ){
			$nav_menu_id = $nav_menu_id->term_id;
		}
		else{
			$nav_menu_id = '_bad_id_';
		}
	}

	//ID
	$args['container_id']		= 'ubermenu-'.$config_id.'-'.$nav_menu_id;
	if( $theme_location ){
		$args['container_id'].='-'.sanitize_key( $theme_location );
		$theme_location_count = _UBERMENU()->get_theme_location_count( $theme_location );
		if( $theme_location_count > 1 ){
			$args['container_id'].= '-'.$theme_location_count;
		}
	}


	//Inner ID
	if( !isset( $args['menu_id'] ) || !$args['menu_id'] || $integration_type == 'auto' ){
		$args['menu_id']		= 'ubermenu-nav-'.$config_id.'-'.$nav_menu_id;
		if( $theme_location ) $args['menu_id'].='-'.sanitize_key( $theme_location );
	}

	//Cache
	$args['menu_cache_key']		= "|uber|$config_id|$nav_menu_id|$theme_location";	//For WP Menu Cache Plugin

	//Container
	$args['container']			= ubermenu_op( 'container_tag' , $config_id ); // . ' role="navigation"';

	//Menu Instance ID
	$args['container_class'].= ' ubermenu-'.$config_id;

	//Menu ID
	$args['container_class'].= ' ubermenu-menu-'.$nav_menu_id;

	//Theme Location
	if( $theme_location ){
		$args['container_class'].= ' ubermenu-loc-'.sanitize_title( $theme_location );
	}

	//Responsive
	if( ubermenu_op( 'responsive' , $config_id ) == 'on' ){
		$args['container_class'].= ' ubermenu-responsive';

		if( ubermenu_op( 'responsive_columns' , $config_id ) == 1 ){
			$args['container_class'].= ' ubermenu-responsive-single-column';
		}

		if( ubermenu_op( 'responsive_submenu_columns' , $config_id ) == 1 ){
			$args['container_class'].= ' ubermenu-responsive-single-column-subs';
		}

		$breakpoint = ubermenu_op( 'responsive_breakpoint' , 'general' );
		if( !$breakpoint ){
			$breakpoint = 'default';
		}
		else{
			$breakpoint = intval( $breakpoint );
		}
		$args['container_class'].= ' ubermenu-responsive-'.$breakpoint;

		if( ubermenu_op( 'mobile_menu_display', $config_id ) === 'modal' ){
			$args['container_class'].= ' ubermenu-mobile-modal';
			//TODO add close button
			$args['items_wrap'] = ubermenu_get_mobile_header( $config_id ) . $args['items_wrap'] . ubermenu_get_mobile_footer( $config_id );
		}
		if( ubermenu_op( 'mobile_submenu_type', $config_id ) === 'accordion' ){
			$args['container_class'].= ' ubermenu-mobile-accordion';
			if( ubermenu_op( 'mobile_accordion_indent', $config_id ) != '' ){
				$args['container_class'].= ' ubermenu-mobile-accordion-indent';
			}
		}
	}

	//Responsive no collapse
	if( ubermenu_op( 'responsive_collapse' , $config_id ) == 'off' ){
		$args['container_class'].= ' ubermenu-responsive-nocollapse';
	}
	else{
		$args['container_class'].= ' ubermenu-responsive-collapse';
	}

	//Orientation
	$orientation = ubermenu_op( 'orientation' , $config_id ) == 'vertical' ? 'vertical' : 'horizontal';
	$args['container_class'].= ' ubermenu-'.$orientation;

	//Transition
	$transition = ubermenu_op( 'transition' , $config_id );
	$args['container_class'].= ' ubermenu-transition-'.$transition;

	//Trigger
	$trigger = ubermenu_op( 'trigger' , $config_id );
	$args['container_class'].= ' ubermenu-trigger-'.$trigger;

	//Skin
	$skin = ubermenu_op( 'skin' , $config_id );
	$args['container_class'].= ' ubermenu-skin-'.$skin;
	$args['container_class'].= ' '._UBERMENU()->get_skin_classes( $skin );	//echo '[[['._UBERMENU()->get_skin_classes( $skin ).']]]';

	//Menu Bar Alignment
	$bar_align = ubermenu_op( 'bar_align' , $config_id );
	$args['container_class'].= ' ubermenu-bar-align-'.$bar_align;

	//Menu Item Alignment
	$items_align = ubermenu_op( 'items_align' , $config_id );
	$args['container_class'].= ' ubermenu-items-align-'.$items_align;

	//Menu Item Vertical Stretch
	if( ubermenu_op( 'items_vertical_stretch' , $config_id ) === 'on' ){
		$args['container_class'].= ' ubermenu-items-vstretch';
	}

	//Menu Item Vertical Alignment
	// $items_align_vertical = ubermenu_op( 'items_align_vertical' , $config_id );
	// if( $items_align_vertical != 'bottom' ){
	// 	$args['container_class'].= ' ubermenu-items-align-'.$items_align_vertical;
	// }

	//Inner Menu Center
	if( ubermenu_op( 'bar_inner_center' , $config_id ) == 'on' ){
		$args['container_class'].= ' ubermenu-bar-inner-center';
	}

	//Submenu Bound
	if( ubermenu_op( 'bound_submenus' , $config_id ) == 'on' || ubermenu_op( 'orientation' , $config_id ) == 'vertical' ){
		$args['container_class'].= ' ubermenu-bound';
	}
	else if( ubermenu_op( 'bound_submenus' , $config_id ) == 'inner' ){
		$args['container_class'].= ' ubermenu-bound-inner';
	}

	//Submenu Scrolling
	if( $transition != 'slide' && ubermenu_op( 'submenu_scrolling' , $config_id ) != 'on' ){
		$args['container_class'].= ' ubermenu-disable-submenu-scroll';
	}


	//Force Current Submenus
	if( ubermenu_op( 'force_current_submenus' , $config_id ) == 'on' ){
		$args['container_class'].= ' ubermenu-force-current-submenu';
	}

	//Invert Submenus
	if( ubermenu_op( 'invert_submenus' , $config_id ) == 'on' ){
		$args['container_class'].= ' ubermenu-invert';
	}



	//Submenu Background Image Hiding
	if( ubermenu_op( 'submenu_background_image_reponsive_hide' , $config_id ) == 'on' ){
		$args['container_class'].= ' ubermenu-hide-bkgs';
	}

	//Responsive Collapse //responsive_collapse
	//$args['container_class'].= ' ubermenu-collapse';

	//Submenu Indicators
	if( ubermenu_op( 'display_submenu_indicators', $config_id ) == 'on' ){
		$args['container_class'].= ' ubermenu-sub-indicators';
	}

	//Submenu indicator alignment/position
	if( ubermenu_op( 'style_align_submenu_indicator' , $config_id ) == 'text' ){
		$args['container_class'].= ' ubermenu-sub-indicators-align-text';
	}

	//Retractors
	if( ubermenu_op( 'retractor_display_strategy' , 'general' ) == 'responsive' ){
		$args['container_class'].= ' ubermenu-retractors-responsive';
	}

	//Icon Display
	if( ubermenu_op( 'icon_display' , $config_id ) == 'inline' ){
		$args['container_class'].= ' ubermenu-icons-inline';
	}


	//Submenu indicator close button
	if( ubermenu_op( 'submenu_indicator_close_mobile' , 'general' ) !== 'off' ){
		$args['container_class'].= ' ubermenu-submenu-indicator-closes';
	}


	//Accessibility - handled in JS only now
	// if( ubermenu_op( 'accessible' , 'general' ) == 'on' ){
	// 	$args['container_class'].= ' ubermenu-accessible';
	// }

	//Don't allow class filtering
	if( ubermenu_op( 'disable_class_filtering' , 'general' ) == 'on' ) remove_all_filters( 'nav_menu_css_class' );

	//$args['container_class'].= ' ubermenu-pad-submenus';

	//Set the Current Instance for Reference
	_UBERMENU()->set_current_config( $config_id );

	return apply_filters( 'ubermenu_nav_menu_args' , $args , $config_id );
}

//add_filter( 'wp_nav_menu_container_allowedtags', 'ubermenu_allowed_nav_tags' );
function ubermenu_allowed_nav_tags( $tags ){
	$tags[] = 'nav role="navigation"';
	$tags[] = 'div role="navigation"';
	return $tags;
}

function ubermenu_fallback_cb( $args ){
	//up( $args );

	$notice = __( 'No menu to display.' , 'ubermenu' );

	if( isset( $args['theme_location'] ) ){
		$theme_location = $args['theme_location'];

		if( $theme_location == '__um_undetermined__' ){
			$instance = $args['uber_instance'];
			$notice .= ' Please either <a target="_blank" href="'.admin_url('themes.php?page=ubermenu-settings#ubermenu_'.$instance ).'">assign a default menu to the <strong>'.$instance.'</strong> menu instance</a>, or pass it a Menu ID via the API';
		}
		else{
			$locs = get_registered_nav_menus();
			if( isset( $locs[$theme_location] ) ){
				$theme_loc_name = $locs[$theme_location];
				$notice = 'Please <a target="_blank" href="'.admin_url( 'nav-menus.php?action=locations' ).'">assign a menu</a> to the <strong>'.$theme_loc_name.'</strong> theme location.';
			}
		}
	}

	ubermenu_admin_notice( $notice );
}


function ubermenu_get_menu_instance_by_theme_location( $theme_location ){

	//Check Main
	$auto_theme_locations = ubermenu_op( 'auto_theme_location' , 'main' );
	if( is_array( $auto_theme_locations ) ){
		foreach( $auto_theme_locations as $loc ){
			if( $theme_location == $loc ){
				return 'main';
			}
		}
	}


	//Check Instances
	$instances = ubermenu_get_menu_instances();

	foreach( $instances as $config_id ){
		$auto_theme_locations = ubermenu_op( 'auto_theme_location' , $config_id );

		if( is_array( $auto_theme_locations ) ){
			foreach( $auto_theme_locations as $loc ){
				if( $theme_location == $loc ){
					return $config_id;
				}
			}
		}
	}

	return false;
}

function ubermenu_automatic_integration_filter( $args ){
	//Only do auto-integrate if this menu hasn't already been handled
	if( !isset( $args['uber_integration_type'] ) ){
		$args = ubermenu_get_nav_menu_args( $args , 'auto' );
	}
	return $args;
}
add_filter( 'wp_nav_menu_args' , 'ubermenu_automatic_integration_filter' , 1000 );


function ubermenu_force_filter( $args ){

	if( ubermenu_op( 'force_filter' , 'general' ) == 'on' ){
		//For main UberMenus
		if( isset( $args['uber_integration_type'] ) ){
			$args = ubermenu_get_nav_menu_args( $args , $args['uber_integration_type'] , $args['uber_instance'] );
		}
		//For menu segments, replace altered arguments with original array
		else if( isset( $args['uber_segment'] ) ){
			if( isset( $args['uber_segment_args'] ) ) $args = $args['uber_segment_args'];
		}
	}
	return $args;
}
add_filter( 'wp_nav_menu_args' , 'ubermenu_force_filter' , 100000 );


function ubermenu_prevent_menu_item_class_filtering(){
	if( ubermenu_op( 'disable_class_filters' ) ){
		remove_all_filters( 'nav_menu_css_class' );
	}
}
//add_action( 'wp_head' , 'ubermenu_prevent_menu_item_class_filtering' );

function ubermenu_direct_injection_registration(){
	if( ubermenu_op( 'direct_inject' , 'main' ) == 'on' ){
		register_nav_menu( 'ubermenu-direct-inject' , __( 'UberMenu [Direct Injection]' , 'ubermenu' ) );
	}
}
add_action( 'init' , 'ubermenu_direct_injection_registration' );

function ubermenu_direct_injection(){
	if( ubermenu_op( 'direct_inject' , 'main' ) == 'on' ){
		if( has_nav_menu( 'ubermenu-direct-inject' ) ){
			ubermenu( 'main' , array( 'theme_location' => 'ubermenu-direct-inject' ) );
		}
		else{
			echo '<div class="ubermenu ubermenu-loc-ubermenu-direct-inject">';
			ubermenu_admin_notice( 'Please <a target="_blank" href="'.admin_url( 'nav-menus.php?action=locations' ).'">assign a menu</a> to the <strong>UberMenu [Direct Injection]</strong> theme location' );
			echo '</div>';
		}
	}
}
add_action( 'wp_footer' , 'ubermenu_direct_injection' );

function ubermenu_skipnav_filter( $nav_menu , $args ){
	//Add to UberMenu, ignore segments
	if( isset( $args->uber_instance ) && !isset( $args->uber_segment ) ){
	//up( $args );

		if( ubermenu_op( 'skip_navigation' , 'general' ) == 'on' ){

			$skipnav_target_id = $args->container_id.'-skipnav';

			$skipnav = '<a href="#'.$skipnav_target_id.'" class="ubermenu-skipnav ubermenu-sr-only ubermenu-sr-only-focusable">'.__( 'Skip Navigation', 'ubermenu' ).'</a>';

			$skipnav_target = '<span id="'.$skipnav_target_id.'"></span>';

			$nav_menu = $skipnav . $nav_menu . $skipnav_target;
		}
	}
	return $nav_menu;
}
add_filter( 'wp_nav_menu' , 'ubermenu_skipnav_filter' , 11, 2 );

function ubermenu_responsive_toggle_filter( $nav_menu , $args ){
	//Add to UberMenu, ignore segments
	if( isset( $args->uber_instance ) && !isset( $args->uber_segment ) ){
	//up( $args );

		$ubermenu_responsive = ubermenu_op( 'responsive' , $args->uber_instance ) == 'on';
		$ubermenu_responsive_toggle = ubermenu_op( 'responsive_toggle' , $args->uber_instance ) == 'on';

		if( $ubermenu_responsive && $ubermenu_responsive_toggle ){

			$toggle_content = ubermenu_op( 'responsive_toggle_content' , $args->uber_instance );
			$toggle_tag = ubermenu_op( 'responsive_toggle_tag' , $args->uber_instance );
			$toggle_content_align = ubermenu_op( 'responsive_toggle_content_alignment' , $args->uber_instance );
			$toggle_align = ubermenu_op( 'responsive_toggle_alignment' , $args->uber_instance );
			$toggle_close_icon = ubermenu_op( 'responsive_toggle_close_icon' , $args->uber_instance );
			$toggle_classes = ubermenu_op( 'responsive_collapse', $args->uber_instance ) == 'off' ? 'ubermenu-responsive-toggle-open' : '';
			$toggle_args = array(
				'toggle_content'	=> $toggle_content,
				'tag'				=> $toggle_tag,
				'content_align'		=> $toggle_content_align,
				'align'				=> $toggle_align,
				'close_icon'	=> $toggle_close_icon,
				'classes'			=> $toggle_classes,
			);
			if( isset( $args->theme_location ) ) $toggle_args['theme_location'] = $args->theme_location;
			$ubermenu_toggle = ubermenu_toggle( $args->container_id , $args->uber_instance , false , $toggle_args);

			$nav_menu = $ubermenu_toggle . $nav_menu;
		}
		else{
			$responsive_status = '';
			if( !$ubermenu_responsive_toggle ){
				$responsive_status.= '[UberMenu Responsive Toggle Disabled] ';
			}
			if( !$ubermenu_responsive ){
				$responsive_status.= '[UberMenu Responsive Menu Disabled] ';
			}
			if( $responsive_status ) $nav_menu = '<!-- '.$responsive_status.'--> '.$nav_menu;
		}
	}
	return $nav_menu;
}
add_filter( 'wp_nav_menu' , 'ubermenu_responsive_toggle_filter' , 10, 2 );


/*
 * Add HTML comments around menu, optionally add content before menu
 */
function ubermenu_before_wp_nav_menu( $nav_menu, $args ){

	if( isset( $args->uber_segment ) ) return $nav_menu; //Ignore segments

	if( isset( $args->uber_instance ) ){

		$theme_loc = isset( $args->theme_location ) ? $args->theme_location : '';

		$nav_menu = "\n<!-- UberMenu [Configuration:$args->uber_instance] [Theme Loc:$theme_loc] [Integration:$args->uber_integration_type] -->\n". $nav_menu . "\n<!-- End UberMenu -->\n";

		//uberp( $args );
		$config_id = $args->uber_instance;

		$before = $after = '';

		$before_content = ubermenu_op( 'content_before_nav' , $args->uber_instance );
		if( $before_content ){
			$before = '<!-- UberMenu Content Before -->';
			$before.= do_shortcode( $before_content );
			$before.= '<!-- End UberMenu Content Before -->';
		}

		$nav_menu = $before . $nav_menu . $after;

	}

	return $nav_menu;
}
add_filter( 'wp_nav_menu', 'ubermenu_before_wp_nav_menu' , 20 , 2 );






function ubermenu_get_post_parent_ops( $ops = array() ){

	if( ubermenu_op( 'autocomplete_disable', 'general' ) == 'on' ){
		$ops[999] = __( 'Autocomplete disabled in Control Panel.  Please enter ID manually' , 'ubermenu' );
		return $ops;
	}

	$post_types = get_post_types( array(
		'public'		=> true,
		'hierarchical' 	=> true,
	));

	$max_posts = ubermenu_op( 'autocomplete_max_post_results', 'general' );
	if( !$max_posts ) $max_posts = 100;


	$post_args = array(
		'post_type'	=> $post_types,
		'posts_per_page' => $max_posts,
	);

	//WPML
	if( defined('ICL_SITEPRESS_VERSION') ){
		$post_args['suppress_filters'] = false;
	}

	$posts = get_posts( $post_args );

	foreach( $posts as $post ){
		$ops[$post->ID] = $post->post_title;
	}

	return $ops;

}


function ubermenu_get_author_ops(){

	$ops = array();

	if( ubermenu_op( 'dynamic_authors_disable', 'general' ) == 'on' ){
		$ops[999] = __( '[Authors selection disabled via Control Panel]' , 'ubermenu' );
		return $ops;
	}

	$authors = get_users( array(
		'who'	=> 'authors'
	));;

	foreach( $authors as $author ){
		$ops[$author->ID] = $author->data->display_name;
		//up( $author->data->display_name , 2 );
	}

	return $ops;
}


function ubermenu_get_post_type_ops(){
	$post_types = get_post_types(
		array(
			'public'	=> true,
		),
		'objects'
	);

	unset( $post_types['attachment'] );

	$ops = array();
	//up( $post_types );
	foreach( $post_types as $id => $type ){
		$ops[$id] = $type->label;
	}
	return $ops;
}

function ubermenu_get_term_ops_by_tax( $tax , $ops = array() ){

	if( ubermenu_op( 'autocomplete_disable', 'general' ) == 'on' ){
		$ops[999] = __( 'Autocomplete disabled in Control Panel.  Please enter ID manually' , 'ubermenu' );
		return $ops;
	}

	if( !is_array( $tax ) ) $tax = array( $tax );

	$max_terms = ubermenu_op( 'autocomplete_max_term_results', 'general' ); //for performance
	if( !$max_terms ) $max_terms = 100;

	$terms = get_terms( $tax ,
		array(
			'number'	=> $max_terms,
			'hide_empty'=> false,
		));

	foreach( $terms as $id => $term ){
		$ops[$term->term_id] = $term->name;
	}

	return $ops;
}



function ubermenu_get_taxonomy_ops(){
	$taxonomies = get_taxonomies(
		array(
			'public'	=> true,
		),
		'objects'
	);

	$ops = array();

	foreach( $taxonomies as $id => $tax ){
		$ops[$id] = $tax->label;
	}

	return $ops;
}


function ubermenu_get_term_ops( $ops = array() ){
	//trigger_error( "Simulating Autocomplete memory exception" , E_USER_ERROR );
	if( ubermenu_op( 'autocomplete_disable', 'general' ) == 'on' ){
		$ops[999] = __( 'Autocomplete disabled in Control Panel.  Please enter ID manually' , 'ubermenu' );
		return $ops;
	}

	$taxonomies = ubermenu_get_taxonomies();

	$max_terms = ubermenu_op( 'autocomplete_max_term_results', 'general' ); //for performance
	if( !$max_terms ) $max_terms = 100;

	$terms = get_terms( $taxonomies ,
		array(
			'number'	=> $max_terms,
			'hide_empty'=> false,
		));

	//$ops = array();

	foreach( $terms as $id => $term ){
		$ops[$term->term_id] = $term->name;
	}

	/* Stress Test
	for( $k = count( $terms )+1 ; $k < count( $terms ) + 1000 ; $k ++ ){
		if( $k % 6 == 0 ){
			$ops[$k] = 'Frogs';
		}
		else if( $k % 5 == 0 ){
			$ops[$k] = 'Lions';
		}
		else if( $k % 4 == 0 ){
			$ops[$k] = 'Aardvarks';
		}
		else if( $k % 3 == 0 ){
			$ops[$k] = 'Antelope';
		}
		else if( $k % 2 == 0 ){
			$ops[$k] = 'Puppies';
		}
		else $ops[$k] = 'Cat'.$k;
	}
	*/

	return $ops;
}

function ubermenu_get_taxonomies(){
	return get_taxonomies(
		array(
			'public'	=> true,
		)
	);
}


function ubermenu_get_image( $img_id = false , $post_id = false , $data = false , $args = array() ){

	extract( wp_parse_args( $args , array(
		'img_size'		=> 'inherit',
		'img_w'			=> '',
		'img_h'			=> '',
		'default_img' 	=> false,
	)));

	$config_id = _UBERMENU()->get_current_config();


	//Image
	$img = '';

	//If post is set, but img is not, get featured image
	if( !$img_id && $post_id ){
		$thumb_id = get_post_thumbnail_id( $post_id );
		if( $thumb_id ) $img_id = $thumb_id;
	}

	if( !$img_id ){
		$img_id = $default_img;
	}

	if( $img_id ){
		$atts = array();

		$atts['class'] = 'ubermenu-image';

		//Determine size of image to get
		if( $img_size == 'inherit' ){
			$img_size = ubermenu_op( 'image_size' , $config_id );
		}

		//echo '['.$img_size.']';
		$atts['class'].= ' ubermenu-image-size-'.$img_size;

		//Get the reight image file
		$img_src = wp_get_attachment_image_src( $img_id , $img_size );
		$atts['src']	= $img_src[0];



		//Apply natural dimensions if not already set
		if( ubermenu_op( 'image_set_dimensions' , $config_id ) ){
			if( $img_w == '' && $img_h == '' ){
				$img_w = $img_src[1];
				$img_h = $img_src[2];
			}
		}

		//Default dimensions if not natural
		if( !$img_w ){
			$img_w = ubermenu_op( 'image_width' , $config_id );
			$img_h = ubermenu_op( 'image_height' , $config_id );
		}



		//Add dimensions as attributes, with pixel units if missing
		if( $img_w ){
			//if( is_numeric( $img_w ) ) $img_w.='px';	//Should always be numeric only, no units
			$atts['width']	= $img_w;
		}
		if( $img_h ){
			//if( is_numeric( $img_h ) ) $img_h.='px';	//Should always be numeric only, no units
			$atts['height'] = $img_h;
		}

		//Add 'alt' & 'title'
		$meta = get_post_custom( $img_id );
		$alt = isset( $meta['_wp_attachment_image_alt'] ) ? $meta['_wp_attachment_image_alt'][0] : '';	//Alt field
		$title = '';

		if( $alt == '' ){
			$title = get_the_title( $img_id );
			$alt = $title;
		}
		$atts['alt'] = $alt;

		if( ubermenu_op( 'image_title_attribute' , $config_id ) == 'on' ){
			if( $title == '' ) $title = get_the_title( $img_id );
			$atts['title'] = $title;
		}

		//Build attributes string
		$attributes = '';
		foreach( $atts as $name => $val ){
			$attributes.= $name . '="'. esc_attr( $val ) .'" ';
		}

		$img = "<img $attributes />";
		//$img = "<span class='ubermenu-image'><img $attributes /></span>";

		if( $data ){
			$data = array();
			$data['img'] = $img;
			$data['w']	= $img_w;
			$data['h']	= $img_h;
			$data['atts'] = $atts;
			return $data;
		}
	}

	return $img;
}

function ubermenu_item_save_inherit_featured_image( $item_id , $setting , $val , &$saved_settings ){

	if( $val == 'cache' ){

		$object_type = get_post_meta( $item_id , '_menu_item_object' , true );

		//Determine Featured Image
		$object_id = get_post_meta( $item_id , '_menu_item_object_id' , true );
		$thumb_id = '';
		switch( $object_type ){
			//WooCommerce Product Categories
			case 'product_cat':
				$thumb_id = ubermenu_get_woocommerce_product_category_image_id( $object_id );
				break;
			default:
				$thumb_id = get_post_thumbnail_id( $object_id );
		}


		//Assign Featured Image
		$saved_settings['item_image'] = $thumb_id;
		update_post_meta( $item_id , UBERMENU_MENU_ITEM_META_KEY , $saved_settings );

	}
}


function ubermenu_display_retractors(){
	//echo ubermenu_op( 'retractor_display_strategy' , 'general' );
	switch( ubermenu_op( 'retractor_display_strategy' , 'general' ) ){
		case 'responsive':
			return true;
		case 'mobile':
			return ubermenu_is_mobile( 'display_retractors' );
		case 'touch':
			return true;
		default:
			return true;
	}
	return true;
}


function ubermenu_is_mobile( $scenario = false ){
	return apply_filters( 'ubermenu_is_mobile' , wp_is_mobile() , $scenario );
}


/** Term Splitting in WordPress 4.2 **/
add_action( 'split_shared_term', 'ubermenu_split_shared_term', 10, 4 );
function ubermenu_split_shared_term( $term_id, $new_term_id, $term_taxonomy_id, $taxonomy ){
	global $wpdb;
	$uber_meta = $wpdb->get_results(
		$wpdb->prepare( "SELECT post_id , meta_value FROM $wpdb->postmeta where meta_key = %s AND meta_value IN( %s , %s )", '_ubermenu_custom_item_type' , 'dynamic_terms' , 'dynamic_posts' )
	);

	//echo count( $uber_meta );

	foreach( $uber_meta as $meta ){
		$meta->post_id;
		//$meta->meta_value; //dynamic_terms or dynamic_posts

		$m = get_post_meta( $meta->post_id , UBERMENU_MENU_ITEM_META_KEY , true );

		if( $meta->meta_value == 'dynamic_terms' ){

			$update = false;

			//Only if $taxonomy is checked
			if( isset( $m['dt_taxonomy'] ) && in_array( $taxonomy , $m['dt_taxonomy'] ) ){

				if( isset( $m['dt_parent'] ) && $m['dt_parent'] ){
					if( $m['dt_parent'] == $term_id ){
						$m['dt_parent'] = $new_term_id;
						$update = true;
					}
				}
				if( isset( $m['dt_child_of'] ) && $m['dt_child_of'] ){
					if( $m['dt_child_of'] == $term_id ){
						$m['dt_child_of'] = $new_term_id;
						$update = true;
					}
				}
				if( isset( $m['dt_exclude'] ) && $m['dt_exclude'] ){
					$exclude_list = explode( ',' , $m['dt_exclude'] );
					if( in_array( $term_id , $exclude_list ) ){
						foreach( $exclude_list as $k => $val ){
							if( $val == $term_id ){
								$exclude_list[$k] = $new_term_id;
							}
						}
						$m['dt_exclude'] = implode( ',' , $exclude_list );
						$update = true;
					}
				}

				if( $update ){
					update_post_meta( $meta->post_id , UBERMENU_MENU_ITEM_META_KEY , $m );
					//uberp( $m , 3 );
				}
			}
		}
		else if( $meta->meta_value == 'dynamic_posts' ){

			//just check dp_{$taxonomy}
			$tax_setting = 'dp_'.$taxonomy;
			if( isset( $m[$tax_setting] ) && $m[$tax_setting]){
				if( $m[$tax_setting] == $term_id ){
					$m[$tax_setting] = $new_term_id;
					update_post_meta( $meta->post_id , UBERMENU_MENU_ITEM_META_KEY , $m );
					//uberp( $m , 3 );
				}
			}

		}

	}
}

//Term Split Tests
//do_action( 'split_shared_term', 100 , 200 , 300 , 'location' );
//do_action( 'split_shared_term', 50 , 150 , 250 , 'category' );





/* Allow HTML descriptions */
/* Off by default because it will fill all descriptions with the post content.
remove_filter( 'nav_menu_description', 'strip_tags' );
add_filter( 'wp_setup_nav_menu_item', 'ubermenu_allow_description_html' );
function ubermenu_allow_description_html( $menu_item ) {
     $menu_item->description = apply_filters( 'nav_menu_description', $menu_item->post_content );
     return $menu_item;
}
*/



/** Admin Notices **/
function ubermenu_user_is_admin(){
	return current_user_can( 'manage_options' );
}

function ubermenu_admin_notice( $content , $echo = true ){
	//$showtips = false;

	if( ubermenu_op( 'admin_notices' , 'general' ) == 'on' ){
		if( ubermenu_user_is_admin() ){
			$notice = '<div class="ubermenu-admin-notice"><i class="ubermenu-admin-notice-icon fas fa-lightbulb"></i>'.$content.'</div>';

			if( $echo ) echo $notice;
			return $notice;
		}
	}

}
function ubermenu_is_pro(){
	if( !defined( 'UBERMENU_PRO' ) ){
		return false;
	}
	if( !UBERMENU_PRO ){
		return false;
	}

	//We're in pro, now check for Lite Mode
	//We don't use ubermenu_op because that function needs to check this function
	//when getting defaults, so it would create an infinite loop and the universe would implode
	$general_settings = get_option( UBERMENU_PREFIX.'general' , false );

	//No settings, Pro Mode
	if( $general_settings === false ){
		return true;
	}
	if( isset( $general_settings['lite_mode'] ) ){
		//If lite mode, pro is false
		if( $general_settings['lite_mode']  == 'on' ){
			return false;
		}
	}
	return true;
}



function ubermenu_get_support_url(){
	return _UBERMENU()->get_support_url();
}

// function ubermenu_get_support_url(){
// 	$url = UBERMENU_SUPPORT_URL;

// 	$data = array();

// 	$data['src']			= 'ubermenu_plugin';
// 	$data['product_id']		= 1;

// 	//Site Data
// 	$data['site_url'] 		= get_site_url();
// 	$data['version']		= UBERMENU_VERSION;
// 	$data['timezone']		= get_option('timezone_string');

// 	//Theme Data
// 	$theme = wp_get_theme();
// 	//uberp( $theme , 3 );
// 	$data['theme']			= $theme->get( 'Name' );
// 	$data['theme_link']		= '<a target="_blank" href="'.$theme->get( 'ThemeURI' ).'">'. $theme->get( 'Name' ). ' v'.$theme->get( 'Version' ).' by ' . $theme->get( 'Author' ).'</a>';
// 	$data['theme_slug']		= isset( $theme->stylesheet ) ? $theme->stylesheet : '';
// 	$data['theme_parent']	= $theme->get( 'Template' );

// 	//User Data
// 	$current_user = wp_get_current_user();
// 	if( $current_user ){
// 		if( $current_user->user_firstname ){
// 			$data['first_name']		= $current_user->user_firstname;
// 		}
// 		if( $current_user->user_firstname ){
// 			$data['last_name']		= $current_user->user_lastname;
// 		}
// 		if( $current_user ){
// 			$data['email']			= $current_user->user_email;
// 		}
// 	}
// 	//$data['email']			= get_bloginfo( 'admin_email' );


// 	//License Data
// 	if( $license_code = ubermenu_op( 'purchase_code' , 'updates' ) ){
// 		$data['license_code']	= $license_code;
// 	}
// 	if( $envato_username = ubermenu_op( 'envato_username' , 'updates' ) ){
// 		$data['envato_username'] = $envato_username;
// 	}

// 	$query = http_build_query( $data );

// 	return "$url?$query";
// }


/** DEBUGGING **/


function uberp( $d , $depth = 1 ){
	echo '<pre>';
	//print_r( $d );
	echo UMVarDumper::dump( $d , $depth );
	echo '</pre>';
}

class UMVarDumper
{
        private static $_objects;
        private static $_output;
        private static $_depth;

        /**
         * Converts a variable into a string representation.
         * This method achieves the similar functionality as var_dump and print_r
         * but is more robust when handling complex objects such as PRADO controls.
         * @param mixed variable to be dumped
         * @param integer maximum depth that the dumper should go into the variable. Defaults to 10.
         * @return string the string representation of the variable
         */
        public static function dump($var,$depth=10,$highlight=false)
        {
                self::$_output='';
                self::$_objects=array();
                self::$_depth=$depth;
                self::dumpInternal($var,0);
                if($highlight)
                {
                        $result=highlight_string("<?php\n".self::$_output,true);
                        return preg_replace('/&lt;\\?php<br \\/>/','',$result,1);
                }
                else
                        return self::$_output;
        }

        private static function dumpInternal($var,$level)
        {
                switch(gettype($var))
                {
                        case 'boolean':
                                self::$_output.=$var?'true':'false';
                                break;
                        case 'integer':
                                self::$_output.="$var";
                                break;
                        case 'double':
                                self::$_output.="$var";
                                break;
                        case 'string':
                                self::$_output.="'$var'";
                                break;
                        case 'resource':
                                self::$_output.='{resource}';
                                break;
                        case 'NULL':
                                self::$_output.="null";
                                break;
                        case 'unknown type':
                                self::$_output.='{unknown}';
                                break;
                        case 'array':
                                if(self::$_depth<=$level)
                                        self::$_output.='array(...)';
                                else if(empty($var))
                                        self::$_output.='array()';
                                else
                                {
                                        $keys=array_keys($var);
                                        $spaces=str_repeat(' ',$level*4);
                                        self::$_output.="array\n".$spaces.'(';
                                        foreach($keys as $key)
                                        {
                                                self::$_output.="\n".$spaces."    [$key] => ";
                                                self::$_output.=self::dumpInternal($var[$key],$level+1);
                                        }
                                        self::$_output.="\n".$spaces.')';
                                }
                                break;
                        case 'object':
                                if(($id=array_search($var,self::$_objects,true))!==false)
                                        self::$_output.=get_class($var).'#'.($id+1).'(...)';
                                else if(self::$_depth<=$level)
                                        self::$_output.=get_class($var).'(...)';
                                else
                                {
                                        $id=array_push(self::$_objects,$var);
                                        $className=get_class($var);
                                        $members=(array)$var;
                                        $keys=array_keys($members);
                                        $spaces=str_repeat(' ',$level*4);
                                        self::$_output.="$className#$id\n".$spaces.'(';
                                        foreach($keys as $key)
                                        {
                                                $keyDisplay=strtr(trim($key),array("\0"=>':'));
                                                self::$_output.="\n".$spaces."    [$keyDisplay] => ";
                                                self::$_output.=self::dumpInternal($members[$key],$level+1);
                                        }
                                        self::$_output.="\n".$spaces.')';
                                }
                                break;
                }
        }
}

//Usage:
//$profiler = new UMProfiler();	//before
//$profiler->output( "Name of Object" );  //after

class UMProfiler{

	var $mem_before;
	var $mem_peak_before;
	var $mem_after;
	var $mem_peak_after;
	var $mem_diff;
	var $mem_peak_diff;


	function __construct(){
		$this->mem_before = memory_get_usage();
		$this->mem_peak_before = memory_get_peak_usage();
	}

	function terminate(){
		$this->mem_after = memory_get_usage();
		$this->mem_peak_after = memory_get_peak_usage();

		$this->mem_diff = $this->mem_after - $this->mem_before;
		$this->mem_peak_diff = $this->mem_peak_after - $this->mem_peak_before;


	}

	function output( $label , $threshold = 0 ){

		$this->terminate();

		if( !current_user_can( 'manage_options' ) ) return;

		if( $this->mem_peak_diff >= $threshold ){

			echo '<div class="profiler-item">'.$label.'</div>';
			echo '<div class="profiler-data">';

			if( $this->mem_peak_diff > 0 ){
				echo '<div class="profiler-data-segment">';
				echo '[Peak: ' .umbytes( $this->mem_peak_diff ) .']';
				echo '</div>';

				echo '<div class="profiler-data-segment">';
				echo '[Net: ' . umbytes( $this->mem_diff ) .']';
				echo '</div>';
			}
			else{
				echo '[Peak: 0]';
			}


			global $_bytes; //, $_bytes_peak;
			//$_bytes_peak+= $this->mem_peak_diff;
			$_bytes+= $this->mem_diff;
			echo '<div class="profiler-data-segment">Total: ' . umbytes( $_bytes ).'</div>';
			echo '<div class="profiler-data-segment">Peak: ' . umbytes( $this->mem_peak_after ).'</div>';

			echo '</div>';
		}

	}
}

function umbytes($size, $precision = 2){
	$base = log($size) / log(1024);
	$suffixes = array('', 'k', 'M', 'G', 'T');
	return round(pow(1024, $base - floor($base)), $precision) . $suffixes[floor($base)];
}




/*
 * Add compatibility with Conditional Menus by Themify
 */
add_filter( 'conditional_menus_theme_location', 'ubermenu_restore_conditional_menus_theme_location' , 10 , 3 );
function ubermenu_restore_conditional_menus_theme_location( $theme_loc , $new_menu, $args ){
   //uberp( $args );
   return $args['theme_location'];
}




/*
 * The strategy is to find all the UberMenu items, remove them, and move their children up a level
 *
 * 1. Make a map of parent > child relationships
 * 2. Determine which items are UberMenu advanced items.
 *    - Take the children of these items, and change their parent IDs to that of the UberMenu item
 *    - Mark the UberMenu item for deletion by recording their index
 * 3. Remove the UberMenu items by unsetting their indexes.
 *    - We can't do it simultaneuously in step 2, as that would alter the index and break the algorithm
 *
 * Note: if there is an UberMenu top level item with children, all those children will become top level items
 *    - One option would be to have a "disable child items that would become top level items" setting.
 */
function ubermenu_exclude_advanced_items( $sorted_menu_items, $args ) {

//uberp( $sorted_menu_items , 3 );

  if( is_admin() ) return $sorted_menu_items;

  //Ignore UberMenu and ShiftNav
  if( isset( $args->uber_instance ) ||
			isset( $args->shiftnav ) ){
    return $sorted_menu_items;
  }

  //uberp( $items ,3 );
  $items = $sorted_menu_items;
  //uberp( $args );

  $child_map = array(); //$parent => array of children

  //First we have to track parents
  foreach ( $items as $index => $item ) {
    $parent_id = $item->menu_item_parent;
    $item_id = $item->ID;

    if( !isset( $child_map[$parent_id] ) ){
      $child_map[$parent_id] = array();
    }
    $child_map[$parent_id][] = array( 'id'  => $item_id , 'index' => $index );
  }

  //uberp( $child_map , 3 );

  $index_trash = array();

  //Now search for UberMenu items, but keep all the indexes intact
  foreach ( $items as $index => $item ) {
    if( $item->object == 'ubermenu-custom' ){

      //Does this item have children?
      if( isset( $child_map[$item->ID] ) ){
        //Send the kiddos to grandma's house
        foreach( $child_map[$item->ID] as $k => $child_data ){
          //Update items
          $items[$child_data['index']]->menu_item_parent = $item->menu_item_parent;
          //Update child map - no, if we do that we break this loop
          //$child_map[$item->menu_item_parent]
        }
      }

      //Keep track of indexes to unset
      $index_trash[] = $index;
      //unset( $items[$key] );
    }
  }

  //Finally, remove all items that are from UberMenu
  foreach( $index_trash as $k => $index ){
    unset( $items[$index] );
  }


  //uberp( $item );
    //if ( $item->object_id == 168 ) unset( $items[$key] );

  return $items;
}



/* Theme Template Backtrace */
add_action( 'wp' , function() {
	if( current_user_can( 'manage_options' ) && ubermenu_op( 'theme_template_backtrace' , 'general' ) === 'on' ){
		add_filter( 'wp_nav_menu' , 'ubermenu_theme_template_backtrace' , 100 , 2 );
	}
});

function ubermenu_theme_template_backtrace( $nav_menu , $args ){
  if( !isset( $args->uber_segment ) ){ //ignore menu segments
      //uberp( $args );
      $backtrace = debug_backtrace();
      //uberp( $backtrace , 3 );


      $html = '<strong>Theme Template Backtrace: wp_nav_menu() call</strong><ul>';
      foreach( $backtrace as $step ){
				// uberp( $step );
        if( $step['file'] && strpos( $step['file'] , 'wp-content/themes' ) !== false ){
          $html.= '<li>'.$step['file']. ' (line '.$step['line'].')</li>';
        }
      }
      $html.= '</ul>';

      ubermenu_admin_notice( $html );
  }
  return $nav_menu;
}





/* Helpers */
function ubermenu_classNames( $classMap, $concat = false ){

  $classes = [];

  foreach( $classMap as $class => $condition ){
    if( $condition ){
      $classes[] = $class;
    }
  }

  if( $concat ){
    return implode( ' ' , $classes );
  }

  return $classes;

}

/**
 * Generate a string of HTML attributes
 *
 * @param   array          $attr      Associative array of attribute names and values.
 * @param   callable|null  $callback  Callback function to escape values for HTML attributes.
 *                                    Defaults to `htmlspecialchars()`.
 * @return  string  Returns a string of HTML attributes.
 */
function ubermenu_html_atts(array $attr, callable $callback = null)
{
	if (!count($attr)) {
		return '';
	}

	$html = array_map(
		function ($val, $key) use ($callback) {
			if (is_bool($val)) {
				return ($val ? $key : '');
			} elseif (isset($val)) {
				if ($val instanceof Closure) {
					$val = $val();
				} elseif ($val instanceof JsonSerializable) {
					$val = json_encode(
						$val->jsonSerialize(),
						(JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE)
					);
				} elseif (is_callable([ $val, 'toArray' ])) {
					$val = $val->toArray();
				} elseif (is_callable([ $val, '__toString' ])) {
					$val = strval($val);
				}

				if (is_array($val)) {
					if (function_exists('is_blank')) {
						$filter = function ($var) {
							return !is_blank($var);
						};
					} else {
						$filter = function ($var) {
							return !empty($var) || is_numeric($var);
						};
					}
					$val = implode(' ', array_filter($val, $filter));
				}

				if (is_callable($callback)) {
					$val = call_user_func($callback, $val);
				} elseif (function_exists('esc_attr')) {
					$val = esc_attr($val);
				} else {
					$val = htmlspecialchars($val, ENT_QUOTES);
				}

				if (is_string($val)) {
					return sprintf('%1$s="%2$s"', $key, $val);
				}
			}
		},
		$attr,
		array_keys($attr)
	);

	return implode(' ', $html);
}

https://t.me/RX1948 - 2025