Current File : /home/bravrvjk/growmaxafrica.com/wp-content/plugins/royal-elementor-addons/admin//mega-menu.php
<?php
use WprAddons\Plugin;
// Register Post Type
function register_mega_menu_cpt() {
$args = array(
'label' => esc_html__( 'Royal Mega Menu', 'wpr-addons' ),
'public' => true,
'publicly_queryable' => true,
'rewrite' => false,
'show_ui' => true,
'show_in_menu' => false,
'show_in_nav_menus' => false,
'exclude_from_search' => true,
'capability_type' => 'post',
'supports' => array( 'title', 'editor', 'elementor' ),
'hierarchical' => false,
);
register_post_type( 'wpr_mega_menu', $args );
}
// Convert to Canvas Template
function convert_to_canvas_template( $template ) {
if ( is_singular('wpr_mega_menu') ) {
$template = WPR_ADDONS_PATH . 'admin/templates/wpr-canvas.php';
}
return $template;
}
// Init Mega Menu
function init_mega_menu() {
register_mega_menu_cpt();
add_action( 'template_include', 'convert_to_canvas_template', 9999 );
}
add_action('init', 'init_mega_menu', 999);
// Confinue only for Dashboard Screen
if ( !is_admin() ) return;
// Init Actions
add_filter( 'option_elementor_cpt_support', 'add_mega_menu_cpt_support' );
add_filter( 'default_option_elementor_cpt_support', 'add_mega_menu_cpt_support' );
add_action( 'admin_footer', 'render_settings_popup', 10 );
add_action( 'wp_ajax_wpr_create_mega_menu_template', 'wpr_create_mega_menu_template' );
add_action( 'wp_ajax_wpr_save_mega_menu_settings', 'wpr_save_mega_menu_settings' );
add_action( 'admin_enqueue_scripts', 'enqueue_scripts' );
// Add Elementor Editor Support
function add_mega_menu_cpt_support( $value ) {
if ( empty( $value ) ) {
$value = [];
}
return array_merge( $value, ['wpr_mega_menu'] );
}
// Create Menu Template
function wpr_create_mega_menu_template() {
if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'wpr-mega-menu-js' ) || ! current_user_can( 'manage_options' ) ) {
wp_send_json_error( [ 'message' => 'Invalid request.' ] );
return;
}
if ( ! isset( $_POST['item_id'] ) ) {
wp_send_json_error( [ 'message' => 'Missing item_id.' ] );
return;
}
$menu_item_id = absint( $_POST['item_id'] );
$menu_item = get_post( $menu_item_id );
if ( ! $menu_item || $menu_item->post_type !== 'nav_menu_item' ) {
wp_send_json_error( [ 'message' => 'Invalid menu item.' ] );
return;
}
$mega_menu_id = get_post_meta( $menu_item_id, 'wpr-mega-menu-item', true );
if ( ! $mega_menu_id ) {
$mega_menu_id = wp_insert_post( array(
'post_title' => 'wpr-mega-menu-item-' . $menu_item_id,
'post_status' => 'publish',
'post_type' => 'wpr_mega_menu',
) );
update_post_meta( $menu_item_id, 'wpr-mega-menu-item', $mega_menu_id );
}
$edit_link = add_query_arg(
array(
'post' => $mega_menu_id,
'action' => 'elementor',
),
admin_url( 'post.php' )
);
wp_send_json([
'data' => [
'edit_link' => $edit_link
]
]);
}
// Render Settings Popup
function render_settings_popup() {
$screen = get_current_screen();
if ( 'nav-menus' !== $screen->base ) {
return;
}
?>
<div class="wpr-mm-settings-popup-wrap">
<div class="wpr-mm-settings-popup">
<div class="wpr-mm-settings-popup-header">
<span class="wpr-mm-popup-logo" style="background:url('<?php echo esc_url( WPR_ADDONS_ASSETS_URL . 'img/logo-40x40.png' ); ?>') no-repeat center center / contain;">RE</span>
<span><?php esc_html_e('Royal Mega Menu', 'wpr-addons'); ?></span>
<span class="wpr-mm-popup-title"><?php esc_html_e('Menu Item: ', 'wpr-addons'); ?><span></span></span>
<span class="dashicons dashicons-no-alt wpr-mm-settings-close-popup-btn"></span>
</div>
<?php $pro_active = defined('WPR_ADDONS_PRO_VERSION') && wpr_fs()->can_use_premium_code() ? 'data-pro-active="true"' : 'data-pro-active="false"'; ?>
<div class="wpr-mm-settings-wrap" <?php echo $pro_active; ?>>
<h4><?php esc_html_e('General', 'wpr-addons'); ?></h4>
<div class="wpr-mm-setting wpr-mm-setting-switcher">
<h4><?php esc_html_e('Enable Mega Menu', 'wpr-addons'); ?></h4>
<input type="checkbox" id="wpr_mm_enable">
<label for="wpr_mm_enable"></label>
</div>
<div class="wpr-mm-setting">
<h4><?php esc_html_e('Mega Menu Content', 'wpr-addons'); ?></h4>
<button class="button button-primary wpr-edit-mega-menu-btn">
<i class="eicon-elementor-square" aria-hidden="true"></i>
<?php esc_html_e('Edit with Elementor', 'wpr-addons'); ?>
</button>
</div>
<div class="wpr-mm-setting">
<h4><?php esc_html_e('Dropdown Position', 'wpr-addons'); ?></h4>
<select id="wpr_mm_position">
<option value="default"><?php esc_html_e('Default', 'wpr-addons'); ?></option>
<option value="relative"><?php esc_html_e('Relative', 'wpr-addons'); ?></option>
</select>
</div>
<div class="wpr-mm-setting">
<h4><?php esc_html_e('Dropdown Width', 'wpr-addons'); ?></h4>
<select id="wpr_mm_width">
<option value="default"><?php esc_html_e('Default', 'wpr-addons'); ?></option>
<?php if ( !defined('WPR_ADDONS_PRO_VERSION') || !wpr_fs()->can_use_premium_code() ) : ?>
<option value="pro-st"><?php esc_html_e('Fit to Section (Pro)', 'wpr-addons'); ?></option>
<?php else: ?>
<option value="stretch"><?php esc_html_e('Fit to Section', 'wpr-addons'); ?></option>
<?php endif; ?>
<option value="full"><?php esc_html_e('Full Width', 'wpr-addons'); ?></option>
<option value="custom"><?php esc_html_e('Custom', 'wpr-addons'); ?></option>
</select>
</div>
<div class="wpr-mm-setting">
<h4><?php esc_html_e('Custom Width (px)', 'wpr-addons'); ?></h4>
<input type="number" id="wpr_mm_custom_width" value="600">
</div>
<div class="wpr-mm-setting <?php echo !defined('WPR_ADDONS_PRO_VERSION') || !wpr_fs()->can_use_premium_code() ? 'wpr-mm-pro-setting' : ''; ?>">
<h4><?php esc_html_e('Mobile Sub Content', 'wpr-addons'); ?></h4>
<div>
<select id="wpr_mm_mobile_content">
<option value="mega"><?php esc_html_e('Mega Menu', 'wpr-addons'); ?></option>
<option value="wp-sub"><?php esc_html_e('WordPress Sub Items', 'wpr-addons'); ?></option>
</select>
<div class="wpr-mm-pro-radio">
<input type="radio" name="mc" checked="checked">
<label>Mega Menu</label><br>
<input type="radio" name="mc">
<label>WordPress Sub Items</label>
</div>
</div>
</div>
<div class="wpr-mm-setting <?php echo !defined('WPR_ADDONS_PRO_VERSION') || !wpr_fs()->can_use_premium_code() ? 'wpr-mm-pro-setting' : ''; ?>">
<h4><?php esc_html_e('Mobile Sub Render', 'wpr-addons'); ?></h4>
<div>
<select id="wpr_mm_render">
<option value="default"><?php esc_html_e('Default', 'wpr-addons'); ?></option>
<option value="ajax"><?php esc_html_e('Load with AJAX', 'wpr-addons'); ?></option>
</select>
<div class="wpr-mm-pro-radio">
<input type="radio" name="mr" checked="checked">
<label>Default</label><br>
<input type="radio" name="mr">
<label>Load with AJAX</label>
</div>
</div>
</div>
<br>
<h4 <?php echo !defined('WPR_ADDONS_PRO_VERSION') || !wpr_fs()->can_use_premium_code() ? 'class="wpr-mm-pro-heading"' : ''; ?>>
<?php esc_html_e('Icon', 'wpr-addons'); ?>
</h4>
<div <?php echo !defined('WPR_ADDONS_PRO_VERSION') || !wpr_fs()->can_use_premium_code() ? 'class="wpr-mm-pro-section"' : ''; ?>>
<div class="wpr-mm-setting wpr-mm-setting-icon">
<h4><?php esc_html_e('Icon Select', 'wpr-addons'); ?></h4>
<div><span class="wpr-mm-active-icon"><i class="fas fa-ban"></i></span><span><i class="fas fa-angle-down"></i></span></div>
<input type="text" id="wpr_mm_icon_picker" data-alpha="true" value="">
</div>
<div class="wpr-mm-setting wpr-mm-setting-color">
<h4><?php esc_html_e('Icon Color', 'wpr-addons'); ?></h4>
<input type="text" id="wpr_mm_icon_color" data-alpha="true" value="rgba(0,0,0,0.6);">
</div>
<div class="wpr-mm-setting">
<h4><?php esc_html_e('Icon Size (px)', 'wpr-addons'); ?></h4>
<input type="number" id="wpr_mm_icon_size" value="14">
</div>
</div>
<br>
<h4 <?php echo !defined('WPR_ADDONS_PRO_VERSION') || !wpr_fs()->can_use_premium_code() ? 'class="wpr-mm-pro-heading"' : ''; ?>>
<?php esc_html_e('Badge', 'wpr-addons'); ?>
</h4>
<div <?php echo !defined('WPR_ADDONS_PRO_VERSION') || !wpr_fs()->can_use_premium_code() ? 'class="wpr-mm-pro-section"' : ''; ?>>
<div class="wpr-mm-setting">
<h4><?php esc_html_e('Badge Text', 'wpr-addons'); ?></h4>
<input type="text" id="wpr_mm_badge_text" value="">
</div>
<div class="wpr-mm-setting wpr-mm-setting-color">
<h4><?php esc_html_e('Badge Text Color', 'wpr-addons'); ?></h4>
<input type="text" id="wpr_mm_badge_color" data-alpha="true" value="rgba(0,0,0,0.6);">
</div>
<div class="wpr-mm-setting wpr-mm-setting-color">
<h4><?php esc_html_e('Badge Background Color', 'wpr-addons'); ?></h4>
<input type="text" id="wpr_mm_badge_bg_color" data-alpha="true" value="rgba(0,0,0,0.6);">
</div>
<div class="wpr-mm-setting wpr-mm-setting-switcher">
<h4><?php esc_html_e('Enable Animation', 'wpr-addons'); ?></h4>
<input type="checkbox" id="wpr_mm_badge_animation">
<label for="wpr_mm_badge_animation"></label>
</div>
</div>
</div>
<div class="wpr-mm-settings-popup-footer">
<button class="button wpr-save-mega-menu-btn"><?php esc_html_e('Save', 'wpr-addons'); ?></button>
</div>
</div>
</div>
<!-- Iframe Popup -->
<div class="wpr-mm-editor-popup-wrap">
<div class="wpr-mm-editor-close-popup-btn"><span class="dashicons dashicons-no-alt"></span></div>
<div class="wpr-mm-editor-popup-iframe"></div>
</div>
<?php
}
/**
* Allowed mega menu setting keys (whitelist for sanitization).
*
* @return array
*/
function wpr_mega_menu_allowed_settings_keys() {
return [
'wpr_mm_enable',
'wpr_mm_position',
'wpr_mm_width',
'wpr_mm_custom_width',
'wpr_mm_mobile_content',
'wpr_mm_render',
'wpr_mm_icon_picker',
'wpr_mm_icon_color',
'wpr_mm_icon_size',
'wpr_mm_badge_text',
'wpr_mm_badge_color',
'wpr_mm_badge_bg_color',
'wpr_mm_badge_animation',
];
}
/**
* Sanitize a single mega menu setting value.
*
* @param mixed $value Raw value.
* @param string $key Setting key.
* @return mixed Sanitized value.
*/
function wpr_sanitize_mega_menu_setting( $value, $key ) {
if ( ! is_scalar( $value ) ) {
return '';
}
$value = (string) $value;
if ( in_array( $key, [ 'wpr_mm_icon_color', 'wpr_mm_badge_color', 'wpr_mm_badge_bg_color' ], true ) ) {
return sanitize_text_field( $value );
}
if ( $key === 'wpr_mm_icon_size' || $key === 'wpr_mm_custom_width' ) {
return absint( $value );
}
return sanitize_text_field( $value );
}
// Save Mega Menu Settings
function wpr_save_mega_menu_settings() {
if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'wpr-mega-menu-js' ) || ! current_user_can( 'manage_options' ) ) {
wp_send_json_error( [ 'message' => 'Invalid request.' ] );
return;
}
if ( ! isset( $_POST['item_id'] ) || ! isset( $_POST['item_settings'] ) || ! is_array( $_POST['item_settings'] ) ) {
wp_send_json_error( [ 'message' => 'Missing item_id or item_settings.' ] );
return;
}
$item_id = absint( $_POST['item_id'] );
$item_post = get_post( $item_id );
if ( ! $item_post || $item_post->post_type !== 'nav_menu_item' ) {
wp_send_json_error( [ 'message' => 'Invalid menu item.' ] );
return;
}
$allowed_keys = wpr_mega_menu_allowed_settings_keys();
$raw = wp_unslash( $_POST['item_settings'] );
$sanitized = [];
foreach ( $allowed_keys as $key ) {
if ( array_key_exists( $key, $raw ) ) {
$sanitized[ $key ] = wpr_sanitize_mega_menu_setting( $raw[ $key ], $key );
}
}
update_post_meta( $item_id, 'wpr-mega-menu-settings', $sanitized );
wp_send_json_success( $sanitized );
}
// Get Menu Items Data
function get_menu_items_data( $menu_id = false ) {
if ( ! $menu_id ) {
return false;
}
$menu = wp_get_nav_menu_object( $menu_id );
$menu_items = wp_get_nav_menu_items( $menu );
if ( ! $menu_items ) {
return false;
}
return $menu_items;
}
// Get Mega Menu Item Settings
function get_menu_items_settings() {
$menu_items = get_menu_items_data( get_selected_menu_id() );
$settings = [];
if ( ! $menu_items ) {
return [];
} else {
foreach ( $menu_items as $key => $item_object ) {
$item_id = $item_object->ID;
$item_meta = get_post_meta( $item_id, 'wpr-mega-menu-settings', true );
if ( !empty($item_meta) ) {
$settings[ $item_id ] = $item_meta;
} else {
$settings[ $item_id ] = [];
}
}
return $settings;
}
}
/**
* Get the Selected menu ID
* @author Tom Hemsley (https://wordpress.org/plugins/megamenu/)
*/
function get_selected_menu_id() {
$nav_menus = wp_get_nav_menus( array('orderby' => 'name') );
$menu_count = count( $nav_menus );
$nav_menu_selected_id = isset( $_REQUEST['menu'] ) ? (int) $_REQUEST['menu'] : 0;
$add_new_screen = ( isset( $_GET['menu'] ) && 0 == $_GET['menu'] ) ? true : false;
$current_menu_id = $nav_menu_selected_id;
// If we have one theme location, and zero menus, we take them right into editing their first menu
$page_count = wp_count_posts( 'page' );
$one_theme_location_no_menus = ( 1 == count( get_registered_nav_menus() ) && ! $add_new_screen && empty( $nav_menus ) && ! empty( $page_count->publish ) ) ? true : false;
// Get recently edited nav menu
$recently_edited = absint( get_user_option( 'nav_menu_recently_edited' ) );
if ( empty( $recently_edited ) && is_nav_menu( $current_menu_id ) ) {
$recently_edited = $current_menu_id;
}
// Use $recently_edited if none are selected
if ( empty( $current_menu_id ) && ! isset( $_GET['menu'] ) && is_nav_menu( $recently_edited ) ) {
$current_menu_id = $recently_edited;
}
// On deletion of menu, if another menu exists, show it
if ( ! $add_new_screen && 0 < $menu_count && isset( $_GET['action'] ) && 'delete' == $_GET['action'] ) {
$current_menu_id = $nav_menus[0]->term_id;
}
// Set $current_menu_id to 0 if no menus
if ( $one_theme_location_no_menus ) {
$current_menu_id = 0;
} elseif ( empty( $current_menu_id ) && ! empty( $nav_menus ) && ! $add_new_screen ) {
// if we have no selection yet, and we have menus, set to the first one in the list
$current_menu_id = $nav_menus[0]->term_id;
}
return $current_menu_id;
}
// Enqueue Scripts and Styles
function enqueue_scripts( $hook ) {
// Get Plugin Version
$version = Plugin::instance()->get_version();
// Deny if NOT a Menu Page
if ( 'nav-menus.php' == $hook ) {
// Color Picker
wp_enqueue_style( 'wp-color-picker' );
wp_enqueue_script( 'wp-color-picker-alpha', WPR_ADDONS_URL .'assets/js/admin/lib/wp-color-picker-alpha.min.js', ['jquery', 'wp-color-picker'], $version, true );
// Icon Picker
wp_enqueue_script( 'wpr-iconpicker-js', WPR_ADDONS_URL .'assets/js/admin/lib/iconpicker/fontawesome-iconpicker.min.js', ['jquery'], $version, true );
wp_enqueue_style( 'wpr-iconpicker-css', WPR_ADDONS_URL .'assets/js/admin/lib/iconpicker/fontawesome-iconpicker.min.css', $version, true );
wp_enqueue_style( 'wpr-el-fontawesome-css', ELEMENTOR_URL .'assets/lib/font-awesome/css/all.min.css', [], $version );
// enqueue CSS
wp_enqueue_style( 'wpr-mega-menu-css', WPR_ADDONS_URL .'assets/css/admin/mega-menu.css', [], $version );
// enqueue JS
wp_enqueue_script( 'wpr-mega-menu-js', WPR_ADDONS_URL .'assets/js/admin/mega-menu.js', ['jquery'], $version );
wp_localize_script(
'wpr-mega-menu-js',
'WprMegaMenuSettingsData',
[
'settingsData' => get_menu_items_settings(),
'nonce' => wp_create_nonce( 'wpr-mega-menu-js' ),
]
);
}
}