importExport->yoastSeo->postActionName ) ) { return; } if ( ! aioseo()->cache->get( 'import_post_meta_yoast_seo' ) ) { aioseo()->cache->update( 'import_post_meta_yoast_seo', time(), WEEK_IN_SECONDS ); } as_schedule_single_action( time(), aioseo()->importExport->yoastSeo->postActionName, [], 'aioseo' ); } catch ( \Exception $e ) { // Do nothing. } } /** * Imports the post meta. * * @since 4.0.0 * * @return void */ public function importPostMeta() { $postsPerAction = 100; $publicPostTypes = implode( "', '", aioseo()->helpers->getPublicPostTypes( true ) ); $timeStarted = gmdate( 'Y-m-d H:i:s', aioseo()->cache->get( 'import_post_meta_yoast_seo' ) ); $posts = aioseo()->db ->start( 'posts' . ' as p' ) ->select( 'p.ID, p.post_type' ) ->leftJoin( 'aioseo_posts as ap', '`p`.`ID` = `ap`.`post_id`' ) ->whereRaw( "( p.post_type IN ( '$publicPostTypes' ) )" ) ->whereRaw( "( ap.post_id IS NULL OR ap.updated < '$timeStarted' )" ) ->orderBy( 'p.ID DESC' ) ->limit( $postsPerAction ) ->run() ->result(); if ( ! $posts || ! count( $posts ) ) { aioseo()->cache->delete( 'import_post_meta_yoast_seo' ); return; } $mappedMeta = [ '_yoast_wpseo_title' => 'title', '_yoast_wpseo_metadesc' => 'description', '_yoast_wpseo_canonical' => 'canonical_url', '_yoast_wpseo_meta-robots-noindex' => 'robots_noindex', '_yoast_wpseo_meta-robots-nofollow' => 'robots_nofollow', '_yoast_wpseo_meta-robots-adv' => '', '_yoast_wpseo_focuskw' => '', '_yoast_wpseo_focuskeywords' => '', '_yoast_wpseo_opengraph-title' => 'og_title', '_yoast_wpseo_opengraph-description' => 'og_description', '_yoast_wpseo_opengraph-image' => 'og_image_custom_url', '_yoast_wpseo_twitter-title' => 'twitter_title', '_yoast_wpseo_twitter-description' => 'twitter_description', '_yoast_wpseo_twitter-image' => 'twitter_image_custom_url', '_yoast_wpseo_schema_page_type' => '', '_yoast_wpseo_schema_article_type' => '', '_yoast_wpseo_primary_category' => 'og_article_section' ]; foreach ( $posts as $post ) { $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 '_yoast_wpseo_%'" ) ->run() ->result(); $categories = aioseo()->helpers->getAllCategories( $post->ID ); $featuredImage = get_the_post_thumbnail_url( $post->ID ); $meta = [ 'post_id' => (int) $post->ID, 'twitter_use_og' => true, 'og_image_type' => $featuredImage ? 'featured' : 'content', 'og_article_section' => ! empty( $categories ) ? $categories[0] : null ]; if ( ! $postMeta || ! count( $postMeta ) ) { $aioseoPost = Models\Post::getPost( (int) $post->ID ); $aioseoPost->set( $meta ); $aioseoPost->save(); aioseo()->migration->meta->migrateAdditionalPostMeta( $post->ID ); continue; } $title = ''; foreach ( $postMeta as $record ) { $name = $record->meta_key; $value = $record->meta_value; if ( ! in_array( $name, array_keys( $mappedMeta ), true ) ) { continue; } switch ( $name ) { case '_yoast_wpseo_primary_category': $primaryCategory = get_cat_name( $value ); foreach ( $categories as $category ) { if ( aioseo()->helpers->toLowerCase( $primaryCategory ) === aioseo()->helpers->toLowerCase( $category ) ) { $meta[ $mappedMeta[ $name ] ] = $category; break 2; } } $meta[ $mappedMeta[ $name ] ] = ! empty( $categories ) ? $categories[0] : ( ! empty( $primaryCategory ) ? $primaryCategory : '' ); break; case '_yoast_wpseo_meta-robots-noindex': case '_yoast_wpseo_meta-robots-nofollow': if ( (bool) $value ) { $meta[ $mappedMeta[ $name ] ] = ! empty( $value ); $meta['robots_default'] = false; } break; case '_yoast_wpseo_meta-robots-adv': $values = explode( ',', $value ); if ( $values ) { foreach ( $values as $value ) { $meta[ "robots_$value" ] = true; } } break; case '_yoast_wpseo_canonical': $meta[ $mappedMeta[ $name ] ] = esc_url( $value ); break; case '_yoast_wpseo_opengraph-image': $meta['og_image_type'] = 'custom_image'; $meta[ $mappedMeta[ $name ] ] = esc_url( $value ); break; case '_yoast_wpseo_twitter-image': $meta['twitter_use_og'] = false; $meta['twitter_image_type'] = 'custom_image'; $meta[ $mappedMeta[ $name ] ] = esc_url( $value ); break; case '_yoast_wpseo_schema_page_type': $value = aioseo()->helpers->pregReplace( '#\s#', '', $value ); if ( in_array( $post->post_type, [ 'post', 'page', 'attachment' ], true ) ) { break; } if ( in_array( $value, ImportExport\SearchAppearance::$supportedWebPageGraphs, true ) ) { $meta[ $mappedMeta[ $name ] ] = 'WebPage'; $options = new \stdClass(); $options->webPage = [ 'webPageType' => $value ]; } $meta['schema_type_options'] = wp_json_encode( $options ); break; case '_yoast_wpseo_schema_article_type': $value = aioseo()->helpers->pregReplace( '#\s#', '', $value ); if ( 'none' === lcfirst( $value ) ) { $meta[ $mappedMeta[ $name ] ] = 'None'; break; } if ( in_array( $post->post_type, [ 'page', 'attachment' ], true ) ) { break; } $options = new \stdClass(); if ( isset( $meta['schema_type_options'] ) ) { $options = json_decode( $meta['schema_type_options'] ); } $options->article = [ 'articleType' => 'Article' ]; if ( in_array( $value, ImportExport\SearchAppearance::$supportedArticleGraphs, true ) ) { $options->article = [ 'articleType' => $value ]; } else { $options->article = [ 'articleType' => 'BlogPosting' ]; } $meta['schema_type'] = 'Article'; $meta['schema_type_options'] = wp_json_encode( $options ); break; case '_yoast_wpseo_focuskw': $keyphrase = [ 'focus' => [ 'keyphrase' => aioseo()->helpers->sanitizeOption( $value ) ], 'additional' => [] ]; $meta['keyphrases'] = wp_json_encode( $keyphrase ); break; case '_yoast_wpseo_focuskeywords': $keyphrases = []; if ( ! empty( $meta[ $mappedMeta[ $name ] ] ) ) { $keyphrases = (array) json_decode( $meta[ $mappedMeta[ $name ] ] ); } $yoastKeyphrases = json_decode( $value ); for ( $i = 0; $i < count( $yoastKeyphrases ); $i++ ) { $keyphrase = [ 'keyphrase' => aioseo()->helpers->sanitizeOption( $yoastKeyphrases[ $i ]->keyword ) ]; $keyphrases['additional'][ $i ] = $keyphrase; } if ( ! empty( $keyphrases ) ) { $meta['keyphrases'] = wp_json_encode( $keyphrases ); } break; case '_yoast_wpseo_title': case '_yoast_wpseo_metadesc': case '_yoast_wpseo_opengraph-title': case '_yoast_wpseo_opengraph-description': case '_yoast_wpseo_twitter-title': case '_yoast_wpseo_twitter-description': if ( 'page' === $post->post_type ) { $value = aioseo()->helpers->pregReplace( '#%%primary_category%%#', '', $value ); $value = aioseo()->helpers->pregReplace( '#%%excerpt%%#', '', $value ); } if ( '_yoast_wpseo_twitter-title' === $name || '_yoast_wpseo_twitter-description' === $name ) { $meta['twitter_use_og'] = false; } $value = aioseo()->importExport->yoastSeo->helpers->macrosToSmartTags( $value, 'post', $post->post_type ); if ( '_yoast_wpseo_title' === $name ) { $title = $value; } default: $meta[ $mappedMeta[ $name ] ] = esc_html( wp_strip_all_tags( strval( $value ) ) ); break; } } // Resetting the `twitter_use_og` option if the user has a custom title and no twitter title. if ( $meta['twitter_use_og'] && $title && empty( $meta['twitter_title'] ) ) { $meta['twitter_use_og'] = false; $meta['twitter_title'] = $title; } $aioseoPost = Models\Post::getPost( (int) $post->ID ); $aioseoPost->set( $meta ); $aioseoPost->save(); aioseo()->migration->meta->migrateAdditionalPostMeta( $post->ID ); } if ( count( $posts ) === $postsPerAction ) { try { as_schedule_single_action( time() + 5, aioseo()->importExport->yoastSeo->postActionName, [], 'aioseo' ); } catch ( \Exception $e ) { // Do nothing. } } else { aioseo()->cache->delete( 'import_post_meta_yoast_seo' ); } } }