| Current Path : /home/x/b/o/xbodynamge/namtation/wp-content/ |
| Current File : /home/x/b/o/xbodynamge/namtation/wp-content/PostMeta.php.tar |
namtation/wp-content/plugins/all-in-one-seo-pack/app/Common/ImportExport/SeoPress/PostMeta.php 0000644 00000015547 15112036222 0031460 0 ustar 00 home/xbodynamge <?php
namespace AIOSEO\Plugin\Common\ImportExport\SeoPress;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
use AIOSEO\Plugin\Common\Models;
// phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
/**
* Imports the post meta from SEOPress.
*
* @since 4.1.4
*/
class PostMeta {
/**
* The mapped meta
*
* @since 4.1.4
*
* @var array
*/
private $mappedMeta = [
'_seopress_analysis_target_kw' => '',
'_seopress_robots_archive' => 'robots_noarchive',
'_seopress_robots_canonical' => 'canonical_url',
'_seopress_robots_follow' => 'robots_nofollow',
'_seopress_robots_imageindex' => 'robots_noimageindex',
'_seopress_robots_index' => 'robots_noindex',
'_seopress_robots_odp' => 'robots_noodp',
'_seopress_robots_snippet' => 'robots_nosnippet',
'_seopress_social_twitter_desc' => 'twitter_description',
'_seopress_social_twitter_img' => 'twitter_image_custom_url',
'_seopress_social_twitter_title' => 'twitter_title',
'_seopress_social_fb_desc' => 'og_description',
'_seopress_social_fb_img' => 'og_image_custom_url',
'_seopress_social_fb_title' => 'og_title',
'_seopress_titles_desc' => 'description',
'_seopress_titles_title' => 'title',
'_seopress_robots_primary_cat' => 'primary_term'
];
/**
* Class constructor.
*
* @since 4.1.4
*/
public function scheduleImport() {
if ( aioseo()->actionScheduler->scheduleSingle( aioseo()->importExport->seoPress->postActionName, 0 ) ) {
if ( ! aioseo()->core->cache->get( 'import_post_meta_seopress' ) ) {
aioseo()->core->cache->update( 'import_post_meta_seopress', time(), WEEK_IN_SECONDS );
}
}
}
/**
* Imports the post meta.
*
* @since 4.1.4
*
* @return void
*/
public function importPostMeta() {
$postsPerAction = apply_filters( 'aioseo_import_seopress_posts_per_action', 100 );
$publicPostTypes = implode( "', '", aioseo()->helpers->getPublicPostTypes( true ) );
$timeStarted = gmdate( 'Y-m-d H:i:s', aioseo()->core->cache->get( 'import_post_meta_seopress' ) );
$posts = aioseo()->core->db
->start( 'posts as p' )
->select( 'p.ID, p.post_type' )
->join( 'postmeta as pm', '`p`.`ID` = `pm`.`post_id`' )
->leftJoin( 'aioseo_posts as ap', '`p`.`ID` = `ap`.`post_id`' )
->whereRaw( "pm.meta_key LIKE '_seopress_%'" )
->whereRaw( "( p.post_type IN ( '$publicPostTypes' ) )" )
->whereRaw( "( ap.post_id IS NULL OR ap.updated < '$timeStarted' )" )
->groupBy( 'p.ID' )
->orderBy( 'p.ID DESC' )
->limit( $postsPerAction )
->run()
->result();
if ( ! $posts || ! count( $posts ) ) {
aioseo()->core->cache->delete( 'import_post_meta_seopress' );
return;
}
foreach ( $posts as $post ) {
$postMeta = aioseo()->core->db
->start( 'postmeta' . ' as pm' )
->select( 'pm.meta_key, pm.meta_value' )
->where( 'pm.post_id', $post->ID )
->whereRaw( "`pm`.`meta_key` LIKE '_seopress_%'" )
->run()
->result();
$meta = array_merge( [
'post_id' => (int) $post->ID,
], $this->getMetaData( $postMeta, $post->ID ) );
if ( ! $postMeta || ! count( $postMeta ) ) {
$aioseoPost = Models\Post::getPost( (int) $post->ID );
$aioseoPost->set( $meta );
$aioseoPost->save();
aioseo()->migration->meta->migrateAdditionalPostMeta( $post->ID );
continue;
}
$aioseoPost = Models\Post::getPost( (int) $post->ID );
$aioseoPost->set( $meta );
$aioseoPost->save();
aioseo()->migration->meta->migrateAdditionalPostMeta( $post->ID );
// Clear the Overview cache.
aioseo()->postSettings->clearPostTypeOverviewCache( $post->ID );
}
if ( count( $posts ) === $postsPerAction ) {
aioseo()->actionScheduler->scheduleSingle( aioseo()->importExport->seoPress->postActionName, 5, [], true );
} else {
aioseo()->core->cache->delete( 'import_post_meta_seopress' );
}
}
/**
* Get the meta data by post meta.
*
* @since 4.1.4
*
* @param object $postMeta The post meta from database.
* @return array The meta data.
*/
public function getMetaData( $postMeta, $postId ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
$meta = [
'robots_default' => true,
'robots_noarchive' => false,
'canonical_url' => '',
'robots_nofollow' => false,
'robots_noimageindex' => false,
'robots_noindex' => false,
'robots_noodp' => false,
'robots_nosnippet' => false,
'twitter_use_og' => aioseo()->options->social->twitter->general->useOgData,
'twitter_title' => '',
'twitter_description' => ''
];
foreach ( $postMeta as $record ) {
$name = $record->meta_key;
$value = $record->meta_value;
if ( ! in_array( $name, array_keys( $this->mappedMeta ), true ) ) {
continue;
}
switch ( $name ) {
case '_seopress_analysis_target_kw':
$keyphrases = array_map( 'trim', explode( ',', $value ) );
$keyphraseArray = [
'focus' => [ 'keyphrase' => aioseo()->helpers->sanitizeOption( $keyphrases[0] ) ],
'additional' => []
];
unset( $keyphrases[0] );
foreach ( $keyphrases as $keyphrase ) {
$keyphraseArray['additional'][] = [ 'keyphrase' => aioseo()->helpers->sanitizeOption( $keyphrase ) ];
}
$meta['keyphrases'] = $keyphraseArray;
break;
case '_seopress_robots_snippet':
case '_seopress_robots_archive':
case '_seopress_robots_imageindex':
case '_seopress_robots_odp':
case '_seopress_robots_follow':
case '_seopress_robots_index':
if ( 'yes' === $value ) {
$meta['robots_default'] = false;
$meta[ $this->mappedMeta[ $name ] ] = true;
}
break;
case '_seopress_social_twitter_img':
$meta['twitter_use_og'] = false;
$meta['twitter_image_type'] = 'custom_image';
$meta[ $this->mappedMeta[ $name ] ] = esc_url( $value );
break;
case '_seopress_social_twitter_desc':
case '_seopress_social_twitter_title':
$meta['twitter_use_og'] = false;
$meta[ $this->mappedMeta[ $name ] ] = esc_html( wp_strip_all_tags( strval( $value ) ) );
break;
case '_seopress_social_fb_img':
$meta['og_image_type'] = 'custom_image';
$meta[ $this->mappedMeta[ $name ] ] = esc_url( $value );
break;
case '_seopress_robots_primary_cat':
$taxonomy = 'category';
$options = new \stdClass();
$options->$taxonomy = (int) $value;
$meta[ $this->mappedMeta[ $name ] ] = wp_json_encode( $options );
break;
case '_seopress_titles_title':
case '_seopress_titles_desc':
$value = aioseo()->importExport->seoPress->helpers->macrosToSmartTags( $value );
default:
$meta[ $this->mappedMeta[ $name ] ] = esc_html( wp_strip_all_tags( strval( $value ) ) );
break;
}
}
return $meta;
}
} namtation/wp-content/plugins/all-in-one-seo-pack/app/Common/ImportExport/YoastSeo/PostMeta.php 0000644 00000025720 15114412665 0031470 0 ustar 00 home/xbodynamge <?php
namespace AIOSEO\Plugin\Common\ImportExport\YoastSeo;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
use AIOSEO\Plugin\Common\ImportExport;
use AIOSEO\Plugin\Common\Models;
// phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
/**
* Imports the post meta from Yoast SEO.
*
* @since 4.0.0
*/
class PostMeta {
/**
* Class constructor.
*
* @since 4.0.0
*/
public function scheduleImport() {
try {
if ( as_next_scheduled_action( aioseo()->importExport->yoastSeo->postActionName ) ) {
return;
}
if ( ! aioseo()->core->cache->get( 'import_post_meta_yoast_seo' ) ) {
aioseo()->core->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 = apply_filters( 'aioseo_import_yoast_seo_posts_per_action', 100 );
$publicPostTypes = implode( "', '", aioseo()->helpers->getPublicPostTypes( true ) );
$timeStarted = gmdate( 'Y-m-d H:i:s', aioseo()->core->cache->get( 'import_post_meta_yoast_seo' ) );
$posts = aioseo()->core->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()->core->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_is_cornerstone' => 'pillar_content'
];
foreach ( $posts as $post ) {
$postMeta = aioseo()->core->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();
$featuredImage = get_the_post_thumbnail_url( $post->ID );
$meta = [
'post_id' => (int) $post->ID,
'twitter_use_og' => true,
'og_image_type' => $featuredImage ? 'featured' : 'content',
'pillar_content' => 0,
'canonical_url' => '',
'robots_default' => true,
'robots_noarchive' => false,
'robots_nofollow' => false,
'robots_noimageindex' => false,
'robots_noindex' => false,
'robots_noodp' => false,
'robots_nosnippet' => false,
'title' => '',
'description' => '',
'og_title' => '',
'og_description' => '',
'og_image_custom_url' => '',
'twitter_title' => '',
'twitter_description' => '',
'twitter_image_custom_url' => '',
'twitter_image_type' => 'default'
];
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;
// Handles primary taxonomy terms.
// We need to handle it separately because it's stored in a different format.
if ( false !== stripos( $name, '_yoast_wpseo_primary_' ) ) {
sscanf( $name, '_yoast_wpseo_primary_%s', $taxonomy );
if ( null === $taxonomy ) {
continue;
}
$options = new \stdClass();
if ( isset( $meta['primary_term'] ) ) {
$options = json_decode( $meta['primary_term'] );
}
$options->$taxonomy = (int) $value;
$meta['primary_term'] = wp_json_encode( $options );
}
if ( ! in_array( $name, array_keys( $mappedMeta ), true ) ) {
continue;
}
switch ( $name ) {
case '_yoast_wpseo_meta-robots-noindex':
case '_yoast_wpseo_meta-robots-nofollow':
if ( (bool) $value ) {
$meta[ $mappedMeta[ $name ] ] = (bool) $value;
$meta['robots_default'] = false;
}
break;
case '_yoast_wpseo_meta-robots-adv':
$supportedValues = [ 'index', 'noarchive', 'noimageindex', 'nosnippet' ];
foreach ( $supportedValues as $val ) {
$meta[ "robots_$val" ] = false;
}
// This is a separated foreach so we can import any and all values.
$values = explode( ',', $value );
if ( $values ) {
$meta['robots_default'] = false;
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 ) ) {
break;
}
$meta[ $mappedMeta[ $name ] ] = 'WebPage';
$meta['schema_type_options'] = wp_json_encode( [
'webPage' => [
'webPageType' => $value
]
] );
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':
$focusKeyphrase = [
'focus' => [ 'keyphrase' => aioseo()->helpers->sanitizeOption( $value ) ]
];
// Merge with existing keyphrases if the array key already exists.
if ( ! empty( $meta['keyphrases'] ) ) {
$meta['keyphrases'] = array_merge( $meta['keyphrases'], $focusKeyphrase );
} else {
$meta['keyphrases'] = $focusKeyphrase;
}
break;
case '_yoast_wpseo_focuskeywords':
$keyphrases = [];
if ( ! empty( $meta[ $mappedMeta[ $name ] ] ) ) {
$keyphrases = (array) json_decode( $meta[ $mappedMeta[ $name ] ] );
}
$yoastKeyphrases = json_decode( $value, true );
if ( is_array( $yoastKeyphrases ) ) {
foreach ( $yoastKeyphrases as $yoastKeyphrase ) {
if ( ! empty( $yoastKeyphrase['keyword'] ) ) {
$keyphrase = [ 'keyphrase' => aioseo()->helpers->sanitizeOption( $yoastKeyphrase['keyword'] ) ];
if ( ! isset( $keyphrases['additional'] ) ) {
$keyphrases['additional'] = [];
}
$keyphrases['additional'][] = $keyphrase;
}
}
}
if ( ! empty( $keyphrases ) ) {
// Merge with existing keyphrases if the array key already exists.
if ( ! empty( $meta['keyphrases'] ) ) {
$meta['keyphrases'] = array_merge( $meta['keyphrases'], $keyphrases );
} else {
$meta['keyphrases'] = $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;
}
$meta[ $mappedMeta[ $name ] ] = esc_html( wp_strip_all_tags( strval( $value ) ) );
break;
case '_yoast_wpseo_is_cornerstone':
$meta['pillar_content'] = (bool) $value ? 1 : 0;
break;
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 );
// Clear the Overview cache.
aioseo()->postSettings->clearPostTypeOverviewCache( $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()->core->cache->delete( 'import_post_meta_yoast_seo' );
}
}
} namtation/wp-content/plugins/all-in-one-seo-pack/app/Common/ImportExport/RankMath/PostMeta.php 0000644 00000022432 15114414015 0031413 0 ustar 00 home/xbodynamge <?php
namespace AIOSEO\Plugin\Common\ImportExport\RankMath;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
use AIOSEO\Plugin\Common\Models;
// phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
/**
* Imports the post meta from Rank Math.
*
* @since 4.0.0
*/
class PostMeta {
/**
* The batch import action name.
*
* @since 4.0.0
* @version 4.8.3 Moved from RankMath class to here.
*
* @var string
*/
public $postActionName = 'aioseo_import_post_meta_rank_math';
/**
* The mapped meta
*
* @since 4.8.3
*
* @var array
*/
private $mappedMeta = [
'rank_math_title' => 'title',
'rank_math_description' => 'description',
'rank_math_canonical_url' => 'canonical_url',
'rank_math_focus_keyword' => 'keyphrases',
'rank_math_robots' => '',
'rank_math_advanced_robots' => '',
'rank_math_facebook_title' => 'og_title',
'rank_math_facebook_description' => 'og_description',
'rank_math_facebook_image' => 'og_image_custom_url',
'rank_math_twitter_use_facebook' => 'twitter_use_og',
'rank_math_twitter_title' => 'twitter_title',
'rank_math_twitter_description' => 'twitter_description',
'rank_math_twitter_image' => 'twitter_image_custom_url',
'rank_math_twitter_card_type' => 'twitter_card',
'rank_math_primary_category' => 'primary_term',
'rank_math_pillar_content' => 'pillar_content',
];
/**
* Class constructor.
*
* @since 4.8.3
*/
public function __construct() {
add_action( $this->postActionName, [ $this, 'importPostMeta' ] );
}
/**
* Schedules the post meta import.
*
* @since 4.0.0
*
* @return void
*/
public function scheduleImport() {
try {
if ( as_next_scheduled_action( $this->postActionName ) ) {
return;
}
if ( ! aioseo()->core->cache->get( 'import_post_meta_rank_math' ) ) {
aioseo()->core->cache->update( 'import_post_meta_rank_math', time(), WEEK_IN_SECONDS );
}
as_schedule_single_action( time(), $this->postActionName, [], 'aioseo' );
} catch ( \Exception $e ) {
// Do nothing.
}
}
/**
* Get all posts to be imported
*
* @since 4.8.3
*
* @param int $postsPerAction The number of posts to import per action.
* @return array The posts to be imported.
*/
protected function getPostsToImport( $postsPerAction = 100 ) {
$publicPostTypes = implode( "', '", aioseo()->helpers->getPublicPostTypes( true ) );
$timeStarted = gmdate( 'Y-m-d H:i:s', aioseo()->core->cache->get( 'import_post_meta_rank_math' ) );
$posts = aioseo()->core->db
->start( 'posts' . ' as p' )
->select( 'p.ID, p.post_type' )
->join( 'postmeta as pm', '`p`.`ID` = `pm`.`post_id`' )
->leftJoin( 'aioseo_posts as ap', '`p`.`ID` = `ap`.`post_id`' )
->whereRaw( "pm.meta_key LIKE 'rank_math_%'" )
->whereRaw( "( p.post_type IN ( '$publicPostTypes' ) )" )
->whereRaw( "( ap.post_id IS NULL OR ap.updated < '$timeStarted' )" )
->orderBy( 'p.ID DESC' )
->groupBy( 'p.ID' )
->limit( $postsPerAction )
->run()
->result();
return $posts;
}
/**
* Imports the post meta.
*
* @since 4.0.0
*
* @return array The posts that were imported.
*/
public function importPostMeta() {
$postsPerAction = apply_filters( 'aioseo_import_rank_math_posts_per_action', 100 );
$posts = $this->getPostsToImport( $postsPerAction );
if ( ! $posts || ! count( $posts ) ) {
aioseo()->core->cache->delete( 'import_post_meta_rank_math' );
return [];
}
foreach ( $posts as $post ) {
$postMeta = aioseo()->core->db
->start( 'postmeta' . ' as pm' )
->select( 'pm.meta_key, pm.meta_value' )
->where( 'pm.post_id', $post->ID )
->whereRaw( "`pm`.`meta_key` LIKE 'rank_math_%'" )
->run()
->result();
$meta = array_merge( [
'post_id' => (int) $post->ID,
], $this->getMetaData( $postMeta, $post ) );
$aioseoPost = Models\Post::getPost( $post->ID );
$aioseoPost->set( $meta );
$aioseoPost->save();
aioseo()->migration->meta->migrateAdditionalPostMeta( $post->ID );
}
// Clear the Overview cache.
aioseo()->postSettings->clearPostTypeOverviewCache( $posts[0]->ID );
if ( count( $posts ) === $postsPerAction ) {
try {
as_schedule_single_action( time() + 5, $this->postActionName, [], 'aioseo' );
} catch ( \Exception $e ) {
// Do nothing.
}
} else {
aioseo()->core->cache->delete( 'import_post_meta_rank_math' );
}
return $posts;
}
/**
* Get the meta data by post meta.
*
* @since 4.8.3
*
* @param object $postMeta The post meta from database.
* @param object $post The post object.
* @return array The meta data.
*/
public function getMetaData( $postMeta, $post ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
$meta = [
'post_id' => $post->ID,
'robots_default' => true,
'robots_noarchive' => false,
'canonical_url' => '',
'robots_nofollow' => false,
'robots_noimageindex' => false,
'robots_noindex' => false,
'robots_noodp' => false,
'robots_nosnippet' => false,
'keyphrases' => [
'focus' => [ 'keyphrase' => '' ],
'additional' => []
],
];
foreach ( $postMeta as $record ) {
$name = $record->meta_key;
$value = $record->meta_value;
if (
! in_array( $post->post_type, [ 'page', 'attachment' ], true ) &&
preg_match( '#^rank_math_schema_([^\s]*)$#', (string) $name, $match ) && ! empty( $match[1] )
) {
switch ( $match[1] ) {
case 'Article':
case 'NewsArticle':
case 'BlogPosting':
$meta['schema_type'] = 'Article';
$meta['schema_type_options'] = wp_json_encode(
[ 'article' => [ 'articleType' => $match[1] ] ]
);
break;
default:
break;
}
}
if ( ! in_array( $name, array_keys( $this->mappedMeta ), true ) ) {
continue;
}
switch ( $name ) {
case 'rank_math_focus_keyword':
$keyphrases = array_map( 'trim', explode( ',', $value ) );
$keyphraseArray = [
'focus' => [ 'keyphrase' => aioseo()->helpers->sanitizeOption( $keyphrases[0] ) ],
'additional' => []
];
unset( $keyphrases[0] );
foreach ( $keyphrases as $keyphrase ) {
$keyphraseArray['additional'][] = [ 'keyphrase' => aioseo()->helpers->sanitizeOption( $keyphrase ) ];
}
$meta['keyphrases'] = $keyphraseArray;
break;
case 'rank_math_robots':
$value = aioseo()->helpers->maybeUnserialize( $value );
if ( ! empty( $value ) ) {
$supportedValues = [ 'index', 'noindex', 'nofollow', 'noarchive', 'noimageindex', 'nosnippet' ];
$meta['robots_default'] = false;
foreach ( $supportedValues as $val ) {
$meta[ "robots_$val" ] = false;
}
// This is a separated foreach as we can import any and all values.
foreach ( $value as $robotsName ) {
$meta[ "robots_$robotsName" ] = true;
}
}
break;
case 'rank_math_advanced_robots':
$value = aioseo()->helpers->maybeUnserialize( $value );
if ( isset( $value['max-snippet'] ) && is_numeric( $value['max-snippet'] ) ) {
$meta['robots_default'] = false;
$meta['robots_max_snippet'] = intval( $value['max-snippet'] );
}
if ( isset( $value['max-video-preview'] ) && is_numeric( $value['max-video-preview'] ) ) {
$meta['robots_default'] = false;
$meta['robots_max_videopreview'] = intval( $value['max-video-preview'] );
}
if ( ! empty( $value['max-image-preview'] ) ) {
$meta['robots_default'] = false;
$meta['robots_max_imagepreview'] = aioseo()->helpers->sanitizeOption( lcfirst( $value['max-image-preview'] ) );
}
break;
case 'rank_math_facebook_image':
$meta['og_image_type'] = 'custom_image';
$meta[ $this->mappedMeta[ $name ] ] = esc_url( $value );
break;
case 'rank_math_twitter_image':
$meta['twitter_image_type'] = 'custom_image';
$meta[ $this->mappedMeta[ $name ] ] = esc_url( $value );
break;
case 'rank_math_twitter_card_type':
preg_match( '#large#', (string) $value, $match );
$meta[ $this->mappedMeta[ $name ] ] = ! empty( $match ) ? 'summary_large_image' : 'summary';
break;
case 'rank_math_twitter_use_facebook':
$meta[ $this->mappedMeta[ $name ] ] = 'on' === $value;
break;
case 'rank_math_primary_category':
$taxonomy = 'category';
$options = new \stdClass();
$options->$taxonomy = (int) $value;
$meta[ $this->mappedMeta[ $name ] ] = wp_json_encode( $options );
break;
case 'rank_math_title':
case 'rank_math_description':
if ( 'page' === $post->post_type ) {
$value = aioseo()->helpers->pregReplace( '#%category%#', '', $value );
$value = aioseo()->helpers->pregReplace( '#%excerpt%#', '', $value );
}
$value = aioseo()->importExport->rankMath->helpers->macrosToSmartTags( $value );
$meta[ $this->mappedMeta[ $name ] ] = esc_html( wp_strip_all_tags( strval( $value ) ) );
break;
case 'rank_math_pillar_content':
$meta['pillar_content'] = 'on' === $value ? 1 : 0;
break;
default:
$meta[ $this->mappedMeta[ $name ] ] = esc_html( wp_strip_all_tags( strval( $value ) ) );
break;
}
}
return $meta;
}
} xbodynamge/dev/wp-content/plugins/all-in-one-seo-pack/app/Common/ImportExport/SeoPress/PostMeta.php 0000644 00000015547 15114440365 0030255 0 ustar 00 home <?php
namespace AIOSEO\Plugin\Common\ImportExport\SeoPress;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
use AIOSEO\Plugin\Common\Models;
// phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
/**
* Imports the post meta from SEOPress.
*
* @since 4.1.4
*/
class PostMeta {
/**
* The mapped meta
*
* @since 4.1.4
*
* @var array
*/
private $mappedMeta = [
'_seopress_analysis_target_kw' => '',
'_seopress_robots_archive' => 'robots_noarchive',
'_seopress_robots_canonical' => 'canonical_url',
'_seopress_robots_follow' => 'robots_nofollow',
'_seopress_robots_imageindex' => 'robots_noimageindex',
'_seopress_robots_index' => 'robots_noindex',
'_seopress_robots_odp' => 'robots_noodp',
'_seopress_robots_snippet' => 'robots_nosnippet',
'_seopress_social_twitter_desc' => 'twitter_description',
'_seopress_social_twitter_img' => 'twitter_image_custom_url',
'_seopress_social_twitter_title' => 'twitter_title',
'_seopress_social_fb_desc' => 'og_description',
'_seopress_social_fb_img' => 'og_image_custom_url',
'_seopress_social_fb_title' => 'og_title',
'_seopress_titles_desc' => 'description',
'_seopress_titles_title' => 'title',
'_seopress_robots_primary_cat' => 'primary_term'
];
/**
* Class constructor.
*
* @since 4.1.4
*/
public function scheduleImport() {
if ( aioseo()->actionScheduler->scheduleSingle( aioseo()->importExport->seoPress->postActionName, 0 ) ) {
if ( ! aioseo()->core->cache->get( 'import_post_meta_seopress' ) ) {
aioseo()->core->cache->update( 'import_post_meta_seopress', time(), WEEK_IN_SECONDS );
}
}
}
/**
* Imports the post meta.
*
* @since 4.1.4
*
* @return void
*/
public function importPostMeta() {
$postsPerAction = apply_filters( 'aioseo_import_seopress_posts_per_action', 100 );
$publicPostTypes = implode( "', '", aioseo()->helpers->getPublicPostTypes( true ) );
$timeStarted = gmdate( 'Y-m-d H:i:s', aioseo()->core->cache->get( 'import_post_meta_seopress' ) );
$posts = aioseo()->core->db
->start( 'posts as p' )
->select( 'p.ID, p.post_type' )
->join( 'postmeta as pm', '`p`.`ID` = `pm`.`post_id`' )
->leftJoin( 'aioseo_posts as ap', '`p`.`ID` = `ap`.`post_id`' )
->whereRaw( "pm.meta_key LIKE '_seopress_%'" )
->whereRaw( "( p.post_type IN ( '$publicPostTypes' ) )" )
->whereRaw( "( ap.post_id IS NULL OR ap.updated < '$timeStarted' )" )
->groupBy( 'p.ID' )
->orderBy( 'p.ID DESC' )
->limit( $postsPerAction )
->run()
->result();
if ( ! $posts || ! count( $posts ) ) {
aioseo()->core->cache->delete( 'import_post_meta_seopress' );
return;
}
foreach ( $posts as $post ) {
$postMeta = aioseo()->core->db
->start( 'postmeta' . ' as pm' )
->select( 'pm.meta_key, pm.meta_value' )
->where( 'pm.post_id', $post->ID )
->whereRaw( "`pm`.`meta_key` LIKE '_seopress_%'" )
->run()
->result();
$meta = array_merge( [
'post_id' => (int) $post->ID,
], $this->getMetaData( $postMeta, $post->ID ) );
if ( ! $postMeta || ! count( $postMeta ) ) {
$aioseoPost = Models\Post::getPost( (int) $post->ID );
$aioseoPost->set( $meta );
$aioseoPost->save();
aioseo()->migration->meta->migrateAdditionalPostMeta( $post->ID );
continue;
}
$aioseoPost = Models\Post::getPost( (int) $post->ID );
$aioseoPost->set( $meta );
$aioseoPost->save();
aioseo()->migration->meta->migrateAdditionalPostMeta( $post->ID );
// Clear the Overview cache.
aioseo()->postSettings->clearPostTypeOverviewCache( $post->ID );
}
if ( count( $posts ) === $postsPerAction ) {
aioseo()->actionScheduler->scheduleSingle( aioseo()->importExport->seoPress->postActionName, 5, [], true );
} else {
aioseo()->core->cache->delete( 'import_post_meta_seopress' );
}
}
/**
* Get the meta data by post meta.
*
* @since 4.1.4
*
* @param object $postMeta The post meta from database.
* @return array The meta data.
*/
public function getMetaData( $postMeta, $postId ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
$meta = [
'robots_default' => true,
'robots_noarchive' => false,
'canonical_url' => '',
'robots_nofollow' => false,
'robots_noimageindex' => false,
'robots_noindex' => false,
'robots_noodp' => false,
'robots_nosnippet' => false,
'twitter_use_og' => aioseo()->options->social->twitter->general->useOgData,
'twitter_title' => '',
'twitter_description' => ''
];
foreach ( $postMeta as $record ) {
$name = $record->meta_key;
$value = $record->meta_value;
if ( ! in_array( $name, array_keys( $this->mappedMeta ), true ) ) {
continue;
}
switch ( $name ) {
case '_seopress_analysis_target_kw':
$keyphrases = array_map( 'trim', explode( ',', $value ) );
$keyphraseArray = [
'focus' => [ 'keyphrase' => aioseo()->helpers->sanitizeOption( $keyphrases[0] ) ],
'additional' => []
];
unset( $keyphrases[0] );
foreach ( $keyphrases as $keyphrase ) {
$keyphraseArray['additional'][] = [ 'keyphrase' => aioseo()->helpers->sanitizeOption( $keyphrase ) ];
}
$meta['keyphrases'] = $keyphraseArray;
break;
case '_seopress_robots_snippet':
case '_seopress_robots_archive':
case '_seopress_robots_imageindex':
case '_seopress_robots_odp':
case '_seopress_robots_follow':
case '_seopress_robots_index':
if ( 'yes' === $value ) {
$meta['robots_default'] = false;
$meta[ $this->mappedMeta[ $name ] ] = true;
}
break;
case '_seopress_social_twitter_img':
$meta['twitter_use_og'] = false;
$meta['twitter_image_type'] = 'custom_image';
$meta[ $this->mappedMeta[ $name ] ] = esc_url( $value );
break;
case '_seopress_social_twitter_desc':
case '_seopress_social_twitter_title':
$meta['twitter_use_og'] = false;
$meta[ $this->mappedMeta[ $name ] ] = esc_html( wp_strip_all_tags( strval( $value ) ) );
break;
case '_seopress_social_fb_img':
$meta['og_image_type'] = 'custom_image';
$meta[ $this->mappedMeta[ $name ] ] = esc_url( $value );
break;
case '_seopress_robots_primary_cat':
$taxonomy = 'category';
$options = new \stdClass();
$options->$taxonomy = (int) $value;
$meta[ $this->mappedMeta[ $name ] ] = wp_json_encode( $options );
break;
case '_seopress_titles_title':
case '_seopress_titles_desc':
$value = aioseo()->importExport->seoPress->helpers->macrosToSmartTags( $value );
default:
$meta[ $this->mappedMeta[ $name ] ] = esc_html( wp_strip_all_tags( strval( $value ) ) );
break;
}
}
return $meta;
}
} xbodynamge/dev/wp-content/plugins/all-in-one-seo-pack/app/Common/ImportExport/RankMath/PostMeta.php 0000644 00000022432 15114444223 0030203 0 ustar 00 home <?php
namespace AIOSEO\Plugin\Common\ImportExport\RankMath;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
use AIOSEO\Plugin\Common\Models;
// phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
/**
* Imports the post meta from Rank Math.
*
* @since 4.0.0
*/
class PostMeta {
/**
* The batch import action name.
*
* @since 4.0.0
* @version 4.8.3 Moved from RankMath class to here.
*
* @var string
*/
public $postActionName = 'aioseo_import_post_meta_rank_math';
/**
* The mapped meta
*
* @since 4.8.3
*
* @var array
*/
private $mappedMeta = [
'rank_math_title' => 'title',
'rank_math_description' => 'description',
'rank_math_canonical_url' => 'canonical_url',
'rank_math_focus_keyword' => 'keyphrases',
'rank_math_robots' => '',
'rank_math_advanced_robots' => '',
'rank_math_facebook_title' => 'og_title',
'rank_math_facebook_description' => 'og_description',
'rank_math_facebook_image' => 'og_image_custom_url',
'rank_math_twitter_use_facebook' => 'twitter_use_og',
'rank_math_twitter_title' => 'twitter_title',
'rank_math_twitter_description' => 'twitter_description',
'rank_math_twitter_image' => 'twitter_image_custom_url',
'rank_math_twitter_card_type' => 'twitter_card',
'rank_math_primary_category' => 'primary_term',
'rank_math_pillar_content' => 'pillar_content',
];
/**
* Class constructor.
*
* @since 4.8.3
*/
public function __construct() {
add_action( $this->postActionName, [ $this, 'importPostMeta' ] );
}
/**
* Schedules the post meta import.
*
* @since 4.0.0
*
* @return void
*/
public function scheduleImport() {
try {
if ( as_next_scheduled_action( $this->postActionName ) ) {
return;
}
if ( ! aioseo()->core->cache->get( 'import_post_meta_rank_math' ) ) {
aioseo()->core->cache->update( 'import_post_meta_rank_math', time(), WEEK_IN_SECONDS );
}
as_schedule_single_action( time(), $this->postActionName, [], 'aioseo' );
} catch ( \Exception $e ) {
// Do nothing.
}
}
/**
* Get all posts to be imported
*
* @since 4.8.3
*
* @param int $postsPerAction The number of posts to import per action.
* @return array The posts to be imported.
*/
protected function getPostsToImport( $postsPerAction = 100 ) {
$publicPostTypes = implode( "', '", aioseo()->helpers->getPublicPostTypes( true ) );
$timeStarted = gmdate( 'Y-m-d H:i:s', aioseo()->core->cache->get( 'import_post_meta_rank_math' ) );
$posts = aioseo()->core->db
->start( 'posts' . ' as p' )
->select( 'p.ID, p.post_type' )
->join( 'postmeta as pm', '`p`.`ID` = `pm`.`post_id`' )
->leftJoin( 'aioseo_posts as ap', '`p`.`ID` = `ap`.`post_id`' )
->whereRaw( "pm.meta_key LIKE 'rank_math_%'" )
->whereRaw( "( p.post_type IN ( '$publicPostTypes' ) )" )
->whereRaw( "( ap.post_id IS NULL OR ap.updated < '$timeStarted' )" )
->orderBy( 'p.ID DESC' )
->groupBy( 'p.ID' )
->limit( $postsPerAction )
->run()
->result();
return $posts;
}
/**
* Imports the post meta.
*
* @since 4.0.0
*
* @return array The posts that were imported.
*/
public function importPostMeta() {
$postsPerAction = apply_filters( 'aioseo_import_rank_math_posts_per_action', 100 );
$posts = $this->getPostsToImport( $postsPerAction );
if ( ! $posts || ! count( $posts ) ) {
aioseo()->core->cache->delete( 'import_post_meta_rank_math' );
return [];
}
foreach ( $posts as $post ) {
$postMeta = aioseo()->core->db
->start( 'postmeta' . ' as pm' )
->select( 'pm.meta_key, pm.meta_value' )
->where( 'pm.post_id', $post->ID )
->whereRaw( "`pm`.`meta_key` LIKE 'rank_math_%'" )
->run()
->result();
$meta = array_merge( [
'post_id' => (int) $post->ID,
], $this->getMetaData( $postMeta, $post ) );
$aioseoPost = Models\Post::getPost( $post->ID );
$aioseoPost->set( $meta );
$aioseoPost->save();
aioseo()->migration->meta->migrateAdditionalPostMeta( $post->ID );
}
// Clear the Overview cache.
aioseo()->postSettings->clearPostTypeOverviewCache( $posts[0]->ID );
if ( count( $posts ) === $postsPerAction ) {
try {
as_schedule_single_action( time() + 5, $this->postActionName, [], 'aioseo' );
} catch ( \Exception $e ) {
// Do nothing.
}
} else {
aioseo()->core->cache->delete( 'import_post_meta_rank_math' );
}
return $posts;
}
/**
* Get the meta data by post meta.
*
* @since 4.8.3
*
* @param object $postMeta The post meta from database.
* @param object $post The post object.
* @return array The meta data.
*/
public function getMetaData( $postMeta, $post ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
$meta = [
'post_id' => $post->ID,
'robots_default' => true,
'robots_noarchive' => false,
'canonical_url' => '',
'robots_nofollow' => false,
'robots_noimageindex' => false,
'robots_noindex' => false,
'robots_noodp' => false,
'robots_nosnippet' => false,
'keyphrases' => [
'focus' => [ 'keyphrase' => '' ],
'additional' => []
],
];
foreach ( $postMeta as $record ) {
$name = $record->meta_key;
$value = $record->meta_value;
if (
! in_array( $post->post_type, [ 'page', 'attachment' ], true ) &&
preg_match( '#^rank_math_schema_([^\s]*)$#', (string) $name, $match ) && ! empty( $match[1] )
) {
switch ( $match[1] ) {
case 'Article':
case 'NewsArticle':
case 'BlogPosting':
$meta['schema_type'] = 'Article';
$meta['schema_type_options'] = wp_json_encode(
[ 'article' => [ 'articleType' => $match[1] ] ]
);
break;
default:
break;
}
}
if ( ! in_array( $name, array_keys( $this->mappedMeta ), true ) ) {
continue;
}
switch ( $name ) {
case 'rank_math_focus_keyword':
$keyphrases = array_map( 'trim', explode( ',', $value ) );
$keyphraseArray = [
'focus' => [ 'keyphrase' => aioseo()->helpers->sanitizeOption( $keyphrases[0] ) ],
'additional' => []
];
unset( $keyphrases[0] );
foreach ( $keyphrases as $keyphrase ) {
$keyphraseArray['additional'][] = [ 'keyphrase' => aioseo()->helpers->sanitizeOption( $keyphrase ) ];
}
$meta['keyphrases'] = $keyphraseArray;
break;
case 'rank_math_robots':
$value = aioseo()->helpers->maybeUnserialize( $value );
if ( ! empty( $value ) ) {
$supportedValues = [ 'index', 'noindex', 'nofollow', 'noarchive', 'noimageindex', 'nosnippet' ];
$meta['robots_default'] = false;
foreach ( $supportedValues as $val ) {
$meta[ "robots_$val" ] = false;
}
// This is a separated foreach as we can import any and all values.
foreach ( $value as $robotsName ) {
$meta[ "robots_$robotsName" ] = true;
}
}
break;
case 'rank_math_advanced_robots':
$value = aioseo()->helpers->maybeUnserialize( $value );
if ( isset( $value['max-snippet'] ) && is_numeric( $value['max-snippet'] ) ) {
$meta['robots_default'] = false;
$meta['robots_max_snippet'] = intval( $value['max-snippet'] );
}
if ( isset( $value['max-video-preview'] ) && is_numeric( $value['max-video-preview'] ) ) {
$meta['robots_default'] = false;
$meta['robots_max_videopreview'] = intval( $value['max-video-preview'] );
}
if ( ! empty( $value['max-image-preview'] ) ) {
$meta['robots_default'] = false;
$meta['robots_max_imagepreview'] = aioseo()->helpers->sanitizeOption( lcfirst( $value['max-image-preview'] ) );
}
break;
case 'rank_math_facebook_image':
$meta['og_image_type'] = 'custom_image';
$meta[ $this->mappedMeta[ $name ] ] = esc_url( $value );
break;
case 'rank_math_twitter_image':
$meta['twitter_image_type'] = 'custom_image';
$meta[ $this->mappedMeta[ $name ] ] = esc_url( $value );
break;
case 'rank_math_twitter_card_type':
preg_match( '#large#', (string) $value, $match );
$meta[ $this->mappedMeta[ $name ] ] = ! empty( $match ) ? 'summary_large_image' : 'summary';
break;
case 'rank_math_twitter_use_facebook':
$meta[ $this->mappedMeta[ $name ] ] = 'on' === $value;
break;
case 'rank_math_primary_category':
$taxonomy = 'category';
$options = new \stdClass();
$options->$taxonomy = (int) $value;
$meta[ $this->mappedMeta[ $name ] ] = wp_json_encode( $options );
break;
case 'rank_math_title':
case 'rank_math_description':
if ( 'page' === $post->post_type ) {
$value = aioseo()->helpers->pregReplace( '#%category%#', '', $value );
$value = aioseo()->helpers->pregReplace( '#%excerpt%#', '', $value );
}
$value = aioseo()->importExport->rankMath->helpers->macrosToSmartTags( $value );
$meta[ $this->mappedMeta[ $name ] ] = esc_html( wp_strip_all_tags( strval( $value ) ) );
break;
case 'rank_math_pillar_content':
$meta['pillar_content'] = 'on' === $value ? 1 : 0;
break;
default:
$meta[ $this->mappedMeta[ $name ] ] = esc_html( wp_strip_all_tags( strval( $value ) ) );
break;
}
}
return $meta;
}
} xbodynamge/dev/wp-content/plugins/all-in-one-seo-pack/app/Common/ImportExport/YoastSeo/PostMeta.php 0000644 00000025720 15114450345 0030251 0 ustar 00 home <?php
namespace AIOSEO\Plugin\Common\ImportExport\YoastSeo;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
use AIOSEO\Plugin\Common\ImportExport;
use AIOSEO\Plugin\Common\Models;
// phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
/**
* Imports the post meta from Yoast SEO.
*
* @since 4.0.0
*/
class PostMeta {
/**
* Class constructor.
*
* @since 4.0.0
*/
public function scheduleImport() {
try {
if ( as_next_scheduled_action( aioseo()->importExport->yoastSeo->postActionName ) ) {
return;
}
if ( ! aioseo()->core->cache->get( 'import_post_meta_yoast_seo' ) ) {
aioseo()->core->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 = apply_filters( 'aioseo_import_yoast_seo_posts_per_action', 100 );
$publicPostTypes = implode( "', '", aioseo()->helpers->getPublicPostTypes( true ) );
$timeStarted = gmdate( 'Y-m-d H:i:s', aioseo()->core->cache->get( 'import_post_meta_yoast_seo' ) );
$posts = aioseo()->core->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()->core->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_is_cornerstone' => 'pillar_content'
];
foreach ( $posts as $post ) {
$postMeta = aioseo()->core->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();
$featuredImage = get_the_post_thumbnail_url( $post->ID );
$meta = [
'post_id' => (int) $post->ID,
'twitter_use_og' => true,
'og_image_type' => $featuredImage ? 'featured' : 'content',
'pillar_content' => 0,
'canonical_url' => '',
'robots_default' => true,
'robots_noarchive' => false,
'robots_nofollow' => false,
'robots_noimageindex' => false,
'robots_noindex' => false,
'robots_noodp' => false,
'robots_nosnippet' => false,
'title' => '',
'description' => '',
'og_title' => '',
'og_description' => '',
'og_image_custom_url' => '',
'twitter_title' => '',
'twitter_description' => '',
'twitter_image_custom_url' => '',
'twitter_image_type' => 'default'
];
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;
// Handles primary taxonomy terms.
// We need to handle it separately because it's stored in a different format.
if ( false !== stripos( $name, '_yoast_wpseo_primary_' ) ) {
sscanf( $name, '_yoast_wpseo_primary_%s', $taxonomy );
if ( null === $taxonomy ) {
continue;
}
$options = new \stdClass();
if ( isset( $meta['primary_term'] ) ) {
$options = json_decode( $meta['primary_term'] );
}
$options->$taxonomy = (int) $value;
$meta['primary_term'] = wp_json_encode( $options );
}
if ( ! in_array( $name, array_keys( $mappedMeta ), true ) ) {
continue;
}
switch ( $name ) {
case '_yoast_wpseo_meta-robots-noindex':
case '_yoast_wpseo_meta-robots-nofollow':
if ( (bool) $value ) {
$meta[ $mappedMeta[ $name ] ] = (bool) $value;
$meta['robots_default'] = false;
}
break;
case '_yoast_wpseo_meta-robots-adv':
$supportedValues = [ 'index', 'noarchive', 'noimageindex', 'nosnippet' ];
foreach ( $supportedValues as $val ) {
$meta[ "robots_$val" ] = false;
}
// This is a separated foreach so we can import any and all values.
$values = explode( ',', $value );
if ( $values ) {
$meta['robots_default'] = false;
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 ) ) {
break;
}
$meta[ $mappedMeta[ $name ] ] = 'WebPage';
$meta['schema_type_options'] = wp_json_encode( [
'webPage' => [
'webPageType' => $value
]
] );
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':
$focusKeyphrase = [
'focus' => [ 'keyphrase' => aioseo()->helpers->sanitizeOption( $value ) ]
];
// Merge with existing keyphrases if the array key already exists.
if ( ! empty( $meta['keyphrases'] ) ) {
$meta['keyphrases'] = array_merge( $meta['keyphrases'], $focusKeyphrase );
} else {
$meta['keyphrases'] = $focusKeyphrase;
}
break;
case '_yoast_wpseo_focuskeywords':
$keyphrases = [];
if ( ! empty( $meta[ $mappedMeta[ $name ] ] ) ) {
$keyphrases = (array) json_decode( $meta[ $mappedMeta[ $name ] ] );
}
$yoastKeyphrases = json_decode( $value, true );
if ( is_array( $yoastKeyphrases ) ) {
foreach ( $yoastKeyphrases as $yoastKeyphrase ) {
if ( ! empty( $yoastKeyphrase['keyword'] ) ) {
$keyphrase = [ 'keyphrase' => aioseo()->helpers->sanitizeOption( $yoastKeyphrase['keyword'] ) ];
if ( ! isset( $keyphrases['additional'] ) ) {
$keyphrases['additional'] = [];
}
$keyphrases['additional'][] = $keyphrase;
}
}
}
if ( ! empty( $keyphrases ) ) {
// Merge with existing keyphrases if the array key already exists.
if ( ! empty( $meta['keyphrases'] ) ) {
$meta['keyphrases'] = array_merge( $meta['keyphrases'], $keyphrases );
} else {
$meta['keyphrases'] = $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;
}
$meta[ $mappedMeta[ $name ] ] = esc_html( wp_strip_all_tags( strval( $value ) ) );
break;
case '_yoast_wpseo_is_cornerstone':
$meta['pillar_content'] = (bool) $value ? 1 : 0;
break;
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 );
// Clear the Overview cache.
aioseo()->postSettings->clearPostTypeOverviewCache( $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()->core->cache->delete( 'import_post_meta_yoast_seo' );
}
}
}