File "quadmenu.php"

Full Path: /home/htzslrk/www1/wp-content/plugins/quadmenu/quadmenu.php
File size: 19.4 KB
MIME-type: text/x-php
Charset: utf-8

<?php

/*
 * Plugin Name: QuadMenu
 * Plugin URI:  https://quadmenu.com
 * Description: The best drag & drop WordPress Mega Menu plugin which allow you to create Tabs Menus & Carousel Menus.
 * Version:     2.1.9
 * Author:      Mega Menu
 * Author URI:  https://quadmenu.com
 * Copyright:   2018 QuadMenu (https://quadmenu.com)
 * Text Domain: quadmenu
 */

if (!defined('ABSPATH')) {
  die('-1');
}

define('QUADMENU_PLUGIN_NAME', 'QuadMenu');
define('QUADMENU_PLUGIN_VERSION', '2.1.9');
define('QUADMENU_PLUGIN_FILE', __FILE__);
define('QUADMENU_PLUGIN_DIR', __DIR__ . DIRECTORY_SEPARATOR);
define('QUADMENU_PLUGIN_URL', plugin_dir_url(QUADMENU_PLUGIN_FILE));
define('QUADMENU_PLUGIN_BASENAME', plugin_basename(QUADMENU_PLUGIN_FILE));
define('QUADMENU_PREFIX', 'quadmenu');
define('QUADMENU_WORDPRESS_URL', 'https://wordpress.org/plugins/quadmenu/');
define('QUADMENU_REVIEW_URL', 'https://wordpress.org/support/plugin/quadmenu/reviews/?filter=5#new-post');
define('QUADMENU_DEMO_URL', 'https://quadmenu.com/?utm_source=quadmenu_admin');
define('QUADMENU_PURCHASE_URL', QUADMENU_DEMO_URL);
define('QUADMENU_SUPPORT_URL', 'https://quadmenu.com/account/support/?utm_source=quadmenu_admin');
define('QUADMENU_DOCUMENTATION_URL', 'https://quadmenu.com/documentation/?utm_source=quadmenu_admin');
define('QUADMENU_GROUP_URL', 'https://www.facebook.com/groups/quadlayers');
define('QUADMENU_DB_THEME', '_quadmenu_theme');
define('QUADMENU_DB_ITEM', '_menu_item_quadmenu');
define('QUADMENU_DEV', false);
define('QUADMENU_COMPILE', true);
//Pro compatibility
define('QUADMENU_DOMAIN', 'quadmenu');
define('QUADMENU_PATH', QUADMENU_PLUGIN_DIR);
define('QUADMENU_DEMO', QUADMENU_DEMO_URL);


if (!class_exists('QL_Widget')) {
  include_once(QUADMENU_PLUGIN_DIR . 'includes/quadlayers/widget.php');
}


if (!class_exists('QuadMenu')) :

  final class QuadMenu
  {

    private $prefix = '#quadmenu-';
    private static $instance;
    private $registered_icons;
    private $registered_icons_names;
    public $selected_icons;

    public static function instance()
    {
      if (!isset(self::$instance)) {
        self::$instance = new QuadMenu;
        self::$instance->constants();
        self::$instance->config();
        self::$instance->includes();
        self::$instance->compatibility();
        self::$instance->hooks();
        self::$instance->errors();
      }
      return self::$instance;
    }

    private function config()
    {
      require_once QUADMENU_PLUGIN_DIR . 'includes/configuration.php';
    }

    private function compatibility()
    {
      require_once QUADMENU_PLUGIN_DIR . 'includes/3rd/woocommerce.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/3rd/polylang.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/3rd/vc.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/3rd/elementor.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/3rd/beaver.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/3rd/divi.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/widget.php';
    }

    private function hooks()
    {

      add_filter('wp_get_nav_menu_items', array($this, 'remove_nav_menu_item'), 20, 3);
      add_filter('wp_setup_nav_menu_item', array($this, 'setup_nav_menu_item_options'), 90);
      add_filter('quadmenu_setup_nav_menu_item', array($this, 'setup_nav_menu_item_parents'), 5);
      add_filter('quadmenu_setup_nav_menu_item', array($this, 'setup_nav_menu_item_validation'), 10);

      add_action('init', array($this, 'register_sidebar'));
      add_action('init', array($this, 'register_icons'), -35);
      add_action('init', array($this, 'admin'), -25);
      add_action('init', array($this, 'compiler'), -20);
      add_action('init', array($this, 'locations'), -15);
      add_action('init', array($this, 'init'), -10);
      add_action('init', array($this, 'frontend'), -5);
      add_action('admin_init', array($this, 'navmenu'));

      add_action('plugins_loaded', array($this, 'i18n'));
    }

    public function register_sidebar()
    {

      register_sidebar(
        array(
          'id' => 'quadmenu-widgets',
          'name' => esc_html__('QuadMenu Widgets', 'quadmenu'),
          'description' => esc_html__('Do not manually edit this sidebar.', 'quadmenu')
        )
      );
    }

    function register_icons()
    {

      foreach (apply_filters('quadmenu_register_icons', array()) as $id => $settings) {

        //if (!wp_style_is($id, $list = 'registered')) {
        //  wp_register_style($id, $settings['url']);
        // }

        $settings['ID'] = $id;

        $this->registered_icons[$id] = (object) $settings;

        $this->registered_icons_names[$id] = $settings['name'];
      }
    }

    function registered_icons()
    {
      return (object) $this->registered_icons;
    }

    function registered_icons_names()
    {
      return $this->registered_icons_names;
    }

    function selected_icons()
    {

      global $quadmenu;

      $this->selected_icons = $this->registered_icons()->dashicons;

      if (!empty($quadmenu['styles_icons']) && isset($this->registered_icons()->{$quadmenu['styles_icons']})) {
        $this->selected_icons = $this->registered_icons()->{$quadmenu['styles_icons']};
      }

      if (!wp_style_is($this->selected_icons->ID, $list = 'registered')) {
        wp_register_style($this->selected_icons->ID, $this->selected_icons->url);
      }

      return $this->selected_icons;
    }


    /*     function selected_icons() {

      global $quadmenu;

      if (empty($quadmenu['styles_icons'])) {
        self::$selected_icons = $this->registered_icons()->dashicons;
      }

      if (empty($this->registered_icons()->{$quadmenu['styles_icons']})) {
        self::$selected_icons = $this->registered_icons()->dashicons;
      }

      self::$selected_icons = $this->registered_icons()->{$quadmenu['styles_icons']};

      if (!wp_style_is(self::$selected_icons->ID, $list = 'registered')) {
        wp_register_style(self::$selected_icons->ID, self::$selected_icons->url);
      }

      return self::$selected_icons;
    } */

    private function theme()
    {

      $theme = get_stylesheet();

      $theme = preg_replace('/[^a-zA-Z0-9_\-]/', '', $theme);

      return $theme;
    }

    private function constants()
    {

      $upload_dir = wp_upload_dir();

      define('QUADMENU_DB_OPTIONS', "quadmenu_{$this->theme()}");

      define('QUADMENU_DB_THEMES', "quadmenu_{$this->theme()}_themes");

      define('QUADMENU_DB_LOCATIONS', "quadmenu_{$this->theme()}_locations");

      define('QUADMENU_UPLOAD_DIR', trailingslashit("{$upload_dir['basedir']}/{$this->theme()}"));

      define('QUADMENU_UPLOAD_URL', set_url_scheme(trailingslashit("{$upload_dir['baseurl']}/{$this->theme()}")));

      define('QUADMENU_PANEL', apply_filters('quadmenu_hook_menu_panel', 'quadmenu_options'));

      // Compatibility
      define('QUADMENU_PATH_CSS', QUADMENU_UPLOAD_DIR);
      define('QUADMENU_URL_CSS', QUADMENU_UPLOAD_URL);
      define('QUADMENU_OPTIONS', QUADMENU_DB_OPTIONS);
      define('QUADMENU_THEMES', QUADMENU_DB_THEMES);
      define('QUADMENU_LOCATIONS', QUADMENU_DB_LOCATIONS);
    }

    private function includes()
    {

      require_once QUADMENU_PLUGIN_DIR . 'includes/functions.php';

      require_once QUADMENU_PLUGIN_DIR . 'includes/import.php';

      require_once QUADMENU_PLUGIN_DIR . 'includes/activation.php';

      require_once QUADMENU_PLUGIN_DIR . 'includes/panel.php';
    }

    public function admin()
    {
      require_once QUADMENU_PLUGIN_DIR . 'includes/admin.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/panel/welcome.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/panel/system.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/panel/options.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/panel/suggestions.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/panel/premium.php';
    }

    public function locations()
    {
      require_once QUADMENU_PLUGIN_DIR . 'includes/locations.php';
    }

    public function init()
    {
      require_once QUADMENU_PLUGIN_DIR . 'includes/themes.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/options.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/redux.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/icons.php';
    }

    public function compiler()
    {

      if (!is_admin() && !is_customize_preview())
        return;

      require_once QUADMENU_PLUGIN_DIR . 'includes/compiler.php';
    }

    function nav_menu_selected_id()
    {

      if (wp_doing_ajax() && isset($_REQUEST['menu_id'])) {
        return (int) $_REQUEST['menu_id'];
      }

      $nav_menus = wp_get_nav_menus(array('orderby' => 'name'));

      $menu_count = count($nav_menus);

      // Get recently edited nav menu
      $recently_edited = (int) get_user_option('nav_menu_recently_edited');

      $nav_menu_selected_id = isset($_REQUEST['menu']) ? (int) $_REQUEST['menu'] : 0;

      // Are we on the add new screen?
      $add_new_screen = (isset($_REQUEST['menu']) && 0 == $_REQUEST['menu']) ? true : false;

      $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;

      if (empty($recently_edited) && is_nav_menu($nav_menu_selected_id))
        $recently_edited = $nav_menu_selected_id;

      // Use $recently_edited if none are selected.
      if (empty($nav_menu_selected_id) && !isset($_REQUEST['menu']) && is_nav_menu($recently_edited))
        $nav_menu_selected_id = $recently_edited;

      // On deletion of menu, if another menu exists, show it.
      if (!$add_new_screen && 0 < $menu_count && isset($_REQUEST['action']) && 'delete' == $_REQUEST['action'])
        $nav_menu_selected_id = $nav_menus[0]->term_id;

      // Set $nav_menu_selected_id to 0 if no menus.
      if ($one_theme_location_no_menus) {
        $nav_menu_selected_id = 0;
      } elseif (empty($nav_menu_selected_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.
        $nav_menu_selected_id = $nav_menus[0]->term_id;
      }

      return $nav_menu_selected_id;
    }

    function is_quadmenu($nav_menu_selected_id = false)
    {

      global $quadmenu_active_locations;

      if (!$menu_locations = isset($_REQUEST['menu-locations']) && is_array($_REQUEST['menu-locations']) ? $_REQUEST['menu-locations'] : get_nav_menu_locations()) {
        return false;
      }

      if (!$nav_menu_selected_id = $this->nav_menu_selected_id()) {
        return false;
      }

      // chek if this menu id is in the theme locations
      if (!in_array(sanitize_key($nav_menu_selected_id), $menu_locations)) {
        return false;
      }

      if (count(array_intersect(array_keys($menu_locations, $nav_menu_selected_id), array_keys((array) $quadmenu_active_locations))) > 0) {
        return true;
      }

      return false;
    }

    function is_quadmenu_location($location = false)
    {

      global $quadmenu_active_locations;

      if (!empty($quadmenu_active_locations[$location])) {
        return true;
      }

      return false;
    }

    public function navmenu()
    {

      if (is_quadmenu()) {

        require_once QUADMENU_PLUGIN_DIR . 'includes/backend/settings.php';
        require_once QUADMENU_PLUGIN_DIR . 'includes/backend/walker/widgets.php';
        require_once QUADMENU_PLUGIN_DIR . 'includes/backend/walker/columns.php';
        require_once QUADMENU_PLUGIN_DIR . 'includes/backend/walker/mega.php';
        require_once QUADMENU_PLUGIN_DIR . 'includes/backend/walker/defaults.php';
        require_once QUADMENU_PLUGIN_DIR . 'includes/backend/ajax.php';
      }
    }

    public function frontend()
    {

      //if (is_admin())
      //    return;

      require_once QUADMENU_PLUGIN_DIR . 'includes/frontend/frontend.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/frontend/integration.php';
      require_once QUADMENU_PLUGIN_DIR . 'includes/frontend/items.php';
    }

    public function setup_nav_menu_item_options($item)
    {

      //if (empty($item->quadmenu)) {
      if (isset($item->ID)) {

        $saved_settings = (array) get_post_meta($item->ID, QUADMENU_DB_ITEM, true);

        foreach ($saved_settings as $key => $value) {
          $item->{$key} = $value;
        }

        return apply_filters('quadmenu_setup_nav_menu_item', $item);
      }
      //}

      return $item;
    }

    public function setup_nav_menu_item_parents($item)
    {

      global $wp_registered_widgets;

      $items = QuadMenu_Configuration::custom_nav_menu_items();

      // Quadmenu
      // -----------------------------------------------------------------

      if (strpos($item->url, $this->prefix) !== false) {
        $item->quadmenu = str_replace($this->prefix, '', $item->url);
      }

      if (isset($item->quadmenu)) {
        if (!empty($items->{$item->quadmenu}->label)) {
          $item->type_label = '[' . $items->{$item->quadmenu}->label . ']';
        }
      }

      if (isset($item->quadmenu) && $item->object == 'custom') {
        $item->object = $item->quadmenu;
      }

      if (!isset($item->quadmenu)) {
        $item->quadmenu = $item->type;
      }

      // Replace quadmenu with object if defined
      // -----------------------------------------------------------------

      if (isset($items->{$item->object})) {
        $item->quadmenu = $item->object;
      }

      // Replace quadmenu with object post_archive
      // -----------------------------------------------------------------
      if ($item->type === 'post_type_archive' && isset($items->{$item->object . '_archive'})) {
        $item->quadmenu = $item->object . '_archive';
      }

      // Parent
      // -----------------------------------------------------------------
      if (empty($item->quadmenu_menu_item_parent)) {
        if (!empty($item->menu_item_parent)) {

          $parent_obj = QuadMenu::wp_setup_nav_menu_item($item->menu_item_parent);

          if (isset($parent_obj->type)) {
            //brokes the subitems
            //if (!empty($parent_obj->quadmenu)) {
            if (isset($parent_obj->quadmenu) && $parent_obj->type === 'custom') {
              $item->quadmenu_menu_item_parent = $parent_obj->quadmenu;
            } else {
              // post_type taxonomy post_type_archive parents
              $item->quadmenu_menu_item_parent = $parent_obj->type;
            }
          }
        } else {
          $item->quadmenu_menu_item_parent = 'main';
        }
      }

      // Validation
      // -----------------------------------------------------------------

      if (!empty($items->{$item->quadmenu}->parent)) {

        $item->quadmenu_allowed_parents = $items->{$item->quadmenu}->parent;

        // Main
        // -----------------------------------------------------------------
        if (!is_array($item->quadmenu_allowed_parents) && $item->quadmenu_allowed_parents === 'main') {
          $item->menu_item_parent = 0;
          $item->quadmenu_menu_item_parent = 'main';
        }

        // Invalid
        // -----------------------------------------------------------------           
        if (is_array($item->quadmenu_allowed_parents) && !in_array($item->quadmenu_menu_item_parent, $item->quadmenu_allowed_parents)) {
          $item->_invalid = true;
        }

        // Invalid
        // -----------------------------------------------------------------
        if (!is_array($item->quadmenu_allowed_parents) && $item->quadmenu_allowed_parents != $item->quadmenu_menu_item_parent) {
          $item->_invalid = true;
        }
      } else {
        $item->quadmenu_allowed_parents = 'all';
      }

      if ($item->quadmenu == 'widget' && (empty($item->widget_id) || !isset($wp_registered_widgets[$item->widget_id]))) {
        $item->_invalid = true;
      }

      return $item;
    }

    static function wp_setup_nav_menu_item($ID)
    {

      $item_obj = wp_cache_get("wp_setup_nav_menu_item_{$ID}", 'quadmenu');

      if ($item_obj === false) {

        $item_obj = get_post($ID);

        if (!empty($item_obj->ID)) {
          $item_obj = wp_setup_nav_menu_item($item_obj);
        }

        wp_cache_set("wp_setup_nav_menu_item_{$ID}", $item_obj, 'quadmenu');
      }

      return $item_obj;
    }

    function setup_nav_menu_item_validation($item)
    {

      if (isset($item->target) && $item->target === 'on') {
        $item->target = '_blank';
      }

      if (isset($item->target) && $item->target === 'off') {
        $item->target = '';
      }

      if (isset($item->columns)) {

        //var_dump($item->columns);

        $item->columns = array_diff(array_filter((array) $item->columns), array('off'));
      }

      return $item;
    }

    public function remove_nav_menu_item($items, $menu, $args)
    {

      if (is_quadmenu()) {

        foreach ($items as $key => $item) {

          if (!wp_doing_ajax()) {

            // Remove invalid items in frontend
            if (!is_admin() && $item->_invalid) {
              unset($items[$key]);
            }

            // Remove valid quadmenu items
            if (is_admin() && !$item->_invalid && in_array(sanitize_key($item->quadmenu_menu_item_parent), apply_filters('quadmenu_remove_nav_menu_item', array('column', 'mega', 'login')))) {
              unset($items[$key]);
            }

            // Remove invalid items without parent
            if (is_admin() && $item->_invalid && !$item->quadmenu_menu_item_parent) {
              unset($items[$key]);
            }
          }
        }
      }

      return $items;
    }

    public function edit_nav_menu_walker($menu_id)
    {
      return 'QuadMenu_Walker_Nav_Menu_Edit';
    }

    function i18n()
    {
      load_plugin_textdomain('quadmenu', false, QUADMENU_PLUGIN_DIR . '/languages');
    }

    public static function taburl($id = 0)
    {
      return admin_url('admin.php?page=' . QUADMENU_PANEL . '&tab=' . $id);
    }

    public static function isMin()
    {
      $min = '';

      if (false == QUADMENU_DEV) {
        $min = '.min';
      }

      return $min;
    }

    public static function send_json_success($json)
    {
      if (ob_get_contents())
        ob_clean();

      wp_send_json_success($json);
    }

    public static function send_json_error($json)
    {
      if (ob_get_contents())
        ob_clean();

      wp_send_json_error($json);
    }

    private function errors()
    {

      if (!QUADMENU_DEV)
        return;

      ini_set('error_reporting', E_ALL);
      ini_set('display_errors', 1);
      ini_set('display_startup_errors', 1);
    }
  }

endif; // End if class_exists check

if (!function_exists('_QuadMenu')) {

  function _QuadMenu()
  {
    return QuadMenu::instance();
  }

  _QuadMenu();
}

if (!function_exists('is_quadmenu_location')) {

  function is_quadmenu_location($location = false)
  {
    return QuadMenu::instance()->is_quadmenu_location($location);
  }
}

register_activation_hook(__FILE__, array('QuadMenu_Activation', 'activation'));