You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
846 lines
29 KiB
PHTML
846 lines
29 KiB
PHTML
8 months ago
|
<?php
|
||
|
/**
|
||
|
* The SEOPress Import Class
|
||
|
*
|
||
|
* @since 1.0.24
|
||
|
* @package RankMath
|
||
|
* @subpackage RankMath\Admin\Importers
|
||
|
* @author Rank Math <support@rankmath.com>
|
||
|
*/
|
||
|
|
||
|
namespace RankMath\Admin\Importers;
|
||
|
|
||
|
use RankMath\Helper;
|
||
|
use RankMath\Admin\Admin_Helper;
|
||
|
use RankMath\Redirections\Redirection;
|
||
|
use RankMath\Schema\JsonLD;
|
||
|
use RankMath\Schema\Singular;
|
||
|
use RankMath\Helpers\DB;
|
||
|
|
||
|
defined( 'ABSPATH' ) || exit;
|
||
|
|
||
|
/**
|
||
|
* SEOPress class.
|
||
|
*/
|
||
|
class SEOPress extends Plugin_Importer {
|
||
|
|
||
|
/**
|
||
|
* The plugin name.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $plugin_name = 'SEOPress';
|
||
|
|
||
|
/**
|
||
|
* Plugin options meta key.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $meta_key = 'seopress';
|
||
|
|
||
|
/**
|
||
|
* Option keys to import and clean.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
protected $option_keys = [ 'seopress', 'seopress_%' ];
|
||
|
|
||
|
/**
|
||
|
* Choices keys to import.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
protected $choices = [ 'settings', 'postmeta', 'termmeta', 'redirections' ];
|
||
|
|
||
|
/**
|
||
|
* JsonLD.
|
||
|
*
|
||
|
* @var JsonLD
|
||
|
*/
|
||
|
private $json_ld;
|
||
|
|
||
|
/**
|
||
|
* Singular.
|
||
|
*
|
||
|
* @var Singular
|
||
|
*/
|
||
|
private $single;
|
||
|
|
||
|
/**
|
||
|
* Convert SEOPress variables if needed.
|
||
|
*
|
||
|
* @param string $string Value to convert.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function convert_variables( $string ) {
|
||
|
$string = str_replace( '%%sitetitle%%', '%sitename%', $string );
|
||
|
$string = str_replace( '%%tagline%%', '%sitedesc%', $string );
|
||
|
$string = str_replace( '%%post_title%%', '%title%', $string );
|
||
|
$string = str_replace( '%%post_excerpt%%', '%excerpt%', $string );
|
||
|
$string = str_replace( '%%post_date%%', '%date%', $string );
|
||
|
$string = str_replace( '%%post_modified_date%%', '%modified%', $string );
|
||
|
$string = str_replace( '%post_author%%', '%name%', $string );
|
||
|
$string = str_replace( '%%post_category%%', '%category%', $string );
|
||
|
$string = str_replace( '%%post_tag%%', '%tag%', $string );
|
||
|
$string = str_replace( '%%_category_title%%', '%term%', $string );
|
||
|
$string = str_replace( '%%_category_description%%', '%term_description%', $string );
|
||
|
$string = str_replace( '%%tag_title%%', '%term%', $string );
|
||
|
$string = str_replace( '%%tag_description%%', '%term_description%', $string );
|
||
|
$string = str_replace( '%%term_title%%', '%term%', $string );
|
||
|
$string = str_replace( '%%term_description%%', '%term_description%', $string );
|
||
|
$string = str_replace( '%%search_keywords%%', '%search_query%', $string );
|
||
|
$string = str_replace( '%%current_pagination%%', '%page%', $string );
|
||
|
$string = str_replace( '%%cpt_plural%%', '%pt_plural%', $string );
|
||
|
$string = str_replace( '%%archive_title%%', '%title%', $string );
|
||
|
$string = str_replace( '%%archive_date%%', '%currentdate%', $string );
|
||
|
$string = str_replace( '%%archive_date_day%%', '%currentday%', $string );
|
||
|
$string = str_replace( '%%archive_date_month%%', '%currentmonth%', $string );
|
||
|
$string = str_replace( '%%archive_date_year%%', '%year%', $string );
|
||
|
$string = str_replace( '%%currentdate%%', '%currentdate%', $string );
|
||
|
$string = str_replace( '%%currentday%%', '%currentday%', $string );
|
||
|
$string = str_replace( '%%currentmonth%%', '%currentmonth%', $string );
|
||
|
$string = str_replace( '%%currentyear%%', '%currentyear%', $string );
|
||
|
$string = str_replace( '%%currenttime%%', '%time%', $string );
|
||
|
$string = str_replace( '%%author_bio%%', '%user_description%', $string );
|
||
|
$string = str_replace( '%%wc_single_cat%%', '%term%', $string );
|
||
|
$string = str_replace( '%%wc_single_tag%%', '%term%', $string );
|
||
|
$string = str_replace( '%%wc_single_short_desc%%', '%wc_shortdesc%', $string );
|
||
|
$string = str_replace( '%%wc_single_price%%', '%wc_price%', $string );
|
||
|
|
||
|
return str_replace( '%%', '%', $string );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Deactivate plugin action.
|
||
|
*/
|
||
|
protected function deactivate() {
|
||
|
if ( is_plugin_active( $this->get_plugin_file() ) ) {
|
||
|
deactivate_plugins( $this->get_plugin_file() );
|
||
|
deactivate_plugins( 'wp-seopress-pro/seopress-pro.php' );
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Import settings of plugin.
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
protected function settings() {
|
||
|
$this->get_settings();
|
||
|
|
||
|
$seopress_titles = get_option( 'seopress_titles_option_name' );
|
||
|
$seopress_sitemap = get_option( 'seopress_xml_sitemap_option_name' );
|
||
|
$seopress_local = get_option( 'seopress_pro_option_name' );
|
||
|
|
||
|
// Titles & Descriptions.
|
||
|
$hash = [
|
||
|
'seopress_titles_archives_author_disable' => 'disable_author_archives',
|
||
|
'seopress_titles_archives_date_disable' => 'disable_date_archives',
|
||
|
'seopress_titles_home_site_title' => 'homepage_title',
|
||
|
'seopress_titles_home_site_desc' => 'homepage_description',
|
||
|
'seopress_titles_archives_author_title' => 'author_archive_title',
|
||
|
'seopress_titles_archives_author_desc' => 'author_archive_description',
|
||
|
'seopress_titles_archives_date_title' => 'date_archive_title',
|
||
|
'seopress_titles_archives_date_desc' => 'date_archive_description',
|
||
|
'seopress_titles_archives_search_title' => 'search_title',
|
||
|
'seopress_titles_archives_404_title' => '404_title',
|
||
|
];
|
||
|
|
||
|
$this->replace( $hash, $seopress_titles, $this->titles, 'convert_variables' );
|
||
|
$this->replace( $hash, $seopress_titles, $this->titles, 'convert_bool' );
|
||
|
$this->titles['title_separator'] = \RankMath\CMB2::sanitize_htmlentities( $seopress_titles['seopress_titles_sep'] );
|
||
|
|
||
|
$this->titles['date_archive_robots'] = ! empty( $seopress_titles['seopress_titles_archives_date_noindex'] ) ? [ 'noindex' ] : [];
|
||
|
$this->set_robots( 'author', ! empty( $seopress_titles['seopress_titles_archives_author_noindex'] ), '' );
|
||
|
|
||
|
$this->update_modules( $seopress_local, $seopress_sitemap );
|
||
|
$this->social_settings();
|
||
|
$this->advanced_settings();
|
||
|
$this->post_type_settings( $seopress_titles, $seopress_sitemap );
|
||
|
$this->taxonomies_settings( $seopress_titles, $seopress_sitemap );
|
||
|
$this->local_seo_settings( $seopress_local );
|
||
|
$this->update_settings();
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Import post meta of plugin.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
protected function postmeta() {
|
||
|
$this->set_pagination( $this->get_post_ids( true ) );
|
||
|
|
||
|
$post_ids = $this->get_post_ids();
|
||
|
|
||
|
$this->set_primary_term( $post_ids );
|
||
|
|
||
|
$hash = [
|
||
|
'_seopress_titles_title' => 'rank_math_title',
|
||
|
'_seopress_titles_desc' => 'rank_math_description',
|
||
|
'_seopress_analysis_target_kw' => 'rank_math_focus_keyword',
|
||
|
'_seopress_robots_canonical' => 'rank_math_canonical_url',
|
||
|
'_seopress_social_fb_title' => 'rank_math_facebook_title',
|
||
|
'_seopress_social_fb_desc' => 'rank_math_facebook_description',
|
||
|
'_seopress_social_fb_img' => 'rank_math_facebook_image',
|
||
|
'_seopress_social_twitter_title' => 'rank_math_twitter_title',
|
||
|
'_seopress_social_twitter_desc' => 'rank_math_twitter_description',
|
||
|
'_seopress_social_twitter_img' => 'rank_math_twitter_image',
|
||
|
'_seopress_robots_breadcrumbs' => 'rank_math_breadcrumb_title',
|
||
|
];
|
||
|
|
||
|
// Set Converter.
|
||
|
$this->json_ld = new JsonLD();
|
||
|
$this->single = new Singular();
|
||
|
|
||
|
foreach ( $post_ids as $post ) {
|
||
|
$post_id = $post->ID;
|
||
|
$this->replace_meta( $hash, null, $post_id, 'post', 'convert_variables' );
|
||
|
delete_post_meta( $post_id, 'rank_math_permalink' );
|
||
|
|
||
|
$this->replace_image( get_post_meta( $post_id, '_seopress_social_fb_img', true ), 'post', 'rank_math_facebook_image', 'rank_math_facebook_image_id', $post_id );
|
||
|
$this->replace_image( get_post_meta( $post_id, '_seopress_social_twitter_img', true ), 'post', 'rank_math_twitter_image', 'rank_math_twitter_image_id', $post_id );
|
||
|
|
||
|
$this->is_twitter_using_facebook( 'post', $post_id );
|
||
|
$this->set_object_robots( $post_id, 'post' );
|
||
|
$this->set_schema_data( $post_id );
|
||
|
$this->set_object_redirection( $post_id, 'post' );
|
||
|
}
|
||
|
|
||
|
return $this->get_pagination_arg();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Import term meta of plugin.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
protected function termmeta() {
|
||
|
$count = 0;
|
||
|
$terms = new \WP_Term_Query(
|
||
|
[
|
||
|
'meta_key' => '_seopress_titles_title',
|
||
|
'fields' => 'ids',
|
||
|
'hide_empty' => false,
|
||
|
'get' => 'all',
|
||
|
]
|
||
|
);
|
||
|
|
||
|
if ( empty( $terms ) || is_wp_error( $terms ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$hash = [
|
||
|
'_seopress_titles_title' => 'rank_math_title',
|
||
|
'_seopress_titles_desc' => 'rank_math_description',
|
||
|
'_seopress_robots_canonical' => 'rank_math_canonical_url',
|
||
|
'_seopress_social_fb_title' => 'rank_math_facebook_title',
|
||
|
'_seopress_social_fb_desc' => 'rank_math_facebook_description',
|
||
|
'_seopress_social_fb_img' => 'rank_math_facebook_image',
|
||
|
'_seopress_social_twitter_title' => 'rank_math_twitter_title',
|
||
|
'_seopress_social_twitter_desc' => 'rank_math_twitter_description',
|
||
|
'_seopress_social_twitter_img' => 'rank_math_twitter_image',
|
||
|
];
|
||
|
|
||
|
foreach ( $terms->get_terms() as $term_id ) {
|
||
|
$count++;
|
||
|
|
||
|
$this->replace_meta( $hash, [], $term_id, 'term', 'convert_variables' );
|
||
|
delete_term_meta( $term_id, 'rank_math_permalink' );
|
||
|
$this->is_twitter_using_facebook( 'term', $term_id );
|
||
|
$this->set_object_robots( $term_id, 'term' );
|
||
|
$this->set_object_redirection( $term_id, 'term' );
|
||
|
}
|
||
|
|
||
|
return compact( 'count' );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Imports redirections data.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
protected function redirections() {
|
||
|
$redirections = get_posts(
|
||
|
[
|
||
|
'posts_per_page' => -1,
|
||
|
'post_type' => 'seopress_404',
|
||
|
]
|
||
|
);
|
||
|
|
||
|
if ( empty( $redirections ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$count = 0;
|
||
|
foreach ( $redirections as $redirection ) {
|
||
|
|
||
|
$data = [
|
||
|
'source' => $redirection->post_title,
|
||
|
'destination' => get_post_meta( $redirection->ID, '_seopress_redirections_value', true ),
|
||
|
'code' => get_post_meta( $redirection->ID, '_seopress_redirections_type', true ),
|
||
|
'status' => 'publish' === $redirection->post_status ? true : false,
|
||
|
];
|
||
|
if ( false !== $this->save_redirection( $data ) ) {
|
||
|
$count++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return compact( 'count' );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Update Modules.
|
||
|
*
|
||
|
* @param array $seopress_local Local SEO Settings.
|
||
|
* @param array $seopress_sitemap Sitemap Settings.
|
||
|
*/
|
||
|
private function update_modules( $seopress_local, $seopress_sitemap ) {
|
||
|
$seopress_toggle = get_option( 'seopress_toggle' );
|
||
|
|
||
|
// Enable/Disable Modules.
|
||
|
$modules = [
|
||
|
'local-seo' => ! empty( $seopress_toggle['toggle-local-business'] ) ? 'on' : 'off',
|
||
|
'sitemap' => ! empty( $seopress_toggle['toggle-xml-sitemap'] ) && ! empty( $seopress_sitemap['seopress_xml_sitemap_general_enable'] ) ? 'on' : 'off',
|
||
|
'rich-snippet' => ! empty( $seopress_toggle['toggle-rich-snippets'] ) ? 'on' : 'off',
|
||
|
'404-monitor' => ! empty( $seopress_toggle['toggle-404'] ) && ! empty( $seopress_local['seopress_404_enable'] ) ? 'on' : 'off',
|
||
|
];
|
||
|
foreach ( $modules as $key => $value ) {
|
||
|
Helper::update_modules( [ $key => $value ] );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Save redirection.
|
||
|
*
|
||
|
* @param WP_Post $redirection Redirection object.
|
||
|
*
|
||
|
* @return mixed
|
||
|
*/
|
||
|
private function save_redirection( $redirection ) {
|
||
|
if ( empty( $redirection['source'] ) || empty( $redirection['destination'] ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$item = Redirection::from(
|
||
|
[
|
||
|
'sources' => [
|
||
|
[
|
||
|
'pattern' => $redirection['source'],
|
||
|
'comparison' => 'exact',
|
||
|
],
|
||
|
],
|
||
|
'url_to' => $redirection['destination'],
|
||
|
'header_code' => $redirection['code'],
|
||
|
'status' => $redirection['status'] ? 'active' : 'inactive',
|
||
|
]
|
||
|
);
|
||
|
|
||
|
return $item->save();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Social settings.
|
||
|
*/
|
||
|
private function social_settings() {
|
||
|
$social = get_option( 'seopress_social_option_name' );
|
||
|
$hash = [
|
||
|
'seopress_social_accounts_facebook' => 'social_url_facebook',
|
||
|
'seopress_social_facebook_link_ownership_id' => 'facebook_author_urls',
|
||
|
'seopress_social_facebook_img' => 'open_graph_image',
|
||
|
'seopress_social_facebook_admin_id' => 'facebook_admin_id',
|
||
|
'seopress_social_facebook_app_id' => 'facebook_app_id',
|
||
|
'seopress_social_accounts_twitter' => 'twitter_author_names',
|
||
|
'seopress_social_knowledge_name' => 'knowledgegraph_name',
|
||
|
'seopress_social_knowledge_img' => 'knowledgegraph_logo',
|
||
|
];
|
||
|
$this->replace( $hash, $social, $this->titles );
|
||
|
|
||
|
$additional_urls = [];
|
||
|
foreach ( [ 'pinterest', 'instagram', 'youtube', 'linkedin' ] as $service ) {
|
||
|
if ( ! empty( $social[ "seopress_social_accounts_{$service}" ] ) ) {
|
||
|
$additional_urls[] = $social[ "seopress_social_accounts_{$service}" ];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( ! empty( $additional_urls ) ) {
|
||
|
$this->titles['social_additional_profiles'] = implode( PHP_EOL, $additional_urls );
|
||
|
}
|
||
|
|
||
|
// OpenGraph.
|
||
|
if ( isset( $social['og_default_image'] ) ) {
|
||
|
$this->replace_image( $social['og_default_image'], $this->titles, 'open_graph_image', 'open_graph_image_id' );
|
||
|
}
|
||
|
|
||
|
if ( isset( $social['og_frontpage_image'] ) ) {
|
||
|
$this->replace_image( $social['og_frontpage_image'], $this->titles, 'homepage_facebook_image', 'homepage_facebook_image_id' );
|
||
|
}
|
||
|
|
||
|
// Phone Numbers.
|
||
|
if ( ! empty( $social['seopress_social_knowledge_phone'] ) ) {
|
||
|
$this->titles['phone_numbers'] = [
|
||
|
[
|
||
|
'type' => $social['seopress_social_knowledge_contact_type'],
|
||
|
'number' => $social['seopress_social_knowledge_phone'],
|
||
|
],
|
||
|
];
|
||
|
}
|
||
|
$this->titles['knowledgegraph_type'] = isset( $social['seopress_social_knowledge_type'] ) && 'organization' === strtolower( $social['seopress_social_knowledge_type'] ) ? 'company' : 'person';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Post type settings.
|
||
|
*
|
||
|
* @param array $seopress_titles Titles & Meta Settings.
|
||
|
* @param array $seopress_sitemap Sitemap Settings.
|
||
|
*/
|
||
|
private function post_type_settings( $seopress_titles, $seopress_sitemap ) {
|
||
|
foreach ( Helper::get_accessible_post_types() as $post_type ) {
|
||
|
$this->titles[ "pt_{$post_type}_title" ] = isset( $seopress_titles['seopress_titles_single_titles'][ $post_type ] ) ? $this->convert_variables( $seopress_titles['seopress_titles_single_titles'][ $post_type ]['title'] ) : '';
|
||
|
$this->titles[ "pt_{$post_type}_description" ] = isset( $seopress_titles['seopress_titles_single_titles'][ $post_type ] ) ? $this->convert_variables( $seopress_titles['seopress_titles_single_titles'][ $post_type ]['description'] ) : '';
|
||
|
|
||
|
$this->set_robots(
|
||
|
"pt_{$post_type}",
|
||
|
! empty( $seopress_titles['seopress_titles_single_titles'][ $post_type ]['noindex'] ),
|
||
|
! empty( $seopress_titles['seopress_titles_single_titles'][ $post_type ]['nofollow'] )
|
||
|
);
|
||
|
|
||
|
$enable_sitemap = $this->enable_sitemap( 'post_types', $post_type, $seopress_sitemap );
|
||
|
$this->sitemap[ "pt_{$post_type}_sitemap" ] = $enable_sitemap ? 'on' : 'off';
|
||
|
|
||
|
if ( 'attachment' === $post_type && $enable_sitemap ) {
|
||
|
$this->settings['attachment_redirect_urls'] = 'off';
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Taxonomies settings.
|
||
|
*
|
||
|
* @param array $seopress_titles Titles & Meta Settings.
|
||
|
* @param array $seopress_sitemap Sitemap Settings.
|
||
|
*/
|
||
|
private function taxonomies_settings( $seopress_titles, $seopress_sitemap ) {
|
||
|
foreach ( Helper::get_accessible_taxonomies() as $taxonomy => $object ) {
|
||
|
$this->titles[ "tax_{$taxonomy}_title" ] = ! empty( $seopress_titles['seopress_titles_tax_titles'][ $taxonomy ]['title'] ) ? $this->convert_variables( $seopress_titles['seopress_titles_tax_titles'][ $taxonomy ]['title'] ) : '';
|
||
|
$this->titles[ "tax_{$taxonomy}_description" ] = ! empty( $seopress_titles['seopress_titles_tax_titles'][ $taxonomy ]['description'] ) ? $this->convert_variables( $seopress_titles['seopress_titles_tax_titles'][ $taxonomy ]['description'] ) : '';
|
||
|
|
||
|
$this->set_robots(
|
||
|
"tax_{$taxonomy}",
|
||
|
! empty( $seopress_titles['seopress_titles_tax_titles'][ $taxonomy ]['noindex'] ),
|
||
|
! empty( $seopress_titles['seopress_titles_tax_titles'][ $taxonomy ]['nofollow'] )
|
||
|
);
|
||
|
|
||
|
$this->sitemap[ "tax_{$taxonomy}_sitemap" ] = $this->enable_sitemap( 'taxonomies', $taxonomy, $seopress_sitemap ) ? 'on' : 'off';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Whether to enable sitemap.
|
||
|
*
|
||
|
* @param string $object_prefix post_types/taxonomies.
|
||
|
* @param string $object_type Current object type.
|
||
|
* @param string $seopress_sitemap Sitemap settings.
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
private function enable_sitemap( $object_prefix, $object_type, $seopress_sitemap ) {
|
||
|
return ! empty( $seopress_sitemap[ "seopress_xml_sitemap_{$object_prefix}_list" ][ $object_type ]['include'] );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set robots settings.
|
||
|
*
|
||
|
* @param string $prefix Setting key prefix.
|
||
|
* @param bool $noindex Is noindex.
|
||
|
* @param bool $nofollow Is nofollow.
|
||
|
*/
|
||
|
private function set_robots( $prefix, $noindex, $nofollow ) {
|
||
|
if ( $noindex || $nofollow ) {
|
||
|
$robots = "{$prefix}_robots";
|
||
|
$custom = "{$prefix}_custom_robots";
|
||
|
|
||
|
// Settings.
|
||
|
$this->titles[ $custom ] = 'on';
|
||
|
$this->titles[ $robots ][] = $noindex ? 'noindex' : '';
|
||
|
$this->titles[ $robots ][] = $nofollow ? 'nofollow' : '';
|
||
|
$this->titles[ $robots ] = array_unique( $this->titles[ $robots ] );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set Advanced settings.
|
||
|
*/
|
||
|
private function advanced_settings() {
|
||
|
$seopress_advanced = get_option( 'seopress_advanced_option_name' );
|
||
|
|
||
|
$hash = [
|
||
|
'seopress_advanced_advanced_google' => 'google_verify',
|
||
|
'seopress_advanced_advanced_bing' => 'bing_verify',
|
||
|
'seopress_advanced_advanced_yandex' => 'yandex_verify',
|
||
|
'seopress_advanced_advanced_pinterest' => 'pinterest_verify',
|
||
|
];
|
||
|
$this->replace( $hash, $seopress_advanced, $this->settings );
|
||
|
$this->replace( $hash, $seopress_advanced, $this->settings, 'convert_bool' );
|
||
|
|
||
|
$this->settings['attachment_redirect_urls'] = ! empty( $seopress_advanced['seopress_advanced_advanced_attachments'] ) ? 'on' : 'off';
|
||
|
$this->settings['strip_category_base'] = ! empty( $seopress_advanced['seopress_advanced_advanced_category_url'] ) ? 'on' : 'off';
|
||
|
|
||
|
$set_alt = ! empty( $seopress_advanced['seopress_advanced_advanced_image_auto_alt_editor'] ) ? 'on' : 'off';
|
||
|
$set_title = ! empty( $seopress_advanced['seopress_advanced_advanced_image_auto_title_editor'] ) ? 'on' : 'off';
|
||
|
|
||
|
$this->settings['add_img_alt'] = $set_alt;
|
||
|
$this->settings['add_img_title'] = $set_title;
|
||
|
$this->settings['img_alt_format'] = 'on' === $set_alt ? ' %filename%' : '';
|
||
|
$this->settings['img_title_format'] = 'on' === $set_title ? ' %filename%' : '';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Local SEO settings.
|
||
|
*
|
||
|
* @param array $seopress_local Local SEOPress data.
|
||
|
*/
|
||
|
private function local_seo_settings( $seopress_local ) {
|
||
|
if ( empty( $seopress_local ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Breadcrumbs.
|
||
|
$hash = [
|
||
|
'seopress_breadcrumbs_i18n_home' => 'breadcrumbs_home_label',
|
||
|
'seopress_breadcrumbs_i18n_search' => 'breadcrumbs_search_format',
|
||
|
'seopress_breadcrumbs_i18n_404' => 'breadcrumbs_404_label',
|
||
|
'seopress_breadcrumbs_enable' => 'breadcrumbs',
|
||
|
];
|
||
|
$this->replace( $hash, $seopress_local, $this->settings );
|
||
|
$this->replace( $hash, $seopress_local, $this->settings, 'convert_bool' );
|
||
|
$this->settings['breadcrumbs_separator'] = \RankMath\CMB2::sanitize_htmlentities( $seopress_local['seopress_breadcrumbs_separator'] );
|
||
|
|
||
|
$hash = [
|
||
|
'seopress_local_business_type' => 'local_business_type',
|
||
|
'seopress_local_business_price_range' => 'price_range',
|
||
|
'seopress_local_business_url' => 'url',
|
||
|
];
|
||
|
$this->replace( $hash, $seopress_local, $this->titles, 'convert_variables' );
|
||
|
|
||
|
// Street Address.
|
||
|
$address = [];
|
||
|
$hash = [
|
||
|
'seopress_local_business_street_address' => 'streetAddress',
|
||
|
'seopress_local_business_address_locality' => 'addressLocality',
|
||
|
'seopress_local_business_address_region' => 'addressRegion',
|
||
|
'seopress_local_business_postal_code' => 'postalCode',
|
||
|
'seopress_local_business_address_country' => 'addressCountry',
|
||
|
];
|
||
|
$this->replace( $hash, $seopress_local, $address );
|
||
|
$this->titles['local_address'] = $address;
|
||
|
|
||
|
// Coordinates.
|
||
|
if ( ! empty( $seopress_local['seopress_local_business_lat'] ) && ! empty( $seopress_local['seopress_local_business_lon'] ) ) {
|
||
|
$this->titles['geo'] = $seopress_local['seopress_local_business_lat'] . ', ' . $seopress_local['seopress_local_business_lon'];
|
||
|
}
|
||
|
|
||
|
$this->seopress_pro_settings( $seopress_local );
|
||
|
$this->seopress_set_opening_hours( $seopress_local );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 404 settings.
|
||
|
*
|
||
|
* @param array $seopress_local SEOPress Pro Settings.
|
||
|
*/
|
||
|
private function seopress_pro_settings( $seopress_local ) {
|
||
|
Helper::update_modules( [ 'redirections' => 'on' ] );
|
||
|
$hash = [
|
||
|
'seopress_rss_before_html' => 'rss_before_content',
|
||
|
'seopress_rss_after_html' => 'rss_after_content',
|
||
|
'seopress_404_redirect_custom_url' => 'redirections_custom_url',
|
||
|
'seopress_404_redirect_status_code' => 'redirections_header_code',
|
||
|
];
|
||
|
$this->replace( $hash, $seopress_local, $this->settings );
|
||
|
$this->settings['redirections_fallback'] = 'none' === $seopress_local['seopress_404_redirect_home'] ? 'default' : ( 'home' === $seopress_local['seopress_404_redirect_home'] ? 'homepage' : 'custom' );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set Opening Hours.
|
||
|
*
|
||
|
* @param array $seopress_local SEOPress Pro Settings.
|
||
|
*/
|
||
|
private function seopress_set_opening_hours( $seopress_local ) {
|
||
|
$hash = [ 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday' ];
|
||
|
$data = [];
|
||
|
foreach ( $seopress_local['seopress_local_business_opening_hours'] as $key => $opening_hour ) {
|
||
|
if ( isset( $opening_hour['open'] ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
$data[] = [
|
||
|
'day' => $hash[ $key ],
|
||
|
'time' => $opening_hour['start']['hours'] . ':' . $opening_hour['start']['mins'] . '-' . $opening_hour['end']['hours'] . ':' . $opening_hour['end']['mins'],
|
||
|
];
|
||
|
}
|
||
|
$this->titles['opening_hours'] = $data;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Set schema data.
|
||
|
*
|
||
|
* @param int $post_id Post ID.
|
||
|
*/
|
||
|
private function set_schema_data( $post_id ) {
|
||
|
if ( ! $type = get_post_meta( $post_id, '_seopress_pro_rich_snippets_type', true ) ) { // phpcs:ignore
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( $meta_keys = $this->get_schema_metakeys( $type ) ) { // phpcs:ignore
|
||
|
$schema_type = 's' === substr( $type, -1 ) ? substr( $type, 0, -1 ) : $type;
|
||
|
update_post_meta( $post_id, 'rank_math_rich_snippet', $schema_type );
|
||
|
|
||
|
foreach ( $meta_keys as $meta_key => $data ) {
|
||
|
$value = $this->get_snippet_value( $post_id, $meta_key );
|
||
|
if ( $value && 'events_location_address' === $meta_key ) {
|
||
|
$value = [ 'streetAddress' => $value ];
|
||
|
}
|
||
|
|
||
|
update_post_meta( $post_id, "rank_math_snippet_{$data}", $value );
|
||
|
}
|
||
|
|
||
|
// Convert post now.
|
||
|
$data = $this->json_ld->get_old_schema( $post_id, $this->single );
|
||
|
if ( isset( $data['richSnippet'] ) ) {
|
||
|
$data = $data['richSnippet'];
|
||
|
$type = $data['@type'];
|
||
|
$data['metadata'] = [
|
||
|
'title' => $type,
|
||
|
'type' => 'template',
|
||
|
];
|
||
|
update_post_meta( $post_id, 'rank_math_schema_' . $type, $data );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set object redirection.
|
||
|
*
|
||
|
* @param int $object_id Object id for destination.
|
||
|
* @param string $object_type Object type for destination.
|
||
|
*/
|
||
|
private function set_object_redirection( $object_id, $object_type ) {
|
||
|
$source_url = 'term' === $object_type ? get_term_link( $object_id ) : get_permalink( $object_id );
|
||
|
if ( is_wp_error( $source_url ) ) { // phpcs:ignore
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$hash = [
|
||
|
'_seopress_redirections_type' => 'redirection_header_code',
|
||
|
'_seopress_redirections_value' => 'redirection_url_to',
|
||
|
];
|
||
|
$this->replace_meta( $hash, null, $object_id, $object_type, 'convert_variables' );
|
||
|
|
||
|
$redirection = [
|
||
|
'source' => trim( parse_url( $source_url, PHP_URL_PATH ), '/' ),
|
||
|
'destination' => $this->get_meta( $object_type, $object_id, '_seopress_redirections_value' ),
|
||
|
'code' => $this->get_meta( $object_type, $object_id, '_seopress_redirections_type' ),
|
||
|
'status' => $this->get_meta( $object_type, $object_id, '_seopress_redirections_enabled' ),
|
||
|
];
|
||
|
|
||
|
$this->save_redirection( $redirection );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get snippet value.
|
||
|
*
|
||
|
* @param int $post_id Post ID.
|
||
|
* @param int $meta_key Meta key.
|
||
|
*
|
||
|
* @return string $value Snippet value
|
||
|
*/
|
||
|
private function get_snippet_value( $post_id, $meta_key ) {
|
||
|
$prefix = in_array( $meta_key, [ 'events_offers_valid_from_date', 'events_offers_valid_from_time' ], true ) ? '_seopress_rich_snippets_' : '_seopress_pro_rich_snippets_';
|
||
|
$value = get_post_meta( $post_id, $prefix . $meta_key, true );
|
||
|
|
||
|
if ( in_array( $meta_key, [ 'recipes_prep_time', 'recipes_cook_time', 'videos_duration' ], true ) ) {
|
||
|
$value .= 'M';
|
||
|
}
|
||
|
|
||
|
$hash = [
|
||
|
'events_start_date' => 'events_start_time',
|
||
|
'events_end_date' => 'events_end_time',
|
||
|
'events_offers_valid_from_date' => 'events_offers_valid_from_time',
|
||
|
];
|
||
|
|
||
|
if ( isset( $hash[ $meta_key ] ) ) {
|
||
|
$time = get_post_meta( $post_id, $prefix . $hash[ $meta_key ], true );
|
||
|
$value = strtotime( $value . ' ' . $time );
|
||
|
}
|
||
|
|
||
|
return $value;
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get schema meta keys.
|
||
|
*
|
||
|
* @param string $type Type of snippet.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
private function get_schema_metakeys( $type ) {
|
||
|
$hash = [
|
||
|
'articles' => [
|
||
|
'article_type' => 'article_type',
|
||
|
'article_title' => 'name',
|
||
|
],
|
||
|
'recipes' => [
|
||
|
'recipes_name' => 'name',
|
||
|
'recipes_desc' => 'desc',
|
||
|
'recipes_cat' => 'recipe_type',
|
||
|
'recipes_prep_time' => 'recipe_preptime',
|
||
|
'recipes_cook_time' => 'recipe_cooktime',
|
||
|
'recipes_calories' => 'recipe_calories',
|
||
|
'recipes_yield' => 'recipe_yield',
|
||
|
'recipes_ingredient' => 'recipe_ingredients',
|
||
|
],
|
||
|
'courses' => [
|
||
|
'courses_title' => 'name',
|
||
|
'courses_desc' => 'desc',
|
||
|
'courses_school' => 'course_provider',
|
||
|
'courses_website' => 'course_provider_url',
|
||
|
],
|
||
|
'videos' => [
|
||
|
'videos_name' => 'name',
|
||
|
'videos_description' => 'desc',
|
||
|
'videos_img' => 'rank_math_twitter_title',
|
||
|
'videos_url' => 'video_url',
|
||
|
'videos_duration' => 'video_duration',
|
||
|
],
|
||
|
'events' => [
|
||
|
'events_type' => 'event_type',
|
||
|
'events_name' => 'name',
|
||
|
'events_desc' => 'desc',
|
||
|
'events_location_address' => 'event_address',
|
||
|
'events_location_name' => 'event_venue',
|
||
|
'events_location_url' => 'event_venue_url',
|
||
|
'events_start_date' => 'event_startdate',
|
||
|
'events_end_date' => 'event_enddate',
|
||
|
'events_offers_price' => 'event_price',
|
||
|
'events_offers_price_currency' => 'event_currency',
|
||
|
'events_offers_url' => 'event_ticketurl',
|
||
|
'events_offers_availability' => 'event_availability',
|
||
|
'events_offers_valid_from_date' => 'event_availability_starts',
|
||
|
'events_performer' => 'event_performer',
|
||
|
],
|
||
|
'products' => [
|
||
|
'product_description' => 'desc',
|
||
|
'product_name' => 'name',
|
||
|
'product_price_currency' => 'product_currency',
|
||
|
'product_price' => 'product_price',
|
||
|
],
|
||
|
'review' => [
|
||
|
'review_item' => 'name',
|
||
|
'item_name' => 'desc',
|
||
|
'review_rating' => 'review_rating_value',
|
||
|
],
|
||
|
];
|
||
|
|
||
|
return isset( $hash[ $type ] ) ? $hash[ $type ] : false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set primary term for post
|
||
|
*
|
||
|
* @param int[] $post_ids Post IDs.
|
||
|
*/
|
||
|
private function set_primary_term( $post_ids ) {
|
||
|
$post_ids = wp_list_pluck( $post_ids, 'ID' );
|
||
|
$table = DB::query_builder( 'postmeta' );
|
||
|
$results = $table->whereLike( 'meta_key', '_seopress_robots_primary_cat' )->whereIn( 'post_id', $post_ids )->get();
|
||
|
|
||
|
foreach ( $results as $result ) {
|
||
|
if ( 'none' !== $result->meta_value ) {
|
||
|
update_post_meta( $result->post_id, 'rank_math_primary_category', $result->meta_value );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set post/term robots.
|
||
|
*
|
||
|
* @param int $object_id Object id.
|
||
|
* @param string $object_type Object type.
|
||
|
*/
|
||
|
private function set_object_robots( $object_id, $object_type ) {
|
||
|
// Early bail if robots data is set in Rank Math plugin.
|
||
|
if ( ! empty( $this->get_meta( $object_type, $object_id, 'rank_math_robots' ) ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$current = $this->get_robots_by_hash( $object_id, $object_type );
|
||
|
$is_noindex = in_array( 'noindex', $current, true );
|
||
|
$is_nofollow = in_array( 'nofollow', $current, true );
|
||
|
|
||
|
if ( ! $is_noindex || ! $is_nofollow ) {
|
||
|
$robots = $this->get_default_robots( $object_id, $object_type );
|
||
|
$current[] = ! $is_nofollow && ! empty( $robots['nofollow'] ) ? 'nofollow' : '';
|
||
|
|
||
|
// Keep global no index status.
|
||
|
if ( ! empty( $robots['noindex'] ) ) {
|
||
|
unset( $current['index'] );
|
||
|
$current[] = 'noindex';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$this->update_meta( $object_type, $object_id, 'rank_math_robots', array_unique( $current ) );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get by meta hash.
|
||
|
*
|
||
|
* @param int $object_id Object id.
|
||
|
* @param string $object_type Object type.
|
||
|
*
|
||
|
* @return array Array of robots data.
|
||
|
*/
|
||
|
private function get_robots_by_hash( $object_id, $object_type ) {
|
||
|
$current = [];
|
||
|
$hash = [
|
||
|
'_seopress_robots_index' => 'noindex',
|
||
|
'_seopress_robots_follow' => 'nofollow',
|
||
|
'_seopress_robots_imageindex' => 'noimageindex',
|
||
|
'_seopress_robots_archive' => 'noarchive',
|
||
|
'_seopress_robots_snippet' => 'nosnippet',
|
||
|
];
|
||
|
|
||
|
foreach ( $hash as $source => $value ) {
|
||
|
if ( ! empty( $this->get_meta( $object_type, $object_id, $source ) ) ) {
|
||
|
$current[] = $value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $current;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get default robots data from settings.
|
||
|
*
|
||
|
* @param int $object_id Object id.
|
||
|
* @param string $object_type Object type.
|
||
|
*
|
||
|
* @return array Array of robots data.
|
||
|
*/
|
||
|
private function get_default_robots( $object_id, $object_type ) {
|
||
|
$seopress_titles = get_option( 'seopress_titles_option_name' );
|
||
|
if ( 'post' === $object_type ) {
|
||
|
$post_type = get_post_type( $object_id );
|
||
|
return isset( $seopress_titles['seopress_titles_single_titles'][ $post_type ] ) ? $seopress_titles['seopress_titles_single_titles'][ $post_type ] : [];
|
||
|
}
|
||
|
|
||
|
$term = get_term( $object_id );
|
||
|
return isset( $seopress_titles['seopress_titles_tax_titles'][ $term->taxonomy ] ) ? $seopress_titles['seopress_titles_tax_titles'][ $term->taxonomy ] : [];
|
||
|
}
|
||
|
}
|