client = new Adsanity_For_MainWP_Client( ADSANITY_FOR_MAINWP_FILE ); $this->aggregator = new Adsanity_For_MainWP_Aggregator( $this->client ); $this->pages = new Adsanity_For_MainWP_Pages( $this->client, $this->aggregator, self::PAGE_SLUG ); add_filter( 'mainwp_getextensions', array( $this, 'register_extension' ) ); add_filter( 'mainwp_getsubpages_sites', array( $this, 'register_site_subpage' ) ); add_filter( 'mainwp_getmetaboxes', array( $this, 'register_metabox' ), 10, 2 ); add_action( 'mainwp_site_synced', array( $this, 'record_sync_summary' ), 10, 2 ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) ); } /** * Record a managed site's AdSanity summary when MainWP syncs it. * * The Connector piggybacks a cheap summary on every regular sync (top-level * `adsanity_mwp` key). Capturing it here keeps the overview metabox current * without any per-page-load fan-out to the fleet. * * @param object $website Managed-site object (provides ->id). * @param array $information Decoded sync payload returned by the child. * @return void */ public function record_sync_summary( $website, $information ): void { if ( ! is_object( $website ) || ! isset( $website->id ) ) { return; } if ( ! is_array( $information ) || empty( $information['adsanity_mwp'] ) || ! is_array( $information['adsanity_mwp'] ) ) { return; } $this->aggregator->record_site_summary( (int) $website->id, $information['adsanity_mwp'] ); } /** * Register this plugin as a MainWP extension. * * @param array $extensions Extensions registered so far. * @return array */ public function register_extension( $extensions ): array { if ( ! is_array( $extensions ) ) { $extensions = array(); } $extensions[] = array( 'plugin' => ADSANITY_FOR_MAINWP_FILE, 'api' => 'adsanity-for-mainwp', 'mainwp' => false, 'callback' => array( $this->pages, 'render_extension_page' ), 'apiManager' => false, 'name' => __( 'AdSanity for MainWP', 'adsanity-for-mainwp' ), ); return $extensions; } /** * Register a per-site "AdSanity" subpage under Manage Sites. * * @param array $subpages Subpages registered so far. * @return array */ public function register_site_subpage( $subpages ): array { if ( ! is_array( $subpages ) ) { $subpages = array(); } $subpages[] = array( 'title' => __( 'AdSanity', 'adsanity-for-mainwp' ), 'slug' => 'AdSanity', 'sites_section' => true, 'menu_hidden' => true, 'callback' => array( $this->pages, 'render_site_subpage' ), ); return $subpages; } /** * Enqueue dashboard CSS/JS on the extension page and the per-site subpage. * * @param string $hook_suffix The current admin page hook (unused; gated on page). * @return void */ public function enqueue_assets( $hook_suffix ): void { unset( $hook_suffix ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- admin page gating only, no state change. $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; if ( self::PAGE_SLUG !== $page && 'ManageSitesAdSanity' !== $page ) { return; } wp_enqueue_style( 'adsanity-for-mainwp', ADSANITY_FOR_MAINWP_URL . 'admin/css/dashboard.css', array(), ADSANITY_FOR_MAINWP_VERSION ); wp_enqueue_script( 'adsanity-for-mainwp', ADSANITY_FOR_MAINWP_URL . 'admin/js/dashboard.js', array( 'jquery' ), ADSANITY_FOR_MAINWP_VERSION, true ); } /** * Register the AdSanity overview metabox on the MainWP overview/site pages. * * The callback renders inside MainWP's widget container and reads the cheap * aggregator snapshot, so it adds no per-page-load fan-out. * * @param array $metaboxes Metaboxes registered so far. * @param mixed $dashboard_siteid Current site id (0/empty on the network overview). * Defaults to 0 because the general overview page * (page-mainwp-overview.php) applies this filter with * only one argument, unlike the manage-sites page. * @return array */ public function register_metabox( $metaboxes, $dashboard_siteid = 0 ): array { if ( ! is_array( $metaboxes ) ) { $metaboxes = array(); } $pages = $this->pages; $site_id = (int) $dashboard_siteid; $metaboxes[] = array( 'id' => 'adsanity', 'plugin' => ADSANITY_FOR_MAINWP_FILE, 'callback' => static function () use ( $pages, $site_id ): void { $pages->render_metabox( $site_id ); }, 'layout' => array( -1, -1, 6, 24 ), ); return $metaboxes; } /** * Expose the transport client (used by screens and, later, AJAX handlers). * * @return Adsanity_For_MainWP_Client */ public function get_client(): Adsanity_For_MainWP_Client { return $this->client; } }