Astra_Ext_Nav_Menu_Markup
Description
Source
File: addons/nav-menu/classes/class-astra-ext-nav-menu-markup.php
final class Astra_Ext_Nav_Menu_Markup {
/**
* 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() {
global $pagenow;
// Add custom fields to menu.
add_filter( 'wp_setup_nav_menu_item', array( $this, 'add_custom_fields_meta' ) );
add_action( 'wp_nav_menu_item_custom_fields', array( $this, 'add_custom_fields' ), 10, 4 );
// Edit menu walker.
add_filter( 'wp_edit_nav_menu_walker', array( $this, 'edit_walker' ), 12 );
add_action( 'init', array( 'Astra_Ext_Nav_Menu_Markup', 'load_walker' ), 1 );
add_action( 'wp_ajax_ast_get_posts_list', array( $this, 'get_post_list_by_query' ) );
/* Add Body Classes */
add_filter( 'body_class', array( $this, 'body_classes' ), 10, 1 );
add_action( 'init', array( $this, 'add_mega_menu_classes' ) );
add_filter( 'astra_above_header_menu_classes', array( $this, 'add_above_menu_classes' ) );
add_filter( 'astra_below_header_menu_classes', array( $this, 'add_below_menu_classes' ) );
add_action( 'astra_get_fonts', array( $this, 'add_fonts' ), 1 );
if ( 'nav-menus.php' === $pagenow ) {
add_action( 'admin_footer', array( $this, 'add_popup_wrap' ) );
}
add_action( 'wp_ajax_ast_render_popup', array( $this, 'render_mm_popup_html' ) );
add_action( 'wp_ajax_ast_save_menu_options', array( $this, 'save_menu_options' ) );
}
/**
* Enqueue Font Family
*/
public function add_fonts() {
$font_family_primary = astra_get_option( 'primary-header-megamenu-heading-font-family' );
$font_weight_primary = astra_get_option( 'primary-header-megamenu-heading-font-weight' );
Astra_Fonts::add_font( $font_family_primary, $font_weight_primary );
$font_family_above = astra_get_option( 'above-header-megamenu-heading-font-family' );
$font_weight_above = astra_get_option( 'above-header-megamenu-heading-font-weight' );
Astra_Fonts::add_font( $font_family_above, $font_weight_above );
$font_family_below = astra_get_option( 'below-header-megamenu-heading-font-family' );
$font_weight_below = astra_get_option( 'below-header-megamenu-heading-font-weight' );
Astra_Fonts::add_font( $font_family_below, $font_weight_below );
$font_family_mobile_submenu = astra_get_option( 'header-font-family-mobile-menu-sub-menu' );
$font_weight_mobile_submenu = astra_get_option( 'header-font-weight-mobile-menu-sub-menu' );
Astra_Fonts::add_font( $font_family_mobile_submenu, $font_weight_mobile_submenu );
}
/**
* Add custom megamenu fields data to the menu.
*
* @access public
* @param int $id menu item id.
* @param object $item A single menu item.
* @param int $depth menu item depth.
* @param array $args menu item arguments.
* @return void.
*/
public function add_custom_fields( $id, $item, $depth, $args ) {
?>
<input type="hidden" class="ast-nonce-field" value="<?php echo esc_attr( wp_create_nonce( 'ast-render-opts-' . $id ) ); ?>">
<p class="description description-wide">
<a class="button button-secondary button-large astra-megamenu-opts-btn" data-depth="<?php echo esc_attr( $depth ); ?>">
<?php
echo sprintf(
/* translators: Astra Pro whitelabbeled string */
esc_html__(
'%1$s Menu Settings',
'astra-addon'
),
esc_html( astra_get_theme_name() )
);
?>
</a>
</p>
<?php
}
/**
* Add custom menu style fields data to the menu.
*
* @access public
* @param object $menu_item A single menu item.
* @return object The menu item.
*/
public function add_custom_fields_meta( $menu_item ) {
$menu_item->megamenu = get_post_meta( $menu_item->ID, '_menu_item_megamenu', true );
$menu_item->megamenu_width = get_post_meta( $menu_item->ID, '_menu_item_megamenu_width', true );
$menu_item->megamenu_col = get_post_meta( $menu_item->ID, '_menu_item_megamenu_col', true );
$menu_item->megamenu_text_color = get_post_meta( $menu_item->ID, '_menu_item_megamenu_text_color', true );
$menu_item->megamenu_text_h_color = get_post_meta( $menu_item->ID, '_menu_item_megamenu_text_h_color', true );
$menu_item->megamenu_background_image = get_post_meta( $menu_item->ID, '_menu_item_megamenu_background_image', true );
$menu_item->megamenu_bg_size = get_post_meta( $menu_item->ID, '_menu_item_megamenu_bg_size', true );
$menu_item->megamenu_bg_repeat = get_post_meta( $menu_item->ID, '_menu_item_megamenu_bg_repeat', true );
$menu_item->megamenu_bg_position = get_post_meta( $menu_item->ID, '_menu_item_megamenu_bg_position', true );
$menu_item->megamenu_bg_color = get_post_meta( $menu_item->ID, '_menu_item_megamenu_bg_color', true );
$menu_item->megamenu_highlight_label = get_post_meta( $menu_item->ID, '_menu_item_megamenu_highlight_label', true );
$menu_item->megamenu_label_color = get_post_meta( $menu_item->ID, '_menu_item_megamenu_label_color', true );
$menu_item->megamenu_label_bg_color = get_post_meta( $menu_item->ID, '_menu_item_megamenu_label_bg_color', true );
$menu_item->megamenu_column_divider_color = get_post_meta( $menu_item->ID, '_menu_item_megamenu_column_divider_color', true );
$menu_item->megamenu_heading_seeparator_color = get_post_meta( $menu_item->ID, '_menu_item_megamenu_heading_seeparator_color', true );
$menu_item->megamenu_content_src = get_post_meta( $menu_item->ID, '_menu_item_megamenu_content_src', true );
$menu_item->megamenu_custom_text = get_post_meta( $menu_item->ID, '_menu_item_megamenu_custom_text', true );
$menu_item->megamenu_disable_title = get_post_meta( $menu_item->ID, '_menu_item_megamenu_disable_title', true );
$menu_item->megamenu_enable_heading = get_post_meta( $menu_item->ID, '_menu_item_megamenu_enable_heading', true );
$menu_item->megamenu_disable_link = get_post_meta( $menu_item->ID, '_menu_item_megamenu_disable_link', true );
$menu_item->megamenu_widgets_list = get_post_meta( $menu_item->ID, '_menu_item_megamenu_widgets_list', true );
$menu_item->megamenu_template = get_post_meta( $menu_item->ID, '_menu_item_megamenu_template', true );
$menu_item->custom_width = get_post_meta( $menu_item->ID, '_menu_item_megamenu_custom_width', true );
$menu_item->megamenu_margin_top = get_post_meta( $menu_item->ID, '_menu_item_megamenu_margin_top', true );
$menu_item->megamenu_margin_right = get_post_meta( $menu_item->ID, '_menu_item_megamenu_margin_right', true );
$menu_item->megamenu_margin_bottom = get_post_meta( $menu_item->ID, '_menu_item_megamenu_margin_bottom', true );
$menu_item->megamenu_margin_left = get_post_meta( $menu_item->ID, '_menu_item_megamenu_margin_left', true );
$menu_item->megamenu_padding_top = get_post_meta( $menu_item->ID, '_menu_item_megamenu_padding_top', true );
$menu_item->megamenu_padding_right = get_post_meta( $menu_item->ID, '_menu_item_megamenu_padding_right', true );
$menu_item->megamenu_padding_bottom = get_post_meta( $menu_item->ID, '_menu_item_megamenu_padding_bottom', true );
$menu_item->megamenu_padding_left = get_post_meta( $menu_item->ID, '_menu_item_megamenu_padding_left', true );
return $menu_item;
}
/**
* Function to replace normal edit nav walker
*
* @return string Class name of new navwalker
*/
public function edit_walker() {
require_once ASTRA_EXT_NAV_MENU_DIR . 'classes/class-astra-walker-nav-menu-edit-custom.php';
return 'Astra_Walker_Nav_Menu_Edit_Custom';
}
/**
* Function to load custom navigation walker.
*
* @return void.
*/
public static function load_walker() {
require_once ASTRA_EXT_NAV_MENU_DIR . 'classes/class-astra-custom-nav-walker.php';
}
/**
* Function to get posts lists to display.
*
* @return void.
*/
public function get_post_list_by_query() {
check_ajax_referer( 'astra-addon-get-posts-by-query', 'nonce' );
$search_string = isset( $_POST['q'] ) ? sanitize_text_field( $_POST['q'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing
$data = array();
$result = array();
$args = array(
'public' => true,
'_builtin' => false,
);
$output = 'names'; // names or objects, note names is the default.
$operator = 'and'; // also supports 'or'.
$post_types = get_post_types( $args, $output, $operator );
$post_types['Posts'] = 'post';
$post_types['Pages'] = 'page';
$has_wp_block_suport = post_type_exists( 'wp_block' );
if ( $has_wp_block_suport ) {
$post_types['Reusable Blocks'] = 'wp_block';
}
foreach ( $post_types as $key => $post_type ) {
$data = array();
$obj_instance = Astra_Target_Rules_Fields::get_instance();
add_filter( 'posts_search', array( $obj_instance, 'search_only_titles' ), 10, 2 );
$query = new WP_Query(
array(
's' => $search_string,
'post_type' => $post_type,
'posts_per_page' => - 1,
)
);
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
$title = get_the_title();
$title .= ( 0 != $query->post->post_parent ) ? ' (' . get_the_title( $query->post->post_parent ) . ')' : '';
$id = get_the_id();
$data[] = array(
'id' => $id,
'text' => $title,
);
}
}
if ( is_array( $data ) && ! empty( $data ) ) {
$result[] = array(
'text' => $key,
'children' => $data,
);
}
}
$data = array();
wp_reset_postdata();
// return the result in json.
wp_send_json( $result );
}
/**
* Mega Menu Header Classes
*
* Add classes of mega menu only if Primary Menu is set.
*
* @since 1.7.2
* @return void;
*/
public function add_mega_menu_classes() {
if ( has_nav_menu( 'primary' ) ) {
add_filter( 'astra_primary_menu_classes', array( $this, 'add_primary_menu_classes' ) );
add_filter( 'astra_secondary_menu_menu_classes', array( $this, 'add_primary_menu_classes' ) );
}
}
/**
* Primary Header Classes
*
* @param array $classes CSS Classes.
*
* @since 1.6.0
* @return array;
*/
public function add_primary_menu_classes( $classes ) {
$classes[] = 'ast-mega-menu-enabled';
return $classes;
}
/**
* Above Header Classes
*
* @param array $classes CSS Classes.
*
* @since 1.6.0
* @return array;
*/
public function add_above_menu_classes( $classes ) {
$classes[] = 'ast-mega-menu-enabled';
return $classes;
}
/**
* Below Header Classes
*
* @param array $classes CSS Classes.
*
* @since 1.6.0
* @return array;
*/
public function add_below_menu_classes( $classes ) {
$classes[] = 'ast-mega-menu-enabled';
return $classes;
}
/**
* Add menu options settings popup wrap at footer.
*
* @since 1.6.0
* @return void
*/
public function add_popup_wrap() {
ob_start();
?>
<div class='ast-popup-wrap'>
<div class='astra-mm-modal-overlay'></div>
<div class='ast-popup-content'>
<div class="ast-megamenu-spinner spinner"></div>
<div class='astra-mm-options-wrap'>
</div>
</div>
</div>
<?php
echo ob_get_clean(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
/**
* Render HTML for nav menu settings popup.
*
* @return void
* @since 1.6.0
*/
public function render_mm_popup_html() {
if ( ! current_user_can( 'edit_theme_options' ) ) {
wp_die();
}
$menu_item_id = sanitize_text_field( $_POST['menu_item_id'] );
$menu_parent_id = sanitize_text_field( $_POST['parent_id'] );
check_ajax_referer( 'ast-render-opts-' . $menu_item_id, 'security_nonce' );
if ( ! current_user_can( 'edit_theme_options' ) ) {
wp_die();
}
ob_start();
$megamenu = get_post_meta( $menu_item_id, '_menu_item_megamenu', true );
$megamenu_width = get_post_meta( $menu_item_id, '_menu_item_megamenu_width', true );
$megamenu_col = get_post_meta( $menu_item_id, '_menu_item_megamenu_col', true );
$megamenu_text_color = get_post_meta( $menu_item_id, '_menu_item_megamenu_text_color', true );
$megamenu_text_h_color = get_post_meta( $menu_item_id, '_menu_item_megamenu_text_h_color', true );
$megamenu_background_image = get_post_meta( $menu_item_id, '_menu_item_megamenu_background_image', true );
$megamenu_bg_size = get_post_meta( $menu_item_id, '_menu_item_megamenu_bg_size', true );
$megamenu_bg_repeat = get_post_meta( $menu_item_id, '_menu_item_megamenu_bg_repeat', true );
$megamenu_bg_position = get_post_meta( $menu_item_id, '_menu_item_megamenu_bg_position', true );
$megamenu_bg_color = get_post_meta( $menu_item_id, '_menu_item_megamenu_bg_color', true );
$megamenu_highlight_label = get_post_meta( $menu_item_id, '_menu_item_megamenu_highlight_label', true );
$megamenu_label_color = get_post_meta( $menu_item_id, '_menu_item_megamenu_label_color', true );
$megamenu_label_bg_color = get_post_meta( $menu_item_id, '_menu_item_megamenu_label_bg_color', true );
$megamenu_column_divider_color = get_post_meta( $menu_item_id, '_menu_item_megamenu_column_divider_color', true );
$megamenu_heading_separator_color = get_post_meta( $menu_item_id, '_menu_item_megamenu_heading_separator_color', true );
$megamenu_content_src = get_post_meta( $menu_item_id, '_menu_item_megamenu_content_src', true );
$megamenu_custom_text = get_post_meta( $menu_item_id, '_menu_item_megamenu_custom_text', true );
$megamenu_disable_title = get_post_meta( $menu_item_id, '_menu_item_megamenu_disable_title', true );
$megamenu_enable_heading = get_post_meta( $menu_item_id, '_menu_item_megamenu_enable_heading', true );
$megamenu_disable_link = get_post_meta( $menu_item_id, '_menu_item_megamenu_disable_link', true );
$custom_width = get_post_meta( $menu_item_id, '_menu_item_megamenu_custom_width', true );
$megamenu_margin_top = get_post_meta( $menu_item_id, '_menu_item_megamenu_margin_top', true );
$megamenu_margin_right = get_post_meta( $menu_item_id, '_menu_item_megamenu_margin_right', true );
$megamenu_margin_bottom = get_post_meta( $menu_item_id, '_menu_item_megamenu_margin_bottom', true );
$megamenu_margin_left = get_post_meta( $menu_item_id, '_menu_item_megamenu_margin_left', true );
$megamenu_padding_top = get_post_meta( $menu_item_id, '_menu_item_megamenu_padding_top', true );
$megamenu_padding_right = get_post_meta( $menu_item_id, '_menu_item_megamenu_padding_right', true );
$megamenu_padding_bottom = get_post_meta( $menu_item_id, '_menu_item_megamenu_padding_bottom', true );
$megamenu_padding_left = get_post_meta( $menu_item_id, '_menu_item_megamenu_padding_left', true );
$parent_megamenu = get_post_meta( $menu_parent_id, '_menu_item_megamenu', true );
$megamenu_template = get_post_meta( $menu_item_id, '_menu_item_megamenu_template', true );
$menulabel_style = '';
if ( 'disable-title' == $megamenu_disable_title ) {
$menulabel_style = "style='display:none;'";
}
$mm_container_style = '';
if ( 'megamenu' != $megamenu ) {
$mm_container_style = "style='display:none;'";
}
if ( 'megamenu' == $parent_megamenu || '' == $menu_parent_id ) {
$parent_container_class = 'ast-show';
} else {
$parent_container_class = 'ast-hide';
}
if ( 'enable-heading' === $megamenu_enable_heading ) {
$color_class = 'ast-show';
} else {
$color_class = 'ast-hide';
}
?>
<div class="astra-mm-title-wrap">
<h2>
<?php
echo sprintf(
/* translators: Astra Pro whitelabbeled string */
esc_html__(
'%1$s Menu Options',
'astra-addon'
),
esc_html( astra_get_theme_name() )
);
?>
</h2>
<span class="ast-editing-label" data-label="<?php esc_attr_e( 'Editing', 'astra-addon' ); ?>"></span>
<div class="astra-mm-close dashicons dashicons-no-alt"></div>
</div>
<div class="ast-mm-settings">
<div class="astra-mm-option-container field-mm-megamenu-opts <?php echo esc_attr( $parent_container_class ); ?> " >
<h2 class="astra-mm-option-heading"><?php esc_html_e( 'Mega Menu', 'astra-addon' ); ?></h2>
<input type="hidden" class="ast-nonce-field" name="ast-mm-opts-nonce-<?php echo esc_attr( $menu_item_id ); ?>" value="<?php echo esc_attr( wp_create_nonce( 'ast-save-opts-' . $menu_item_id ) ); ?>">
<input type="hidden" class="ast-nonce-field ast-drop-widget-nonce" name="ast-drop-widget-nonce-<?php echo esc_attr( $menu_item_id ); ?>" value="<?php echo esc_attr( wp_create_nonce( 'ast-drop-widget-' . $menu_item_id ) ); ?>">
<input type="hidden" class="ast-nonce-field ast-render-widgets-nonce" name="ast-render-widgets-nonce-<?php echo esc_attr( $menu_item_id ); ?>" value="<?php echo esc_attr( wp_create_nonce( 'ast-render-widgets-' . $menu_item_id ) ); ?>">
<div class="astra-mm-settings-wrap field-mm-enabled">
<div class="ast-mm-label-container">
<label for="edit-menu-item-megamenu-<?php echo esc_attr( $menu_item_id ); ?>"><?php esc_html_e( 'Enable Mega Menu', 'astra-addon' ); ?></label>
</div>
<div class="astra-option-input-container">
<input type="checkbox" id="edit-menu-item-megamenu-<?php echo esc_attr( $menu_item_id ); ?>" class="code edit-menu-item-megamenu" value="megamenu" name="megamenu" <?php checked( $megamenu, 'megamenu' ); ?> />
</div>
</div>
<div class="astra-mm-settings-wrap field-mm-width" <?php echo $mm_container_style; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> >
<div class="ast-mm-label-container">
<label for="edit-menu-item-megamenu_width-<?php echo esc_attr( $menu_item_id ); ?>">
<?php esc_html_e( 'Mega Menu Width', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<select id="edit-menu-item-megamenu_width-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_width">
<option value="content" <?php selected( $megamenu_width, 'content' ); ?> >
<?php esc_attr_e( 'Content', 'astra-addon' ); ?>
</option>
<option value="menu-container" <?php selected( $megamenu_width, 'menu-container' ); ?> >
<?php esc_attr_e( 'Menu Container Width', 'astra-addon' ); ?>
</option>
<option value="full" <?php selected( $megamenu_width, 'full' ); ?> >
<?php esc_attr_e( 'Full Width', 'astra-addon' ); ?>
</option>
<option value="full-stretched" <?php selected( $megamenu_width, 'full-stretched' ); ?> >
<?php esc_attr_e( 'Full Width Stretched', 'astra-addon' ); ?>
</option>
<option value="custom" <?php selected( $megamenu_width, 'custom' ); ?> >
<?php esc_attr_e( 'Custom Width', 'astra-addon' ); ?>
</option>
</select>
</div>
</div>
<div class="astra-mm-settings-wrap mm-custom-width-wrap">
<div class="ast-mm-label-container">
<label for="mega-menu-item-megamenu_custom_width-<?php echo esc_attr( $menu_item_id ); ?>">
<?php esc_html_e( 'Custom Width (in px)', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<input type="number" class="ast-mm-input" id="mega-menu-item-megamenu_custom_width-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_custom_width" / value="<?php echo esc_attr( $custom_width ); ?>" >
</div>
</div>
<div class="astra-mm-settings-wrap field-mm-width" <?php echo $mm_container_style; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> >
<div class="ast-mm-label-container">
<label for="edit-menu-item-megamenu_heading_color">
<?php esc_html_e( 'Change Heading Color', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<?php
$url = admin_url( 'customize.php?autofocus[control]=' . ASTRA_THEME_SETTINGS . '[primary-header-megamenu-heading-color]' );
if ( true === astra_addon_builder_helper()->is_header_footer_builder_active ) {
$url = admin_url( 'customize.php?autofocus[control]=' . ASTRA_THEME_SETTINGS . '[header-menu1-mega-menu-col-color-group]&context=design' );
}
?>
<a href="<?php echo esc_url( $url ); ?>" for="edit-menu-item-megamenu_heading_color_link">
<?php esc_html_e( 'Click Here!', 'astra-addon' ); ?>
</a>
</div>
</div>
<!-- Column Heading field-->
<div class="astra-mm-settings-wrap field-mm-enabled-heading <?php echo esc_attr( $parent_container_class ); ?> " >
<div class="ast-mm-label-container">
<label for="edit-menu-item-megamenu_enable_heading-<?php echo esc_attr( $menu_item_id ); ?>">
<?php esc_html_e( 'Make this menu as column heading?', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<input type="checkbox" id="edit-menu-item-megamenu_enable_heading-<?php echo esc_attr( $menu_item_id ); ?>" class="code edit-menu-item-megamenu_enable_heading" value="enable-heading" name="megamenu_enable_heading"<?php checked( $megamenu_enable_heading, 'enable-heading' ); ?> />
</div>
</div>
<div class="astra-mm-settings-wrap field-mm-header-sep-color <?php echo esc_attr( $color_class ); ?>">
<div class="ast-mm-label-container">
<label>
<?php esc_html_e( 'Column Heading Separator Color', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<input type="text" data-alpha="true" class="astra-wp-color-input" id="edit-menu-item-megamenu_heading_separator_color-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_heading_separator_color" value="<?php echo esc_attr( $megamenu_heading_separator_color ); ?>"/>
</div>
</div>
</div>
<div class="astra-mm-option-container field-mm-megamenu-label" >
<h2 class="astra-mm-option-heading"><?php esc_html_e( 'Menu Label', 'astra-addon' ); ?></h2>
<!-- Submenu Disable Label/Description field-->
<div class="astra-mm-settings-wrap field-mm-disable-label">
<div class="ast-mm-label-container">
<label for="edit-menu-item-megamenu_disable_title-<?php echo esc_attr( $menu_item_id ); ?>">
<?php esc_html_e( 'Hide Menu Label/Description?', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<input type="checkbox" id="edit-menu-item-megamenu_disable_title-<?php echo esc_attr( $menu_item_id ); ?>" class="code edit-menu-item-megamenu_disable_title" value="disable-title" name="megamenu_disable_title" <?php checked( $megamenu_disable_title, 'disable-title' ); ?> />
</div>
</div>
<!-- Submenu Disable link field-->
<div class="astra-mm-settings-wrap field-mm-disable-link" <?php echo esc_attr( $menulabel_style ); ?>>
<div class="ast-mm-label-container">
<label for="edit-menu-item-megamenu_disable_link-<?php echo esc_attr( $menu_item_id ); ?>">
<?php esc_html_e( 'Disable Link', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<input type="checkbox" id="edit-menu-item-megamenu_disable_link-<?php echo esc_attr( $menu_item_id ); ?>" class="code edit-menu-item-megamenu_disable_link" value="disable-link" name="megamenu_disable_link" <?php checked( $megamenu_disable_link, 'disable-link' ); ?> />
</div>
</div>
</div>
<div class="astra-mm-option-container field-mm-bg-img bg-image-container" <?php echo $mm_container_style; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> >
<h2 class="astra-mm-option-heading"><?php esc_html_e( 'Background Color / Image', 'astra-addon' ); ?></h2>
<div class="astra-mm-settings-wrap">
<div class="ast-mm-label-container">
<label>
<?php esc_html_e( 'Background Color', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<input type="text" data-alpha="true" class="astra-wp-color-input" id="edit-menu-item-megamenu_bg_color-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_bg_color" value="<?php echo esc_attr( $megamenu_bg_color ); ?>"/>
</div>
</div>
<div class="astra-mm-settings-wrap">
<div class="ast-mm-label-container">
<label>
<?php esc_html_e( 'Background Image', 'astra-addon' ); ?>
</label>
</div>
<?php
$image_set_cls = '';
if ( '' != $megamenu_background_image ) {
$image_set_cls = 'ast-image-set';
}
?>
<div class="astra-option-input-container ast-media-img-container <?php echo esc_attr( $image_set_cls ); ?>">
<input type="hidden" id="edit-menu-item-megamenu-background-image-<?php echo esc_attr( $menu_item_id ); ?>" class="regular-text astra-builder-upload-field" name="menu-item-megamenu_background_image" value="<?php echo esc_attr( $megamenu_background_image ); ?>" />
<div class="astra-builder-upload-preview">
<img src="<?php echo esc_attr( $megamenu_background_image ); ?>" id="astra-media-img-background-image-<?php echo esc_attr( $menu_item_id ); ?>" class="astra-megamenu-background-image" style="<?php echo ( trim( $megamenu_background_image ) ) ? 'display:inline;' : ''; ?>" />
</div>
<input type='button' data-id="background-image-<?php echo esc_attr( $menu_item_id ); ?>" class='button-upload astra-builder-upload-button astra-edit-button button button-secondary' data-type="image" value="<?php esc_attr_e( 'Edit', 'astra-addon' ); ?>" />
<input type="button" data-id="background-image-<?php echo esc_attr( $menu_item_id ); ?>" class="button button-secondary upload-image-remove ast-remove-button" value="<?php esc_attr_e( 'Remove', 'astra-addon' ); ?>" />
<input type='button' data-id="background-image-<?php echo esc_attr( $menu_item_id ); ?>" class='button-upload astra-builder-upload-button ast-upload-button button-secondary' data-type="image" value="<?php esc_attr_e( 'Upload Image', 'astra-addon' ); ?>" />
</div>
</div>
<div class="astra-mm-settings-wrap">
<div class="ast-mm-label-container">
<label>
<?php esc_html_e( 'Background Repeat', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<?php
$bg_sizes = array(
'no-repeat' => __( 'No Repeat', 'astra-addon' ),
'repeat' => __( 'Repeat All', 'astra-addon' ),
'repeat-x' => __( 'Repeat Horizontally', 'astra-addon' ),
'repeat-y' => __( 'Repeat Vertically', 'astra-addon' ),
);
?>
<select id="edit-menu-item-megamenu_bg_repeat-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_bg_repeat">
<?php foreach ( $bg_sizes as $key => $value ) { ?>
<option <?php selected( $megamenu_bg_repeat, $key ); ?> value="<?php echo esc_attr( $key ); ?>">
<?php echo esc_html( $value ); ?>
</option>
<?php } ?>
</select>
</div>
</div>
<div class="astra-mm-settings-wrap">
<div class="ast-mm-label-container">
<label>
<?php esc_html_e( 'Background Size', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<?php
$bg_sizes = array(
'auto' => __( 'Auto', 'astra-addon' ),
'cover' => __( 'Cover', 'astra-addon' ),
'contain' => __( 'Contain', 'astra-addon' ),
);
$megamenu_bg_size = ! $megamenu_bg_size ? 'cover' : $megamenu_bg_size;
?>
<select id="edit-menu-item-megamenu_bg_size-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_bg_size">
<?php foreach ( $bg_sizes as $key => $value ) { ?>
<option <?php selected( $megamenu_bg_size, $key ); ?> value="<?php echo esc_attr( $key ); ?>">
<?php echo esc_html( $value ); ?>
</option>
<?php } ?>
</select>
</div>
</div>
<div class="astra-mm-settings-wrap field-mm-bg-position">
<div class="ast-mm-label-container">
<label>
<?php esc_html_e( 'Background Position', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<?php
$bg_positions = array(
'left top' => __( 'Left Top', 'astra-addon' ),
'left center' => __( 'Left Center', 'astra-addon' ),
'left bottom' => __( 'Left Bottom', 'astra-addon' ),
'right top' => __( 'Right Top', 'astra-addon' ),
'right center' => __( 'Right Center', 'astra-addon' ),
'right bottom' => __( 'Right Bottom', 'astra-addon' ),
'center top' => __( 'Center Top', 'astra-addon' ),
'center center' => __( 'Center Center', 'astra-addon' ),
'center bottom' => __( 'Center Bottom', 'astra-addon' ),
);
?>
<select id="edit-menu-item-megamenu_bg_position-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_bg_position">
<?php foreach ( $bg_positions as $key => $value ) { ?>
<option <?php selected( $megamenu_bg_position, $key ); ?> value="<?php echo esc_attr( $key ); ?>">
<?php echo esc_attr( $value ); ?>
</option>
<?php } ?>
</select>
</div>
</div>
</div>
<div class="astra-mm-option-container field-mm-color" <?php echo $mm_container_style; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> >
<h2 class="astra-mm-option-heading"><?php esc_html_e( 'Override Colors for this Mega Menu?', 'astra-addon' ); ?></h2>
<div class="astra-mm-settings-wrap field-mm-text-color">
<div class="ast-mm-label-container">
<label>
<?php esc_html_e( 'Text/Link Color', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<input type="text" data-alpha="true" class="astra-wp-color-input" id="edit-menu-item-megamenu_text_color-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_text_color" value="<?php echo esc_attr( $megamenu_text_color ); ?>"/>
</div>
</div>
<div class="astra-mm-settings-wrap field-mm-text-hover-color">
<div class="ast-mm-label-container">
<label>
<?php esc_html_e( 'Text/Link Hover Color', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<input type="text" data-alpha="true" class="astra-wp-color-input" id="edit-menu-item-megamenu_text_h_color-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_text_h_color" value="<?php echo esc_attr( $megamenu_text_h_color ); ?>"/>
</div>
</div>
<div class="astra-mm-settings-wrap field-mm-column-div-color">
<div class="ast-mm-label-container">
<label>
<?php esc_html_e( 'Column Divider Color', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<input type="text" data-alpha="true" class="astra-wp-color-input" id="edit-menu-item-megamenu_column_divider_color-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_column_divider_color" value="<?php echo esc_attr( $megamenu_column_divider_color ); ?>"/>
</div>
</div>
</div>
<div class="astra-mm-option-container field-mm-content-src <?php echo esc_attr( $parent_container_class ); ?>" >
<h2 class="astra-mm-option-heading"><?php esc_html_e( 'Content Source', 'astra-addon' ); ?></h2>
<div class="astra-mm-settings-wrap">
<div class="ast-mm-label-container">
<label for="edit-menu-item-megamenu_content_src-<?php echo esc_attr( $menu_item_id ); ?>">
<?php esc_html_e( 'Content Source', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<?php
$src = array(
'default' => __( 'Default', 'astra-addon' ),
'custom_text' => __( 'Custom Text', 'astra-addon' ),
'template' => __( 'Template', 'astra-addon' ),
'widget' => __( 'Widget', 'astra-addon' ),
);
?>
<select id="edit-menu-item-megamenu_content_src-<?php echo esc_attr( $menu_item_id ); ?>" class="ast-content-src form-control ast-input" name="menu-item-megamenu_content_src" / >
<?php
$content_src = $megamenu_content_src;
foreach ( $src as $key => $value ) {
echo '<option ' . selected( $content_src, $key ) . " value='" . esc_attr( $key ) . "'>" . esc_attr( $value ) . '</option>';
}
?>
</select>
</div>
</div>
<div class="astra-mm-settings-wrap field-mm-custom-text">
<div class="ast-mm-label-container">
<label for="edit-menu-item-megamenu_custom_text-<?php echo esc_attr( $menu_item_id ); ?>">
<?php esc_html_e( 'Enter Custom Text', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<textarea cols="65" rows="15" class="ast-custom-text-editor" id="menu-item-megamenu_custom_text" name="menu-item-megamenu_custom_text"><?php echo esc_textarea( $megamenu_custom_text ); ?></textarea>
</div>
</div>
<div class="astra-mm-settings-wrap field-mm-template">
<div class="ast-mm-label-container">
<label for="edit-menu-item-megamenu_template-<?php echo esc_attr( $menu_item_id ); ?>">
<?php esc_html_e( 'Template', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<select id="edit-menu-item-megamenu_template-<?php echo esc_attr( $menu_item_id ); ?>" class="form-control ast-input ast-select2-container" name="menu-item-megamenu_template" / >
<?php
if ( ! empty( $megamenu_template ) ) {
$template_title = get_the_title( (int) $megamenu_template );
echo "<option selected='selected' value='" . esc_attr( $megamenu_template ) . "'>" . esc_attr( $template_title ) . '</option>';
}
?>
</select>
</div>
</div>
<div class="astra-mm-settings-wrap field-mm-widget-option">
<div class="ast-mm-label-container">
<label for="edit-menu-item-megamenu_widget-<?php echo esc_attr( $menu_item_id ); ?>">
<?php esc_html_e( 'Insert Widget', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<?php
$widget_obj = Astra_Ext_Nav_Widget_Support::get_instance();
$widgets = $widget_obj->get_widget_list();
?>
<select id="edit-menu-item-megamenu_widget-<?php echo esc_attr( $menu_item_id ); ?>" class="form-control ast-input ast-select-widget" name="menu-item-megamenu_widget" / >
<option value=""><?php esc_html_e( 'Select widget', 'astra-addon' ); ?></option>
<?php
foreach ( $widgets as $widget ) {
echo '<option value="' . esc_attr( $widget['id'] ) . '">' . esc_attr( $widget['text'] ) . '</option>';
}
?>
</select>
<button class="button button-primary ast-insert-widget"><?php esc_html_e( 'Add Widget', 'astra-addon' ); ?></button>
</div>
</div>
<div class="astra-mm-settings-wrap field-mm-widget-area">
<div class="ast-widget-list" id="ast-widget-sortable">
</div>
</div>
</div>
<div class="astra-mm-option-container field-mm-highlight-label" >
<h2 class="astra-mm-option-heading"><?php esc_html_e( 'Highlight Labels', 'astra-addon' ); ?></h2>
<div class="astra-mm-settings-wrap">
<div class="ast-mm-label-container">
<label for="edit-menu-item-megamenu_highlight_label-<?php echo esc_attr( $menu_item_id ); ?>">
<?php esc_html_e( 'Menu Highlight Label', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<input type="text" class="ast-mm-input" id="edit-menu-item-megamenu_highlight_label-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_highlight_label" / value="<?php echo esc_attr( $megamenu_highlight_label ); ?>" >
</div>
</div>
<div class="astra-mm-settings-wrap">
<div class="ast-mm-label-container">
<label>
<?php esc_html_e( 'Highlight Label Color', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<input type="text" data-alpha="true" class="ast-mm-input astra-wp-color-input" id="edit-menu-item-megamenu_label_color-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_label_color" value="<?php echo esc_attr( $megamenu_label_color ); ?>"/>
</div>
</div>
<div class="astra-mm-settings-wrap">
<div class="ast-mm-label-container">
<label>
<?php esc_html_e( 'Highlight Label Background Color', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container">
<input type="text" data-alpha="true" class="ast-mm-input astra-wp-color-input" id="edit-menu-item-megamenu_label_bg_color-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_label_bg_color" value="<?php echo esc_attr( $megamenu_label_bg_color ); ?>"/>
</div>
</div>
</div>
<div class="astra-mm-option-container field-mm-highlight-label field-mm-advanced-options" >
<h2 class="astra-mm-option-heading"><?php esc_html_e( 'Advanced', 'astra-addon' ); ?></h2>
<div class="astra-mm-settings-wrap">
<div class="ast-mm-label-container">
<label for="edit-menu-item-megamenu_margin_top-<?php echo esc_attr( $menu_item_id ); ?>">
<?php esc_html_e( 'Margin (in px)', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container spacing-wrapper">
<ul class="ast-mm-spacing-wrap">
<li clas="spacing-input-item">
<input type="number" class="ast-mm-input" id="edit-menu-item-megamenu_margin_top-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_margin_top" / value="<?php echo esc_attr( $megamenu_margin_top ); ?>" >
<span class="ast-spacing-title"> <?php esc_html_e( 'Top', 'astra-addon' ); ?> </span>
</li>
<li clas="spacing-input-item">
<input type="number" class="ast-mm-input" id="edit-menu-item-megamenu_margin_right-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_margin_right" / value="<?php echo esc_attr( $megamenu_margin_right ); ?>" >
<span class="ast-spacing-title"> <?php esc_html_e( 'Right', 'astra-addon' ); ?> </span>
</li>
<li clas="spacing-input-item">
<input type="number" class="ast-mm-input" id="edit-menu-item-megamenu_margin_bottom-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_margin_bottom" / value="<?php echo esc_attr( $megamenu_margin_bottom ); ?>" >
<span class="ast-spacing-title"> <?php esc_html_e( 'Bottom', 'astra-addon' ); ?> </span>
</li>
<li clas="spacing-input-item">
<input type="number" class="ast-mm-input" id="edit-menu-item-megamenu_margin_left-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_margin_left" / value="<?php echo esc_attr( $megamenu_margin_left ); ?>" >
<span class="ast-spacing-title"> <?php esc_html_e( 'Left', 'astra-addon' ); ?> </span>
</li>
</ul>
</div>
</div>
<div class="astra-mm-settings-wrap">
<div class="ast-mm-label-container">
<label for="edit-menu-item-megamenu_padding_top-<?php echo esc_attr( $menu_item_id ); ?>">
<?php esc_html_e( 'Padding (in px)', 'astra-addon' ); ?>
</label>
</div>
<div class="astra-option-input-container spacing-wrapper">
<ul class="ast-mm-spacing-wrap">
<li clas="spacing-input-item">
<input type="number" class="ast-mm-input" id="edit-menu-item-megamenu_padding_top-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_padding_top" / value="<?php echo esc_attr( $megamenu_padding_top ); ?>" >
<span class="ast-spacing-title"> <?php esc_html_e( 'Top', 'astra-addon' ); ?> </span>
</li>
<li clas="spacing-input-item">
<input type="number" class="ast-mm-input" id="edit-menu-item-megamenu_padding_right-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_padding_right" / value="<?php echo esc_attr( $megamenu_padding_right ); ?>" >
<span class="ast-spacing-title"> <?php esc_html_e( 'Right', 'astra-addon' ); ?> </span>
</li>
<li clas="spacing-input-item">
<input type="number" class="ast-mm-input" id="edit-menu-item-megamenu_padding_bottom-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_padding_bottom" / value="<?php echo esc_attr( $megamenu_padding_bottom ); ?>" >
<span class="ast-spacing-title"> <?php esc_html_e( 'Bottom', 'astra-addon' ); ?> </span>
</li>
<li clas="spacing-input-item">
<input type="number" class="ast-mm-input" id="edit-menu-item-megamenu_padding_left-<?php echo esc_attr( $menu_item_id ); ?>" name="menu-item-megamenu_padding_left" / value="<?php echo esc_attr( $megamenu_padding_left ); ?>" >
<span class="ast-spacing-title"> <?php esc_html_e( 'Left', 'astra-addon' ); ?> </span>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="astra-mm-cta-wrap">
<div class="alignright">
<span class="spinner"></span>
<a data-label="<?php esc_html_e( 'Save', 'astra-addon' ); ?>" class="button button-primary button-large astra-megamenu-save-opts"><?php esc_html_e( 'Save', 'astra-addon' ); ?></a>
<a class="button button-primary button-large astra-megamenu-cancel-btn"> <?php esc_html_e( 'Cancel', 'astra-addon' ); ?>
</a>
</div>
</div>
<?php
$html = ob_get_clean();
wp_send_json_success( $html );
}
/**
* Save menu item meta options.
*
* @return void
* @since 1.6.0
*/
public function save_menu_options() {
$menu_id = sanitize_text_field( $_POST['menu_item_id'] );
check_ajax_referer( 'ast-save-opts-' . $menu_id, 'security_nonce' );
if ( ! current_user_can( 'edit_theme_options' ) ) {
wp_die();
}
$nav_id = sanitize_text_field( $_POST['nav_id'] );
$fields = isset( $_POST['options'] ) ? $_POST['options'] : array();
$widgets = isset( $_POST['widgets'] ) ? $_POST['widgets'] : array();
if ( ! empty( $widgets ) ) {
$fields['megamenu_widgets_list'] = implode( ',', $widgets );
}
if ( ! empty( $fields ) ) {
// Update meta values.
foreach ( $fields as $key => $value ) {
$key = sanitize_text_field( str_replace( 'menu-item-', '', $key ) );
if ( 'megamenu_custom_text' == $key ) {
$value = wp_kses_post( wp_unslash( $value ) );
} else {
$value = sanitize_text_field( wp_unslash( $value ) );
}
update_post_meta( $menu_id, '_menu_item_' . $key, $value );
}
}
wp_send_json_success();
}
/**
* Add Body Classes
*
* @param array $classes Body Class Array.
* @return array
*/
public function body_classes( $classes ) {
if ( ! wp_is_mobile() ) {
$classes[] = 'ast-desktop';
}
return $classes;
}
}
Expand full source code Collapse full source code View on Trac
Methods
- __construct — Constructor
- add_above_menu_classes — Above Header Classes
- add_below_menu_classes — Below Header Classes
- add_custom_fields — Add custom megamenu fields data to the menu.
- add_custom_fields_meta — Add custom menu style fields data to the menu.
- add_fonts — Enqueue Font Family
- add_mega_menu_classes — Mega Menu Header Classes
- add_mega_menu_wrap — Add menu options settings popup wrap at footer.
- add_popup_wrap — Add menu options settings popup wrap at footer.
- add_primary_menu_classes — Primary Header Classes
- body_classes — Add Body Classes
- create_rest_routes — Creating rest routes for mega menu
- dynamic_mega_menu_css — Add global palette to admin section.
- edit_walker — Function to replace normal edit nav walker
- get_instance — Initiator
- get_mega_menu_option — Mega menu configs
- get_mega_menu_option_permission — Checking permissions
- get_post_list_by_query — Function to get posts lists to display.
- load_walker — Function to load custom navigation walker.
- register_mega_menu_script — Register Script for Mega menu.
- render_mm_popup_html — Render HTML for nav menu settings popup.
- save_menu_options — Save menu item meta options.
- set_mega_menu_option — Mega set configs
- set_mega_menu_option_permission — Checking permissions