oldOptions = aioseo()->migration->oldOptions; $this->migrateSeparatorCharacter(); $this->setDefaultArticleType(); $this->migrateHomePageMeta(); $this->migrateTitleFormats(); $this->migrateDescriptionFormat(); $this->migrateNoindexSettings(); $this->migrateNofollowSettings(); $this->migratePostSeoColumns(); $this->migrateSocialUrls(); $this->migrateSchemaMarkupSettings(); $this->migrateHomePageKeywords(); $this->migrateDeprecatedAdvancedOptions(); $this->migrateRssContentSettings(); $this->migrateRedirectToParent(); $this->migrateDisabledPosts(); $this->migrateGoogleAnalytics(); $settings = [ 'aiosp_no_paged_canonical_links' => [ 'type' => 'boolean', 'newOption' => [ 'searchAppearance', 'advanced', 'noPaginationForCanonical' ] ], 'aiosp_showseonews' => [ 'type' => 'boolean', 'newOption' => [ 'advanced', 'dashboardWidget' ] ], 'aiosp_admin_bar' => [ 'type' => 'boolean', 'newOption' => [ 'advanced', 'adminBarMenu' ] ], 'aiosp_google_verify' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'google' ] ], 'aiosp_bing_verify' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'bing' ] ], 'aiosp_pinterest_verify' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'pinterest' ] ], 'aiosp_yandex_verify' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'yandex' ] ], 'aiosp_baidu_verify' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'baidu' ] ], 'aiosp_google_analytics_id' => [ 'type' => 'string', 'newOption' => [ 'deprecated', 'webmasterTools', 'googleAnalytics', 'id' ] ], 'aiosp_ga_advanced_options' => [ 'type' => 'boolean', 'newOption' => [ 'deprecated', 'webmasterTools', 'googleAnalytics', 'advanced' ] ], 'aiosp_ga_domain' => [ 'type' => 'string', 'newOption' => [ 'deprecated', 'webmasterTools', 'googleAnalytics', 'trackingDomain' ] ], 'aiosp_ga_multi_domain' => [ 'type' => 'boolean', 'newOption' => [ 'deprecated', 'webmasterTools', 'googleAnalytics', 'multipleDomains' ] ], 'aiosp_ga_addl_domains' => [ 'type' => 'string', 'newOption' => [ 'deprecated', 'webmasterTools', 'googleAnalytics', 'additionalDomains' ] ], 'aiosp_ga_anonymize_ip' => [ 'type' => 'boolean', 'newOption' => [ 'deprecated', 'webmasterTools', 'googleAnalytics', 'anonymizeIp' ] ], 'aiosp_ga_display_advertising' => [ 'type' => 'boolean', 'newOption' => [ 'deprecated', 'webmasterTools', 'googleAnalytics', 'displayAdvertiserTracking' ] ], 'aiosp_ga_exclude_users' => [ 'type' => 'array', 'newOption' => [ 'deprecated', 'webmasterTools', 'googleAnalytics', 'excludeUsers' ] ], 'aiosp_ga_track_outbound_links' => [ 'type' => 'boolean', 'newOption' => [ 'deprecated', 'webmasterTools', 'googleAnalytics', 'trackOutboundLinks' ] ], 'aiosp_ga_link_attribution' => [ 'type' => 'boolean', 'newOption' => [ 'deprecated', 'webmasterTools', 'googleAnalytics', 'enhancedLinkAttribution' ] ], 'aiosp_ga_enhanced_ecommerce' => [ 'type' => 'boolean', 'newOption' => [ 'deprecated', 'webmasterTools', 'googleAnalytics', 'enhancedEcommerce' ] ], 'aiosp_schema_site_represents' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'global', 'schema', 'siteRepresents' ] ], 'aiosp_schema_organization_name' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'global', 'schema', 'organizationName' ] ], 'aiosp_schema_person_manual_name' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'global', 'schema', 'personName' ] ], 'aiosp_schema_organization_logo' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'global', 'schema', 'organizationLogo' ] ], 'aiosp_schema_person_manual_image' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'global', 'schema', 'personLogo' ] ], 'aiosp_schema_search_results_page' => [ 'type' => 'boolean', 'newOption' => [ 'searchAppearance', 'advanced', 'sitelinks' ] ], 'aiosp_togglekeywords' => [ 'type' => 'boolean', 'newOption' => [ 'searchAppearance', 'advanced', 'useKeywords' ] ], 'aiosp_use_categories' => [ 'type' => 'boolean', 'newOption' => [ 'searchAppearance', 'advanced', 'useCategoriesForMetaKeywords' ] ], 'aiosp_use_tags_as_keywords' => [ 'type' => 'boolean', 'newOption' => [ 'searchAppearance', 'advanced', 'useTagsForMetaKeywords' ] ], 'aiosp_dynamic_postspage_keywords' => [ 'type' => 'boolean', 'newOption' => [ 'searchAppearance', 'advanced', 'dynamicallyGenerateKeywords' ] ], ]; aioseo()->migration->helpers->mapOldToNew( $settings, aioseo()->migration->oldOptions ); } /** * Migrates the separator character. * * @since 4.0.0 * * @return void */ private function migrateSeparatorCharacter() { aioseo()->options->searchAppearance->global->separator = '|'; } /** * Set the default posts schema type to Article. * * @since 4.0.0 * * @return void */ private function setDefaultArticleType() { if ( aioseo()->dynamicOptions->searchAppearance->postTypes->has( 'post' ) ) { aioseo()->dynamicOptions->searchAppearance->postTypes->post->articleType = 'Article'; } } /** * Migrates the homepage meta. * * @since 4.0.0 * * @return void */ private function migrateHomePageMeta() { $this->migrateHomePageTitle(); $this->migrateHomePageDescription(); // If the homepage is a static one, we should migrate the meta now. $showOnFront = get_option( 'show_on_front' ); $pageOnFront = (int) get_option( 'page_on_front' ); if ( 'page' !== $showOnFront || ! $pageOnFront ) { return; } $post = 'page' === $showOnFront && $pageOnFront ? get_post( $pageOnFront ) : ''; $aioseoPost = Models\Post::getPost( $post->ID ); $postMeta = aioseo()->db ->start( 'postmeta' . ' as pm' ) ->select( 'pm.meta_key, pm.meta_value' ) ->where( 'pm.post_id', $post->ID ) ->whereRaw( "`pm`.`meta_key` LIKE '_aioseop_%'" ) ->run() ->result(); $mappedMeta = [ '_aioseop_nofollow' => 'robots_nofollow', '_aioseop_sitemap_priority' => 'priority', '_aioseop_sitemap_frequency' => 'frequency', '_aioseop_keywords' => 'keywords', '_aioseop_opengraph_settings' => '', ]; $meta = [ 'post_id' => $post->ID, ]; foreach ( $postMeta as $record ) { $name = $record->meta_key; $value = $record->meta_value; if ( ! in_array( $name, array_keys( $mappedMeta ), true ) ) { continue; } switch ( $name ) { case '_aioseop_nofollow': $meta[ $mappedMeta[ $name ] ] = ! empty( $value ); if ( ! empty( $value ) ) { $meta['robots_default'] = false; } break; case '_aioseop_keywords': $meta[ $mappedMeta[ $name ] ] = aioseo()->migration->helpers->oldKeywordsToNewKeywords( $value ); break; case '_aioseop_opengraph_settings': $class = new Meta(); $meta += $class->convertOpenGraphMeta( $value ); // We'll deal with the OG title/description in the Social Meta migration class. if ( isset( $meta['og_title'] ) ) { unset( $meta['og_title'] ); } if ( isset( $meta['og_description'] ) ) { unset( $meta['og_description'] ); } break; default: $meta[ $mappedMeta[ $name ] ] = aioseo()->helpers->sanitizeOption( $value ); break; } } $aioseoPost->set( $meta ); $aioseoPost->save(); } /** * Migrates the homepage title. * * @since 4.0.0 * * @return void */ private function migrateHomePageTitle() { $showOnFront = get_option( 'show_on_front' ); $pageOnFront = (int) get_option( 'page_on_front' ); $homePageTitle = ! empty( $this->oldOptions['aiosp_home_title'] ) ? $this->oldOptions['aiosp_home_title'] : ''; $format = $this->oldOptions['aiosp_home_page_title_format']; if ( 'posts' === $showOnFront ) { $homePageTitle = $homePageTitle ? $homePageTitle : get_bloginfo( 'name' ); $title = empty( $format ) ? $homePageTitle : aioseo()->helpers->pregReplace( '#%page_title%#', $homePageTitle, $format ); $title = aioseo()->migration->helpers->macrosToSmartTags( $title ); aioseo()->options->searchAppearance->global->siteTitle = aioseo()->helpers->sanitizeOption( $title ); return; } // Set the setting globally regardless of what happens below. if ( ! empty( $homePageTitle ) ) { $title = aioseo()->migration->helpers->macrosToSmartTags( aioseo()->helpers->pregReplace( '#%page_title%#', $homePageTitle, $format ) ); aioseo()->options->searchAppearance->global->siteTitle = aioseo()->helpers->sanitizeOption( $title ); } $post = 'page' === $showOnFront && $pageOnFront ? get_post( $pageOnFront ) : ''; $metaTitle = get_post_meta( $post->ID, '_aioseop_title', true ); $homePageTitle = ''; if ( empty( $this->oldOptions['aiosp_use_static_home_info'] ) ) { $homePageTitle = ! empty( $this->oldOptions['aiosp_home_title'] ) ? $this->oldOptions['aiosp_home_title'] : '#site_title'; $homePageTitle = ! empty( $metaTitle ) ? $metaTitle : $homePageTitle; $homePageTitle = empty( $format ) ? $homePageTitle : aioseo()->helpers->pregReplace( '#%page_title%#', $homePageTitle, $format ); $homePageTitle = aioseo()->migration->helpers->macrosToSmartTags( $homePageTitle ); } else { if ( ! empty( $metaTitle ) ) { $homePageTitle = empty( $format ) ? $metaTitle : aioseo()->helpers->pregReplace( '#%page_title%#', $metaTitle, $format ); $homePageTitle = aioseo()->migration->helpers->macrosToSmartTags( $homePageTitle ); } } $aioseoPost = Models\Post::getPost( $post->ID ); $aioseoPost->set( [ 'post_id' => $post->ID, 'title' => aioseo()->helpers->sanitizeOption( $homePageTitle ) ] ); $aioseoPost->save(); $this->maybeShowHomePageTitleNotice( $post ); } /** * Check if we should display a notice warning users that their homepage title may have changed. * * @since 4.0.0 * * @param WP_Post $post The post object. * @return void */ private function maybeShowHomePageTitleNotice( $post ) { $metaTitle = get_post_meta( $post->ID, '_aioseop_title', true ); $homePageTitle = ! empty( $this->oldOptions['aiosp_home_title'] ) ? $this->oldOptions['aiosp_home_title'] : ''; if ( empty( $this->oldOptions['aiosp_use_static_home_info'] ) && $metaTitle && ( trim( $homePageTitle ) !== trim( $metaTitle ) ) ) { $this->showHomePageSettingsNotice(); } } /** * Migrates the homepage description. * * @since 4.0.0 * * @return void */ private function migrateHomePageDescription() { $showOnFront = get_option( 'show_on_front' ); $pageOnFront = (int) get_option( 'page_on_front' ); $homePageDescription = ! empty( $this->oldOptions['aiosp_home_description'] ) ? $this->oldOptions['aiosp_home_description'] : ''; $format = $this->oldOptions['aiosp_description_format']; if ( 'posts' === $showOnFront ) { // If the description had the page_title macro, we want to replace it with the actual page title itself. $homePageDescription = $homePageDescription ? $homePageDescription : get_bloginfo( 'description' ); $homePageTitle = ! empty( $this->oldOptions['aiosp_home_title'] ) ? $this->oldOptions['aiosp_home_title'] : get_bloginfo( 'name' ); $format = aioseo()->helpers->pregReplace( '#%page_title%#', $homePageTitle, $format ); $description = empty( $format ) ? $homePageDescription : aioseo()->helpers->pregReplace( '#%description%#', $homePageDescription, $format ); $description = aioseo()->migration->helpers->macrosToSmartTags( $description ); aioseo()->options->searchAppearance->global->metaDescription = aioseo()->helpers->sanitizeOption( $description ); return; } // Set the setting globally regardless of what happens below. if ( ! empty( $homePageDescription ) ) { $homePageTitle = ! empty( $this->oldOptions['aiosp_home_title'] ) ? $this->oldOptions['aiosp_home_title'] : get_bloginfo( 'name' ); $format = aioseo()->helpers->pregReplace( '#%page_title%#', $homePageTitle, $format ); $description = aioseo()->migration->helpers->macrosToSmartTags( aioseo()->helpers->pregReplace( '#%description%#', $homePageDescription, $format ) ); aioseo()->options->searchAppearance->global->metaDescription = aioseo()->helpers->sanitizeOption( $description ); } $post = 'page' === $showOnFront && $pageOnFront ? get_post( $pageOnFront ) : ''; $metaDescription = get_post_meta( $post->ID, '_aioseop_description', true ); $homePageDescription = ''; if ( empty( $this->oldOptions['aiosp_use_static_home_info'] ) ) { $homePageDescription = ! empty( $this->oldOptions['aiosp_home_description'] ) ? $this->oldOptions['aiosp_home_description'] : ''; $homePageDescription = ! empty( $metaDescription ) ? $metaDescription : $homePageDescription; } else { if ( ! empty( $metaDescription ) ) { $homePageDescription = empty( $format ) ? $metaDescription : aioseo()->helpers->pregReplace( '#%description%#', $metaDescription, $format ); $homePageDescription = aioseo()->migration->helpers->macrosToSmartTags( $homePageDescription ); } } $homePageDescription = empty( $format ) ? $homePageDescription : aioseo()->helpers->pregReplace( '#(%description%|%page_title%)#', $homePageDescription, $format ); $homePageDescription = aioseo()->migration->helpers->macrosToSmartTags( $homePageDescription ); $aioseoPost = Models\Post::getPost( $post->ID ); $aioseoPost->set( [ 'post_id' => $post->ID, 'description' => aioseo()->helpers->sanitizeOption( $homePageDescription ) ] ); $aioseoPost->save(); $this->maybeShowHomePageDescriptionNotice( $post ); } /** * Check if we should display a notice warning users that their homepage title may have changed. * * @since 4.0.0 * * @param WP_Post $post The post object. * @return void */ private function maybeShowHomePageDescriptionNotice( $post ) { $metaDescription = get_post_meta( $post->ID, '_aioseop_description', true ); $homePageDescription = ! empty( $this->oldOptions['aiosp_home_description'] ) ? $this->oldOptions['aiosp_home_description'] : ''; if ( empty( $this->oldOptions['aiosp_use_static_home_info'] ) && $metaDescription && ( trim( $homePageDescription ) !== trim( $metaDescription ) ) ) { $this->showHomePageSettingsNotice(); } } /** * Shows the homepage settings notice. * * @since 4.0.0 * * @return void */ private function showHomePageSettingsNotice() { $notification = Models\Notification::getNotificationByName( 'v3-migration-homepage-settings' ); if ( $notification->notification_name ) { return; } Models\Notification::addNotification( [ 'slug' => uniqid(), 'notification_name' => 'v3-migration-homepage-settings', 'title' => __( 'Review Your Homepage Title & Description', 'all-in-one-seo-pack' ), 'content' => sprintf( // Translators: 1 - All in One SEO. __( 'Due to a bug in the previous version of %1$s, your homepage title and description may have changed. Please take a minute to review your homepage settings to verify that they are correct.', 'all-in-one-seo-pack' ), // phpcs:ignore Generic.Files.LineLength.MaxExceeded AIOSEO_PLUGIN_NAME ), 'type' => 'warning', 'level' => [ 'all' ], 'button1_label' => __( 'Review Now', 'all-in-one-seo-pack' ), 'button1_action' => 'http://route#aioseo-search-appearance&aioseo-scroll=home-page-settings&aioseo-highlight=home-page-settings:global-settings', 'start' => gmdate( 'Y-m-d H:i:s' ) ] ); } /** * Migrates the title formats. * * @since 4.0.0 * * @return void */ private function migrateTitleFormats() { if ( ! empty( $this->oldOptions['aiosp_archive_title_format'] ) ) { $archives = array_keys( aioseo()->dynamicOptions->searchAppearance->archives->all() ); $format = aioseo()->helpers->sanitizeOption( aioseo()->migration->helpers->macrosToSmartTags( $this->oldOptions['aiosp_archive_title_format'] ) ); foreach ( $archives as $archive ) { aioseo()->dynamicOptions->searchAppearance->archives->$archive->title = $format; } } $settings = [ 'aiosp_post_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'postTypes', 'post', 'title' ], 'dynamic' => true ], 'aiosp_page_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'postTypes', 'page', 'title' ], 'dynamic' => true ], 'aiosp_attachment_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'postTypes', 'attachment', 'title' ], 'dynamic' => true ], 'aiosp_category_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'taxonomies', 'category', 'title' ], 'dynamic' => true ], 'aiosp_tag_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'taxonomies', 'post_tag', 'title' ], 'dynamic' => true ], 'aiosp_date_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'archives', 'date', 'title' ] ], 'aiosp_author_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'archives', 'author', 'title' ] ], 'aiosp_search_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'archives', 'search', 'title' ] ], 'aiosp_paged_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'advanced', 'pagedFormat' ] ] ]; foreach ( $this->oldOptions as $name => $value ) { if ( ! in_array( $name, array_keys( $settings ), true ) && preg_match( '#aiosp_(.*)_title_format#', $name, $slug ) ) { if ( empty( $slug ) && empty( $slug[1] ) ) { continue; } $objectSlug = aioseo()->helpers->pregReplace( '#_tax#', '', $slug[1] ); if ( in_array( $objectSlug, aioseo()->helpers->getPublicPostTypes( true ), true ) ) { $settings[ $name ] = [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'postTypes', $objectSlug, 'title' ], 'dynamic' => true ]; continue; } if ( in_array( $objectSlug, aioseo()->helpers->getPublicTaxonomies( true ), true ) ) { $settings[ $name ] = [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'taxonomies', $objectSlug, 'title' ], 'dynamic' => true ]; } } } aioseo()->migration->helpers->mapOldToNew( $settings, $this->oldOptions, true ); // Check if any of the title formats were empty and register a notification if so. $found = false; foreach ( $settings as $k => $v ) { if ( 'aiosp_home_page_title_format' === $k ) { continue; } if ( isset( $this->oldOptions[ $k ] ) && empty( $this->oldOptions[ $k ] ) ) { $found = true; break; } } if ( ! $found ) { Models\Notification::deleteNotificationByName( 'v3-migration-title-formats-blank' ); return; } $notification = Models\Notification::getNotificationByName( 'v3-migration-title-formats-blank' ); if ( $notification->notification_name ) { return; } $p1 = sprintf( // Translators: 1 - The plugin short name ("AIOSEO"), 2 - The plugin short name ("AIOSEO"), 3 - Opening link tag, 4 - Closing link tag. __( '%1$s migrated all your title formats, some of which were blank. If you were purposely using blank formats in the previous version of %2$s and want WordPress to handle your titles, you can safely dismiss this message. For more information, check out our documentation on %3$sblank title formats%4$s.', 'all-in-one-seo-pack' ), // phpcs:ignore Generic.Files.LineLength.MaxExceeded AIOSEO_PLUGIN_SHORT_NAME, AIOSEO_PLUGIN_SHORT_NAME, '', '' ); Models\Notification::addNotification( [ 'slug' => uniqid(), 'notification_name' => 'v3-migration-title-formats-blank', 'title' => __( 'Blank Title Formats Detected', 'all-in-one-seo-pack' ), 'content' => $p1, 'type' => 'warning', 'level' => [ 'all' ], 'button1_label' => __( 'Learn More', 'all-in-one-seo-pack' ), 'button1_action' => aioseo()->helpers->utmUrl( AIOSEO_MARKETING_URL . '/docs/blank-title-formats-detected', 'notifications-center', 'v3-migration-title-formats-blank' ), 'start' => gmdate( 'Y-m-d H:i:s' ) ] ); } /** * Migrates the description format. * * @since 4.0.0 * * @return void */ private function migrateDescriptionFormat() { if ( ! empty( $this->oldOptions['aiosp_generate_descriptions'] ) && empty( $this->oldOptions['aiosp_skip_excerpt'] ) ) { foreach ( aioseo()->helpers->getPublicPostTypes() as $postType ) { if ( empty( $postType['hasExcerpt'] ) ) { continue; } if ( aioseo()->dynamicOptions->searchAppearance->postTypes->has( $postType['name'] ) ) { aioseo()->dynamicOptions->searchAppearance->postTypes->{$postType['name']}->metaDescription = '#post_excerpt'; } } } if ( empty( $this->oldOptions['aiosp_description_format'] ) || '%description%' === trim( $this->oldOptions['aiosp_description_format'] ) ) { return; } $deprecatedOptions = aioseo()->internalOptions->internal->deprecatedOptions; array_push( $deprecatedOptions, 'descriptionFormat' ); aioseo()->internalOptions->internal->deprecatedOptions = $deprecatedOptions; $format = aioseo()->migration->helpers->macrosToSmartTags( $this->oldOptions['aiosp_description_format'] ); aioseo()->options->deprecated->searchAppearance->global->descriptionFormat = aioseo()->helpers->sanitizeOption( $format ); } /** * Migrates the noindex settings. * * @since 4.0.0 * * @return void */ private function migrateNoindexSettings() { if ( ! isset( $this->oldOptions['aiosp_cpostnoindex'] ) && ! isset( $this->oldOptions['aiosp_tax_noindex'] ) ) { return; } $noindexedPostTypes = is_array( $this->oldOptions['aiosp_cpostnoindex'] ) ? $this->oldOptions['aiosp_cpostnoindex'] : explode( ', ', $this->oldOptions['aiosp_cpostnoindex'] ); foreach ( array_intersect( aioseo()->helpers->getPublicPostTypes( true ), $noindexedPostTypes ) as $postType ) { if ( aioseo()->dynamicOptions->noConflict()->searchAppearance->postTypes->has( $postType ) ) { aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->show = false; aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->default = false; aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->noindex = true; } } $noindexedTaxonomies = isset( $this->oldOptions['aiosp_tax_noindex'] ) ? (array) $this->oldOptions['aiosp_tax_noindex'] : []; if ( ! empty( $this->oldOptions['aiosp_category_noindex'] ) ) { $noindexedTaxonomies[] = 'category'; } if ( ! empty( $this->oldOptions['aiosp_tags_noindex'] ) ) { $noindexedTaxonomies[] = 'post_tag'; } if ( ! empty( $noindexedTaxonomies ) ) { foreach ( array_intersect( aioseo()->helpers->getPublicTaxonomies( true ), $noindexedTaxonomies ) as $taxonomy ) { if ( aioseo()->dynamicOptions->noConflict()->searchAppearance->taxonomies->has( $taxonomy ) ) { aioseo()->dynamicOptions->searchAppearance->taxonomies->$taxonomy->show = false; aioseo()->dynamicOptions->searchAppearance->taxonomies->$taxonomy->advanced->robotsMeta->default = false; aioseo()->dynamicOptions->searchAppearance->taxonomies->$taxonomy->advanced->robotsMeta->noindex = true; } } } if ( ! empty( $this->oldOptions['aiosp_archive_date_noindex'] ) ) { aioseo()->options->searchAppearance->archives->date->show = false; aioseo()->options->searchAppearance->archives->date->advanced->robotsMeta->default = false; aioseo()->options->searchAppearance->archives->date->advanced->robotsMeta->noindex = true; } if ( ! empty( $this->oldOptions['aiosp_archive_author_noindex'] ) ) { aioseo()->options->searchAppearance->archives->author->show = false; aioseo()->options->searchAppearance->archives->author->advanced->robotsMeta->default = false; aioseo()->options->searchAppearance->archives->author->advanced->robotsMeta->noindex = true; } if ( ! empty( $this->oldOptions['aiosp_search_noindex'] ) ) { aioseo()->options->searchAppearance->archives->search->show = false; aioseo()->options->searchAppearance->archives->search->advanced->robotsMeta->default = false; aioseo()->options->searchAppearance->archives->search->advanced->robotsMeta->noindex = true; } else { // We need to do this as V4 will noindex the search page otherwise. aioseo()->options->searchAppearance->archives->search->show = true; aioseo()->options->searchAppearance->archives->search->advanced->robotsMeta->default = true; aioseo()->options->searchAppearance->archives->search->advanced->robotsMeta->noindex = false; } if ( ! empty( $this->oldOptions['aiosp_paginated_noindex'] ) ) { aioseo()->options->searchAppearance->advanced->globalRobotsMeta->default = false; aioseo()->options->searchAppearance->advanced->globalRobotsMeta->noindexPaginated = true; } } /** * Migrates the nofollow settings. * * @since 4.0.0 * * @return void */ private function migrateNofollowSettings() { if ( ! empty( $this->oldOptions['aiosp_cpostnofollow'] ) ) { foreach ( array_intersect( aioseo()->helpers->getPublicPostTypes( true ), $this->oldOptions['aiosp_cpostnofollow'] ) as $postType ) { if ( aioseo()->dynamicOptions->noConflict()->searchAppearance->postTypes->has( $postType ) ) { aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->default = false; aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->nofollow = true; } } } if ( ! empty( $this->oldOptions['aiosp_paginated_nofollow'] ) ) { aioseo()->options->searchAppearance->advanced->globalRobotsMeta->nofollowPaginated = true; } } /** * Migrates the post SEO columns. * * @since 4.0.0 * * @return void */ private function migratePostSeoColumns() { if ( ! isset( $this->oldOptions['aiosp_posttypecolumns'] ) ) { return; } $publicPostTypes = aioseo()->helpers->getPublicPostTypes( true ); $postTypes = array_intersect( (array) $this->oldOptions['aiosp_posttypecolumns'], $publicPostTypes ); aioseo()->options->advanced->postTypes->included = array_values( $postTypes ); if ( count( $publicPostTypes ) !== count( $postTypes ) ) { aioseo()->options->advanced->postTypes->all = false; } } /** * Migrates the schema social URLs. * * @since 4.0.0 * * @return void */ private function migrateSocialUrls() { if ( ! empty( $this->oldOptions['modules']['aiosp_opengraph_options']['aiosp_opengraph_facebook_publisher'] ) ) { aioseo()->options->social->profiles->urls->facebookPageUrl = esc_url( wp_strip_all_tags( $this->oldOptions['modules']['aiosp_opengraph_options']['aiosp_opengraph_facebook_publisher'] ) ); aioseo()->options->social->profiles->sameUsername->enable = false; } if ( empty( $this->oldOptions['aiosp_schema_social_profile_links'] ) ) { return; } $socialUrls = aioseo()->helpers->pregReplace( '/\s/', '\r\n', $this->oldOptions['aiosp_schema_social_profile_links'] ); $socialUrls = array_filter( explode( '\r\n', $socialUrls ) ); if ( ! count( $socialUrls ) ) { return; } $supportedNetworks = [ 'facebook.com' => 'facebookPageUrl', 'twitter.com' => 'twitterUrl', 'instagram.com' => 'instagramUrl', 'pinterest.com' => 'pinterestUrl', 'youtube.com' => 'youtubeUrl', 'linkedin.com' => 'linkedinUrl', 'tumblr.com' => 'tumblrUrl', 'yelp.com' => 'yelpPageUrl', 'soundcloud.com' => 'soundCloudUrl', 'wikipedia.org' => 'wikipediaUrl', 'myspace.com' => 'myspaceUrl', ]; $found = false; foreach ( $supportedNetworks as $url => $settingName ) { $url = aioseo()->helpers->escapeRegex( $url ); foreach ( $socialUrls as $socialUrl ) { if ( preg_match( "/.*$url.*/", $socialUrl ) ) { aioseo()->options->social->profiles->urls->$settingName = esc_url( wp_strip_all_tags( $socialUrl ) ); $found = true; } } } if ( $found ) { aioseo()->options->social->profiles->sameUsername->enable = false; } } /** * Migrates the Schema Markup settings in the General Settings menu. * * @since 4.0.0 * * @return void */ private function migrateSchemaMarkupSettings() { $this->migrateSchemaPhoneNumber(); if ( isset( $this->oldOptions['aiosp_schema_markup'] ) && empty( $this->oldOptions['aiosp_schema_markup'] ) ) { $deprecatedOptions = aioseo()->internalOptions->internal->deprecatedOptions; array_push( $deprecatedOptions, 'enableSchemaMarkup' ); aioseo()->internalOptions->internal->deprecatedOptions = $deprecatedOptions; aioseo()->options->deprecated->searchAppearance->global->schema->enableSchemaMarkup = false; } if ( ! empty( $this->oldOptions['aiosp_schema_person_user'] ) ) { if ( -1 === (int) $this->oldOptions['aiosp_schema_person_user'] ) { aioseo()->options->searchAppearance->global->schema->person = 'manual'; } else { aioseo()->options->searchAppearance->global->schema->person = intval( $this->oldOptions['aiosp_schema_person_user'] ); } } if ( ! empty( $this->oldOptions['aiosp_schema_contact_type'] ) ) { aioseo()->options->searchAppearance->global->schema->contactType = 'manual'; aioseo()->options->searchAppearance->global->schema->contactTypeManual = aioseo()->helpers->sanitizeOption( $this->oldOptions['aiosp_schema_contact_type'] ); } } /** * Migrates the schema phone number. * * @since 4.0.0 * * @return void */ private function migrateSchemaPhoneNumber() { if ( empty( $this->oldOptions['aiosp_schema_phone_number'] ) ) { return; } $phoneNumber = aioseo()->helpers->sanitizeOption( $this->oldOptions['aiosp_schema_phone_number'] ); if ( ! preg_match( '#\+\d+#', $phoneNumber ) ) { $notification = Models\Notification::getNotificationByName( 'v3-migration-schema-number' ); if ( $notification->notification_name ) { return; } Models\Notification::addNotification( [ 'slug' => uniqid(), 'notification_name' => 'v3-migration-schema-number', 'title' => __( 'Invalid Phone Number for Knowledge Graph', 'all-in-one-seo-pack' ), 'content' => sprintf( // Translators: 1 - The phone number. __( 'The phone number that you previously entered for your Knowledge Graph schema markup is invalid. As it needs to be internationally formatted, please enter it (%1$s) again with the country code, e.g. +1 (555) 555-1234.', 'all-in-one-seo-pack' ), // phpcs:ignore Generic.Files.LineLength.MaxExceeded "$phoneNumber" ), 'type' => 'warning', 'level' => [ 'all' ], 'button1_label' => __( 'Fix Now', 'all-in-one-seo-pack' ), 'button1_action' => 'http://route#aioseo-search-appearance&aioseo-scroll=schema-graph-phone&aioseo-highlight=schema-graph-phone:global-settings', 'button2_label' => __( 'Remind Me Later', 'all-in-one-seo-pack' ), 'button2_action' => 'http://action#notification/v3-migration-schema-number-reminder', 'start' => gmdate( 'Y-m-d H:i:s' ) ] ); return; } aioseo()->options->searchAppearance->global->schema->phone = $phoneNumber; } /** * Migrates the homepage keywords. * * @since 4.0.0 * * @return void */ private function migrateHomePageKeywords() { if ( ! empty( $this->oldOptions['aiosp_home_keywords'] ) ) { aioseo()->options->searchAppearance->global->keywords = aioseo()->migration->helpers->oldKeywordsToNewKeywords( $this->oldOptions['aiosp_home_keywords'] ); } } /** * Migrates the deprecated V3 advanced General Settings options. * * @since 4.0.0 * * @return void */ private function migrateDeprecatedAdvancedOptions() { $deprecatedOptions = aioseo()->internalOptions->internal->deprecatedOptions; if ( empty( $this->oldOptions['aiosp_generate_descriptions'] ) ) { array_push( $deprecatedOptions, 'autogenerateDescriptions' ); aioseo()->options->deprecated->searchAppearance->advanced->autogenerateDescriptions = false; } else { if ( empty( $this->oldOptions['aiosp_run_shortcodes'] ) ) { array_push( $deprecatedOptions, 'runShortcodesInDescription' ); aioseo()->options->deprecated->searchAppearance->advanced->runShortcodesInDescription = false; } if ( ! empty( $this->oldOptions['aiosp_skip_excerpt'] ) ) { array_push( $deprecatedOptions, 'useContentForAutogeneratedDescriptions' ); aioseo()->options->deprecated->searchAppearance->advanced->useContentForAutogeneratedDescriptions = true; } } aioseo()->internalOptions->internal->deprecatedOptions = $deprecatedOptions; } /** * Migrates the RSS content settings. * * @since 4.0.0 * * @return void */ private function migrateRssContentSettings() { if ( isset( $this->oldOptions['aiosp_rss_content_before'] ) ) { aioseo()->options->rssContent->before = esc_html( aioseo()->migration->helpers->macrosToSmartTags( $this->oldOptions['aiosp_rss_content_before'] ) ); } if ( isset( $this->oldOptions['aiosp_rss_content_after'] ) ) { aioseo()->options->rssContent->after = esc_html( aioseo()->migration->helpers->macrosToSmartTags( $this->oldOptions['aiosp_rss_content_after'] ) ); } } /** * Migrates the Redirect Attachment to Parent setting. * * @since 4.0.0 * * @return void */ private function migrateRedirectToParent() { if ( isset( $this->oldOptions['aiosp_redirect_attachement_parent'] ) ) { if ( ! empty( $this->oldOptions['aiosp_redirect_attachement_parent'] ) ) { aioseo()->dynamicOptions->searchAppearance->postTypes->attachment->redirectAttachmentUrls = 'attachment_parent'; } else { aioseo()->dynamicOptions->searchAppearance->postTypes->attachment->redirectAttachmentUrls = 'disabled'; } } } /** * Migrates the excluded posts. * * @since 4.0.0 * * @return void */ private function migrateDisabledPosts() { if ( empty( $this->oldOptions['aiosp_ex_pages'] ) ) { return; } $deprecatedOptions = aioseo()->internalOptions->internal->deprecatedOptions; if ( ! in_array( 'excludePosts', $deprecatedOptions, true ) ) { array_push( $deprecatedOptions, 'excludePosts' ); aioseo()->internalOptions->internal->deprecatedOptions = $deprecatedOptions; } $excludedPosts = aioseo()->options->deprecated->searchAppearance->advanced->excludePosts; $pages = explode( ',', $this->oldOptions['aiosp_ex_pages'] ); if ( count( $pages ) ) { foreach ( $pages as $page ) { $page = trim( $page ); $id = intval( $page ); if ( ! $id ) { $post = get_page_by_path( $page, OBJECT, aioseo()->helpers->getPublicPostTypes( true ) ); if ( $post && is_object( $post ) ) { $id = $post->ID; } } if ( $id ) { $post = get_post( $id ); if ( ! is_object( $post ) ) { continue; } $excludedPost = new \stdClass(); $excludedPost->value = $id; $excludedPost->type = $post->post_type; $excludedPost->label = $post->post_title; $excludedPost->link = get_permalink( $id ); array_push( $excludedPosts, wp_json_encode( $excludedPost ) ); } } } aioseo()->options->deprecated->searchAppearance->advanced->excludePosts = $excludedPosts; } /** * Enables deprecated Google Analytics if there is an existing GA id. * * @since 4.0.6 * * @return void */ private function migrateGoogleAnalytics() { if ( empty( $this->oldOptions['aiosp_google_analytics_id'] ) ) { return; } $deprecatedOptions = aioseo()->internalOptions->internal->deprecatedOptions; if ( ! in_array( 'googleAnalytics', $deprecatedOptions, true ) ) { array_push( $deprecatedOptions, 'googleAnalytics' ); aioseo()->internalOptions->internal->deprecatedOptions = $deprecatedOptions; } } }