license->hasCoreFeature( 'general', 'cornerstone-content' ) ) { new CornerstoneContent(); } } /** * Actually adds the menu items to the admin bar. * * @since 4.0.0 * * @return void */ protected function addAdminBarMenuItems() { // Add an upsell to Pro. if ( current_user_can( 'update_plugins' ) && ! aioseo()->license->isActive() ) { $this->adminBarMenuItems['aioseo-pro-license'] = [ 'parent' => 'aioseo-main', 'title' => '' . __( 'Add License Key', 'aioseo-pro' ) . '', 'id' => 'aioseo-pro-license', 'href' => esc_url( admin_url( 'admin.php?page=aioseo-settings' ) ) ]; } parent::addAdminBarMenuItems(); } /** * Get the required capability for given admin page. * * @since 4.1.3 * * @param string $pageSlug The slug of the page. * @return string The required capability. */ public function getPageRequiredCapability( $pageSlug ) { $capabilityList = aioseo()->access->getCapabilityList(); switch ( $pageSlug ) { case 'aioseo': $capability = 'aioseo_dashboard'; break; case 'aioseo-settings': $capability = 'aioseo_general_settings'; break; case 'aioseo-sitemaps': $capability = 'aioseo_sitemap_settings'; break; case 'aioseo-about': $capability = 'aioseo_about_us_page'; break; case 'aioseo-setup-wizard': $capability = 'aioseo_setup_wizard'; break; case 'aioseo-search-statistics': $capability = 'aioseo_search_statistics_settings'; break; case 'aioseo-redirects': $capability = current_user_can( 'aioseo_redirects_manage' ) ? 'aioseo_redirects_manage' : 'aioseo_redirects_settings'; break; case 'aioseo-ai-insights': $capability = 'aioseo_ai_insights_settings'; break; case 'aioseo-seo-revisions': $capability = 'aioseo_page_seo_revisions_settings'; break; case 'aioseo-ai-bulk-generate': $capability = 'aioseo_page_ai_content_settings'; break; default: $capability = str_replace( '-', '_', $pageSlug . '-settings' ); break; } if ( ! in_array( $capability, $capabilityList, true ) ) { $capability = apply_filters( 'aioseo_manage_seo', 'aioseo_manage_seo' ); } return $capability; } /** * Add the menu inside of WordPress. * * @since 4.0.0 * * @return void */ public function addMenu() { parent::addMenu(); // We use the global submenu, because we are adding an external link here. if ( current_user_can( 'aioseo_manage_seo' ) && ! aioseo()->license->isActive() ) { global $submenu; $submenu[ $this->pageSlug ][] = [ '' . esc_html__( 'Add License Key', 'aioseo-pro' ) . '', apply_filters( 'aioseo_manage_seo', 'aioseo_manage_seo' ), esc_url( admin_url( 'admin.php?page=aioseo-settings' ) ) ]; } } /** * Update checks. * This does user permission checks so we have to run it after plugins loaded. * * @since 4.0.0 * * @return void */ public function loadUpdates() { new Updates( [ 'pluginSlug' => 'all-in-one-seo-pack-pro', 'pluginPath' => plugin_basename( AIOSEO_FILE ), 'version' => AIOSEO_VERSION, 'key' => aioseo()->sensitiveOptions->get( 'licenseKey' ) ] ); } /** * Adds All in One SEO to the Admin Bar. * * @since 4.0.0 * * @return void */ public function adminBarMenu() { if ( aioseo()->options->advanced->adminBarMenu ) { parent::adminBarMenu(); } } /** * Adds the current post/term menu items to the admin bar. * * @since 4.2.3 * * @return void */ protected function addEditSeoMenuItem() { if ( ! is_category() && ! is_tag() && ! is_tax() ) { parent::addEditSeoMenuItem(); return; } $term = aioseo()->helpers->getTerm(); if ( ! is_a( $term, 'WP_Term' ) ) { return; } $this->adminBarMenuItems[] = [ 'id' => 'aioseo-edit-' . $term->term_id, 'parent' => 'aioseo-main', 'title' => esc_html__( 'Edit SEO', 'aioseo-pro' ), 'href' => get_edit_term_link( $term->term_id, $term->taxonomy ) . '#aioseo-tabbed', ]; } /** * Hooks for loading our pages. * * @since 4.0.0 * * @return void */ public function hooks() { parent::hooks(); $currentScreen = aioseo()->helpers->getCurrentScreen(); global $admin_page_hooks; // phpcs:ignore Squiz.NamingConventions.ValidVariableName if ( ! is_object( $currentScreen ) || empty( $currentScreen->id ) || empty( $admin_page_hooks ) ) { // phpcs:ignore Squiz.NamingConventions.ValidVariableName return; } $addScripts = false; if ( 'toplevel_page_aioseo' === $currentScreen->id ) { $addScripts = true; } if ( ! empty( $admin_page_hooks['aioseo'] ) && $currentScreen->id === $admin_page_hooks['aioseo'] ) { // phpcs:ignore Squiz.NamingConventions.ValidVariableName $addScripts = true; } if ( strpos( $currentScreen->id, 'aioseo-tools' ) !== false ) { $addScripts = true; } if ( ! $addScripts ) { return; } } /** * Starts the cleaning procedure to fix escaped, corrupted data. * * @since 4.1.2 * * @return void */ public function scheduleUnescapeData() { parent::scheduleUnescapeData(); aioseo()->core->cache->update( 'unslash_escaped_data_terms', time(), WEEK_IN_SECONDS ); aioseo()->actionScheduler->scheduleSingle( 'aioseo_unslash_escaped_data_terms', 120 ); } /** * Unlashes corrupted escaped data in terms. * * @since 4.1.2 * * @return void */ public function unslashEscapedDataTerms() { $termsToUnslash = apply_filters( 'aioseo_debug_unslash_escaped_terms', 200 ); $timeStarted = esc_sql( gmdate( 'Y-m-d H:i:s', aioseo()->core->cache->get( 'unslash_escaped_data_terms' ) ) ); $terms = aioseo()->core->db->start( 'aioseo_terms' ) ->select( '*' ) ->where( 'updated <', $timeStarted ) ->orderBy( 'updated ASC' ) ->limit( $termsToUnslash ) ->run() ->result(); if ( empty( $terms ) ) { aioseo()->core->cache->delete( 'unslash_escaped_data_terms' ); return; } aioseo()->actionScheduler->scheduleSingle( 'aioseo_unslash_escaped_data_terms', 120, [], true ); $postExclusiveColumns = [ 'keyphrases', 'page_analysis', 'schema_type_options', 'local_seo' ]; $columns = array_diff( $this->getColumnsToUnslash(), $postExclusiveColumns ); foreach ( $terms as $term ) { $aioseoTerm = Models\Term::getTerm( $term->term_id ); foreach ( $columns as $columnName ) { $aioseoTerm->$columnName = aioseo()->helpers->pregReplace( '/\\\(?![uU][+]?[a-zA-Z0-9]{4})/', '', $term->$columnName ); } $aioseoTerm->images = null; $aioseoTerm->image_scan_date = null; $aioseoTerm->videos = null; $aioseoTerm->video_scan_date = null; $aioseoTerm->save(); } } /** * Loads the plugin text domain. * * @since 4.1.4 * * @return void */ public function loadTextDomain() { parent::loadTextDomain(); aioseo()->helpers->loadTextDomain( 'aioseo-pro' ); } }