oc_menu_logo = sprintf( '', plugin_dir_url( __FILE__ ) . '/assets/images/one.com.black.svg', __( 'one.com', OC_VALIDATOR_DOMAIN ) ); } public function init() { // remove menus registered from plugin add_action( 'admin_menu', array( $this, 'onecom_remove_menu' ), 14 ); add_action( 'network_admin_menu', array( $this, 'onecom_remove_menu' ), 14 ); // one.com admin menu add_action( 'admin_menu', array( $this, 'onecom_register_menu' ), 15 ); add_action( 'network_admin_menu', array( $this, 'onecom_register_menu' ), 15 ); // Enqueue CSS assets add_action( 'admin_head', array( $this, 'onecom_css_assets' ) ); // Enqueue JS assets add_action( 'admin_print_footer_scripts', array( $this, 'onecom_js_assets' ), 100 ); } // Register all menu and submenu public function onecom_register_menu() { global $submenu; $plugin_menu = 'onecom-wp-plugins'; $theme_menu = 'onecom-wp-themes'; $generic_plugin_ver = $this->oc_get_plugin_version( self::ONECOM_PLUGIN_FILE ); // Return if multisite if ( ! is_network_admin() && is_multisite() ) { return false; } // Main menu $position = $this->onecom_get_free_menu_position( '2.1' ); add_menu_page( __( 'One.com', self::ONECOM_MENU_SLUG ), 'one.com', 'manage_options', self::ONECOM_MENU_SLUG, '', 'dashicons-admin-generic', $position ); if ( $this->onecom_plugin_activated() || is_plugin_active( 'onecom-spam-protection/onecom-spam-protection.php' ) ) { // Health and Security add_submenu_page( self::ONECOM_MENU_SLUG, 'Health and Security', 'Health and Security', 'manage_options', 'onecom-health-security', array( $this, 'onecom_menu_callback', ), 2 ); if ( $this->onecom_plugin_activated() ) { add_submenu_page( self::ONECOM_MENU_SLUG, __( 'Home', OC_VALIDATOR_DOMAIN ), '' . __( 'Home', OC_VALIDATOR_DOMAIN ) . '', 'manage_options', 'onecom-home', '', -1 ); add_submenu_page( self::ONECOM_MENU_SLUG, 'Health Monitor', 'Health Monitor', 'manage_options', 'onecom-wp-health-monitor', '' ); } if ( is_plugin_active( 'onecom-spam-protection/onecom-spam-protection.php' ) ) { add_submenu_page( self::ONECOM_MENU_SLUG, 'Spam Protection', 'Spam Protection', 'manage_options', 'onecom-wp-spam-protection', '' ); } } // Show 'Performance' nested menu heading if one.com (latest having WP-Rocket) or PCache plugin is active if ( is_plugin_active( self::ONECOM_VCACHE_FILE ) || ( $this->onecom_plugin_activated() && version_compare( $generic_plugin_ver, '4.0.0', '>=' ) ) ) { // Performance add_submenu_page( self::ONECOM_MENU_SLUG, 'Performance', 'Performance', 'manage_options', 'onecom-performance-menu', array( $this, 'onecom_menu_callback', ), 3 ); } // Show WP-Rocket page from one.com or PCache plugin based on version // @todo - Remove PCache page fallback after some time to remove redundant code if ( $this->onecom_plugin_activated() && version_compare( $generic_plugin_ver, '4.0.0', '>=' ) ) { add_submenu_page( self::ONECOM_MENU_SLUG, self::WP_ROCKET_TITLE, self::WP_ROCKET_TITLE, 'manage_options', 'onecom-wp-rocket', array( 'Onecom_Wp_Rocket', 'wp_rocket_page', ), 2 ); } elseif ( is_plugin_active( self::ONECOM_VCACHE_FILE ) && version_compare( $this->oc_get_plugin_version( self::ONECOM_VCACHE_FILE ), '2.0', '>=' ) ) { add_submenu_page( self::ONECOM_MENU_SLUG, self::WP_ROCKET_TITLE, self::WP_ROCKET_TITLE, 'manage_options', 'onecom-wp-rocket', array( 'OCVCaching', 'wp_rocket_page', ), 2 ); } if ( is_plugin_active( self::ONECOM_VCACHE_FILE ) && version_compare( $this->oc_get_plugin_version( self::ONECOM_VCACHE_FILE ), '2.0', '>=' ) ) { add_submenu_page( self::ONECOM_MENU_SLUG, self::WP_PCACHE_TITLE, self::WP_PCACHE_TITLE, 'manage_options', 'onecom-vcache-plugin', array( 'OCVCaching', 'cache_settings_page', ), 2 ); add_submenu_page( self::ONECOM_MENU_SLUG, 'CDN', 'CDN', 'manage_options', 'onecom-cdn', array( 'OCVCaching', 'cdn_settings_page', ), 2 ); } elseif ( is_plugin_active( self::ONECOM_VCACHE_FILE ) ) { add_submenu_page( self::ONECOM_MENU_SLUG, self::WP_PCACHE_TITLE, 'Performance Cache ', 'manage_options', 'onecom-vcache-plugin', '', 2 ); } //Staging feature not supported on multisite //or if the site and home url are different if ( $this->onecom_plugin_activated() && is_multisite() || ( get_option( 'siteurl' ) !== get_option( 'home' ) ) ) { add_submenu_page( self::ONECOM_MENU_SLUG, 'Staging blocked', 'Staging', 'manage_options', 'onecom-wp-staging-blocked', '', 7 ); } else if ( $this->onecom_plugin_activated() && ( isset( $submenu[ self::ONECOM_MENU_SLUG ] ) && ( ! is_multisite() ) ) ) { add_submenu_page( self::ONECOM_MENU_SLUG, 'Staging', 'Staging', 'manage_options', 'onecom-wp-staging', '', 7 ); } if ( is_plugin_active( self::ONECOM_WEBSHOP_FILE ) || is_plugin_active( 'onecom-onephoto/onecom-onephoto.php' ) || $this->onecom_plugin_activated() || is_plugin_active( 'onecom-under-construction/onecom-under-construction.php' ) || is_plugin_active( 'onecom-php-scanner/onecom-compatibility-scanner.php' ) ) { // Utility add_submenu_page( self::ONECOM_MENU_SLUG, 'Utility', 'Utility', 'manage_options', 'onecom-utility', array( $this, 'onecom_menu_callback', ), 9 ); if ( is_plugin_active( self::ONECOM_WEBSHOP_FILE ) ) { include_once WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . self::ONECOM_WEBSHOP_FILE; add_submenu_page( self::ONECOM_MENU_SLUG, 'Online Shop', 'Online Shop', 'manage_options', 'one-webshop-settings', 'one_webshop_plugin_settings_page', 10 ); } if ( is_plugin_active( 'onecom-onephoto/onecom-onephoto.php' ) ) { add_submenu_page( self::ONECOM_MENU_SLUG, 'One Photo', 'One Photo', 'manage_options', 'oc_onephoto', '', 11 ); } if ( $this->onecom_plugin_activated() ) { add_submenu_page( self::ONECOM_MENU_SLUG, 'Advanced Error Page', 'Advanced Error Page', 'manage_options', 'onecom-wp-error-page', '', 12 ); add_submenu_page( self::ONECOM_MENU_SLUG, 'Cookie Banner', 'Cookie Banner', 'manage_options', 'onecom-wp-cookie-banner', '', 13 ); } if ( is_plugin_active( 'onecom-under-construction/onecom-under-construction.php' ) ) { add_submenu_page( self::ONECOM_MENU_SLUG, 'Maintenance Mode', 'Maintenance Mode', 'manage_options', 'onecom-wp-under-construction', '', 14 ); } if ( is_plugin_active( 'onecom-php-scanner/onecom-compatibility-scanner.php' ) ) { add_submenu_page( self::ONECOM_MENU_SLUG, 'PHP Scanner', 'PHP Scanner', 'manage_options', 'onecom-php-compatibility-scanner', '', 15 ); } // Themes & Plugins if ( $this->onecom_plugin_activated() && ( isset( $submenu[ self::ONECOM_MENU_SLUG ] ) ) && ! ( in_array( $plugin_menu, wp_list_pluck( $submenu[ self::ONECOM_MENU_SLUG ], 2 ) ) || in_array( $theme_menu, wp_list_pluck( $submenu[ self::ONECOM_MENU_SLUG ], 2 ) ) ) ) { add_submenu_page( self::ONECOM_MENU_SLUG, 'Themes', 'Themes', 'manage_options', 'onecom-wp-themes', '', 16 ); } } // Add WordPress product accordion menu only if plugin is active if ($this->onecom_plugin_activated()) { // Use static variable to ensure menus are registered only once per request static $wp_products_registered = false; if (!$wp_products_registered) { global $submenu; // Check if onecom-products already exists $products_exists = false; if (isset($submenu[self::ONECOM_MENU_SLUG])) { foreach ($submenu[self::ONECOM_MENU_SLUG] as $item) { if ($item[2] === 'onecom-products') { $products_exists = true; break; } } } if (!$products_exists) { add_submenu_page( self::ONECOM_MENU_SLUG, 'WordPress products', 'WordPress products', 'manage_options', 'onecom-products', array( $this, 'onecom_menu_callback', ), 20 ); } // Check if onecom-marketplace already exists $marketplace_exists = false; if (isset($submenu[self::ONECOM_MENU_SLUG])) { foreach ($submenu[self::ONECOM_MENU_SLUG] as $item) { if ($item[2] === 'onecom-marketplace') { $marketplace_exists = true; break; } } } if (!$marketplace_exists) { add_submenu_page( self::ONECOM_MENU_SLUG, 'Marketplace', 'Marketplace', 'manage_options', 'onecom-marketplace', '', 21 ); } // Check if onecom-marketplace-products already exists $marketplace_products_exists = false; if (isset($submenu[self::ONECOM_MENU_SLUG])) { foreach ($submenu[self::ONECOM_MENU_SLUG] as $item) { if ($item[2] === 'onecom-marketplace-products') { $marketplace_products_exists = true; break; } } } if (!$marketplace_products_exists) { add_submenu_page( self::ONECOM_MENU_SLUG, 'My products', 'My products', 'manage_options', 'onecom-marketplace-products', '', 22 ); } // Mark as registered to prevent duplicate registration $wp_products_registered = true; } } if ( ! is_network_admin() && is_multisite() ) { return false; } } public function onecom_remove_menu() { remove_menu_page( self::ONECOM_MENU_SLUG ); remove_menu_page( 'onecom-vcache-plugin' ); remove_menu_page( 'onecom-wp-under-construction' ); remove_menu_page( 'onecom-wp-spam-protection' ); remove_menu_page( 'onecom-php-compatibility-scanner' ); remove_menu_page( 'vcaching-plugin' ); remove_menu_page( 'one-webshop' ); remove_menu_page( 'oc_onephoto' ); remove_submenu_page( self::ONECOM_MENU_SLUG, 'onecom-wp-health-monitor' ); remove_submenu_page( self::ONECOM_MENU_SLUG, 'onecom-vcache-plugin' ); remove_submenu_page( self::ONECOM_MENU_SLUG, 'onecom-wp-error-page' ); remove_submenu_page( self::ONECOM_MENU_SLUG, 'onecom-wp-cookie-banner' ); remove_submenu_page( self::ONECOM_MENU_SLUG, 'onecom-wp-staging' ); remove_submenu_page( self::ONECOM_MENU_SLUG, 'onecom-wp-staging-blocked' ); remove_submenu_page( self::ONECOM_MENU_SLUG, self::ONECOM_MENU_SLUG ); remove_submenu_page( self::ONECOM_MENU_SLUG, 'onecom-wp-plugins' ); remove_submenu_page( self::ONECOM_MENU_SLUG, 'onecom-wp-themes' ); if ( $this->onecom_plugin_activated() && version_compare( $this->oc_get_plugin_version( 'onecom-themes-plugins/onecom-themes-plugins.php' ), '3.0', '>=' ) ) { remove_submenu_page( self::ONECOM_MENU_SLUG, 'onecom-wp-vulnerability-monitor' ); } if ( $this->onecom_plugin_activated() ) { remove_submenu_page( self::ONECOM_MENU_SLUG, 'onecom-wp-under-construction' ); remove_submenu_page( self::ONECOM_MENU_SLUG, 'onecom-marketplace' ); remove_submenu_page( self::ONECOM_MENU_SLUG, 'onecom-marketplace-products' ); } } public function onecom_plugin_activated(): bool { return is_plugin_active( self::ONECOM_PLUGIN_FILE ); } // Menu callback for non-functional menus // public function onecom_menu_callback() { wp_die( '

' . __( 'Sorry, you are not allowed to access this page.' ) . '

' ); } public function onecom_get_free_menu_position( $start, $increment = 0.3 ) { foreach ( $GLOBALS['menu'] as $key => $menu ) { $menus_positions[] = $key; } if ( ! in_array( $start, $menus_positions ) ) { return $start; } /* the position is already reserved find the closet one */ while ( in_array( $start, $menus_positions ) ) { $start += $increment; } return (string) $start; } /** * @param $path * * @return false|string * removed return type since string|bool is not supported in php 7.4 */ public function oc_get_plugin_version( $path ) { if ( function_exists( 'get_file_data' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; $file_path = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $path; if ( ! file_exists( $file_path ) ) { return false; } $plugin_data = get_file_data( $file_path, array( 'Version' => 'Version', ) ); if ( ! empty( $plugin_data['Version'] ) ) { return $plugin_data['Version']; } } return false; } // Insert script & styles related to admin menu public function onecom_css_assets() { ?>