slug = $slug; $this->args = wp_parse_args( $args, array( 'render_callback' => null, 'title' => '', 'capability' => 'manage_options', 'menu_title' => '', 'parent_slug' => self::MENU_SLUG, 'enqueue_callback' => null, 'initialize_callback' => null, ) ); if ( empty( $this->args['menu_title'] ) ) { $this->args['menu_title'] = $this->args['title']; } $this->args['title'] = __( 'Site Kit by Google', 'google-site-kit' ) . ' ' . $this->args['title']; } /** * Gets the unique screen slug. * * @since 1.0.0 * * @return string Unique screen slug. */ public function get_slug() { return $this->slug; } /** * Adds the screen to the WordPress admin backend. * * @since 1.0.0 * * @param Context $context Plugin context, used for URL generation. * @return string Hook suffix of the screen, or empty string if not added. */ public function add( Context $context ) { static $menu_slug = null; if ( ! $this->args['render_callback'] || ! $this->args['title'] ) { return ''; } // A parent slug of null means the screen will not appear in the menu. $parent_slug = null; // If parent slug is provided, use it as parent. if ( ! empty( $this->args['parent_slug'] ) ) { $parent_slug = $this->args['parent_slug']; // If parent slug is 'googlesitekit', append to main Site Kit menu. if ( self::MENU_SLUG === $parent_slug ) { // If this is null, it means no menu has been added yet. if ( null === $menu_slug ) { add_menu_page( $this->args['title'], __( 'Site Kit', 'google-site-kit' ), $this->args['capability'], $this->slug, function() use ( $context ) { $this->render( $context ); }, $context->url( 'dist/assets/images/logo-g_white_small.png' ) ); $menu_slug = $this->slug; } // Set parent slug to actual slug of main Site Kit menu. $parent_slug = $menu_slug; } } // If submenu item or not in menu, use add_submenu_page(). return (string) add_submenu_page( $parent_slug, $this->args['title'], $this->args['menu_title'], $this->args['capability'], $this->slug, function() use ( $context ) { $this->render( $context ); } ); } /** * Runs actions when initializing the screen, before sending headers and generating markup. * * @since 1.0.0 * * @param Context $context Plugin context. */ public function initialize( Context $context ) { if ( ! $this->args['initialize_callback'] ) { return; } call_user_func( $this->args['initialize_callback'], $context ); } /** * Enqueues assets for the screen. * * @since 1.0.0 * * @param Assets $assets Assets instance to rely on for enqueueing assets. */ public function enqueue_assets( Assets $assets ) { // Enqueue fonts. $assets->enqueue_fonts(); // Enqueue base admin screen stylesheet. $assets->enqueue_asset( 'googlesitekit_admin_css' ); // Helps detection of enabled ad blockers to warn users before activating or setup AdSense module. if ( $this->is_ad_blocker_detection_required() ) { $assets->enqueue_asset( 'googlesitekit_ads_detect' ); } if ( $this->args['enqueue_callback'] ) { call_user_func( $this->args['enqueue_callback'], $assets ); } // Enqueue module hooks. $assets->enqueue_asset( 'googlesitekit_modules' ); } /** * Renders the screen content. * * @since 1.0.0 * * @param Context $context Plugin context. */ private function render( Context $context ) { if ( ! $this->args['render_callback'] ) { return; } call_user_func( $this->args['render_callback'], $context ); } /** * Verifies if it's required to detect and warn user to disable ad blocker in the current screen. * * Required on dashboard and settings page if module is inactive. * Required on adsense dashboard if module is active and not setup complete. * * @return bool True if ad blocker detection is required. */ private function is_ad_blocker_detection_required() { $screens = array( 'googlesitekit-settings', 'googlesitekit-dashboard', 'googlesitekit-module-adsense', 'googlesitekit-splash', ); if ( in_array( $this->slug, $screens, true ) ) { return true; } return false; } }