checks[] = [ 'name' => 'licenseActivated', 'title' => __( 'Activate Your License', 'aioseo-pro' ), 'description' => __( 'Unlock all Pro features, addons and updates by activating your AIOSEO license key.', 'aioseo-pro' ), // phpcs:ignore Generic.Files.LineLength.MaxExceeded 'priority' => 'high', 'time' => [ 'label' => __( '1 minute', 'aioseo-pro' ), 'value' => 60 ], 'callback' => 'licenseActivated', 'capability' => 'aioseo_general_settings', 'actions' => [ [ 'label' => __( 'Activate', 'aioseo-pro' ), 'url' => admin_url( 'admin.php?page=aioseo-settings&aioseo-scroll=aioseo-license-key-row&aioseo-highlight=aioseo-license-key-row#general-settings' ) ], [ 'label' => __( 'Purchase', 'aioseo-pro' ), 'url' => aioseo()->helpers->utmUrl( AIOSEO_MARKETING_URL . 'pricing/', 'seo-checklist', 'activate-license' ) ] ], 'completed' => false, 'dismissable' => false ]; $this->checks[] = [ 'name' => 'enableIndexNow', 'title' => __( 'Enable IndexNow', 'aioseo-pro' ), 'description' => __( 'Instantly notify search engines when your content changes, helping you get indexed and ranked sooner.', 'aioseo-pro' ), 'priority' => 'medium', 'time' => [ 'label' => __( 'Instant', 'aioseo-pro' ), 'value' => 0 ], 'callback' => 'checkIndexNowEnabled', 'capability' => 'install_plugins', 'actions' => [ [ 'label' => __( 'Enable', 'aioseo-pro' ), 'callback' => 'enableIndexNow' ] ], 'completed' => false ]; // Show if the user's plan includes Local SEO, and multiple locations is disabled. if ( $this->planIncludesAddon( 'aioseo-local-business' ) && ! aioseo()->options->localBusiness->locations->general->multiple ) { $this->checks[] = [ 'name' => 'fillLocalBusinessSchema', 'title' => __( 'Fill Out Local Business Info', 'aioseo-pro' ), 'description' => __( 'Add your business details and location information to help local customers find you in Google Maps and local search results.', 'aioseo-pro' ), 'priority' => 'medium', 'time' => [ 'label' => __( '10 minutes', 'aioseo-pro' ), 'value' => 600 ], 'callback' => null, 'capability' => 'aioseo_local_seo_settings', 'actions' => [ [ 'label' => __( 'Configure', 'aioseo-pro' ), 'url' => admin_url( 'admin.php?page=aioseo-local-seo&aioseo-scroll=aioseo-card-localBusinessInfo&aioseo-highlight=aioseo-card-localBusinessInfo' ) ], [ 'label' => __( 'Mark Complete', 'aioseo-pro' ), 'callback' => 'completeCheck' ] ], 'completed' => false ]; } // Show if the user's plan includes Image SEO. if ( $this->planIncludesAddon( 'aioseo-image-seo' ) ) { $this->checks[] = [ 'name' => 'reviewImageSeoSettings', 'title' => __( 'Configure Image SEO Settings', 'aioseo-pro' ), 'description' => __( 'Configure how your images are optimized for search engines, including alt text, titles, and file naming.', 'aioseo-pro' ), 'priority' => 'low', 'time' => [ 'label' => __( '10 minutes', 'aioseo-pro' ), 'value' => 600 ], 'callback' => null, 'capability' => 'aioseo_search_appearance_settings', 'actions' => [ [ 'label' => __( 'Open Settings', 'aioseo-pro' ), 'url' => admin_url( 'admin.php?page=aioseo-search-appearance#/media' ) ], [ 'label' => __( 'Mark Complete', 'aioseo-pro' ), 'callback' => 'completeCheck' ] ], 'completed' => false ]; } // Only show if llms.txt is enabled. if ( aioseo()->options->sitemap->llms->enable ) { $this->checks[] = [ 'name' => 'enableLlmsFullTxt', 'title' => __( 'Enable llms-full.txt', 'aioseo-pro' ), 'description' => __( 'Generate a comprehensive llms-full.txt file with full content for AI models.', 'aioseo-pro' ), 'priority' => 'low', 'time' => [ 'label' => __( 'Instant', 'aioseo-pro' ), 'value' => 0 ], 'callback' => 'checkLlmsFullTxtEnabled', 'capability' => 'aioseo_sitemap_settings', 'actions' => [ [ 'label' => __( 'Enable', 'aioseo-pro' ), 'callback' => 'enableLlmsFullTxt' ] ], 'completed' => false ]; } // Show if the user's plan includes Link Assistant and there are orphaned posts. if ( $this->planIncludesAddon( 'aioseo-link-assistant' ) && $this->hasOrphanedPosts() ) { $this->checks[] = [ 'name' => 'fixOrphanedPosts', 'title' => __( 'Add Internal Links to Orphaned Posts', 'aioseo-pro' ), 'description' => __( 'Find and link to posts that have no internal links pointing to them, making them easier for search engines to discover.', 'aioseo-pro' ), 'priority' => 'medium', 'time' => [ 'label' => __( '15 minutes', 'aioseo-pro' ), 'value' => 900 ], 'callback' => null, 'capability' => 'aioseo_link_assistant_settings', 'actions' => [ [ 'label' => __( 'Fix Posts', 'aioseo-pro' ), 'url' => admin_url( 'admin.php?page=aioseo-link-assistant#/links-report?orphaned-posts=1' ) ], [ 'label' => __( 'Mark Complete', 'aioseo-pro' ), 'callback' => 'completeCheck' ] ], 'completed' => false ]; } // Only show 404 log checks for Pro, Elite, Agency, or Business plans. if ( $this->planIncludes404Logs() ) { $this->checks[] = [ 'name' => 'enable404Logs', 'title' => __( 'Enable 404 Logs', 'aioseo-pro' ), 'description' => __( 'Track 404 errors on your site to identify broken links and improve user experience.', 'aioseo-pro' ), 'priority' => 'medium', 'time' => [ 'label' => __( 'Instant', 'aioseo-pro' ), 'value' => 0 ], 'callback' => 'check404LogsEnabled', 'capability' => 'aioseo_redirects_settings', 'actions' => [ [ 'label' => __( 'Enable', 'aioseo-pro' ), 'callback' => 'enable404Logs' ] ], 'completed' => false ]; $this->checks[] = [ 'name' => 'review404Logs', 'title' => __( 'Check 404 Logs for Missing Pages', 'aioseo-pro' ), 'description' => __( 'Identify and fix broken links on your site by checking which pages are returning 404 errors.', 'aioseo-pro' ), 'priority' => 'medium', 'time' => [ 'label' => __( '15 minutes', 'aioseo-pro' ), 'value' => 900 ], 'callback' => null, 'capability' => 'aioseo_redirects_settings', 'actions' => [ [ 'label' => __( 'Review Logs', 'aioseo-pro' ), 'url' => admin_url( 'admin.php?page=aioseo-redirects&activetab=logs-404#/logs' ) ], [ 'label' => __( 'Mark Complete', 'aioseo-pro' ), 'callback' => 'completeCheck' ] ], 'completed' => false ]; } } /** * Check if the license is activated. * * @since 4.9.4 * * @return bool */ protected function licenseActivated() { if ( ! is_object( aioseo()->license ) || ! method_exists( aioseo()->license, 'isActive' ) ) { return false; } return aioseo()->license->isActive(); } /** * Check if IndexNow addon is enabled. * * @since 4.9.4 * * @return bool */ protected function checkIndexNowEnabled() { $indexNowAddon = aioseo()->addons->getAddon( 'aioseo-index-now' ); return ! empty( $indexNowAddon->isActive ); } /** * Check if llms-full.txt is enabled. * * @since 4.9.4 * * @return bool */ protected function checkLlmsFullTxtEnabled() { return aioseo()->options->sitemap->llms->enableFull; } /** * Check if there are orphaned posts. * * @since 4.9.4 * * @return bool */ protected function hasOrphanedPosts() { if ( ! function_exists( 'aioseoLinkAssistant' ) ) { return false; } $overviewData = aioseoLinkAssistant()->helpers->getOverviewData(); return ! empty( $overviewData['totals']['orphanedPosts'] ); } /** * Check if 404 logs are enabled. * * @since 4.9.4 * * @return bool */ protected function check404LogsEnabled() { if ( empty( aioseo()->redirects ) ) { return false; } return aioseo()->redirects->options->logs->log404->enabled; } /** * Execute a Pro-specific action. * * @since 4.9.4 * * @param string $check The check name. * @param string $action The action name. * @return bool */ public function doAction( $check, $action ) { switch ( $action ) { case 'enableIndexNow': return $this->enableIndexNow(); case 'enableLlmsFullTxt': return $this->enableLlmsFullTxt(); case 'enable404Logs': return $this->enable404Logs(); default: return parent::doAction( $check, $action ); } } /** * Enable the IndexNow addon. * * @since 4.9.4 * * @return bool */ private function enableIndexNow() { if ( ! current_user_can( 'install_plugins' ) && ! current_user_can( 'activate_plugins' ) ) { return false; } return $this->activateAddon( 'aioseo-index-now' ); } /** * Enable llms-full.txt. * * @since 4.9.4 * * @return bool */ private function enableLlmsFullTxt() { if ( ! current_user_can( 'aioseo_sitemap_settings' ) ) { return false; } aioseo()->options->sitemap->llms->enableFull = true; // Schedule llms-full.txt generation. if ( aioseo()->llms && method_exists( aioseo()->llms, 'scheduleSingleGenerationForLlmsFullTxt' ) ) { aioseo()->llms->scheduleSingleGenerationForLlmsFullTxt(); } return true; } /** * Enable 404 logs. * * @since 4.9.4 * * @return bool */ private function enable404Logs() { if ( ! current_user_can( 'aioseo_redirects_settings' ) ) { return false; } if ( empty( aioseo()->redirects ) ) { return false; } aioseo()->redirects->options->logs->log404->enabled = true; return true; } /** * Check if the user's plan includes a specific addon. * * @since 4.9.4 * * @param string $addonSku The addon SKU. * @return bool True if the plan includes the addon. */ private function planIncludesAddon( $addonSku ) { if ( ! aioseo()->license || ! aioseo()->license->isActive() ) { return false; } $licenseLevel = aioseo()->internalOptions->internal->license->level; if ( empty( $licenseLevel ) ) { return false; } $addonLevels = aioseo()->addons->getAddonLevels( $addonSku ); return in_array( strtolower( $licenseLevel ), $addonLevels, true ); } /** * Check if the user's plan includes 404 logs. * * 404 logs are available for Pro, Elite, Agency, and Business plans. * * @since 4.9.4 * * @return bool True if the plan includes 404 logs. */ private function planIncludes404Logs() { if ( ! aioseo()->license || ! aioseo()->license->isActive() ) { return false; } $licenseLevel = aioseo()->internalOptions->internal->license->level; if ( empty( $licenseLevel ) ) { return false; } $allowedLevels = [ 'pro', 'elite', 'agency', 'business' ]; return in_array( strtolower( $licenseLevel ), $allowedLevels, true ); } /** * Activate an addon (install if needed). * * @since 4.9.4 * * @param string $addonSku The addon SKU. * @return bool True on success. */ private function activateAddon( $addonSku ) { $addon = aioseo()->addons->getAddon( $addonSku ); // Already active. if ( ! empty( $addon->isActive ) ) { return true; } // Installed but not active - just activate it. if ( ! empty( $addon->installed ) && ! empty( $addon->basename ) ) { if ( ! aioseo()->addons->canActivate() ) { return false; } if ( ! current_user_can( 'activate_plugins' ) ) { return false; } $activated = activate_plugin( $addon->basename ); return ! is_wp_error( $activated ); } if ( ! current_user_can( 'install_plugins' ) ) { return false; } // Not installed - install and activate. if ( ! aioseo()->addons->canInstall() ) { return false; } return aioseo()->addons->installAddon( $addonSku ); } }