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;
}
?>
'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' ),
]
);
}
}