'wp-mega-menu', 'name' => __("AP Mega Menu Widgets", APMM_TD), 'description' => __("Do not manually edit this area.", APMM_TD) ) ); } /** * Depending on how a widget has been written, it may not necessarily base the new widget settings on * a copy the old settings. If this is the case, the mega menu data will be lost. This function * checks to make sure widgets persist the mega menu data when they're saved. * Note : This Function specially for plugin that need to filter a widget’s settings before saving. * Derived From: Max Mega Menu * https://www.maxmegamenu.com */ public function wpmm_persist_mega_menu_widget_settings($instance, $new_instance, $old_instance, $that) { if (isset($old_instance["wpmm_mega_menu_columns"]) && !isset($new_instance["wpmm_mega_menu_columns"])) { $instance["wpmm_mega_menu_columns"] = $old_instance["wpmm_mega_menu_columns"]; } if (isset($old_instance["wp_menu_order"]) && !isset($new_instance["wp_menu_order"])) { $instance["wp_menu_order"] = $old_instance["wp_menu_order"]; } if (isset($old_instance["wpmm_mega_menu_parent_menu_id"]) && !isset($new_instance["wpmm_mega_menu_parent_menu_id"])) { $instance["wpmm_mega_menu_parent_menu_id"] = $old_instance["wpmm_mega_menu_parent_menu_id"]; } return $instance; } /** * Returns an specific wp mega menu widget object. * Derived From: Max Mega Menu * https://www.maxmegamenu.com */ public function wpmm_get_specific_widgets() { global $wp_widget_factory; $wordpress_widgets = array(); foreach ($wp_widget_factory->widgets as $wordpress_widget) { $enabled_widgets = array('wpmegamenu_contact_info','wpmegamenu_pro_linkimage', 'wpmegamenu_pro_html_text'); $enabled_widgets = apply_filters("wpmegamenu_compatible_widgets", $enabled_widgets); if (in_array($wordpress_widget->id_base, $enabled_widgets)) { $wordpress_widgets[] = array( 'text' => $wordpress_widget->name, 'value' => $wordpress_widget->id_base, 'description' => $wordpress_widget->widget_options['description'] ); } } uasort($wordpress_widgets, array($this, 'wpmm_sort_by_text')); return $wordpress_widgets; } /** * Derived From: Max Mega Menu * https://www.maxmegamenu.com * Returns an objects representing all widgets registered in woocommerce widgets */ public function wpmm_get_woo_widgets() { global $wp_widget_factory; $wordpress_widgets = array(); foreach ($wp_widget_factory->widgets as $wordpress_widget) { if (strpos($wordpress_widget->id_base, 'woocommerce') !== false) { $wordpress_widgets[] = array( 'text' => $wordpress_widget->name, 'value' => $wordpress_widget->id_base, 'description' => $wordpress_widget->widget_options['description'] ); } } uasort($wordpress_widgets, array($this, 'wpmm_sort_by_text')); return $wordpress_widgets; } /** * Derived From: Max Mega Menu * https://www.maxmegamenu.com * Returns an object representing all widgets registered in WordPress */ public function wpmm_get_available_widgets() { global $wp_widget_factory; $wordpress_widgets = array(); foreach ($wp_widget_factory->widgets as $wordpress_widget) { $disabled_widgets = array('wpmegamenu_widget', 'wpmegamenu_contact_info','wpmegamenu_pro_linkimage', 'wpmegamenu_pro_html_text'); $disabled_widgets = apply_filters("wpmegamenu_incompatible_widgets", $disabled_widgets); if (!in_array($wordpress_widget->id_base, $disabled_widgets)) { if (strpos($wordpress_widget->id_base, 'woocommerce') !== false) { } else { $wordpress_widgets[] = array( 'text' => $wordpress_widget->name, 'value' => $wordpress_widget->id_base, 'description' => $wordpress_widget->widget_options['description'] ); } } } uasort($wordpress_widgets, array($this, 'wpmm_sort_by_text')); return $wordpress_widgets; } /** * Derived From: Max Mega Menu * https://www.maxmegamenu.com * Sorts a 2d array by the 'text' key * @param array $a * @param array $b */ public function wpmm_sort_by_text($a, $b) { return strcmp($a['text'], $b['text']); } /** * Derived From: Max Mega Menu * https://www.maxmegamenu.com * Add a widget to the right wp mega menu panel */ public function wpmm_ajax_add_widget() { check_ajax_referer('apmm-ajax-nonce', '_wpnonce'); if (isset($_POST) && $_POST['id_base'] != '' && $_POST['menu_item_id'] != '') { $widgets_id_value = sanitize_text_field($_POST['id_base']); $menu_item_id = $_POST['menu_item_id']; $widget_title = sanitize_text_field($_POST['title']); $added_widgets = $this->wpmm_add_widget_selected($widgets_id_value, $menu_item_id, $widget_title); if ($added_widgets) { if (ob_get_contents()) ob_clean(); wp_send_json_success($added_widgets); } else { if (ob_get_contents()) ob_clean(); wp_send_json_error(sprintf(__("Failed to add %s to %d", APMM_TD), $widgets_id_value, $menu_item_id)); } } } /** * Derived From: Max Mega Menu * https://www.maxmegamenu.com * Adds a widget to WordPress. First creates a new widget instance */ public function wpmm_add_widget_selected($widgets_id_value, $menu_item_id, $widget_title) { require_once( ABSPATH . 'wp-admin/includes/widgets.php' ); $next_id = next_widget_id_number($widgets_id_value); // $this->wpmm_add_widget_instance( $widgets_id_value, $next_id, $menu_item_id ); $my_current_widgetss = get_option('widget_' . $widgets_id_value); $my_current_widgetss[$next_id] = array( "wpmm_mega_menu_columns" => 2, "wpmm_mega_menu_parent_menu_id" => $menu_item_id ); update_option('widget_' . $widgets_id_value, $my_current_widgetss); $widget_id = $this->wpmm_add_widget_to_sidebar($widgets_id_value, $next_id); // include(APMM_PATH.'inc/backend/menu_settings/top_menu/add-widgets_settings.php'); $return .= '
'; $return .= '
'; $return .= '
'; $return .= ''; $return .= '' . esc_html($widget_title) . '
'; $return .= '
'; $return .= ''; $return .= ''; $return .= '2/'; $return .= 'X'; $return .= ''; $return .= ''; $return .= ''; $return .= '
'; $return .= '
'; $return .= '
'; $return .= '
'; return $return; } /** * Adds a widget to the WP Mega Menu widget sidebar * Derived From: Max Mega Menu * https://www.maxmegamenu.com */ private function wpmm_add_widget_to_sidebar($id_base, $next_id) { $widget_id = $id_base . '-' . $next_id; $sidebar_widgets = $this->wpmm_get_mega_menu_sidebar_widgets(); $sidebar_widgets[] = $widget_id; $this->wpmm_set_mega_menu_sidebar_widgets($sidebar_widgets); do_action("wpmm_after_widget_add"); return $widget_id; } /** * Update wp mega columns for a widget * Derived From: Max Mega Menu * https://www.maxmegamenu.com */ public function wpmm_ajax_update_widget() { check_ajax_referer('apmm-ajax-nonce', '_wpnonce'); $widget_id = sanitize_text_field($_POST['widget_unique_id']); $columns = absint($_POST['columns']); $widget_updated = $this->wpmm_update_widget($widget_id, $columns); if ($widget_updated) { $this->wpmm_send_json_success(sprintf(__("Updated %s (new columns: %d)", APMM_TD), $widget_id, $columns)); } else { $this->wpmm_send_json_error(sprintf(__("Failed to update %s", APMM_TD), $widget_id)); } } /** * Updates the number of wp mega columns for a specified widget. * Derived From: Max Mega Menu * https://www.maxmegamenu.com * @param string $widget_id * @param int $columns */ public function wpmm_update_widget($widget_id, $columns) { $id_base = $this->wpmm_get_id_base_for_widget_id($widget_id); //$widget_number = $this->get_widget_number_for_widget_id( $widget_id ); $parts = explode("-", $widget_id); $widget_number = absint(end($parts)); $current_widgets = get_option('widget_' . $id_base); $current_widgets[$widget_number]["wpmm_mega_menu_columns"] = absint($columns); update_option('widget_' . $id_base, $current_widgets); do_action("wpmm_after_widget_save"); return true; } /** * Update the number of wp mega sub menu columns for a widget in mega menu * Derived From: Max Mega Menu * https://www.maxmegamenu.com */ public function wpmm_ajax_update_menu_item_columns() { check_ajax_referer('apmm-ajax-nonce', '_wpnonce'); $submenuid = absint($_POST['sub_menu_id']); $columns = absint($_POST['columns']); $updated = $this->wpmm_update_menuitem_columns($submenuid, $columns); if ($updated) { $this->wpmm_send_json_success(sprintf(__("Updated %s (new columns: %d)", APMM_TD), $submenuid, $columns)); } else { $this->wpmm_send_json_error(sprintf(__("Failed to update %s", APMM_TD), $submenuid)); } } /** * Updates the number of wp mega columns for a specified widget. * Derived From: Max Mega Menu * https://www.maxmegamenu.com * @param string $menu_item_id * @param int $columns */ public function wpmm_update_menuitem_columns($submenuid, $columns) { $settings = get_post_meta($submenuid, '_wpmegamenu', true); $settings['wpmm_mega_menu_columns'] = absint($columns); update_post_meta($submenuid, '_wpmegamenu', $settings); return true; } /** * Derived From: Max Mega Menu * https://www.maxmegamenu.com * Returns the id_base value for a Widget ID */ public function wpmm_get_id_base_for_widget_id($widget_id) { global $wp_registered_widget_controls; if (!isset($wp_registered_widget_controls[$widget_id])) { return false; } $control = $wp_registered_widget_controls[$widget_id]; $id_base = isset($control['id_base']) ? $control['id_base'] : $control['id']; return $id_base; } /** * Derived From: Max Mega Menu * https://www.maxmegamenu.com * Returns an unfiltered array of all widgets in our sidebar */ public function wpmm_get_mega_menu_sidebar_widgets() { $sidebar_widgets = wp_get_sidebars_widgets(); if (!isset($sidebar_widgets['wp-mega-menu'])) { return false; } return $sidebar_widgets['wp-mega-menu']; } /** * Sets the sidebar widgets * Derived From: Max Mega Menu * https://www.maxmegamenu.com */ private function wpmm_set_mega_menu_sidebar_widgets($widgets) { $sidebar_widgets = wp_get_sidebars_widgets(); $sidebar_widgets['wp-mega-menu'] = $widgets; wp_set_sidebars_widgets($sidebar_widgets); } /** * Moves a widget to a new position by sortable order * Derived From: Max Mega Menu * https://www.maxmegamenu.com */ public function wpmm_ajax_reorder_items() { check_ajax_referer('apmm-ajax-nonce', '_wpnonce'); $items = isset($_POST['items']) ? $_POST['items'] : false; $saved = false; if ($items) { $movedwidgets = $this->wpmm_item_reorder($items); } if ($movedwidgets) { $this->wpmm_send_json_success(sprintf(__("Moved (%s)", APMM_TD), json_encode($items))); } else { $this->wpmm_send_json_error(sprintf(__("Didn't move items", APMM_TD), json_encode($items))); } } /** * Moves a widget from one position to another. * Derived From: Max Mega Menu * https://www.maxmegamenu.com * @param array $items * @return string $widget_id. The widget that has been moved. */ public function wpmm_item_reorder($items) { foreach ($items as $item) { if ($item['parent_menu_item_id']) { $parent_menu_id = $item['parent_menu_item_id']; $submitted_settings = array('submenu_ordering' => 'forced'); $existing_settings = get_post_meta($parent_menu_id, '_wpmegamenu', true); if (is_array($existing_settings)) { $submitted_settings = array_merge($existing_settings, $submitted_settings); } update_post_meta($parent_menu_id, '_wpmegamenu', $submitted_settings); } /* * Change the order if its megamenu is widget added for top level menu and save data * into postmeta with key as _wpmegamenu */ if ($item['type'] == 'wp_widget') { $this->wpmm_update_widget_order($item['id'], $item['order'], $item['parent_menu_item_id']); } /* * Change the order if its sub menu items of top level with data-type as wpmm_menu_subitem */ if ($item['type'] == 'wpmm_menu_subitem') { //Updates the order of a specified menu item. $submitted_settings['wp_menu_order'] = array($item['parent_menu_item_id'] => absint($item['order'])); $existing_settings = get_post_meta($item['id'], '_wpmegamenu', true); if (is_array($existing_settings)) { $submitted_settings = array_merge($existing_settings, $submitted_settings); } update_post_meta($item['id'], '_wpmegamenu', $submitted_settings); } } return true; } /** * Updates the order of a specified widget. * Derived From: Max Mega Menu * https://www.maxmegamenu.com * @param string $widget_id * @param int $columns */ public function wpmm_update_widget_order($widget_id, $order, $parent_menu_item_id) { $widget_id_base = $this->wpmm_get_id_base_for_widget_id($widget_id); // $widget_number = $this->wpmm_get_widget_number_for_widget_id( $widget_id ); $parts = explode("-", $widget_id); $widget_number = absint(end($parts)); $current_widgets = get_option('widget_' . $widget_id_base); $current_widgets[$widget_number]["wp_menu_order"] = array($parent_menu_item_id => absint($order)); update_option('widget_' . $widget_id_base, $current_widgets); return true; } /** * Display a widget settings form * Derived From: Max Mega Menu * https://www.maxmegamenu.com */ public function wpmm_ajax_edit_widget_form() { check_ajax_referer('apmm-ajax-nonce', '_wpnonce'); $widget_id = sanitize_text_field($_POST['widget_id_base']); if (ob_get_contents()) ob_clean(); // remove any warnings or output from other plugins which may corrupt the response //echo trim($this->wpmm_show_widget_form( $widget_id )); wp_die(trim($this->wpmm_show_widget_form($widget_id))); } /* * Widget CallBack Form: On edit specific widget on megamenu backend display widgets callback form * Derived From: Max Mega Menu * https://www.maxmegamenu.com */ function wpmm_show_widget_form($widget_id_base) { global $wp_registered_widget_controls; $control_widget = $wp_registered_widget_controls[$widget_id_base]; $id_base = $this->wpmm_get_id_base_for_widget_id($widget_id_base); //$widget_number = $this->get_widget_number_for_widget_id( $widget_id_base ); $parts = explode("-", $widget_id); $widget_number = absint(end($parts)); $widget_nonce = wp_create_nonce('wpmm_save_widget_' . $widget_id_base); ?>
|
wpmm_delete_widgets($widget_id); if ($deleted_widgets) { $this->wpmm_send_json_success(sprintf(__("Deleted %s", APMM_TD), $widget_id)); } else { $this->wpmm_send_json_error(sprintf(__("Failed to delete %s", APMM_TD), $widget_id)); } } /** * Deletes a widget from WordPress * Derived From: Max Mega Menu * https://www.maxmegamenu.com * */ public function wpmm_delete_widgets($widget_id) { $this->wpmm_remove_widget_from_sidebar($widget_id); $this->wpmm_remove_widget_instance($widget_id); do_action("wpmm_after_widget_delete"); return true; } /** * Removes a widget from the WP Mega Menu widget sidebar * Derived From: Max Mega Menu * https://www.maxmegamenu.com * @return string The widget that was removed */ private function wpmm_remove_widget_from_sidebar($widget_id) { $widgets = $this->wpmm_get_mega_menu_sidebar_widgets(); $new_mega_menu_widgets = array(); foreach ($widgets as $widget) { if ($widget != $widget_id) $new_mega_menu_widgets[] = $widget; } $this->wpmm_set_mega_menu_sidebar_widgets($new_mega_menu_widgets); return $widget_id; } /** * Removes a widget instance from the database * Derived From: Max Mega Menu * https://www.maxmegamenu.com */ private function wpmm_remove_widget_instance($widget_id) { $id_base = $this->wpmm_get_id_base_for_widget_id($widget_id); //$widget_number = $this->get_widget_number_for_widget_id( $widget_id ); $parts = explode("-", $widget_id); $widget_number = absint(end($parts)); // add blank widget $current_widgets = get_option('widget_' . $id_base); if (isset($current_widgets[$widget_number])) { unset($current_widgets[$widget_number]); update_option('widget_' . $id_base, $current_widgets); return true; } return false; } /** * Save a widget * Derived From: Max Mega Menu * https://www.maxmegamenu.com */ public function wpmm_ajax_save_widget() { $widget_id = sanitize_text_field($_POST['widget_id']); $id_base = sanitize_text_field($_POST['id_base']); check_ajax_referer('wpmm_save_widget_' . $widget_id); $saved_widgets = $this->wpmm_save_widget($id_base); if ($saved_widgets) { $this->wpmm_send_json_success(sprintf(__("Saved %s", APMM_TD), $id_base)); } else { $this->wpmm_send_json_error(sprintf(__("Failed to save %s", APMM_TD), $id_base)); } } /** * Saves a widget. Calls the update callback on the widget. * Derived From: Max Mega Menu * https://www.maxmegamenu.com * The callback inspects the post values and updates all widget instances which match the base ID. */ public function wpmm_save_widget($id_base) { global $wp_registered_widget_updates; $control_widgets = $wp_registered_widget_updates[$id_base]; if (is_callable($control_widgets['callback'])) { call_user_func_array($control_widgets['callback'], $control_widgets['params']); do_action("wpmm_after_widget_save"); return true; } return false; } /** * Returns an array of widgets and second level menu items for a specified parent menu item. * Used to display the widgets/menu items in the mega menu builder. * Derived From: Max Mega Menu * https://www.maxmegamenu.com * int $parent_menu_item_id * int $menu_id */ public function wpmm_get_widgets_and_menu_items_for_menu_id($parent_menu_item_id, $menu_id) { $menu_items = $this->wpmm_get_second_level_menu_items($parent_menu_item_id, $menu_id); //get all sub menu item $widgets = $this->wpmm_getwidgets_menuid($parent_menu_item_id, $menu_id); $items = array_merge($menu_items, $widgets); $parent_settings = get_post_meta($parent_menu_item_id, '_wpmegamenu', true); // echo "
";
            // print_r($parent_settings);
            // exit();

            $ordering = isset($parent_settings['submenu_ordering']) ? $parent_settings['submenu_ordering'] : 'natural';

            if ($ordering == 'forced') {

                uasort($items, array($this, 'wpmm_sort_by_order'));

                $new_items = $items;
                $end_items = array();

                foreach ($items as $key => $value) {
                    if ($value['order'] == 0) {
                        unset($new_items[$key]);
                        $end_items[] = $value;
                    }
                }

                $items = array_merge($new_items, $end_items);
            }

            return $items;
        }

        /**
         * Derived From: Max Mega Menu
         * https://www.maxmegamenu.com
         * Returns an array of all widgets belonging to a specified menu item ID.
         * int $menu_item_id
         */
        public function wpmm_getwidgets_menuid($parent_menu_item_id, $menu_id) {

            $widgets = array();

            if ($mega_menu_widgets = $this->wpmm_get_mega_menu_sidebar_widgets()) {
                foreach ($mega_menu_widgets as $widget_id) {

                    $settings = $this->wpmm_get_settings_for_widget_id($widget_id);


                    if (isset($settings['wpmm_mega_menu_parent_menu_id']) && $settings['wpmm_mega_menu_parent_menu_id'] == $parent_menu_item_id) {

                        $name = $this->wpmmgetnameforwidgetid($widget_id);

                        $widgets[$widget_id] = array(
                            'id' => $widget_id,
                            'type' => 'wp_widget',
                            'title' => $name,
                            'columns' => $settings['wpmm_mega_menu_columns'],
                            'order' => isset($settings['wp_menu_order'][$parent_menu_item_id]) ? $settings['wp_menu_order'][$parent_menu_item_id] : 0
                        );
                    }
                }
            }

            return $widgets;
        }

        /**
         * Returns the name/title of a Widget
         * Derived From: Max Mega Menu
         * https://www.maxmegamenu.com
         */
        public function wpmmgetnameforwidgetid($widget_id) {
            global $wp_registered_widgets;

            $registered_widget = $wp_registered_widgets[$widget_id];

            return $registered_widget['name'];
        }

        /**
         * Returns the widget data as stored in the options table
         * Derived From: Max Mega Menu
         * https://www.maxmegamenu.com
         */
        public function wpmm_get_settings_for_widget_id($widget_id) {

            $id_base = $this->wpmm_get_id_base_for_widget_id($widget_id);

            if (!$id_base) {
                return false;
            }

            //$widget_number = $this->get_widget_number_for_widget_id( $widget_id );
            $parts = explode("-", $widget_id);

            $widget_number = absint(end($parts));


            $current_widgets = get_option('widget_' . $id_base);

            return $current_widgets[$widget_number];
        }

        /**
         * Returns an array of immediate child menu items for the current item
         * Derived From: Max Mega Menu
         * https://www.maxmegamenu.com
         */
        private function wpmm_get_second_level_menu_items($parent_menu_item_id, $menu_id) {

            $items = array();

            // check we're using a valid menu ID
            if (!is_nav_menu($menu_id)) {
                return $items;
            }

            $menu = wp_get_nav_menu_items($menu_id);
            // echo "
";
            // print_r($menu);
            // die();

            if (count($menu)) {

                foreach ($menu as $item) {

                    // find the child menu items
                    if ($item->menu_item_parent == $parent_menu_item_id) {

                        $saved_settings = array_filter((array) get_post_meta($item->ID, '_wpmegamenu', true));
                        $submitted_default_settings = new AP_Menu_Settings();
                        $submitted_settings = $submitted_default_settings->wpmm_menu_item_defaults();
                        $settings = array_merge($submitted_settings, $saved_settings);
                        // echo "
";
                        // print_r($submitted_settings);
                        // die();
                        $items[$item->ID] = array(
                            'id' => $item->ID,
                            'type' => 'wpmm_menu_subitem', //menu_item i.e second item display on mega menu
                            'title' => $item->title,
                            'columns' => $settings['wpmm_mega_menu_columns'],
                            'order' => isset($settings['wp_menu_order'][$parent_menu_item_id]) ? $settings['wp_menu_order'][$parent_menu_item_id] : 0
                        );
                    }
                }
            }


            return $items;
        }

        /**
         * Sorts a 2d array by the 'order' key
         * Derived From: Max Mega Menu
         * https://www.maxmegamenu.com
         */
        function wpmm_sort_by_order($a, $b) {

            if ($a['order'] == $b['order']) {
                return 1;
            }
            return ($a['order'] < $b['order']) ? -1 : 1;
        }

        /*
         * Derived From: Max Mega Menu
         * https://www.maxmegamenu.com
         */

        public function wpmm_send_json_success($json) {
            if (ob_get_contents())
                ob_clean();

            wp_send_json_success($json);
        }

        /**
         * Send JSON response.
         *
         * Remove any warnings or output from other plugins which may corrupt the response
         * Derived From: Max Mega Menu
         * https://www.maxmegamenu.com
         */
        public function wpmm_send_json_error($json) {
            if (ob_get_contents())
                ob_clean();

            wp_send_json_error($json);
        }

        /**
         * Returns the HTML for a single widget instance.
         *  Derived From: Max Mega Menu
         * https://www.maxmegamenu.com
         */
        public function wpmmshowwidget($id) {
            global $wp_registered_widgets;

            $lists_arr_parameters = array_merge(
                    array(array_merge(array('widgetid' => $id, 'widgetname' => $wp_registered_widgets[$id]['name']))), (array) $wp_registered_widgets[$id]['params']
            );

            $lists_arr_parameters[0]['before_title'] = apply_filters("wpmm_before_widget_title", '

', $wp_registered_widgets[$id]); $lists_arr_parameters[0]['after_title'] = apply_filters("wpmm_after_widget_title", '

', $wp_registered_widgets[$id]); $lists_arr_parameters[0]['before_widget'] = apply_filters("wpmm_before_widget", "", $wp_registered_widgets[$id]); $lists_arr_parameters[0]['after_widget'] = apply_filters("wpmm_after_widget", "", $wp_registered_widgets[$id]); $callback = $wp_registered_widgets[$id]['callback']; if (is_callable($callback)) { ob_start(); call_user_func_array($callback, $lists_arr_parameters); return ob_get_clean(); } } /** * Returns the class name for a widget instance. Get Class of Widgets * Derived From: Max Mega Menu * https://www.maxmegamenu.com */ public function wpmm_getwidget($id) { global $wp_registered_widgets; if (isset($wp_registered_widgets[$id]['classname'])) { return $wp_registered_widgets[$id]['classname']; } return ""; } } endif;