Astra_Ext_Nav_Menu_Loader
Description
Source
File: addons/nav-menu/classes/class-astra-ext-nav-menu-loader.php
final class Astra_Ext_Nav_Menu_Loader {
/**
* Member Variable
*
* @var instance
*/
private static $instance;
/**
* Member Variable
*
* @var string
*/
private static $mega_menu_style = '';
/**
* Initiator
*/
public static function get_instance() {
if ( ! isset( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Constructor
*/
public function __construct() {
add_filter( 'wp_nav_menu_args', array( $this, 'modify_nav_menu_args' ) );
add_filter( 'astra_theme_defaults', array( $this, 'theme_defaults' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );
add_action( 'wp_enqueue_scripts', array( $this, 'load_scripts' ) );
if ( defined( 'UAGB_VER' ) && version_compare( preg_replace( '/[^0-9\.]/', '', UAGB_VER ), '1.23.0', '>=' ) ) {
add_action( 'wp_enqueue_scripts', array( $this, 'load_gutenberg_addon_scripts' ) );
} else {
add_action( 'wp', array( $this, 'load_gutenberg_addon_scripts' ) );
}
add_action( 'astra_get_css_files', array( $this, 'add_styles' ) );
add_action( 'astra_get_js_files', array( $this, 'add_scripts' ) );
add_action( 'customize_register', array( $this, 'customize_register' ), 2 );
add_filter( 'wp_footer', array( $this, 'megamenu_style' ) );
add_action( 'customize_preview_init', array( $this, 'preview_scripts' ) );
}
/**
* Load page builder scripts and styles.
*
* @access public
* @return void
*/
public function load_scripts() {
$menu_locations = get_nav_menu_locations();
foreach ( $menu_locations as $menu_id ) {
$nav_items = wp_get_nav_menu_items( $menu_id );
if ( ! empty( $nav_items ) ) {
foreach ( $nav_items as $nav_item ) {
if ( isset( $nav_item->megamenu_template ) && '' != $nav_item->megamenu_template ) {
$page_builder_base_instance = Astra_Addon_Page_Builder_Compatibility::get_instance();
$page_builder_instance = $page_builder_base_instance->get_active_page_builder( $nav_item->megamenu_template );
if ( is_callable( array( $page_builder_instance, 'enqueue_scripts' ) ) ) {
$page_builder_instance->enqueue_scripts( $nav_item->megamenu_template );
}
}
}
}
}
}
/**
* Load UAG scripts and styles.
*
* @access public
* @return void
*
* @since 2.6.0
*/
public function load_gutenberg_addon_scripts() {
$menu_locations = get_nav_menu_locations();
foreach ( $menu_locations as $menu_id ) {
$nav_items = wp_get_nav_menu_items( $menu_id );
if ( ! empty( $nav_items ) ) {
foreach ( $nav_items as $nav_item ) {
if ( isset( $nav_item->megamenu_template ) && '' != $nav_item->megamenu_template ) {
if ( class_exists( 'Astra_Addon_Gutenberg_Compatibility' ) ) {
$astra_gutenberg_instance = new Astra_Addon_Gutenberg_Compatibility();
if ( is_callable( array( $astra_gutenberg_instance, 'enqueue_blocks_assets' ) ) ) {
$astra_gutenberg_instance->enqueue_blocks_assets( $nav_item->megamenu_template );
}
}
}
}
}
}
}
/**
* Include admin scripts on navigation menu screen.
*
* @access public
* @return void
*/
public function admin_scripts() {
if ( current_user_can( 'edit_theme_options' ) ) {
global $pagenow;
$rtl = '';
if ( is_rtl() ) {
$rtl = '-rtl';
}
if ( 'nav-menus.php' == $pagenow || 'widgets.php' == $pagenow ) {
wp_enqueue_media();
wp_enqueue_style( 'wp-color-picker' );
/**
* Localize wp-color-picker & wpColorPickerL10n.
*
* This is only needed in WordPress version >= 5.5 because wpColorPickerL10n has been removed.
*
* @see https://github.com/WordPress/WordPress/commit/7e7b70cd1ae5772229abb769d0823411112c748b
*
* This is should be removed once the issue is fixed from wp-color-picker-alpha repo.
* @see https://github.com/kallookoo/wp-color-picker-alpha/issues/35
*
* @since 2.6.3
*/
global $wp_version;
if ( version_compare( $wp_version, '5.4.99', '>=' ) ) {
wp_localize_script(
'wp-color-picker',
'wpColorPickerL10n',
array(
'clear' => __( 'Clear', 'astra-addon' ),
'clearAriaLabel' => __( 'Clear color', 'astra-addon' ),
'defaultString' => __( 'Default', 'astra-addon' ),
'defaultAriaLabel' => __( 'Select default color', 'astra-addon' ),
'pick' => __( 'Select Color', 'astra-addon' ),
'defaultLabel' => __( 'Color value', 'astra-addon' ),
)
);
}
if ( SCRIPT_DEBUG ) {
wp_enqueue_style( 'astra-mm-opts-style', ASTRA_EXT_NAV_MENU_URL . 'assets/css/unminified/megamenu-options' . $rtl . '.css', array(), ASTRA_EXT_VER );
wp_enqueue_script( 'astra-megamenu-opts', ASTRA_EXT_NAV_MENU_URL . 'assets/js/unminified/megamenu-options.js', array( 'jquery', 'astra-color-alpha' ), ASTRA_EXT_VER, true );
} else {
wp_enqueue_style( 'astra-mm-opts-style', ASTRA_EXT_NAV_MENU_URL . 'assets/css/minified/megamenu-options' . $rtl . '.min.css', array(), ASTRA_EXT_VER );
wp_enqueue_script( 'astra-megamenu-opts', ASTRA_EXT_NAV_MENU_URL . 'assets/js/minified/megamenu-options.min.js', array( 'jquery', 'astra-color-alpha' ), ASTRA_EXT_VER, true );
}
$has_wp_block_suport = post_type_exists( 'wp_block' );
if ( $has_wp_block_suport ) {
$select2_placeholder = __( 'Search Pages/ Posts / Reusable Blocks', 'astra-addon' );
} else {
$select2_placeholder = __( 'Search Pages/ Posts', 'astra-addon' );
}
wp_localize_script(
'astra-megamenu-opts',
'astMegamenuVars',
array(
'select2_placeholder' => $select2_placeholder,
'saving_text' => __( 'Saving ..', 'astra-addon' ),
'saved_text' => __( 'Saved', 'astra-addon' ),
)
);
}
}
}
/**
* Customizer Preview
*/
public function preview_scripts() {
if ( SCRIPT_DEBUG ) {
wp_enqueue_script( 'astra-ext-nav-menu-customize-preview-js', ASTRA_EXT_NAV_MENU_URL . 'assets/js/unminified/customizer-preview.js', array( 'customize-preview', 'astra-customizer-preview-js' ), ASTRA_EXT_VER, true );
} else {
wp_enqueue_script( 'astra-ext-nav-menu-customize-preview-js', ASTRA_EXT_NAV_MENU_URL . 'assets/js/minified/customizer-preview.min.js', array( 'customize-preview', 'astra-customizer-preview-js' ), ASTRA_EXT_VER, true );
}
}
/**
* Function to modify navigation menu parameters.
*
* @param array $args navigation menu arguments.
* @return array modified arguments.
*/
public function modify_nav_menu_args( $args ) {
if ( 'primary' == $args['theme_location'] || 'secondary_menu' == $args['theme_location'] || 'above_header_menu' == $args['theme_location'] || 'below_header_menu' == $args['theme_location'] || 'mobile_menu' == $args['theme_location'] ) {
$args['walker'] = new Astra_Custom_Nav_Walker();
}
return $args;
}
/**
* Add Scripts Callback
*/
public function add_scripts() {
/* Define Variables */
$uri = ASTRA_EXT_NAV_MENU_URL . 'assets/js/';
$path = ASTRA_EXT_NAV_MENU_DIR . 'assets/js/';
/* Directory and Extension */
$file_prefix = '.min';
$dir_name = 'minified';
if ( SCRIPT_DEBUG ) {
$file_prefix = '';
$dir_name = 'unminified';
}
$js_uri = $uri . $dir_name . '/';
$js_dir = $path . $dir_name . '/';
if ( defined( 'ASTRA_THEME_HTTP2' ) && ASTRA_THEME_HTTP2 ) {
$gen_path = $js_uri;
} else {
$gen_path = $js_dir;
}
/*** End Path Logic */
Astra_Minify::add_dependent_js( 'jquery' );
Astra_Minify::add_js( $gen_path . 'mega-menu-frontend' . $file_prefix . '.js' );
}
/**
* Add Styles
*
* @since 1.6.0
* @return void
*/
public function add_styles() {
/*** Start Path Logic */
/* Define Variables */
$uri = ASTRA_EXT_NAV_MENU_URL . 'assets/css/';
$path = ASTRA_EXT_NAV_MENU_DIR . 'assets/css/';
$rtl = '';
if ( is_rtl() ) {
$rtl = '-rtl';
}
/* Directory and Extension */
$file_prefix = $rtl . '.min';
$dir_name = 'minified';
if ( SCRIPT_DEBUG ) {
$file_prefix = $rtl;
$dir_name = 'unminified';
}
$css_uri = $uri . $dir_name . '/';
$css_dir = $path . $dir_name . '/';
if ( defined( 'ASTRA_THEME_HTTP2' ) && ASTRA_THEME_HTTP2 ) {
$gen_path = $css_uri;
} else {
$gen_path = $css_dir;
}
Astra_Minify::add_css( $gen_path . 'mega-menu' . $file_prefix . '.css' );
}
/**
* Append CSS style to class variable.
*
* @since 1.6.0
* @param string $style Inline style string.
* @return void
*/
public static function add_css( $style ) {
self::$mega_menu_style .= $style;
}
/**
* Print inline CSS to footer.
*
* @since 1.6.0
* @return void
*/
public function megamenu_style() {
if ( '' != self::$mega_menu_style ) {
echo "<style type='text/css' class='astra-megamenu-inline-style'>";
echo self::$mega_menu_style; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo '</style>';
}
}
/**
* Load customizer configuration file.
*
* @since 1.6.0
* @return void
*/
public function customize_register() {
if ( astra_addon_existing_header_footer_configs() ) {
// Primary Header.
require_once ASTRA_EXT_NAV_MENU_DIR . 'classes/sections/class-astra-nav-menu-primary-header-layout.php';
require_once ASTRA_EXT_NAV_MENU_DIR . 'classes/sections/class-astra-nav-menu-primary-header-typography.php';
require_once ASTRA_EXT_NAV_MENU_DIR . 'classes/sections/class-astra-existing-nav-menu-primary-header-colors.php';
// Above Header.
require_once ASTRA_EXT_NAV_MENU_DIR . 'classes/sections/class-astra-nav-menu-above-header-layout.php';
require_once ASTRA_EXT_NAV_MENU_DIR . 'classes/sections/class-astra-nav-menu-above-header-typography.php';
require_once ASTRA_EXT_NAV_MENU_DIR . 'classes/sections/class-astra-existing-nav-menu-above-header-colors.php';
// Below Header.
require_once ASTRA_EXT_NAV_MENU_DIR . 'classes/sections/class-astra-nav-menu-below-header-layout.php';
require_once ASTRA_EXT_NAV_MENU_DIR . 'classes/sections/class-astra-nav-menu-below-header-typography.php';
require_once ASTRA_EXT_NAV_MENU_DIR . 'classes/sections/class-astra-existing-nav-menu-below-header-colors.php';
}
// Primary Header.
require_once ASTRA_EXT_NAV_MENU_DIR . 'classes/sections/class-astra-nav-menu-primary-header-colors.php';
// Above Header.
require_once ASTRA_EXT_NAV_MENU_DIR . 'classes/sections/class-astra-nav-menu-above-header-colors.php';
// Below Header.
require_once ASTRA_EXT_NAV_MENU_DIR . 'classes/sections/class-astra-nav-menu-below-header-colors.php';
}
/**
* Set Options Default Values
*
* @param array $defaults Astra options default value array.
* @return array
*/
public function theme_defaults( $defaults ) {
$component_limit = astra_addon_builder_helper()->component_limit;
for ( $index = 1; $index <= $component_limit; $index++ ) {
$_prefix = 'menu' . $index;
/**
* Menu + Submenu Colors
*/
$defaults[ 'header-' . $_prefix . '-submenu-bg-color-responsive' ] = array(
'desktop' => '',
'tablet' => '',
'mobile' => '',
);
$defaults[ 'header-' . $_prefix . '-submenu-color-responsive' ] = array(
'desktop' => '',
'tablet' => '',
'mobile' => '',
);
$defaults[ 'header-' . $_prefix . '-submenu-h-bg-color-responsive' ] = array(
'desktop' => '',
'tablet' => '',
'mobile' => '',
);
$defaults[ 'header-' . $_prefix . '-submenu-h-color-responsive' ] = array(
'desktop' => '',
'tablet' => '',
'mobile' => '',
);
$defaults[ 'header-' . $_prefix . '-submenu-a-bg-color-responsive' ] = array(
'desktop' => '',
'tablet' => '',
'mobile' => '',
);
$defaults[ 'header-' . $_prefix . '-submenu-a-color-responsive' ] = array(
'desktop' => '',
'tablet' => '',
'mobile' => '',
);
/**
* Submenu
*/
$defaults[ 'header-' . $_prefix . '-submenu-bg-color' ] = '';
$defaults[ 'header-' . $_prefix . '-submenu-color' ] = '';
$defaults[ 'header-' . $_prefix . '-submenu-h-bg-color' ] = '';
$defaults[ 'header-' . $_prefix . '-submenu-h-color' ] = '';
$defaults[ 'header-' . $_prefix . '-submenu-a-bg-color' ] = '';
$defaults[ 'header-' . $_prefix . '-submenu-a-color' ] = '';
/**
* Sub Menu - Typography.
*/
$defaults[ 'header-font-size-' . $_prefix . '-sub-menu' ] = array(
'desktop' => '',
'tablet' => '',
'mobile' => '',
'desktop-unit' => 'px',
'tablet-unit' => 'px',
'mobile-unit' => 'px',
);
$defaults[ 'header-font-family-' . $_prefix . '-sub-menu' ] = '';
$defaults[ 'header-font-weight-' . $_prefix . '-sub-menu' ] = '';
$defaults[ 'header-text-transform-' . $_prefix . '-sub-menu' ] = '';
$defaults[ 'header-line-height-' . $_prefix . '-sub-menu' ] = '';
if ( $index < 3 ) {
/**
* Mega Menu Spacing.
*/
$defaults[ 'header-' . $_prefix . '-megamenu-heading-space' ] = astra_addon_builder_helper()->default_responsive_spacing;
$defaults[ 'header-' . $_prefix . '-header-megamenu-heading-space' ] = astra_addon_builder_helper()->default_responsive_spacing;
/**
* Mega Menu Color.
*/
$defaults[ 'header-' . $_prefix . '-header-megamenu-heading-color' ] = '';
$defaults[ 'header-' . $_prefix . '-header-megamenu-heading-h-color' ] = '';
/**
* Mega Menu Typography.
*/
$defaults[ 'header-' . $_prefix . '-megamenu-heading-font-family' ] = 'inherit';
$defaults[ 'header-' . $_prefix . '-megamenu-heading-font-weight' ] = '700';
$defaults[ 'header-' . $_prefix . '-megamenu-heading-text-transform' ] = '';
$defaults[ 'header-' . $_prefix . '-megamenu-heading-font-size' ] = array(
'desktop' => '',
'tablet' => '',
'mobile' => '',
'desktop-unit' => 'px',
'tablet-unit' => 'px',
'mobile-unit' => 'px',
);
}
/**
* Menu Spacing.
*/
$defaults[ 'header-' . $_prefix . '-spacing' ] = array(
'desktop' => array(
'top' => '',
'right' => '',
'bottom' => '',
'left' => '',
),
'tablet' => array(
'top' => '0',
'right' => '20',
'bottom' => '0',
'left' => '20',
),
'mobile' => array(
'top' => '',
'right' => '',
'bottom' => '',
'left' => '',
),
'desktop-unit' => 'px',
'tablet-unit' => 'px',
'mobile-unit' => 'px',
);
$defaults[ 'header-' . $_prefix . '-submenu-spacing' ] = array(
'desktop' => array(
'top' => '',
'right' => '',
'bottom' => '',
'left' => '',
),
'tablet' => array(
'top' => '0',
'right' => '20',
'bottom' => '0',
'left' => '30',
),
'mobile' => array(
'top' => '',
'right' => '',
'bottom' => '',
'left' => '',
),
'desktop-unit' => 'px',
'tablet-unit' => 'px',
'mobile-unit' => 'px',
);
}
// Mobile Menu.
/**
* Submenu
*/
$defaults['header-mobile-menu-submenu-bg-color'] = '';
$defaults['header-mobile-menu-submenu-color'] = '';
$defaults['header-mobile-menu-submenu-h-bg-color'] = '';
$defaults['header-mobile-menu-submenu-h-color'] = '';
$defaults['header-mobile-menu-submenu-a-bg-color'] = '';
$defaults['header-mobile-menu-submenu-a-color'] = '';
$defaults['header-mobile-menu-submenu-spacing'] = astra_addon_builder_helper()->default_responsive_spacing;
/**
* Sub Menu - Typography.
*/
$defaults['header-font-size-mobile-menu-sub-menu'] = array(
'desktop' => '',
'tablet' => '',
'mobile' => '',
'desktop-unit' => 'px',
'tablet-unit' => 'px',
'mobile-unit' => 'px',
);
$defaults['header-font-family-mobile-menu-sub-menu'] = '';
$defaults['header-font-weight-mobile-menu-sub-menu'] = '';
$defaults['header-text-transform-mobile-menu-sub-menu'] = '';
$defaults['header-line-height-mobile-menu-sub-menu'] = '';
// Above Header.
$defaults['above-header-megamenu-heading-color'] = '';
$defaults['above-header-megamenu-heading-h-color'] = '';
$defaults['above-header-megamenu-heading-space'] = array(
'desktop' => array(
'top' => '',
'right' => '',
'bottom' => '',
'left' => '',
),
'tablet' => array(
'top' => '',
'right' => '',
'bottom' => '',
'left' => '',
),
'mobile' => array(
'top' => '',
'right' => '',
'bottom' => '',
'left' => '',
),
'desktop-unit' => 'px',
'tablet-unit' => 'px',
'mobile-unit' => 'px',
);
$defaults['above-header-megamenu-heading-font-family'] = 'inherit';
$defaults['above-header-megamenu-heading-font-weight'] = '500';
$defaults['above-header-megamenu-heading-text-transform'] = '';
$defaults['above-header-megamenu-heading-font-size'] = array(
'desktop' => '1.1',
'tablet' => '',
'mobile' => '',
'desktop-unit' => 'em',
'tablet-unit' => 'px',
'mobile-unit' => 'px',
);
// Primary Header.
$defaults['primary-header-megamenu-heading-font-family'] = 'inherit';
$defaults['primary-header-megamenu-heading-font-weight'] = '700';
$defaults['primary-header-megamenu-heading-text-transform'] = '';
$defaults['primary-header-megamenu-heading-font-size'] = array(
'desktop' => '1.1',
'tablet' => '',
'mobile' => '',
'desktop-unit' => 'em',
'tablet-unit' => 'px',
'mobile-unit' => 'px',
);
$defaults['primary-header-megamenu-heading-color'] = '';
$defaults['primary-header-megamenu-heading-h-color'] = '';
$defaults['primary-header-megamenu-heading-space'] = array(
'desktop' => array(
'top' => '',
'right' => '',
'bottom' => '',
'left' => '',
),
'tablet' => array(
'top' => '',
'right' => '',
'bottom' => '',
'left' => '',
),
'mobile' => array(
'top' => '',
'right' => '',
'bottom' => '',
'left' => '',
),
'desktop-unit' => 'px',
'tablet-unit' => 'px',
'mobile-unit' => 'px',
);
// Above Header.
$defaults['below-header-megamenu-heading-color'] = '';
$defaults['below-header-megamenu-heading-h-color'] = '';
$defaults['below-header-megamenu-heading-space'] = array(
'desktop' => array(
'top' => '',
'right' => '',
'bottom' => '',
'left' => '',
),
'tablet' => array(
'top' => '',
'right' => '',
'bottom' => '',
'left' => '',
),
'mobile' => array(
'top' => '',
'right' => '',
'bottom' => '',
'left' => '',
),
'desktop-unit' => 'px',
'tablet-unit' => 'px',
'mobile-unit' => 'px',
);
$defaults['below-header-megamenu-heading-font-family'] = 'inherit';
$defaults['below-header-megamenu-heading-font-weight'] = '500';
$defaults['below-header-megamenu-heading-text-transform'] = '';
$defaults['below-header-megamenu-heading-font-size'] = array(
'desktop' => '1.1',
'tablet' => '',
'mobile' => '',
'desktop-unit' => 'em',
'tablet-unit' => 'px',
'mobile-unit' => 'px',
);
$defaults['sticky-above-header-megamenu-heading-color'] = '';
$defaults['sticky-above-header-megamenu-heading-h-color'] = '';
$defaults['sticky-below-header-megamenu-heading-color'] = '';
$defaults['sticky-below-header-megamenu-heading-h-color'] = '';
$defaults['sticky-primary-header-megamenu-heading-color'] = '';
$defaults['sticky-primary-header-megamenu-heading-h-color'] = '';
return $defaults;
}
}
Expand full source code Collapse full source code View on Trac
Methods
- __construct — Constructor
- add_css — Append CSS style to class variable.
- add_scripts — Add Scripts Callback
- add_styles — Add Styles
- admin_scripts — Include admin scripts on navigation menu screen.
- clear_nav_menu_cached_transient — Clear cached navigation menu transient on menu save.
- customize_register — Load customizer configuration file.
- get_cached_nav_menu_items — Returns cached navigation menu items.
- get_instance — Initiator
- get_megamenu_default — Megamenu Defaults
- get_post_meta — Parse post meta of particular passed key & return its value.
- load_gutenberg_addon_scripts — Load UAG scripts and styles.
- load_scripts — Load page builder scripts and styles.
- megamenu_style — Print inline CSS to footer.
- modify_nav_menu_args — Function to modify navigation menu parameters.
- preview_scripts — Customizer Preview
- theme_defaults — Set Options Default Values