All in One SEO Pack - Version 4.1.4.5

Version Description

This update adds major improvements and bugfixes.

Download this release

Release Info

Developer benjaminprojas
Plugin Icon 128x128 All in One SEO Pack
Version 4.1.4.5
Comparing to
See all releases

Code changes from version 4.1.3.4 to 4.1.4.5

Files changed (115) hide show
  1. all_in_one_seo_pack.php +3 -3
  2. app/AIOSEO.php +15 -4
  3. app/Common/Admin/Admin.php +87 -42
  4. app/Common/Admin/Notices/Import.php +1 -16
  5. app/Common/Admin/PostSettings.php +35 -5
  6. app/Common/Admin/SiteHealth.php +12 -12
  7. app/Common/Api/Migration.php +4 -4
  8. app/Common/Api/PostsTerms.php +32 -8
  9. app/Common/Api/Settings.php +64 -15
  10. app/Common/Api/Sitemaps.php +3 -3
  11. app/Common/Api/Tools.php +8 -0
  12. app/Common/Api/Wizard.php +70 -66
  13. app/Common/HeadlineAnalyzer/HeadlineAnalyzer.php +2 -1
  14. app/Common/ImportExport/Helpers.php +3 -3
  15. app/Common/ImportExport/ImportExport.php +43 -0
  16. app/Common/ImportExport/RankMath/GeneralSettings.php +2 -2
  17. app/Common/ImportExport/RankMath/TitleMeta.php +15 -15
  18. app/Common/ImportExport/SeoPress/Analytics.php +34 -0
  19. app/Common/ImportExport/SeoPress/Breadcrumbs.php +57 -0
  20. app/Common/ImportExport/SeoPress/GeneralSettings.php +130 -0
  21. app/Common/ImportExport/SeoPress/Helpers.php +88 -9
  22. app/Common/ImportExport/SeoPress/PostMeta.php +174 -0
  23. app/Common/ImportExport/SeoPress/RobotsTxt.php +50 -0
  24. app/Common/ImportExport/SeoPress/Rss.php +47 -0
  25. app/Common/ImportExport/SeoPress/SearchAppearance.php +0 -46
  26. app/Common/ImportExport/SeoPress/SeoPress.php +57 -11
  27. app/Common/ImportExport/SeoPress/Sitemap.php +74 -0
  28. app/Common/ImportExport/SeoPress/SocialMeta.php +130 -0
  29. app/Common/ImportExport/SeoPress/Titles.php +288 -0
  30. app/Common/ImportExport/YoastSeo/GeneralSettings.php +0 -19
  31. app/Common/ImportExport/YoastSeo/PostMeta.php +47 -7
  32. app/Common/ImportExport/YoastSeo/SearchAppearance.php +18 -18
  33. app/Common/ImportExport/YoastSeo/SocialMeta.php +61 -0
  34. app/Common/ImportExport/YoastSeo/UserMeta.php +68 -0
  35. app/Common/ImportExport/YoastSeo/YoastSeo.php +12 -0
  36. app/Common/Main/Activate.php +10 -0
  37. app/Common/Main/Filters.php +63 -5
  38. app/Common/Main/Media.php +2 -2
  39. app/Common/Main/Updates.php +147 -1
  40. app/Common/Meta/Description.php +9 -9
  41. app/Common/Meta/Helpers.php +18 -1
  42. app/Common/Meta/Keywords.php +6 -6
  43. app/Common/Meta/Robots.php +38 -27
  44. app/Common/Meta/Title.php +10 -10
  45. app/Common/Migration/GeneralSettings.php +26 -26
  46. app/Common/Migration/Helpers.php +3 -3
  47. app/Common/Migration/Meta.php +18 -2
  48. app/Common/Migration/Sitemap.php +10 -7
  49. app/Common/Migration/SocialMeta.php +3 -3
  50. app/Common/Models/Model.php +3 -115
  51. app/Common/Models/Post.php +26 -6
  52. app/Common/Options/Cache.php +93 -0
  53. app/Common/{Utils → Options}/DynamicBackup.php +49 -48
  54. app/Common/Options/DynamicOptions.php +387 -0
  55. app/Common/{Utils → Options}/InternalOptions.php +14 -12
  56. app/Common/{Utils → Options}/Options.php +67 -336
  57. app/Common/Schema/Graphs/Article.php +1 -0
  58. app/Common/Schema/Graphs/BreadcrumbList.php +2 -2
  59. app/Common/Schema/Graphs/Graph.php +21 -4
  60. app/Common/Schema/Graphs/WebPage.php +1 -1
  61. app/Common/Schema/Graphs/WebSite.php +5 -1
  62. app/Common/Schema/Schema.php +7 -7
  63. app/Common/Sitemap/Content.php +8 -6
  64. app/Common/Sitemap/Helpers.php +6 -20
  65. app/Common/Sitemap/Html/Sitemap.php +0 -6
  66. app/Common/Sitemap/Image.php +5 -0
  67. app/Common/Sitemap/Priority.php +9 -4
  68. app/Common/Sitemap/Query.php +66 -49
  69. app/Common/Sitemap/Root.php +3 -3
  70. app/Common/Social/Facebook.php +209 -7
  71. app/Common/Social/Helpers.php +0 -55
  72. app/Common/Social/Output.php +1 -0
  73. app/Common/Social/Social.php +0 -1
  74. app/Common/Social/Twitter.php +17 -2
  75. app/Common/Tools/Htaccess.php +2 -1
  76. app/Common/Tools/RobotsTxt.php +16 -4
  77. app/Common/Traits/Helpers/ActionScheduler.php +12 -0
  78. app/Common/Traits/Helpers/Arrays.php +85 -0
  79. app/Common/Traits/Helpers/Constants.php +15 -1
  80. app/Common/Traits/Helpers/DateTime.php +37 -0
  81. app/Common/Traits/Helpers/ECommerce.php +0 -109
  82. app/Common/Traits/Helpers/Language.php +40 -0
  83. app/Common/Traits/Helpers/Strings.php +122 -1
  84. app/Common/Traits/Helpers/Svg.php +51 -0
  85. app/Common/Traits/Helpers/ThirdParty.php +338 -0
  86. app/Common/Traits/Helpers/Vue.php +367 -0
  87. app/Common/Traits/Helpers/Wp.php +549 -0
  88. app/Common/Traits/Helpers/WpContext.php +489 -0
  89. app/Common/Traits/Helpers/WpUri.php +306 -0
  90. app/Common/Traits/Options.php +184 -68
  91. app/Common/Utils/Database.php +3 -2
  92. app/Common/Utils/Helpers.php +88 -2133
  93. app/Common/Utils/VueSettings.php +2 -0
  94. app/Common/Views/main/meta.php +2 -2
  95. app/Common/Views/sitemap/html/widget-options.php +2 -2
  96. app/Lite/Admin/Connect.php +32 -0
  97. app/Lite/Options/InternalOptions.php +42 -0
  98. app/Lite/Options/Options.php +34 -0
  99. app/Lite/Traits/Options.php +98 -0
  100. app/Lite/Utils/InternalOptions.php +0 -102
  101. app/Lite/Utils/Options.php +0 -107
  102. dist/Lite/assets/css/aioseo-admin-bar.css +1 -1
  103. dist/Lite/assets/css/aioseo-admin-bar.css.gz +0 -0
  104. dist/Lite/assets/css/chunk-common.css +1 -1
  105. dist/Lite/assets/css/chunk-common.rtl.css +1 -1
  106. dist/Lite/assets/css/headline-analyzer.css +1 -1
  107. dist/Lite/assets/css/headline-analyzer.css.gz +0 -0
  108. dist/Lite/assets/css/local-seo-Maps-vue.css +1 -0
  109. dist/Lite/assets/css/local-seo-Maps-vue.rtl.css +1 -0
  110. dist/Lite/assets/css/local-seo-lite-Maps-vue.css +1 -0
  111. dist/Lite/assets/css/local-seo-lite-Maps-vue.rtl.css +1 -0
  112. dist/Lite/assets/css/local-seo-pro-Maps-vue.css +1 -0
  113. dist/Lite/assets/css/local-seo-pro-Maps-vue.rtl.css +1 -0
  114. dist/Lite/assets/css/post-settings.css +1 -1
  115. dist/Lite/assets/css/post-settings.rtl.css +1 -1
all_in_one_seo_pack.php CHANGED
@@ -2,10 +2,10 @@
2
  /**
3
  * Plugin Name: All in One SEO
4
  * Plugin URI: https://aioseo.com/
5
- * Description: SEO for WordPress. Features like XML Sitemaps, SEO for custom post types, SEO for blogs, business sites, ecommerce sites, and much more. More than 75 million downloads since 2007.
6
  * Author: All in One SEO Team
7
  * Author URI: https://aioseo.com/
8
- * Version: 4.1.3.4
9
  * Text Domain: all-in-one-seo-pack
10
  * Domain Path: /i18n/
11
  *
@@ -84,4 +84,4 @@ if ( version_compare( PHP_VERSION, '5.5', '<' ) ) {
84
  // Define the class and the function.
85
  require_once( dirname( __FILE__ ) . '/app/AIOSEO.php' );
86
 
87
- aioseo();
2
  /**
3
  * Plugin Name: All in One SEO
4
  * Plugin URI: https://aioseo.com/
5
+ * Description: SEO for WordPress. Features like XML Sitemaps, SEO for custom post types, SEO for blogs, business sites, ecommerce sites, and much more. More than 80 million downloads since 2007.
6
  * Author: All in One SEO Team
7
  * Author URI: https://aioseo.com/
8
+ * Version: 4.1.4.5
9
  * Text Domain: all-in-one-seo-pack
10
  * Domain Path: /i18n/
11
  *
84
  // Define the class and the function.
85
  require_once( dirname( __FILE__ ) . '/app/AIOSEO.php' );
86
 
87
+ aioseo();
app/AIOSEO.php CHANGED
@@ -57,6 +57,15 @@ namespace AIOSEO\Plugin {
57
  */
58
  public $options = [];
59
 
 
 
 
 
 
 
 
 
 
60
  /**
61
  * The WordPress filters to run.
62
  *
@@ -275,9 +284,11 @@ namespace AIOSEO\Plugin {
275
  $this->badBotBlocker = new Common\Tools\BadBotBlocker();
276
  $this->headlineAnalyzer = new Common\HeadlineAnalyzer\HeadlineAnalyzer();
277
  $this->breadcrumbs = $this->pro ? new Pro\Breadcrumbs\Breadcrumbs() : new Common\Breadcrumbs\Breadcrumbs();
278
- $this->dynamicBackup = $this->pro ? new Pro\Utils\DynamicBackup() : new Common\Utils\DynamicBackup();
279
- $this->internalOptions = $this->pro ? new Pro\Utils\InternalOptions() : new Lite\Utils\InternalOptions();
280
- $this->options = $this->pro ? new Pro\Utils\Options() : new Lite\Utils\Options();
 
 
281
  $this->backup = new Common\Utils\Backup();
282
  $this->access = $this->pro ? new Pro\Utils\Access() : new Common\Utils\Access();
283
  $this->usage = $this->pro ? new Pro\Admin\Usage() : new Lite\Admin\Usage();
@@ -335,7 +346,7 @@ namespace AIOSEO\Plugin {
335
  $this->badBotBlocker->init();
336
 
337
  // We call this again to reset any post types/taxonomies that have not yet been set up.
338
- $this->options->refresh();
339
  }
340
 
341
  /**
57
  */
58
  public $options = [];
59
 
60
+ /**
61
+ * The AIOSEO dynamic options.
62
+ *
63
+ * @since 4.1.4
64
+ *
65
+ * @var array
66
+ */
67
+ public $dynamicOptions = [];
68
+
69
  /**
70
  * The WordPress filters to run.
71
  *
284
  $this->badBotBlocker = new Common\Tools\BadBotBlocker();
285
  $this->headlineAnalyzer = new Common\HeadlineAnalyzer\HeadlineAnalyzer();
286
  $this->breadcrumbs = $this->pro ? new Pro\Breadcrumbs\Breadcrumbs() : new Common\Breadcrumbs\Breadcrumbs();
287
+ $this->dynamicBackup = $this->pro ? new Pro\Options\DynamicBackup() : new Common\Options\DynamicBackup();
288
+ $this->optionsCache = new Common\Options\Cache();
289
+ $this->internalOptions = $this->pro ? new Pro\Options\InternalOptions() : new Lite\Options\InternalOptions();
290
+ $this->options = $this->pro ? new Pro\Options\Options() : new Lite\Options\Options();
291
+ $this->dynamicOptions = $this->pro ? new Pro\Options\DynamicOptions() : new Common\Options\DynamicOptions();
292
  $this->backup = new Common\Utils\Backup();
293
  $this->access = $this->pro ? new Pro\Utils\Access() : new Common\Utils\Access();
294
  $this->usage = $this->pro ? new Pro\Admin\Usage() : new Lite\Admin\Usage();
346
  $this->badBotBlocker->init();
347
 
348
  // We call this again to reset any post types/taxonomies that have not yet been set up.
349
+ $this->dynamicOptions->refresh();
350
  }
351
 
352
  /**
app/Common/Admin/Admin.php CHANGED
@@ -72,6 +72,59 @@ class Admin {
72
  return;
73
  }
74
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  $this->pages = [
76
  $this->pageSlug => [
77
  'menu_title' => esc_html__( 'Dashboard', 'all-in-one-seo-pack' ),
@@ -126,46 +179,6 @@ class Admin {
126
  'parent' => $this->pageSlug
127
  ]
128
  ];
129
-
130
- add_action( 'sanitize_comment_cookies', [ $this, 'init' ], 20 );
131
-
132
- $this->setupWizard = new SetupWizard();
133
- }
134
-
135
- /**
136
- * Initialize the admin.
137
- *
138
- * @since 4.0.0
139
- *
140
- * @return void
141
- */
142
- public function init() {
143
- // Add the admin bar menu.
144
- if ( is_user_logged_in() && ( ! is_multisite() || ! is_network_admin() ) ) {
145
- add_action( 'admin_bar_menu', [ $this, 'adminBarMenu' ], 1000 );
146
- }
147
-
148
- if ( is_admin() ) {
149
- // Add the menu to the sidebar.
150
- add_action( 'admin_menu', [ $this, 'addMenu' ] );
151
- add_action( 'admin_menu', [ $this, 'hideScheduledActionsMenu' ], 99999 );
152
- if ( is_multisite() ) {
153
- add_action( 'network_admin_menu', [ $this, 'addRobotsMenu' ] );
154
- }
155
-
156
- // Add the columns to page/posts.
157
- add_action( 'current_screen', [ $this, 'addPostColumns' ], 1 );
158
-
159
- // Add Score to Publish metabox.
160
- add_action( 'post_submitbox_misc_actions', [ $this, 'addPublishScore' ] );
161
-
162
- add_action( 'admin_init', [ $this, 'addPluginScripts' ] );
163
-
164
- // Add redirects messages to trashed posts.
165
- add_filter( 'bulk_post_updated_messages', [ $this, 'appendTrashedMessage' ], 10, 2 );
166
-
167
- $this->registerLinkFormatHooks();
168
- }
169
  }
170
 
171
  /**
@@ -1108,7 +1121,7 @@ class Admin {
1108
  $postTypes = aioseo()->helpers->getPublicPostTypes();
1109
  $showTruSeo = aioseo()->options->advanced->truSeo;
1110
  $isSpecialPage = aioseo()->helpers->isSpecialPage( $post->ID );
1111
- $showMetabox = aioseo()->options->searchAppearance->dynamic->postTypes->{$post->post_type}->advanced->showMetaBox;
1112
 
1113
  $postTypesMB = [];
1114
  foreach ( $postTypes as $pt ) {
@@ -1142,7 +1155,7 @@ class Admin {
1142
  echo sprintf( esc_html__( '%1$s Score', 'all-in-one-seo-pack' ), esc_html( AIOSEO_PLUGIN_SHORT_NAME ) );
1143
  ?>
1144
  </span>
1145
- <div id="aioseo-post-settings-sidebar-button" class="aioseo-score-button classic-editor <?php echo esc_attr( aioseo()->helpers->getScoreClass( $score ) ); ?>">
1146
  <span id="aioseo-post-score"><?php echo esc_attr( $score . '/100' ); ?></span>
1147
  </div>
1148
  </div>
@@ -1378,4 +1391,36 @@ class Admin {
1378
  $messages['page']['trashed'] = $messages['page']['trashed'] . '&nbsp;<a href="' . $url . '">' . $addRedirect . '</a> |';
1379
  return $messages;
1380
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1381
  }
72
  return;
73
  }
74
 
75
+ add_action( 'sanitize_comment_cookies', [ $this, 'init' ], 20 );
76
+
77
+ $this->setupWizard = new SetupWizard();
78
+ }
79
+
80
+ /**
81
+ * Initialize the admin.
82
+ *
83
+ * @since 4.0.0
84
+ *
85
+ * @return void
86
+ */
87
+ public function init() {
88
+ // Add the admin bar menu.
89
+ if ( is_user_logged_in() && ( ! is_multisite() || ! is_network_admin() ) ) {
90
+ add_action( 'admin_bar_menu', [ $this, 'adminBarMenu' ], 1000 );
91
+ }
92
+
93
+ if ( is_admin() ) {
94
+ // Add the menu to the sidebar.
95
+ add_action( 'admin_menu', [ $this, 'addMenu' ] );
96
+ add_action( 'admin_menu', [ $this, 'hideScheduledActionsMenu' ], 99999 );
97
+ if ( is_multisite() ) {
98
+ add_action( 'network_admin_menu', [ $this, 'addRobotsMenu' ] );
99
+ }
100
+
101
+ // Add the columns to page/posts.
102
+ add_action( 'current_screen', [ $this, 'addPostColumns' ], 1 );
103
+
104
+ // Add Score to Publish metabox.
105
+ add_action( 'post_submitbox_misc_actions', [ $this, 'addPublishScore' ] );
106
+
107
+ add_action( 'admin_init', [ $this, 'addPluginScripts' ] );
108
+
109
+ // Add redirects messages to trashed posts.
110
+ add_filter( 'bulk_post_updated_messages', [ $this, 'appendTrashedMessage' ], 10, 2 );
111
+
112
+ $this->registerLinkFormatHooks();
113
+ }
114
+
115
+ $this->loadTextDomain();
116
+ $this->setPages();
117
+ }
118
+
119
+ /**
120
+ * Sets our menu pages.
121
+ * It is important this runs AFTER we've loaded the text domain.
122
+ *
123
+ * @since 4.1.4
124
+ *
125
+ * @return void
126
+ */
127
+ private function setPages() {
128
  $this->pages = [
129
  $this->pageSlug => [
130
  'menu_title' => esc_html__( 'Dashboard', 'all-in-one-seo-pack' ),
179
  'parent' => $this->pageSlug
180
  ]
181
  ];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182
  }
183
 
184
  /**
1121
  $postTypes = aioseo()->helpers->getPublicPostTypes();
1122
  $showTruSeo = aioseo()->options->advanced->truSeo;
1123
  $isSpecialPage = aioseo()->helpers->isSpecialPage( $post->ID );
1124
+ $showMetabox = aioseo()->dynamicOptions->searchAppearance->postTypes->{$post->post_type}->advanced->showMetaBox;
1125
 
1126
  $postTypesMB = [];
1127
  foreach ( $postTypes as $pt ) {
1155
  echo sprintf( esc_html__( '%1$s Score', 'all-in-one-seo-pack' ), esc_html( AIOSEO_PLUGIN_SHORT_NAME ) );
1156
  ?>
1157
  </span>
1158
+ <div id="aioseo-post-settings-sidebar-button" class="aioseo-score-button classic-editor <?php echo esc_attr( $this->getScoreClass( $score ) ); ?>">
1159
  <span id="aioseo-post-score"><?php echo esc_attr( $score . '/100' ); ?></span>
1160
  </div>
1161
  </div>
1391
  $messages['page']['trashed'] = $messages['page']['trashed'] . '&nbsp;<a href="' . $url . '">' . $addRedirect . '</a> |';
1392
  return $messages;
1393
  }
1394
+
1395
+ /**
1396
+ * Get the class name for the Score button.
1397
+ * Depending on the score the button should have different color.
1398
+ *
1399
+ * @since 4.0.0
1400
+ *
1401
+ * @param int $score The content to retrieve from the remote URL.
1402
+ *
1403
+ * @return string The class name for Score button.
1404
+ */
1405
+ private function getScoreClass( $score ) {
1406
+ $scoreClass = 50 < $score ? 'score-orange' : 'score-red';
1407
+ if ( 0 === $score ) {
1408
+ $scoreClass = 'score-none';
1409
+ }
1410
+ if ( $score >= 80 ) {
1411
+ $scoreClass = 'score-green';
1412
+ }
1413
+ return $scoreClass;
1414
+ }
1415
+
1416
+ /**
1417
+ * Loads the plugin text domain.
1418
+ *
1419
+ * @since 4.1.4
1420
+ *
1421
+ * @return void
1422
+ */
1423
+ public function loadTextDomain() {
1424
+ aioseo()->helpers->loadTextDomain( 'all-in-one-seo-pack' );
1425
+ }
1426
  }
app/Common/Admin/Notices/Import.php CHANGED
@@ -20,22 +20,7 @@ class Import {
20
  * @return void
21
  */
22
  public function maybeShowNotice() {
23
- $transients = aioseo()->db
24
- ->start( 'options' )
25
- ->select( 'option_name as name' )
26
- ->whereRaw( "`option_name` LIKE '_aioseo_cache_%'" )
27
- ->run()
28
- ->result();
29
-
30
- $foundImportTransient = false;
31
- foreach ( $transients as $transient ) {
32
- if ( preg_match( '#import_.*_meta_.*#', $transient->name ) ) {
33
- $foundImportTransient = true;
34
- break;
35
- }
36
- }
37
-
38
- if ( ! $foundImportTransient ) {
39
  return;
40
  }
41
 
20
  * @return void
21
  */
22
  public function maybeShowNotice() {
23
+ if ( ! aioseo()->importExport->isImportRunning() ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  return;
25
  }
26
 
app/Common/Admin/PostSettings.php CHANGED
@@ -71,6 +71,10 @@ class PostSettings {
71
  aioseo()->helpers->getVueData( $page )
72
  );
73
 
 
 
 
 
74
  $rtl = is_rtl() ? '.rtl' : '';
75
  aioseo()->helpers->enqueueStyle(
76
  'aioseo-post-settings-metabox',
@@ -84,6 +88,26 @@ class PostSettings {
84
  }
85
  }
86
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  /**
88
  * Adds a meta box to page/posts screens.
89
  *
@@ -92,9 +116,9 @@ class PostSettings {
92
  * @return void
93
  */
94
  public function addPostSettingsMetabox() {
95
- $options = aioseo()->options->noConflict();
96
- $screen = get_current_screen();
97
- $postType = $screen->post_type;
98
 
99
  $pageAnalysisSettingsCapability = aioseo()->access->hasCapability( 'aioseo_page_analysis' );
100
  $generalSettingsCapability = aioseo()->access->hasCapability( 'aioseo_page_general_settings' );
@@ -103,8 +127,8 @@ class PostSettings {
103
  $advancedSettingsCapability = aioseo()->access->hasCapability( 'aioseo_page_advanced_settings' );
104
 
105
  if (
106
- $options->searchAppearance->dynamic->postTypes->has( $postType ) &&
107
- $options->searchAppearance->dynamic->postTypes->$postType->advanced->showMetaBox &&
108
  ! (
109
  empty( $pageAnalysisSettingsCapability ) &&
110
  empty( $generalSettingsCapability ) &&
@@ -195,6 +219,12 @@ class PostSettings {
195
 
196
  $currentPost = json_decode( stripslashes( $_POST['aioseo-post-settings'] ), true ); // phpcs:ignore HM.Security.ValidatedSanitizedInput
197
 
 
 
 
 
 
 
198
  Models\Post::savePost( $postId, $currentPost );
199
 
200
  }
71
  aioseo()->helpers->getVueData( $page )
72
  );
73
 
74
+ if ( 'post' === $page ) {
75
+ $this->enqueuePublishPanelAssets();
76
+ }
77
+
78
  $rtl = is_rtl() ? '.rtl' : '';
79
  aioseo()->helpers->enqueueStyle(
80
  'aioseo-post-settings-metabox',
88
  }
89
  }
90
 
91
+ /**
92
+ * Enqueues the JS/CSS for the Block Editor integrations.
93
+ *
94
+ * @since 4.1.4
95
+ *
96
+ * @return void
97
+ */
98
+ private function enqueuePublishPanelAssets() {
99
+ aioseo()->helpers->enqueueScript(
100
+ 'aioseo-publish-panel',
101
+ 'js/publish-panel.js'
102
+ );
103
+
104
+ $rtl = is_rtl() ? '.rtl' : '';
105
+ aioseo()->helpers->enqueueStyle(
106
+ 'aioseo-publish-panel',
107
+ "css/publish-panel$rtl.css"
108
+ );
109
+ }
110
+
111
  /**
112
  * Adds a meta box to page/posts screens.
113
  *
116
  * @return void
117
  */
118
  public function addPostSettingsMetabox() {
119
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
120
+ $screen = get_current_screen();
121
+ $postType = $screen->post_type;
122
 
123
  $pageAnalysisSettingsCapability = aioseo()->access->hasCapability( 'aioseo_page_analysis' );
124
  $generalSettingsCapability = aioseo()->access->hasCapability( 'aioseo_page_general_settings' );
127
  $advancedSettingsCapability = aioseo()->access->hasCapability( 'aioseo_page_advanced_settings' );
128
 
129
  if (
130
+ $dynamicOptions->searchAppearance->postTypes->has( $postType ) &&
131
+ $dynamicOptions->searchAppearance->postTypes->$postType->advanced->showMetaBox &&
132
  ! (
133
  empty( $pageAnalysisSettingsCapability ) &&
134
  empty( $generalSettingsCapability ) &&
219
 
220
  $currentPost = json_decode( stripslashes( $_POST['aioseo-post-settings'] ), true ); // phpcs:ignore HM.Security.ValidatedSanitizedInput
221
 
222
+ // If there is no data, there likely was an error, e.g. if the hidden field wasn't populated on load and the user saved the post without making changes in the metabox - #2254
223
+ // In that case we should return to prevent a complete reset of the data.
224
+ if ( empty( $currentPost ) ) {
225
+ return;
226
+ }
227
+
228
  Models\Post::savePost( $postId, $currentPost );
229
 
230
  }
app/Common/Admin/SiteHealth.php CHANGED
@@ -335,9 +335,9 @@ class SiteHealth {
335
 
336
  foreach ( aioseo()->helpers->getPublicPostTypes() as $postType ) {
337
  if (
338
- aioseo()->options->searchAppearance->dynamic->postTypes->has( $postType['name'] ) &&
339
- ! aioseo()->options->searchAppearance->dynamic->postTypes->{ $postType['name'] }->advanced->robotsMeta->default &&
340
- aioseo()->options->searchAppearance->dynamic->postTypes->{ $postType['name'] }->advanced->robotsMeta->noindex
341
  ) {
342
  $noindexed[] = $postType['label'] . ' (' . $postType['name'] . ')';
343
  }
@@ -345,9 +345,9 @@ class SiteHealth {
345
 
346
  foreach ( aioseo()->helpers->getPublicTaxonomies() as $taxonomy ) {
347
  if (
348
- aioseo()->options->searchAppearance->dynamic->taxonomies->has( $taxonomy['name'] ) &&
349
- ! aioseo()->options->searchAppearance->dynamic->taxonomies->{ $taxonomy['name'] }->advanced->robotsMeta->default &&
350
- aioseo()->options->searchAppearance->dynamic->taxonomies->{ $taxonomy['name'] }->advanced->robotsMeta->noindex
351
  ) {
352
  $noindexed[] = $taxonomy['label'] . ' (' . $taxonomy['name'] . ')';
353
  }
@@ -401,9 +401,9 @@ class SiteHealth {
401
 
402
  foreach ( aioseo()->helpers->getPublicPostTypes() as $postType ) {
403
  if (
404
- aioseo()->options->searchAppearance->dynamic->postTypes->has( $postType['name'] ) &&
405
- ! aioseo()->options->searchAppearance->dynamic->postTypes->{ $postType['name'] }->advanced->robotsMeta->default &&
406
- aioseo()->options->searchAppearance->dynamic->postTypes->{ $postType['name'] }->advanced->robotsMeta->nofollow
407
  ) {
408
  $nofollowed[] = $postType['label'] . ' (' . $postType['name'] . ')';
409
  }
@@ -411,9 +411,9 @@ class SiteHealth {
411
 
412
  foreach ( aioseo()->helpers->getPublicTaxonomies() as $taxonomy ) {
413
  if (
414
- aioseo()->options->searchAppearance->dynamic->taxonomies->has( $taxonomy['name'] ) &&
415
- ! aioseo()->options->searchAppearance->dynamic->taxonomies->{ $taxonomy['name'] }->advanced->robotsMeta->default &&
416
- aioseo()->options->searchAppearance->dynamic->taxonomies->{ $taxonomy['name'] }->advanced->robotsMeta->nofollow
417
  ) {
418
  $nofollowed[] = $taxonomy['label'] . ' (' . $taxonomy['name'] . ')';
419
  }
335
 
336
  foreach ( aioseo()->helpers->getPublicPostTypes() as $postType ) {
337
  if (
338
+ aioseo()->dynamicOptions->searchAppearance->postTypes->has( $postType['name'] ) &&
339
+ ! aioseo()->dynamicOptions->searchAppearance->postTypes->{ $postType['name'] }->advanced->robotsMeta->default &&
340
+ aioseo()->dynamicOptions->searchAppearance->postTypes->{ $postType['name'] }->advanced->robotsMeta->noindex
341
  ) {
342
  $noindexed[] = $postType['label'] . ' (' . $postType['name'] . ')';
343
  }
345
 
346
  foreach ( aioseo()->helpers->getPublicTaxonomies() as $taxonomy ) {
347
  if (
348
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->has( $taxonomy['name'] ) &&
349
+ ! aioseo()->dynamicOptions->searchAppearance->taxonomies->{ $taxonomy['name'] }->advanced->robotsMeta->default &&
350
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->{ $taxonomy['name'] }->advanced->robotsMeta->noindex
351
  ) {
352
  $noindexed[] = $taxonomy['label'] . ' (' . $taxonomy['name'] . ')';
353
  }
401
 
402
  foreach ( aioseo()->helpers->getPublicPostTypes() as $postType ) {
403
  if (
404
+ aioseo()->dynamicOptions->searchAppearance->postTypes->has( $postType['name'] ) &&
405
+ ! aioseo()->dynamicOptions->searchAppearance->postTypes->{ $postType['name'] }->advanced->robotsMeta->default &&
406
+ aioseo()->dynamicOptions->searchAppearance->postTypes->{ $postType['name'] }->advanced->robotsMeta->nofollow
407
  ) {
408
  $nofollowed[] = $postType['label'] . ' (' . $postType['name'] . ')';
409
  }
411
 
412
  foreach ( aioseo()->helpers->getPublicTaxonomies() as $taxonomy ) {
413
  if (
414
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->has( $taxonomy['name'] ) &&
415
+ ! aioseo()->dynamicOptions->searchAppearance->taxonomies->{ $taxonomy['name'] }->advanced->robotsMeta->default &&
416
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->{ $taxonomy['name'] }->advanced->robotsMeta->nofollow
417
  ) {
418
  $nofollowed[] = $taxonomy['label'] . ' (' . $taxonomy['name'] . ')';
419
  }
app/Common/Api/Migration.php CHANGED
@@ -39,13 +39,13 @@ class Migration {
39
  }
40
 
41
  $objectName = $match[1];
42
- if ( in_array( $objectName, $postTypes, true ) && aioseo()->options->searchAppearance->dynamic->postTypes->has( $objectName ) ) {
43
- aioseo()->options->searchAppearance->dynamic->postTypes->$objectName->title = '#post_title #separator_sa #site_title';
44
  continue;
45
  }
46
 
47
- if ( in_array( $objectName, $taxonomies, true ) && aioseo()->options->searchAppearance->dynamic->taxonomies->has( $objectName ) ) {
48
- aioseo()->options->searchAppearance->dynamic->taxonomies->$objectName->title = '#taxonomy_title #separator_sa #site_title';
49
  }
50
  }
51
 
39
  }
40
 
41
  $objectName = $match[1];
42
+ if ( in_array( $objectName, $postTypes, true ) && aioseo()->dynamicOptions->searchAppearance->postTypes->has( $objectName ) ) {
43
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$objectName->title = '#post_title #separator_sa #site_title';
44
  continue;
45
  }
46
 
47
+ if ( in_array( $objectName, $taxonomies, true ) && aioseo()->dynamicOptions->searchAppearance->taxonomies->has( $objectName ) ) {
48
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->$objectName->title = '#taxonomy_title #separator_sa #site_title';
49
  }
50
  }
51
 
app/Common/Api/PostsTerms.php CHANGED
@@ -40,14 +40,14 @@ class PostsTerms {
40
 
41
  $searchQuery = esc_sql( aioseo()->db->db->esc_like( $body['query'] ) );
42
 
43
- $objects = [];
44
- $options = aioseo()->options->noConflict();
45
  if ( 'posts' === $body['type'] ) {
46
 
47
  $postTypes = aioseo()->helpers->getPublicPostTypes( true );
48
  foreach ( $postTypes as $postType ) {
49
  // Check if post type isn't noindexed.
50
- if ( $options->searchAppearance->dynamic->postTypes->has( $postType ) && ! $options->searchAppearance->dynamic->postTypes->$postType->show ) {
51
  $postTypes = aioseo()->helpers->unsetValue( $postTypes, $postType );
52
  }
53
  }
@@ -68,7 +68,7 @@ class PostsTerms {
68
  $taxonomies = aioseo()->helpers->getPublicTaxonomies( true );
69
  foreach ( $taxonomies as $taxonomy ) {
70
  // Check if taxonomy isn't noindexed.
71
- if ( $options->searchAppearance->dynamic->taxonomies->has( $taxonomy ) && ! $options->searchAppearance->dynamic->taxonomies->$taxonomy->show ) {
72
  $taxonomies = aioseo()->helpers->unsetValue( $taxonomies, $taxonomy );
73
  }
74
  }
@@ -145,12 +145,35 @@ class PostsTerms {
145
  'postData' => [
146
  'parsedTitle' => aioseo()->tags->replaceTags( $thePost->title, $args['postId'] ),
147
  'parsedDescription' => aioseo()->tags->replaceTags( $thePost->description, $args['postId'] ),
148
- 'content' => aioseo()->helpers->doShortcodes( aioseo()->helpers->getAnalysisContent( $args['postId'] ) ),
149
  'slug' => get_post_field( 'post_name', $args['postId'] )
150
  ]
151
  ], 200 );
152
  }
153
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154
  /**
155
  * Update post settings.
156
  *
@@ -181,12 +204,13 @@ class PostsTerms {
181
  $body['twitter_title'] = ! empty( $body['twitter_title'] ) ? sanitize_text_field( $body['twitter_title'] ) : null;
182
  $body['twitter_description'] = ! empty( $body['twitter_description'] ) ? sanitize_text_field( $body['twitter_description'] ) : null;
183
 
184
- $saveStatus = Models\Post::savePost( $postId, $body );
 
185
 
186
- if ( ! empty( $saveStatus ) ) {
187
  return new \WP_REST_Response( [
188
  'success' => false,
189
- 'message' => 'Failed update query: ' . $saveStatus
190
  ], 401 );
191
  }
192
 
40
 
41
  $searchQuery = esc_sql( aioseo()->db->db->esc_like( $body['query'] ) );
42
 
43
+ $objects = [];
44
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
45
  if ( 'posts' === $body['type'] ) {
46
 
47
  $postTypes = aioseo()->helpers->getPublicPostTypes( true );
48
  foreach ( $postTypes as $postType ) {
49
  // Check if post type isn't noindexed.
50
+ if ( $dynamicOptions->searchAppearance->postTypes->has( $postType ) && ! $dynamicOptions->searchAppearance->postTypes->$postType->show ) {
51
  $postTypes = aioseo()->helpers->unsetValue( $postTypes, $postType );
52
  }
53
  }
68
  $taxonomies = aioseo()->helpers->getPublicTaxonomies( true );
69
  foreach ( $taxonomies as $taxonomy ) {
70
  // Check if taxonomy isn't noindexed.
71
+ if ( $dynamicOptions->searchAppearance->taxonomies->has( $taxonomy ) && ! $dynamicOptions->searchAppearance->taxonomies->$taxonomy->show ) {
72
  $taxonomies = aioseo()->helpers->unsetValue( $taxonomies, $taxonomy );
73
  }
74
  }
145
  'postData' => [
146
  'parsedTitle' => aioseo()->tags->replaceTags( $thePost->title, $args['postId'] ),
147
  'parsedDescription' => aioseo()->tags->replaceTags( $thePost->description, $args['postId'] ),
148
+ 'content' => aioseo()->helpers->doShortcodes( self::getAnalysisContent( $args['postId'] ) ),
149
  'slug' => get_post_field( 'post_name', $args['postId'] )
150
  ]
151
  ], 200 );
152
  }
153
 
154
+ /**
155
+ * Returns the posts custom fields.
156
+ *
157
+ * @since 4.0.6
158
+ *
159
+ * @param WP_Post|int $post The post.
160
+ * @return string The custom field content.
161
+ */
162
+ private static function getAnalysisContent( $post = null ) {
163
+ $post = ( $post && is_object( $post ) ) ? $post : aioseo()->helpers->getPost( $post );
164
+ $customFieldKeys = aioseo()->dynamicOptions->searchAppearance->postTypes->{$post->post_type}->customFields;
165
+
166
+ if ( empty( $customFieldKeys ) ) {
167
+ return get_post_field( 'post_content', $post->ID );
168
+ }
169
+
170
+ $customFieldKeys = explode( ' ', sanitize_text_field( $customFieldKeys ) );
171
+ $customFieldContent = aioseo()->helpers->getCustomFieldsContent( $post->ID, $customFieldKeys );
172
+ $analysisContent = $post->post_content . apply_filters( 'aioseo_analysis_content', $customFieldContent );
173
+
174
+ return sanitize_post_field( 'post_content', $analysisContent, $post->ID, 'display' );
175
+ }
176
+
177
  /**
178
  * Update post settings.
179
  *
204
  $body['twitter_title'] = ! empty( $body['twitter_title'] ) ? sanitize_text_field( $body['twitter_title'] ) : null;
205
  $body['twitter_description'] = ! empty( $body['twitter_description'] ) ? sanitize_text_field( $body['twitter_description'] ) : null;
206
 
207
+ // @TODO: Refactor this as it's not the best way to look for errors.
208
+ $error = Models\Post::savePost( $postId, $body );
209
 
210
+ if ( ! empty( $error ) ) {
211
  return new \WP_REST_Response( [
212
  'success' => false,
213
+ 'message' => 'Failed update query: ' . $error
214
  ], 401 );
215
  }
216
 
app/Common/Api/Settings.php CHANGED
@@ -116,9 +116,10 @@ class Settings {
116
  * @return \WP_REST_Response The response.
117
  */
118
  public static function saveChanges( $request ) {
119
- $body = $request->get_json_params();
120
- $options = ! empty( $body['options'] ) ? $body['options'] : [];
121
- $network = ! empty( $body['network'] ) ? (bool) $body['network'] : false;
 
122
 
123
  // If this is the network admin, reset the options.
124
  if ( $network ) {
@@ -126,6 +127,7 @@ class Settings {
126
  }
127
 
128
  aioseo()->options->sanitizeAndSave( $options );
 
129
 
130
  // Re-initialize notices.
131
  aioseo()->notices->init();
@@ -152,9 +154,9 @@ class Settings {
152
  $notAllowedOptions = aioseo()->access->getNotAllowedOptions();
153
 
154
  foreach ( $settings as $setting ) {
155
- $option = in_array( $setting, [ 'robots', 'blocker' ], true ) ? 'tools' : aioseo()->helpers->dashesToCamelCase( $setting );
156
 
157
- if ( in_array( $option, $notAllowedOptions, true ) ) {
158
  continue;
159
  }
160
 
@@ -166,8 +168,11 @@ class Settings {
166
  aioseo()->options->deprecated->tools->blocker->reset();
167
  break;
168
  default:
169
- if ( aioseo()->options->has( $option ) ) {
170
- aioseo()->options->$option->reset();
 
 
 
171
  }
172
  }
173
 
@@ -177,8 +182,7 @@ class Settings {
177
  }
178
 
179
  return new \WP_REST_Response( [
180
- 'success' => true,
181
- 'options' => aioseo()->options->all()
182
  ], 200 );
183
  }
184
 
@@ -211,6 +215,32 @@ class Settings {
211
  $contents['settings']['deprecated'] = array_diff_key( $contents['settings']['deprecated'], $notAllowedOptions );
212
  }
213
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
214
  aioseo()->options->sanitizeAndSave( $contents['settings'] );
215
  }
216
 
@@ -266,15 +296,34 @@ class Settings {
266
 
267
  if ( ! empty( $settings ) ) {
268
  $options = aioseo()->options->noConflict();
 
269
  $notAllowedOptions = aioseo()->access->getNotAllowedOptions();
270
  foreach ( $settings as $setting ) {
271
- if ( ! in_array( $setting, $notAllowedOptions, true ) && $options->has( $setting ) ) {
272
- $allSettings['settings'][ $setting ] = $options->$setting->all();
273
 
274
- // It there is a related deprecated $setting, include it.
275
- if ( $options->deprecated->has( $setting ) ) {
276
- $allSettings['settings']['deprecated'][ $setting ] = $options->deprecated->$setting->all();
277
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
278
  }
279
  }
280
  }
116
  * @return \WP_REST_Response The response.
117
  */
118
  public static function saveChanges( $request ) {
119
+ $body = $request->get_json_params();
120
+ $options = ! empty( $body['options'] ) ? $body['options'] : [];
121
+ $dynamicOptions = ! empty( $body['dynamicOptions'] ) ? $body['dynamicOptions'] : [];
122
+ $network = ! empty( $body['network'] ) ? (bool) $body['network'] : false;
123
 
124
  // If this is the network admin, reset the options.
125
  if ( $network ) {
127
  }
128
 
129
  aioseo()->options->sanitizeAndSave( $options );
130
+ aioseo()->dynamicOptions->sanitizeAndSave( $dynamicOptions );
131
 
132
  // Re-initialize notices.
133
  aioseo()->notices->init();
154
  $notAllowedOptions = aioseo()->access->getNotAllowedOptions();
155
 
156
  foreach ( $settings as $setting ) {
157
+ $optionAccess = in_array( $setting, [ 'robots', 'blocker' ], true ) ? 'tools' : $setting;
158
 
159
+ if ( in_array( $optionAccess, $notAllowedOptions, true ) ) {
160
  continue;
161
  }
162
 
168
  aioseo()->options->deprecated->tools->blocker->reset();
169
  break;
170
  default:
171
+ if ( aioseo()->options->has( $setting ) ) {
172
+ aioseo()->options->$setting->reset();
173
+ }
174
+ if ( aioseo()->dynamicOptions->has( $setting ) ) {
175
+ aioseo()->dynamicOptions->$setting->reset();
176
  }
177
  }
178
 
182
  }
183
 
184
  return new \WP_REST_Response( [
185
+ 'success' => true
 
186
  ], 200 );
187
  }
188
 
215
  $contents['settings']['deprecated'] = array_diff_key( $contents['settings']['deprecated'], $notAllowedOptions );
216
  }
217
 
218
+ // Remove any dynamic options and save them separately since this has been refactored.
219
+ $commonDynamic = [
220
+ 'sitemap',
221
+ 'searchAppearance',
222
+ 'breadcrumbs',
223
+ 'accessControl'
224
+ ];
225
+
226
+ foreach ( $commonDynamic as $cd ) {
227
+ if ( ! empty( $contents['settings'][ $cd ]['dynamic'] ) ) {
228
+ $contents['settings']['dynamic'][ $cd ] = $contents['settings'][ $cd ]['dynamic'];
229
+ unset( $contents['settings'][ $cd ]['dynamic'] );
230
+ }
231
+ }
232
+
233
+ // These options have a very different structure so we'll do them separately.
234
+ if ( ! empty( $contents['settings']['social']['facebook']['general']['dynamic'] ) ) {
235
+ $contents['settings']['dynamic']['social']['facebook']['general'] = $contents['settings']['social']['facebook']['general']['dynamic'];
236
+ unset( $contents['settings']['social']['facebook']['general']['dynamic'] );
237
+ }
238
+
239
+ if ( ! empty( $contents['settings']['dynamic'] ) ) {
240
+ aioseo()->dynamicOptions->sanitizeAndSave( $contents['settings']['dynamic'] );
241
+ unset( $contents['settings']['dynamic'] );
242
+ }
243
+
244
  aioseo()->options->sanitizeAndSave( $contents['settings'] );
245
  }
246
 
296
 
297
  if ( ! empty( $settings ) ) {
298
  $options = aioseo()->options->noConflict();
299
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
300
  $notAllowedOptions = aioseo()->access->getNotAllowedOptions();
301
  foreach ( $settings as $setting ) {
302
+ $optionAccess = in_array( $setting, [ 'robots', 'blocker' ], true ) ? 'tools' : $setting;
 
303
 
304
+ if ( in_array( $optionAccess, $notAllowedOptions, true ) ) {
305
+ continue;
306
+ }
307
+
308
+ switch ( $setting ) {
309
+ case 'robots':
310
+ $allSettings['settings']['tools']['robots'] = $options->tools->robots->all();
311
+ break;
312
+ default:
313
+ if ( $options->has( $setting ) ) {
314
+ $allSettings['settings'][ $setting ] = $options->$setting->all();
315
+ }
316
+
317
+ // If there are related dynamic settings, let's include them.
318
+ if ( $dynamicOptions->has( $setting ) ) {
319
+ $allSettings['settings']['dynamic'][ $setting ] = $dynamicOptions->$setting->all();
320
+ }
321
+
322
+ // It there is a related deprecated $setting, include it.
323
+ if ( $options->deprecated->has( $setting ) ) {
324
+ $allSettings['settings']['deprecated'][ $setting ] = $options->deprecated->$setting->all();
325
+ }
326
+ break;
327
  }
328
  }
329
  }
app/Common/Api/Sitemaps.php CHANGED
@@ -137,11 +137,11 @@ class Sitemaps {
137
  ], 400 );
138
  }
139
 
140
- $path = trim( $pageUrl['path'], '/' );
141
- $page = get_page_by_path( $path, OBJECT, aioseo()->helpers->getPublicPostTypes( true ) );
142
 
143
  return new \WP_REST_Response( [
144
- 'exists' => is_object( $page )
145
  ], 200 );
146
  }
147
  }
137
  ], 400 );
138
  }
139
 
140
+ $path = trim( $pageUrl['path'], '/' );
141
+ $exists = aioseo()->helpers->pathExists( $path );
142
 
143
  return new \WP_REST_Response( [
144
+ 'exists' => $exists
145
  ], 200 );
146
  }
147
  }
app/Common/Api/Tools.php CHANGED
@@ -210,6 +210,14 @@ class Tools {
210
  $body = $request->get_json_params();
211
  $htaccess = ! empty( $body['htaccess'] ) ? sanitize_textarea_field( $body['htaccess'] ) : '';
212
 
 
 
 
 
 
 
 
 
213
  if ( ! aioseo()->htaccess->saveContents( $htaccess ) ) {
214
  return new \WP_REST_Response( [
215
  'success' => false,
210
  $body = $request->get_json_params();
211
  $htaccess = ! empty( $body['htaccess'] ) ? sanitize_textarea_field( $body['htaccess'] ) : '';
212
 
213
+ if ( empty( $htaccess ) ) {
214
+ return new \WP_REST_Response( [
215
+ 'success' => false,
216
+ 'message' => __( '.htaccess file is empty.', 'all-in-one-seo-pack' )
217
+ ], 400 );
218
+ }
219
+
220
+ $htaccess = aioseo()->helpers->decodeHtmlEntities( $htaccess );
221
  if ( ! aioseo()->htaccess->saveContents( $htaccess ) ) {
222
  return new \WP_REST_Response( [
223
  'success' => false,
app/Common/Api/Wizard.php CHANGED
@@ -23,9 +23,11 @@ class Wizard {
23
  * @return \WP_REST_Response The response.
24
  */
25
  public static function saveWizard( $request ) {
26
- $body = $request->get_json_params();
27
- $section = ! empty( $body['section'] ) ? sanitize_text_field( $body['section'] ) : null;
28
- $wizard = ! empty( $body['wizard'] ) ? $body['wizard'] : null;
 
 
29
 
30
  aioseo()->internalOptions->internal->wizard = wp_json_encode( $wizard );
31
 
@@ -77,21 +79,31 @@ class Wizard {
77
  // If the home page is a static page, let's find and set that,
78
  // otherwise set our home page settings.
79
  $staticHomePage = 'page' === get_option( 'show_on_front' ) ? get_post( get_option( 'page_on_front' ) ) : null;
80
- if ( ! empty( $category['siteTitle'] ) ) {
81
- if ( $staticHomePage ) {
82
- $page = Models\Post::getPost( $staticHomePage->ID );
 
 
83
  $page->title = $category['siteTitle'];
84
- } else {
85
- aioseo()->options->searchAppearance->global->siteTitle = $category['siteTitle'];
86
  }
87
- }
88
 
89
- if ( ! empty( $category['metaDescription'] ) ) {
90
- if ( $staticHomePage ) {
91
- $page = Models\Post::getPost( $staticHomePage->ID );
92
  $page->description = $category['metaDescription'];
93
- } else {
94
- aioseo()->options->searchAppearance->global->metaDescription = $category['metaDescription'];
 
 
 
 
 
 
 
 
 
 
 
 
95
  }
96
  }
97
  }
@@ -100,44 +112,44 @@ class Wizard {
100
  if ( 'additionalInformation' === $section && ! empty( $wizard['additionalInformation'] ) ) {
101
  $additionalInformation = $wizard['additionalInformation'];
102
  if ( ! empty( $additionalInformation['siteRepresents'] ) ) {
103
- aioseo()->options->searchAppearance->global->schema->siteRepresents = $additionalInformation['siteRepresents'];
104
  }
105
 
106
  if ( ! empty( $additionalInformation['person'] ) ) {
107
- aioseo()->options->searchAppearance->global->schema->person = $additionalInformation['person'];
108
  }
109
 
110
  if ( ! empty( $additionalInformation['organizationName'] ) ) {
111
- aioseo()->options->searchAppearance->global->schema->organizationName = $additionalInformation['organizationName'];
112
  }
113
 
114
  if ( ! empty( $additionalInformation['phone'] ) ) {
115
- aioseo()->options->searchAppearance->global->schema->phone = $additionalInformation['phone'];
116
  }
117
 
118
  if ( ! empty( $additionalInformation['organizationLogo'] ) ) {
119
- aioseo()->options->searchAppearance->global->schema->organizationLogo = $additionalInformation['organizationLogo'];
120
  }
121
 
122
  if ( ! empty( $additionalInformation['personName'] ) ) {
123
- aioseo()->options->searchAppearance->global->schema->personName = $additionalInformation['personName'];
124
  }
125
 
126
  if ( ! empty( $additionalInformation['personLogo'] ) ) {
127
- aioseo()->options->searchAppearance->global->schema->personLogo = $additionalInformation['personLogo'];
128
  }
129
 
130
  if ( ! empty( $additionalInformation['contactType'] ) ) {
131
- aioseo()->options->searchAppearance->global->schema->contactType = $additionalInformation['contactType'];
132
  }
133
 
134
  if ( ! empty( $additionalInformation['contactManual'] ) ) {
135
- aioseo()->options->searchAppearance->global->schema->contactManual = $additionalInformation['contactManual'];
136
  }
137
 
138
  if ( ! empty( $additionalInformation['socialShareImage'] ) ) {
139
- aioseo()->options->social->facebook->general->defaultImagePosts = $additionalInformation['socialShareImage'];
140
- aioseo()->options->social->twitter->general->defaultImagePosts = $additionalInformation['socialShareImage'];
141
  }
142
 
143
  if ( ! empty( $additionalInformation['social'] ) && ! empty( $additionalInformation['social']['profiles'] ) ) {
@@ -145,66 +157,66 @@ class Wizard {
145
  if ( ! empty( $profiles['sameUsername'] ) ) {
146
  $sameUsername = $profiles['sameUsername'];
147
  if ( isset( $sameUsername['enable'] ) ) {
148
- aioseo()->options->social->profiles->sameUsername->enable = $sameUsername['enable'];
149
  }
150
 
151
  if ( ! empty( $sameUsername['username'] ) ) {
152
- aioseo()->options->social->profiles->sameUsername->username = $sameUsername['username'];
153
  }
154
 
155
  if ( ! empty( $sameUsername['included'] ) ) {
156
- aioseo()->options->social->profiles->sameUsername->included = $sameUsername['included'];
157
  }
158
  }
159
 
160
  if ( ! empty( $profiles['urls'] ) ) {
161
  $urls = $profiles['urls'];
162
  if ( ! empty( $urls['facebookPageUrl'] ) ) {
163
- aioseo()->options->social->profiles->urls->facebookPageUrl = $urls['facebookPageUrl'];
164
  }
165
 
166
  if ( ! empty( $urls['twitterUrl'] ) ) {
167
- aioseo()->options->social->profiles->urls->twitterUrl = $urls['twitterUrl'];
168
  }
169
 
170
  if ( ! empty( $urls['instagramUrl'] ) ) {
171
- aioseo()->options->social->profiles->urls->instagramUrl = $urls['instagramUrl'];
172
  }
173
 
174
  if ( ! empty( $urls['pinterestUrl'] ) ) {
175
- aioseo()->options->social->profiles->urls->pinterestUrl = $urls['pinterestUrl'];
176
  }
177
 
178
  if ( ! empty( $urls['youtubeUrl'] ) ) {
179
- aioseo()->options->social->profiles->urls->youtubeUrl = $urls['youtubeUrl'];
180
  }
181
 
182
  if ( ! empty( $urls['linkedinUrl'] ) ) {
183
- aioseo()->options->social->profiles->urls->linkedinUrl = $urls['linkedinUrl'];
184
  }
185
 
186
  if ( ! empty( $urls['tumblrUrl'] ) ) {
187
- aioseo()->options->social->profiles->urls->tumblrUrl = $urls['tumblrUrl'];
188
  }
189
 
190
  if ( ! empty( $urls['yelpPageUrl'] ) ) {
191
- aioseo()->options->social->profiles->urls->yelpPageUrl = $urls['yelpPageUrl'];
192
  }
193
 
194
  if ( ! empty( $urls['soundCloudUrl'] ) ) {
195
- aioseo()->options->social->profiles->urls->soundCloudUrl = $urls['soundCloudUrl'];
196
  }
197
 
198
  if ( ! empty( $urls['wikipediaUrl'] ) ) {
199
- aioseo()->options->social->profiles->urls->wikipediaUrl = $urls['wikipediaUrl'];
200
  }
201
 
202
  if ( ! empty( $urls['myspaceUrl'] ) ) {
203
- aioseo()->options->social->profiles->urls->myspaceUrl = $urls['myspaceUrl'];
204
  }
205
 
206
  if ( ! empty( $urls['googlePlacesUrl'] ) ) {
207
- aioseo()->options->social->profiles->urls->googlePlacesUrl = $urls['googlePlacesUrl'];
208
  }
209
  }
210
  }
@@ -279,55 +291,47 @@ class Wizard {
279
  ) {
280
  // Robots.
281
  if ( ! empty( $searchAppearance['postTypes']['postTypes']['all'] ) ) {
282
- $options = aioseo()->options->noConflict();
283
  foreach ( aioseo()->helpers->getPublicPostTypes( true ) as $postType ) {
284
- if ( $options->searchAppearance->dynamic->postTypes->has( $postType ) ) {
285
- $options->searchAppearance->dynamic->postTypes->$postType->show = true;
286
- $options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->default = true;
287
- $options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->noindex = false;
288
  }
289
  }
290
-
291
- aioseo()->options->refresh();
292
  } else {
293
- $options = aioseo()->options->noConflict();
294
  foreach ( aioseo()->helpers->getPublicPostTypes( true ) as $postType ) {
295
- if ( $options->searchAppearance->dynamic->postTypes->has( $postType ) ) {
296
  if ( in_array( $postType, (array) $searchAppearance['postTypes']['postTypes']['included'], true ) ) {
297
- $options->searchAppearance->dynamic->postTypes->$postType->show = true;
298
- $options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->default = true;
299
- $options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->noindex = false;
300
  } else {
301
- $options->searchAppearance->dynamic->postTypes->$postType->show = false;
302
- $options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->default = false;
303
- $options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->noindex = true;
304
  }
305
  }
306
  }
307
-
308
- aioseo()->options->refresh();
309
  }
310
 
311
  // Sitemaps.
312
  if ( isset( $searchAppearance['postTypes']['postTypes']['all'] ) ) {
313
- aioseo()->options->sitemap->general->postTypes->all = $searchAppearance['postTypes']['postTypes']['all'];
314
  }
315
 
316
  if ( isset( $searchAppearance['postTypes']['postTypes']['included'] ) ) {
317
- aioseo()->options->sitemap->general->postTypes->included = $searchAppearance['postTypes']['postTypes']['included'];
318
  }
319
  }
320
 
321
  if ( isset( $searchAppearance['multipleAuthors'] ) ) {
322
- aioseo()->options->searchAppearance->archives->author->show = $searchAppearance['multipleAuthors'];
323
- aioseo()->options->searchAppearance->archives->author->advanced->robotsMeta->default = $searchAppearance['multipleAuthors'];
324
- aioseo()->options->searchAppearance->archives->author->advanced->robotsMeta->noindex = ! $searchAppearance['multipleAuthors'];
325
  }
326
 
327
- $options = aioseo()->options->noConflict();
328
- if ( isset( $searchAppearance['redirectAttachmentPages'] ) && $options->searchAppearance->dynamic->postTypes->has( 'attachment' ) ) {
329
- $options->searchAppearance->dynamic->postTypes->attachment->redirectAttachmentUrls = $searchAppearance['redirectAttachmentPages'] ? 'attachment' : 'disabled';
330
- aioseo()->options->refresh();
331
  }
332
  }
333
 
23
  * @return \WP_REST_Response The response.
24
  */
25
  public static function saveWizard( $request ) {
26
+ $body = $request->get_json_params();
27
+ $section = ! empty( $body['section'] ) ? sanitize_text_field( $body['section'] ) : null;
28
+ $wizard = ! empty( $body['wizard'] ) ? $body['wizard'] : null;
29
+ $options = aioseo()->options->noConflict();
30
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
31
 
32
  aioseo()->internalOptions->internal->wizard = wp_json_encode( $wizard );
33
 
79
  // If the home page is a static page, let's find and set that,
80
  // otherwise set our home page settings.
81
  $staticHomePage = 'page' === get_option( 'show_on_front' ) ? get_post( get_option( 'page_on_front' ) ) : null;
82
+ if ( ! empty( $staticHomePage ) ) {
83
+ $update = false;
84
+ $page = Models\Post::getPost( $staticHomePage->ID );
85
+ if ( ! empty( $category['siteTitle'] ) ) {
86
+ $update = true;
87
  $page->title = $category['siteTitle'];
 
 
88
  }
 
89
 
90
+ if ( ! empty( $category['metaDescription'] ) ) {
91
+ $update = true;
 
92
  $page->description = $category['metaDescription'];
93
+ }
94
+
95
+ if ( $update ) {
96
+ $page->save();
97
+ }
98
+ }
99
+
100
+ if ( empty( $staticHomePage ) ) {
101
+ if ( ! empty( $category['siteTitle'] ) ) {
102
+ $options->searchAppearance->global->siteTitle = $category['siteTitle'];
103
+ }
104
+
105
+ if ( ! empty( $category['metaDescription'] ) ) {
106
+ $options->searchAppearance->global->metaDescription = $category['metaDescription'];
107
  }
108
  }
109
  }
112
  if ( 'additionalInformation' === $section && ! empty( $wizard['additionalInformation'] ) ) {
113
  $additionalInformation = $wizard['additionalInformation'];
114
  if ( ! empty( $additionalInformation['siteRepresents'] ) ) {
115
+ $options->searchAppearance->global->schema->siteRepresents = $additionalInformation['siteRepresents'];
116
  }
117
 
118
  if ( ! empty( $additionalInformation['person'] ) ) {
119
+ $options->searchAppearance->global->schema->person = $additionalInformation['person'];
120
  }
121
 
122
  if ( ! empty( $additionalInformation['organizationName'] ) ) {
123
+ $options->searchAppearance->global->schema->organizationName = $additionalInformation['organizationName'];
124
  }
125
 
126
  if ( ! empty( $additionalInformation['phone'] ) ) {
127
+ $options->searchAppearance->global->schema->phone = $additionalInformation['phone'];
128
  }
129
 
130
  if ( ! empty( $additionalInformation['organizationLogo'] ) ) {
131
+ $options->searchAppearance->global->schema->organizationLogo = $additionalInformation['organizationLogo'];
132
  }
133
 
134
  if ( ! empty( $additionalInformation['personName'] ) ) {
135
+ $options->searchAppearance->global->schema->personName = $additionalInformation['personName'];
136
  }
137
 
138
  if ( ! empty( $additionalInformation['personLogo'] ) ) {
139
+ $options->searchAppearance->global->schema->personLogo = $additionalInformation['personLogo'];
140
  }
141
 
142
  if ( ! empty( $additionalInformation['contactType'] ) ) {
143
+ $options->searchAppearance->global->schema->contactType = $additionalInformation['contactType'];
144
  }
145
 
146
  if ( ! empty( $additionalInformation['contactManual'] ) ) {
147
+ $options->searchAppearance->global->schema->contactManual = $additionalInformation['contactManual'];
148
  }
149
 
150
  if ( ! empty( $additionalInformation['socialShareImage'] ) ) {
151
+ $options->social->facebook->general->defaultImagePosts = $additionalInformation['socialShareImage'];
152
+ $options->social->twitter->general->defaultImagePosts = $additionalInformation['socialShareImage'];
153
  }
154
 
155
  if ( ! empty( $additionalInformation['social'] ) && ! empty( $additionalInformation['social']['profiles'] ) ) {
157
  if ( ! empty( $profiles['sameUsername'] ) ) {
158
  $sameUsername = $profiles['sameUsername'];
159
  if ( isset( $sameUsername['enable'] ) ) {
160
+ $options->social->profiles->sameUsername->enable = $sameUsername['enable'];
161
  }
162
 
163
  if ( ! empty( $sameUsername['username'] ) ) {
164
+ $options->social->profiles->sameUsername->username = $sameUsername['username'];
165
  }
166
 
167
  if ( ! empty( $sameUsername['included'] ) ) {
168
+ $options->social->profiles->sameUsername->included = $sameUsername['included'];
169
  }
170
  }
171
 
172
  if ( ! empty( $profiles['urls'] ) ) {
173
  $urls = $profiles['urls'];
174
  if ( ! empty( $urls['facebookPageUrl'] ) ) {
175
+ $options->social->profiles->urls->facebookPageUrl = $urls['facebookPageUrl'];
176
  }
177
 
178
  if ( ! empty( $urls['twitterUrl'] ) ) {
179
+ $options->social->profiles->urls->twitterUrl = $urls['twitterUrl'];
180
  }
181
 
182
  if ( ! empty( $urls['instagramUrl'] ) ) {
183
+ $options->social->profiles->urls->instagramUrl = $urls['instagramUrl'];
184
  }
185
 
186
  if ( ! empty( $urls['pinterestUrl'] ) ) {
187
+ $options->social->profiles->urls->pinterestUrl = $urls['pinterestUrl'];
188
  }
189
 
190
  if ( ! empty( $urls['youtubeUrl'] ) ) {
191
+ $options->social->profiles->urls->youtubeUrl = $urls['youtubeUrl'];
192
  }
193
 
194
  if ( ! empty( $urls['linkedinUrl'] ) ) {
195
+ $options->social->profiles->urls->linkedinUrl = $urls['linkedinUrl'];
196
  }
197
 
198
  if ( ! empty( $urls['tumblrUrl'] ) ) {
199
+ $options->social->profiles->urls->tumblrUrl = $urls['tumblrUrl'];
200
  }
201
 
202
  if ( ! empty( $urls['yelpPageUrl'] ) ) {
203
+ $options->social->profiles->urls->yelpPageUrl = $urls['yelpPageUrl'];
204
  }
205
 
206
  if ( ! empty( $urls['soundCloudUrl'] ) ) {
207
+ $options->social->profiles->urls->soundCloudUrl = $urls['soundCloudUrl'];
208
  }
209
 
210
  if ( ! empty( $urls['wikipediaUrl'] ) ) {
211
+ $options->social->profiles->urls->wikipediaUrl = $urls['wikipediaUrl'];
212
  }
213
 
214
  if ( ! empty( $urls['myspaceUrl'] ) ) {
215
+ $options->social->profiles->urls->myspaceUrl = $urls['myspaceUrl'];
216
  }
217
 
218
  if ( ! empty( $urls['googlePlacesUrl'] ) ) {
219
+ $options->social->profiles->urls->googlePlacesUrl = $urls['googlePlacesUrl'];
220
  }
221
  }
222
  }
291
  ) {
292
  // Robots.
293
  if ( ! empty( $searchAppearance['postTypes']['postTypes']['all'] ) ) {
 
294
  foreach ( aioseo()->helpers->getPublicPostTypes( true ) as $postType ) {
295
+ if ( $dynamicOptions->searchAppearance->postTypes->has( $postType ) ) {
296
+ $dynamicOptions->searchAppearance->postTypes->$postType->show = true;
297
+ $dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->default = true;
298
+ $dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->noindex = false;
299
  }
300
  }
 
 
301
  } else {
 
302
  foreach ( aioseo()->helpers->getPublicPostTypes( true ) as $postType ) {
303
+ if ( $dynamicOptions->searchAppearance->postTypes->has( $postType ) ) {
304
  if ( in_array( $postType, (array) $searchAppearance['postTypes']['postTypes']['included'], true ) ) {
305
+ $dynamicOptions->searchAppearance->postTypes->$postType->show = true;
306
+ $dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->default = true;
307
+ $dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->noindex = false;
308
  } else {
309
+ $dynamicOptions->searchAppearance->postTypes->$postType->show = false;
310
+ $dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->default = false;
311
+ $dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->noindex = true;
312
  }
313
  }
314
  }
 
 
315
  }
316
 
317
  // Sitemaps.
318
  if ( isset( $searchAppearance['postTypes']['postTypes']['all'] ) ) {
319
+ $options->sitemap->general->postTypes->all = $searchAppearance['postTypes']['postTypes']['all'];
320
  }
321
 
322
  if ( isset( $searchAppearance['postTypes']['postTypes']['included'] ) ) {
323
+ $options->sitemap->general->postTypes->included = $searchAppearance['postTypes']['postTypes']['included'];
324
  }
325
  }
326
 
327
  if ( isset( $searchAppearance['multipleAuthors'] ) ) {
328
+ $options->searchAppearance->archives->author->show = $searchAppearance['multipleAuthors'];
329
+ $options->searchAppearance->archives->author->advanced->robotsMeta->default = $searchAppearance['multipleAuthors'];
330
+ $options->searchAppearance->archives->author->advanced->robotsMeta->noindex = ! $searchAppearance['multipleAuthors'];
331
  }
332
 
333
+ if ( isset( $searchAppearance['redirectAttachmentPages'] ) && $dynamicOptions->searchAppearance->postTypes->has( 'attachment' ) ) {
334
+ $dynamicOptions->searchAppearance->postTypes->attachment->redirectAttachmentUrls = $searchAppearance['redirectAttachmentPages'] ? 'attachment' : 'disabled';
 
 
335
  }
336
  }
337
 
app/Common/HeadlineAnalyzer/HeadlineAnalyzer.php CHANGED
@@ -55,7 +55,8 @@ class HeadlineAnalyzer {
55
 
56
  aioseo()->helpers->enqueueStyle(
57
  'aioseo-headline-analyzer',
58
- 'css/headline-analyzer.css'
 
59
  );
60
  }
61
 
55
 
56
  aioseo()->helpers->enqueueStyle(
57
  'aioseo-headline-analyzer',
58
+ 'css/headline-analyzer.css',
59
+ false
60
  );
61
  }
62
 
app/Common/ImportExport/Helpers.php CHANGED
@@ -42,13 +42,15 @@ abstract class Helpers {
42
  return;
43
  }
44
 
 
 
45
  foreach ( $mappings as $name => $values ) {
46
  if ( ! isset( $group[ $name ] ) ) {
47
  continue;
48
  }
49
 
50
  $error = false;
51
- $options = aioseo()->options->noConflict();
52
  $lastOption = '';
53
  for ( $i = 0; $i < count( $values['newOption'] ); $i++ ) {
54
  $lastOption = $values['newOption'][ $i ];
@@ -89,7 +91,5 @@ abstract class Helpers {
89
  break;
90
  }
91
  }
92
-
93
- aioseo()->options->refresh();
94
  }
95
  }
42
  return;
43
  }
44
 
45
+ $mainOptions = aioseo()->options->noConflict();
46
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
47
  foreach ( $mappings as $name => $values ) {
48
  if ( ! isset( $group[ $name ] ) ) {
49
  continue;
50
  }
51
 
52
  $error = false;
53
+ $options = ! empty( $values['dynamic'] ) ? $dynamicOptions : $mainOptions;
54
  $lastOption = '';
55
  for ( $i = 0; $i < count( $values['newOption'] ); $i++ ) {
56
  $lastOption = $values['newOption'][ $i ];
91
  break;
92
  }
93
  }
 
 
94
  }
95
  }
app/Common/ImportExport/ImportExport.php CHANGED
@@ -31,6 +31,7 @@ class ImportExport {
31
  public function __construct() {
32
  $this->yoastSeo = new YoastSeo\YoastSeo( $this );
33
  $this->rankMath = new RankMath\RankMath( $this );
 
34
  }
35
 
36
  /**
@@ -297,6 +298,9 @@ class ImportExport {
297
  * @return void
298
  */
299
  public function startImport( $plugin, $settings ) {
 
 
 
300
  foreach ( $this->plugins as $pluginData ) {
301
  if ( $pluginData['slug'] === $plugin ) {
302
  $pluginData['class']->doImport( $settings );
@@ -305,6 +309,45 @@ class ImportExport {
305
  }
306
  }
307
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
308
  /**
309
  * Adds plugins to the import/export.
310
  *
31
  public function __construct() {
32
  $this->yoastSeo = new YoastSeo\YoastSeo( $this );
33
  $this->rankMath = new RankMath\RankMath( $this );
34
+ $this->seoPress = new SeoPress\SeoPress( $this );
35
  }
36
 
37
  /**
298
  * @return void
299
  */
300
  public function startImport( $plugin, $settings ) {
301
+ // First cancel any scans running that might interfere with our import.
302
+ $this->cancelScans();
303
+
304
  foreach ( $this->plugins as $pluginData ) {
305
  if ( $pluginData['slug'] === $plugin ) {
306
  $pluginData['class']->doImport( $settings );
309
  }
310
  }
311
 
312
+ /**
313
+ * Cancel scans that are currently running and could conflict with our migration.
314
+ *
315
+ * @since 4.1.4
316
+ *
317
+ * @return void
318
+ */
319
+ private function cancelScans() {
320
+ // Figure out how to check if these addons are enabled and then get the action names that way.
321
+ aioseo()->helpers->unscheduleAction( 'aioseo_video_sitemap_scan' );
322
+ aioseo()->helpers->unscheduleAction( 'aioseo_image_sitemap_scan' );
323
+ }
324
+
325
+ /**
326
+ * Checks if an import is currently running.
327
+ *
328
+ * @since 4.1.4
329
+ *
330
+ * @return boolean True if an import is currently running.
331
+ */
332
+ public function isImportRunning() {
333
+ $transients = aioseo()->db
334
+ ->start( 'options' )
335
+ ->select( 'option_name as name' )
336
+ ->whereRaw( "`option_name` LIKE '_aioseo_cache_%'" )
337
+ ->run()
338
+ ->result();
339
+
340
+ $foundImportTransient = false;
341
+ foreach ( $transients as $transient ) {
342
+ if ( preg_match( '#import_.*_meta_.*#', $transient->name ) ) {
343
+ $foundImportTransient = true;
344
+ break;
345
+ }
346
+ }
347
+
348
+ return $foundImportTransient;
349
+ }
350
+
351
  /**
352
  * Adds plugins to the import/export.
353
  *
app/Common/ImportExport/RankMath/GeneralSettings.php CHANGED
@@ -63,9 +63,9 @@ class GeneralSettings {
63
  private function migrateRedirectAttachments() {
64
  if ( isset( $this->options['attachment_redirect_urls'] ) ) {
65
  if ( 'on' === $this->options['attachment_redirect_urls'] ) {
66
- aioseo()->options->searchAppearance->dynamic->postTypes->attachment->redirectAttachmentUrls = 'attachment_parent';
67
  } else {
68
- aioseo()->options->searchAppearance->dynamic->postTypes->attachment->redirectAttachmentUrls = 'disabled';
69
  }
70
  }
71
  }
63
  private function migrateRedirectAttachments() {
64
  if ( isset( $this->options['attachment_redirect_urls'] ) ) {
65
  if ( 'on' === $this->options['attachment_redirect_urls'] ) {
66
+ aioseo()->dynamicOptions->searchAppearance->postTypes->attachment->redirectAttachmentUrls = 'attachment_parent';
67
  } else {
68
+ aioseo()->dynamicOptions->searchAppearance->postTypes->attachment->redirectAttachmentUrls = 'disabled';
69
  }
70
  }
71
  }
app/Common/ImportExport/RankMath/TitleMeta.php CHANGED
@@ -188,7 +188,7 @@ class TitleMeta extends ImportExport\SearchAppearance {
188
  foreach ( aioseo()->helpers->getPublicPostTypes( true ) as $postType ) {
189
  // Reset existing values first.
190
  foreach ( $this->robotMetaSettings as $robotsMetaName ) {
191
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->$robotsMetaName = false;
192
  }
193
 
194
  foreach ( $this->options as $name => $value ) {
@@ -202,7 +202,7 @@ class TitleMeta extends ImportExport\SearchAppearance {
202
  $value = aioseo()->helpers->pregReplace( '#%category%#', '', $value );
203
  $value = aioseo()->helpers->pregReplace( '#%excerpt%#', '', $value );
204
  }
205
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->title =
206
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->rankMath->helpers->macrosToSmartTags( $value ) );
207
  break;
208
  case 'description':
@@ -210,11 +210,11 @@ class TitleMeta extends ImportExport\SearchAppearance {
210
  $value = aioseo()->helpers->pregReplace( '#%category%#', '', $value );
211
  $value = aioseo()->helpers->pregReplace( '#%excerpt%#', '', $value );
212
  }
213
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->metaDescription =
214
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->rankMath->helpers->macrosToSmartTags( $value ) );
215
  break;
216
  case 'custom_robots':
217
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->default = 'off' === $value;
218
  break;
219
  case 'robots':
220
  if ( ! empty( $value ) ) {
@@ -222,33 +222,33 @@ class TitleMeta extends ImportExport\SearchAppearance {
222
  if ( 'index' === $robotsName ) {
223
  continue;
224
  }
225
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->$robotsName = true;
226
  }
227
  }
228
  break;
229
  case 'advanced_robots':
230
  if ( ! empty( $value['max-snippet'] ) ) {
231
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->maxSnippet = intval( $value['max-snippet'] );
232
  }
233
  if ( ! empty( $value['max-video-preview'] ) ) {
234
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->maxVideoPreview = intval( $value['max-video-preview'] );
235
  }
236
  if ( ! empty( $value['max-image-preview'] ) ) {
237
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->maxImagePreview =
238
  aioseo()->helpers->sanitizeOption( $value['max-image-preview'] );
239
  }
240
  break;
241
  case 'add_meta_box':
242
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->advanced->showMetaBox = 'on' === $value;
243
  break;
244
  case 'default_rich_snippet':
245
  $value = aioseo()->helpers->pregReplace( '#\s#', '', $value );
246
  if ( 'off' === lcfirst( $value ) || in_array( $postType, [ 'page', 'attachment' ], true ) ) {
247
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->schemaType = 'none';
248
  break;
249
  }
250
  if ( in_array( ucfirst( $value ), ImportExport\SearchAppearance::$supportedSchemaGraphs, true ) ) {
251
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->schemaType = ucfirst( $value );
252
  }
253
  break;
254
  case 'default_article_type':
@@ -257,9 +257,9 @@ class TitleMeta extends ImportExport\SearchAppearance {
257
  }
258
  $value = aioseo()->helpers->pregReplace( '#\s#', '', $value );
259
  if ( in_array( ucfirst( $value ), ImportExport\SearchAppearance::$supportedArticleGraphs, true ) ) {
260
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->articleType = ucfirst( $value );
261
  } else {
262
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->articleType = 'BlogPosting';
263
  }
264
  break;
265
  default:
@@ -290,11 +290,11 @@ class TitleMeta extends ImportExport\SearchAppearance {
290
 
291
  switch ( $match[1] ) {
292
  case 'title':
293
- aioseo()->options->searchAppearance->dynamic->archives->$postType->title =
294
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->rankMath->helpers->macrosToSmartTags( $value, 'archive' ) );
295
  break;
296
  case 'description':
297
- aioseo()->options->searchAppearance->dynamic->archives->$postType->metaDescription =
298
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->rankMath->helpers->macrosToSmartTags( $value, 'archive' ) );
299
  break;
300
  default:
188
  foreach ( aioseo()->helpers->getPublicPostTypes( true ) as $postType ) {
189
  // Reset existing values first.
190
  foreach ( $this->robotMetaSettings as $robotsMetaName ) {
191
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->$robotsMetaName = false;
192
  }
193
 
194
  foreach ( $this->options as $name => $value ) {
202
  $value = aioseo()->helpers->pregReplace( '#%category%#', '', $value );
203
  $value = aioseo()->helpers->pregReplace( '#%excerpt%#', '', $value );
204
  }
205
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->title =
206
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->rankMath->helpers->macrosToSmartTags( $value ) );
207
  break;
208
  case 'description':
210
  $value = aioseo()->helpers->pregReplace( '#%category%#', '', $value );
211
  $value = aioseo()->helpers->pregReplace( '#%excerpt%#', '', $value );
212
  }
213
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->metaDescription =
214
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->rankMath->helpers->macrosToSmartTags( $value ) );
215
  break;
216
  case 'custom_robots':
217
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->default = 'off' === $value;
218
  break;
219
  case 'robots':
220
  if ( ! empty( $value ) ) {
222
  if ( 'index' === $robotsName ) {
223
  continue;
224
  }
225
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->$robotsName = true;
226
  }
227
  }
228
  break;
229
  case 'advanced_robots':
230
  if ( ! empty( $value['max-snippet'] ) ) {
231
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->maxSnippet = intval( $value['max-snippet'] );
232
  }
233
  if ( ! empty( $value['max-video-preview'] ) ) {
234
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->maxVideoPreview = intval( $value['max-video-preview'] );
235
  }
236
  if ( ! empty( $value['max-image-preview'] ) ) {
237
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->maxImagePreview =
238
  aioseo()->helpers->sanitizeOption( $value['max-image-preview'] );
239
  }
240
  break;
241
  case 'add_meta_box':
242
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->showMetaBox = 'on' === $value;
243
  break;
244
  case 'default_rich_snippet':
245
  $value = aioseo()->helpers->pregReplace( '#\s#', '', $value );
246
  if ( 'off' === lcfirst( $value ) || in_array( $postType, [ 'page', 'attachment' ], true ) ) {
247
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->schemaType = 'none';
248
  break;
249
  }
250
  if ( in_array( ucfirst( $value ), ImportExport\SearchAppearance::$supportedSchemaGraphs, true ) ) {
251
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->schemaType = ucfirst( $value );
252
  }
253
  break;
254
  case 'default_article_type':
257
  }
258
  $value = aioseo()->helpers->pregReplace( '#\s#', '', $value );
259
  if ( in_array( ucfirst( $value ), ImportExport\SearchAppearance::$supportedArticleGraphs, true ) ) {
260
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->articleType = ucfirst( $value );
261
  } else {
262
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->articleType = 'BlogPosting';
263
  }
264
  break;
265
  default:
290
 
291
  switch ( $match[1] ) {
292
  case 'title':
293
+ aioseo()->dynamicOptions->searchAppearance->archives->$postType->title =
294
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->rankMath->helpers->macrosToSmartTags( $value, 'archive' ) );
295
  break;
296
  case 'description':
297
+ aioseo()->dynamicOptions->searchAppearance->archives->$postType->metaDescription =
298
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->rankMath->helpers->macrosToSmartTags( $value, 'archive' ) );
299
  break;
300
  default:
app/Common/ImportExport/SeoPress/Analytics.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\ImportExport\SeoPress;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
10
+
11
+ /**
12
+ * Migrates the Analytics Settings.
13
+ *
14
+ * @since 4.1.4
15
+ */
16
+ class Analytics {
17
+ /**
18
+ * Class constructor.
19
+ *
20
+ * @since 4.1.4
21
+ */
22
+ public function __construct() {
23
+ $this->options = get_option( 'seopress_google_analytics_option_name' );
24
+ if ( empty( $this->options ) ) {
25
+ return;
26
+ }
27
+
28
+ $settings = [
29
+ 'seopress_google_analytics_other_tracking' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'miscellaneousVerification' ] ],
30
+ ];
31
+
32
+ aioseo()->importExport->seoPress->helpers->mapOldToNew( $settings, $this->options );
33
+ }
34
+ }
app/Common/ImportExport/SeoPress/Breadcrumbs.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\ImportExport\SeoPress;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
10
+
11
+ /**
12
+ * Migrates the Breadcrumb settings.
13
+ *
14
+ * @since 4.1.4
15
+ */
16
+ class Breadcrumbs {
17
+ /**
18
+ * Class constructor.
19
+ *
20
+ * @since 4.1.4
21
+ */
22
+ public function __construct() {
23
+ $this->options = get_option( 'seopress_pro_option_name' );
24
+ if ( empty( $this->options ) ) {
25
+ return;
26
+ }
27
+
28
+ $this->migrate();
29
+ }
30
+
31
+ /**
32
+ * Migrates the Breadcrumbs settings.
33
+ *
34
+ * @since 4.1.4
35
+ *
36
+ * @return void
37
+ */
38
+ private function migrate() {
39
+ if ( ! empty( $this->options['seopress_breadcrumbs_i18n_search'] ) ) {
40
+ aioseo()->options->breadcrumbs->searchResultFormat = sprintf( '%1$s #breadcrumb_archive_post_type_name', $this->options['seopress_breadcrumbs_i18n_search'] );
41
+ }
42
+
43
+ if ( ! empty( $this->options['seopress_breadcrumbs_remove_blog_page'] ) ) {
44
+ aioseo()->options->breadcrumbs->showBlogHome = false;
45
+ }
46
+
47
+ $settings = [
48
+ 'seopress_breadcrumbs_enable' => [ 'type' => 'boolean', 'newOption' => [ 'breadcrumbs', 'enable' ] ],
49
+ 'seopress_breadcrumbs_separator' => [ 'type' => 'string', 'newOption' => [ 'breadcrumbs', 'separator' ] ],
50
+ 'seopress_breadcrumbs_i18n_home' => [ 'type' => 'string', 'newOption' => [ 'breadcrumbs', 'homepageLabel' ] ],
51
+ 'seopress_breadcrumbs_i18n_here' => [ 'type' => 'string', 'newOption' => [ 'breadcrumbs', 'breadcrumbPrefix' ] ],
52
+ 'seopress_breadcrumbs_i18n_404' => [ 'type' => 'string', 'newOption' => [ 'breadcrumbs', 'errorFormat404' ] ],
53
+ ];
54
+
55
+ aioseo()->importExport->seoPress->helpers->mapOldToNew( $settings, $this->options );
56
+ }
57
+ }
app/Common/ImportExport/SeoPress/GeneralSettings.php ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\ImportExport\SeoPress;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
10
+
11
+ /**
12
+ * Migrates the General Settings.
13
+ *
14
+ * @since 4.1.4
15
+ */
16
+ class GeneralSettings {
17
+ /**
18
+ * Class constructor.
19
+ *
20
+ * @since 4.1.4
21
+ */
22
+ public function __construct() {
23
+ $this->options = get_option( 'seopress_advanced_option_name' );
24
+ if ( empty( $this->options ) ) {
25
+ return;
26
+ }
27
+
28
+ $this->roles = aioseo()->access->getRoles();
29
+
30
+ $this->migrateBlockMetaboxRoles();
31
+ $this->migrateBlockContentAnalysisRoles();
32
+ $this->migrateAttachmentRedirects();
33
+
34
+ $settings = [
35
+ 'seopress_advanced_advanced_google' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'google' ] ],
36
+ 'seopress_advanced_advanced_bing' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'bing' ] ],
37
+ 'seopress_advanced_advanced_pinterest' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'pinterest' ] ],
38
+ 'seopress_advanced_advanced_yandex' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'yandex' ] ],
39
+ ];
40
+
41
+ aioseo()->importExport->seoPress->helpers->mapOldToNew( $settings, $this->options );
42
+ }
43
+
44
+ /**
45
+ * Migrates Block AIOSEO metabox setting.
46
+ *
47
+ * @since 4.1.4
48
+ *
49
+ * @return void
50
+ */
51
+ private function migrateBlockMetaboxRoles() {
52
+ $seoPressRoles = $this->options['seopress_advanced_security_metaboxe_role'];
53
+ if ( empty( $seoPressRoles ) ) {
54
+ return;
55
+ }
56
+
57
+ $roleSettings = [ 'useDefault', 'pageAnalysis', 'pageGeneralSettings', 'pageSocialSettings', 'pageSchemaSettings', 'pageAdvancedSettings' ];
58
+
59
+ foreach ( $seoPressRoles as $wpRole => $value ) {
60
+ $role = $this->roles[ $wpRole ];
61
+ if ( empty( $role ) || aioseo()->access->isAdmin( $role ) ) {
62
+ continue;
63
+ }
64
+
65
+ if ( aioseo()->options->accessControl->has( $role ) ) {
66
+ foreach ( $roleSettings as $setting ) {
67
+ aioseo()->options->accessControl->$role->$setting = false;
68
+ }
69
+ } elseif ( aioseo()->dynamicOptions->accessControl->has( $role ) ) {
70
+ foreach ( $roleSettings as $setting ) {
71
+ aioseo()->dynamicOptions->accessControl->$role->$setting = false;
72
+ }
73
+ }
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Migrates Block Content analysis metabox setting.
79
+ *
80
+ * @since 4.1.4
81
+ *
82
+ * @return void
83
+ */
84
+ private function migrateBlockContentAnalysisRoles() {
85
+ $seoPressRoles = $this->options['seopress_advanced_security_metaboxe_ca_role'];
86
+ if ( empty( $seoPressRoles ) ) {
87
+ return;
88
+ }
89
+
90
+ $roleSettings = [ 'useDefault', 'pageAnalysis' ];
91
+
92
+ foreach ( $seoPressRoles as $wpRole => $value ) {
93
+ $role = $this->roles[ $wpRole ];
94
+ if ( empty( $role ) || aioseo()->access->isAdmin( $role ) ) {
95
+ continue;
96
+ }
97
+
98
+ if ( aioseo()->options->accessControl->has( $role ) ) {
99
+ foreach ( $roleSettings as $setting ) {
100
+ aioseo()->options->accessControl->$role->$setting = false;
101
+ }
102
+ } elseif ( aioseo()->dynamicOptions->accessControl->has( $role ) ) {
103
+ foreach ( $roleSettings as $setting ) {
104
+ aioseo()->dynamicOptions->accessControl->$role->$setting = false;
105
+ }
106
+ }
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Migrates redirect attachment pages settings.
112
+ *
113
+ * @since 4.1.4
114
+ *
115
+ * @return void
116
+ */
117
+ private function migrateAttachmentRedirects() {
118
+ if ( ! empty( $this->options['seopress_advanced_advanced_attachments'] ) ) {
119
+ aioseo()->dynamicOptions->searchAppearance->postTypes->attachment->redirectAttachmentUrls = 'attachment_parent';
120
+ }
121
+
122
+ if ( ! empty( $this->options['seopress_advanced_advanced_attachments_file'] ) ) {
123
+ aioseo()->dynamicOptions->searchAppearance->postTypes->attachment->redirectAttachmentUrls = 'attachment';
124
+ }
125
+
126
+ if ( empty( $this->options['seopress_advanced_advanced_attachments'] ) && empty( $this->options['seopress_advanced_advanced_attachments_file'] ) ) {
127
+ aioseo()->dynamicOptions->searchAppearance->postTypes->attachment->redirectAttachmentUrls = 'disabled';
128
+ }
129
+ }
130
+ }
app/Common/ImportExport/SeoPress/Helpers.php CHANGED
@@ -13,25 +13,104 @@ use AIOSEO\Plugin\Common\ImportExport;
13
  /**
14
  * Contains helper methods for the import from SEOPress.
15
  *
16
- * @since 4.0.0
17
  */
18
  class Helpers extends ImportExport\Helpers {
19
  /**
20
  * Converts the macros from SEOPress to our own smart tags.
21
  *
22
- * @since 4.0.0
23
  *
24
- * @param string $string The string with macros.
25
- * @return string $string The string with smart tags.
 
26
  */
27
- public function macrosToSmartTags( $string ) {
28
- $macros = [
29
- '%%tagline%%' => '#tagline',
30
- ];
31
 
32
  foreach ( $macros as $macro => $tag ) {
33
  $string = aioseo()->helpers->pregReplace( "#$macro(?![a-zA-Z0-9_])#im", $tag, $string );
34
  }
35
- return $string;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  }
37
  }
13
  /**
14
  * Contains helper methods for the import from SEOPress.
15
  *
16
+ * @since 4.1.4
17
  */
18
  class Helpers extends ImportExport\Helpers {
19
  /**
20
  * Converts the macros from SEOPress to our own smart tags.
21
  *
22
+ * @since 4.1.4
23
  *
24
+ * @param string $string The string with macros.
25
+ * @param string $pageType The page type.
26
+ * @return string $string The string with smart tags.
27
  */
28
+ public function macrosToSmartTags( $string, $postType = null ) {
29
+ $macros = $this->getMacros( $postType );
 
 
30
 
31
  foreach ( $macros as $macro => $tag ) {
32
  $string = aioseo()->helpers->pregReplace( "#$macro(?![a-zA-Z0-9_])#im", $tag, $string );
33
  }
34
+
35
+ return trim( $string );
36
+ }
37
+
38
+ /**
39
+ * Returns the macro mappings.
40
+ *
41
+ * @since 4.1.4
42
+ *
43
+ * @param string $postType The post type.
44
+ * @param string $pageType The page type.
45
+ * @return array $macros The macros.
46
+ */
47
+ protected function getMacros( $postType = null, $pageType = null ) {
48
+ $macros = [
49
+ '%%sep%%' => '#separator_sa',
50
+ '%%sitetitle%%' => '#site_title',
51
+ '%%sitename%%' => '#site_title',
52
+ '%%tagline%%' => '#tagline',
53
+ '%%sitedesc%%' => '#tagline',
54
+ '%%title%%' => '#site_title',
55
+ '%%post_title%%' => '#post_title',
56
+ '%%post_excerpt%%' => '#post_excerpt',
57
+ '%%excerpt%%' => '#post_excerpt',
58
+ '%%post_content%%' => '#post_content',
59
+ '%%post_url%%' => '#permalink',
60
+ '%%post_date%%' => '#post_date',
61
+ '%%post_permalink%%' => '#permalink',
62
+ '%%date%%' => '#post_date',
63
+ '%%post_author%%' => '#author_name',
64
+ '%%post_category%%' => '#categories',
65
+ '%%_category_title%%' => '#taxonomy_title',
66
+ '%%_category_description%%' => '#taxonomy_description',
67
+ '%%tag_title%%' => '#taxonomy_title',
68
+ '%%tag_description%%' => '#taxonomy_description',
69
+ '%%term_title%%' => '#taxonomy_title',
70
+ '%%term_description%%' => '#taxonomy_description',
71
+ '%%search_keywords%%' => '#search_term',
72
+ '%%current_pagination%%' => '#page_number',
73
+ '%%page%%' => '#page_number',
74
+ '%%archive_title%%' => '#archive_title',
75
+ '%%archive_date%%' => '#archive_date',
76
+ '%%wc_single_price%%' => '#woocommerce_price',
77
+ '%%wc_sku%%' => '#woocommerce_sku',
78
+ '%%currentday%%' => '#current_day',
79
+ '%%currentmonth%%' => '#current_month',
80
+ '%%currentmonth_short%%' => '#current_month',
81
+ '%%currentyear%%' => '#current_year',
82
+ '%%currentdate%%' => '#current_date',
83
+ '%%author_first_name%%' => '#author_first_name',
84
+ '%%author_last_name%%' => '#author_last_name',
85
+ '%%author_website%%' => '#author_link',
86
+ '%%author_nickname%%' => '#author_first_name',
87
+ '%%author_bio%%' => '#author_bio',
88
+ '%%currentmonth_num%%' => '#current_month',
89
+ ];
90
+
91
+ if ( $postType ) {
92
+ $postType = get_post_type_object( $postType );
93
+ if ( ! empty( $postType ) ) {
94
+ $macros += [
95
+ '%%cpt_plural%%' => $postType->labels->name,
96
+ ];
97
+ }
98
+ }
99
+
100
+ switch ( $pageType ) {
101
+ case 'archive':
102
+ $macros['%%title%%'] = '#archive_title';
103
+ break;
104
+ case 'term':
105
+ $macros['%%title%%'] = '#taxonomy_title';
106
+ break;
107
+ default:
108
+ $macros['%%title%%'] = '#post_title';
109
+ break;
110
+ }
111
+
112
+ // Strip all other tags.
113
+ $macros['%%[^%]*%%'] = '';
114
+ return $macros;
115
  }
116
  }
app/Common/ImportExport/SeoPress/PostMeta.php ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\ImportExport\SeoPress;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ use AIOSEO\Plugin\Common\Models;
10
+
11
+ // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
12
+
13
+ /**
14
+ * Imports the post meta from SEOPress.
15
+ *
16
+ * @since 4.1.4
17
+ */
18
+ class PostMeta {
19
+ /**
20
+ * The mapped meta
21
+ *
22
+ * @since 4.1.4
23
+ *
24
+ * @var array
25
+ */
26
+ private $mappedMeta = [
27
+ '_seopress_analysis_target_kw' => '',
28
+ '_seopress_robots_archive' => 'robots_noarchive',
29
+ '_seopress_robots_canonical' => 'canonical_url',
30
+ '_seopress_robots_follow' => 'robots_nofollow',
31
+ '_seopress_robots_imageindex' => 'robots_noimageindex',
32
+ '_seopress_robots_index' => 'robots_noindex',
33
+ '_seopress_robots_odp' => 'robots_noodp',
34
+ '_seopress_robots_snippet' => 'robots_nosnippet',
35
+ '_seopress_social_twitter_desc' => 'twitter_description',
36
+ '_seopress_social_twitter_img' => 'twitter_image_custom_url',
37
+ '_seopress_social_twitter_title' => 'twitter_title',
38
+ '_seopress_social_fb_desc' => 'og_description',
39
+ '_seopress_social_fb_img' => 'og_image_custom_url',
40
+ '_seopress_social_fb_title' => 'og_title',
41
+ '_seopress_titles_desc' => 'description',
42
+ '_seopress_titles_title' => 'title',
43
+ ];
44
+
45
+ /**
46
+ * Class constructor.
47
+ *
48
+ * @since 4.1.4
49
+ */
50
+ public function scheduleImport() {
51
+ if ( aioseo()->helpers->scheduleSingleAction( aioseo()->importExport->seoPress->postActionName, 0 ) ) {
52
+ if ( ! aioseo()->transients->get( 'import_post_meta_seopress' ) ) {
53
+ aioseo()->transients->update( 'import_post_meta_seopress', time(), WEEK_IN_SECONDS );
54
+ }
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Imports the post meta.
60
+ *
61
+ * @since 4.1.4
62
+ *
63
+ * @return void
64
+ */
65
+ public function importPostMeta() {
66
+ $postsPerAction = 100;
67
+ $publicPostTypes = implode( "', '", aioseo()->helpers->getPublicPostTypes( true ) );
68
+ $timeStarted = gmdate( 'Y-m-d H:i:s', aioseo()->transients->get( 'import_post_meta_seopress' ) );
69
+
70
+ $posts = aioseo()->db
71
+ ->start( 'posts as p' )
72
+ ->select( 'p.ID, p.post_type' )
73
+ ->join( 'postmeta as pm', '`p`.`ID` = `pm`.`post_id`' )
74
+ ->leftJoin( 'aioseo_posts as ap', '`p`.`ID` = `ap`.`post_id`' )
75
+ ->whereRaw( "pm.meta_key LIKE '_seopress_%'" )
76
+ ->whereRaw( "( p.post_type IN ( '$publicPostTypes' ) )" )
77
+ ->whereRaw( "( ap.post_id IS NULL OR ap.updated < '$timeStarted' )" )
78
+ ->orderBy( 'p.ID DESC' )
79
+ ->limit( $postsPerAction )
80
+ ->run()
81
+ ->result();
82
+
83
+ if ( ! $posts || ! count( $posts ) ) {
84
+ aioseo()->transients->delete( 'import_post_meta_seopress' );
85
+ return;
86
+ }
87
+
88
+ foreach ( $posts as $post ) {
89
+ $postMeta = aioseo()->db
90
+ ->start( 'postmeta' . ' as pm' )
91
+ ->select( 'pm.meta_key, pm.meta_value' )
92
+ ->where( 'pm.post_id', $post->ID )
93
+ ->whereRaw( "`pm`.`meta_key` LIKE '_seopress_%'" )
94
+ ->run()
95
+ ->result();
96
+
97
+ if ( ! $postMeta || ! count( $postMeta ) ) {
98
+ continue;
99
+ }
100
+
101
+ $meta = array_merge( [
102
+ 'post_id' => (int) $post->ID,
103
+ ], $this->getMetaData( $postMeta, $post->ID ) );
104
+
105
+ $aioseoPost = Models\Post::getPost( (int) $post->ID );
106
+ $aioseoPost->set( $meta );
107
+ $aioseoPost->save();
108
+ }
109
+
110
+ if ( count( $posts ) === $postsPerAction ) {
111
+ aioseo()->helpers->scheduleSingleAction( aioseo()->importExport->seoPress->postActionName, 5 );
112
+ } else {
113
+ aioseo()->transients->delete( 'import_post_meta_seopress' );
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Get the meta data by post meta.
119
+ *
120
+ * @since 4.1.4
121
+ *
122
+ * @param object $postMeta The post meta from database.
123
+ * @return array The meta data.
124
+ */
125
+ public function getMetaData( $postMeta, $post_id ) {
126
+ $meta = [];
127
+ foreach ( $postMeta as $record ) {
128
+ $name = $record->meta_key;
129
+ $value = $record->meta_value;
130
+
131
+ if ( ! in_array( $name, array_keys( $this->mappedMeta ), true ) ) {
132
+ continue;
133
+ }
134
+
135
+ switch ( $name ) {
136
+ case '_seopress_analysis_target_kw':
137
+ $keyphrase = [
138
+ 'focus' => [ 'keyphrase' => aioseo()->helpers->sanitizeOption( $value ) ],
139
+ 'additional' => []
140
+ ];
141
+ $meta['keyphrases'] = wp_json_encode( $keyphrase );
142
+ break;
143
+ case '_seopress_robots_snippet':
144
+ case '_seopress_robots_archive':
145
+ case '_seopress_robots_imageindex':
146
+ case '_seopress_robots_odp':
147
+ case '_seopress_robots_follow':
148
+ case '_seopress_robots_index':
149
+ if ( 'yes' === $value ) {
150
+ $meta['robots_default'] = false;
151
+ $meta[ $this->mappedMeta[ $name ] ] = true;
152
+ }
153
+ break;
154
+ case '_seopress_social_twitter_img':
155
+ $meta['twitter_use_og'] = false;
156
+ $meta['twitter_image_type'] = 'custom_image';
157
+ $meta[ $this->mappedMeta[ $name ] ] = esc_url( $value );
158
+ break;
159
+ case '_seopress_social_fb_img':
160
+ $meta['og_image_type'] = 'custom_image';
161
+ $meta[ $this->mappedMeta[ $name ] ] = esc_url( $value );
162
+ break;
163
+ case '_seopress_titles_title':
164
+ case '_seopress_titles_desc':
165
+ $value = aioseo()->importExport->seoPress->helpers->macrosToSmartTags( $value );
166
+ default:
167
+ $meta[ $this->mappedMeta[ $name ] ] = esc_html( wp_strip_all_tags( strval( $value ) ) );
168
+ break;
169
+ }
170
+ }
171
+
172
+ return $meta;
173
+ }
174
+ }
app/Common/ImportExport/SeoPress/RobotsTxt.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\ImportExport\SeoPress;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
10
+
11
+ /**
12
+ * Migrates the robots.txt settings.
13
+ *
14
+ * @since 4.1.4
15
+ */
16
+ class RobotsTxt {
17
+ /**
18
+ * Class constructor.
19
+ *
20
+ * @since 4.1.4
21
+ */
22
+ public function __construct() {
23
+ $this->options = get_option( 'seopress_pro_option_name' );
24
+ if ( empty( $this->options ) ) {
25
+ return;
26
+ }
27
+
28
+ $this->migrateRobotsTxt();
29
+
30
+ $settings = [
31
+ 'seopress_robots_enable' => [ 'type' => 'boolean', 'newOption' => [ 'tools', 'robots', 'enable' ] ],
32
+ ];
33
+
34
+ aioseo()->importExport->seoPress->helpers->mapOldToNew( $settings, $this->options );
35
+ }
36
+
37
+ /**
38
+ * Migrates the robots.txt.
39
+ *
40
+ * @since 4.1.4
41
+ *
42
+ * @return void
43
+ */
44
+ public function migrateRobotsTxt() {
45
+ $lines = explode( "\n", $this->options['seopress_robots_file'] );
46
+ $allRules = aioseo()->robotsTxt->extractRules( $lines );
47
+
48
+ aioseo()->options->tools->robots->rules = aioseo()->robotsTxt->prepareRobotsTxt( $allRules );
49
+ }
50
+ }
app/Common/ImportExport/SeoPress/Rss.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\ImportExport\SeoPress;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
10
+
11
+ /**
12
+ * Migrates the RSS settings.
13
+ *
14
+ * @since 4.1.4
15
+ */
16
+ class Rss {
17
+ /**
18
+ * Class constructor.
19
+ *
20
+ * @since 4.1.4
21
+ */
22
+ public function __construct() {
23
+ $this->options = get_option( 'seopress_pro_option_name' );
24
+ if ( empty( $this->options ) ) {
25
+ return;
26
+ }
27
+
28
+ $this->migrateRss();
29
+ }
30
+
31
+ /**
32
+ * Migrates the RSS settings.
33
+ *
34
+ * @since 4.1.4
35
+ *
36
+ * @return void
37
+ */
38
+ public function migrateRss() {
39
+ if ( ! empty( $this->options['seopress_rss_before_html'] ) ) {
40
+ aioseo()->options->rssContent->before = esc_html( aioseo()->importExport->seoPress->helpers->macrosToSmartTags( $this->options['seopress_rss_before_html'] ) );
41
+ }
42
+
43
+ if ( ! empty( $this->options['seopress_rss_after_html'] ) ) {
44
+ aioseo()->options->rssContent->after = esc_html( aioseo()->importExport->seoPress->helpers->macrosToSmartTags( $this->options['seopress_rss_after_html'] ) );
45
+ }
46
+ }
47
+ }
app/Common/ImportExport/SeoPress/SearchAppearance.php DELETED
@@ -1,46 +0,0 @@
1
- <?php
2
- namespace AIOSEO\Plugin\Common\ImportExport\SeoPress;
3
-
4
- // Exit if accessed directly.
5
- if ( ! defined( 'ABSPATH' ) ) {
6
- exit;
7
- }
8
-
9
- // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
10
-
11
- /**
12
- * Migrates the Search Appearance settings.
13
- *
14
- * @since 4.0.0
15
- */
16
- class SearchAppearance {
17
- /**
18
- * Class constructor.
19
- *
20
- * @since 4.0.0
21
- */
22
- public function __construct() {
23
- $this->options = get_option( 'seopress_titles_option_name' );
24
- if ( empty( $this->options ) ) {
25
- return;
26
- }
27
-
28
- $this->migrateTitleFormats();
29
-
30
- }
31
-
32
- /**
33
- * Migrates the title format settings.
34
- *
35
- * @since 4.0.0
36
- *
37
- * @return void
38
- */
39
- private function migrateTitleFormats() {
40
- if ( isset( $this->options['seopress_titles_home_site_title'] ) ) {
41
- aioseo()->options->searchAppearance->global->siteTitle =
42
- aioseo()->importExport->seoPress->helpers->macrosToSmartTags( $this->options['seopress_titles_home_site_title'] );
43
- }
44
- }
45
-
46
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/Common/ImportExport/SeoPress/SeoPress.php CHANGED
@@ -6,28 +6,74 @@ if ( ! defined( 'ABSPATH' ) ) {
6
  exit;
7
  }
8
 
9
- class SeoPress {
 
 
10
  /**
11
- * Starts the import.
12
  *
13
- * @since 4.0.0
14
  *
15
- * @return void
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  */
17
- public function doImport() {
18
- // @TODO: [V4+] Write this once SEOPress is going in.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  }
20
 
21
  /**
22
  * Imports the settings.
23
  *
24
- * @since 4.0.0
25
  *
26
  * @return void
27
  */
28
- public function migrateSettings() {
29
- $this->helpers = new Helpers();
30
-
31
- new SearchAppearance();
 
 
 
 
 
32
  }
33
  }
6
  exit;
7
  }
8
 
9
+ use AIOSEO\Plugin\Common\ImportExport;
10
+
11
+ class SeoPress extends ImportExport\Importer {
12
  /**
13
+ * A list of plugins to look for to import.
14
  *
15
+ * @since 4.1.4
16
  *
17
+ * @var array
18
+ */
19
+ public $plugins = [
20
+ [
21
+ 'name' => 'SEOPress',
22
+ 'version' => '4.0',
23
+ 'basename' => 'wp-seopress/seopress.php',
24
+ 'slug' => 'seopress'
25
+ ],
26
+ [
27
+ 'name' => 'SEOPress PRO',
28
+ 'version' => '4.0',
29
+ 'basename' => 'wp-seopress-pro/seopress-pro.php',
30
+ 'slug' => 'seopress-pro'
31
+ ],
32
+ ];
33
+
34
+ /**
35
+ * The post action name.
36
+ *
37
+ * @since 4.1.4
38
+ *
39
+ * @var string
40
  */
41
+ public $postActionName = 'aioseo_import_post_meta_seopress';
42
+
43
+ /**
44
+ * The post action name.
45
+ *
46
+ * @since 4.1.4
47
+ *
48
+ * @param ImportExport $importer The main importer class.
49
+ */
50
+ public function __construct( $importer ) {
51
+ $this->helpers = new Helpers();
52
+ $this->postMeta = new PostMeta();
53
+ add_action( $this->postActionName, [ $this->postMeta, 'importPostMeta' ] );
54
+
55
+ $plugins = $this->plugins;
56
+ foreach ( $plugins as $key => $plugin ) {
57
+ $plugins[ $key ]['class'] = $this;
58
+ }
59
+ $importer->addPlugins( $plugins );
60
  }
61
 
62
  /**
63
  * Imports the settings.
64
  *
65
+ * @since 4.1.4
66
  *
67
  * @return void
68
  */
69
+ protected function importSettings() {
70
+ new GeneralSettings();
71
+ new Analytics();
72
+ new SocialMeta();
73
+ new Titles();
74
+ new Sitemap();
75
+ new RobotsTxt();
76
+ new Rss();
77
+ new Breadcrumbs();
78
  }
79
  }
app/Common/ImportExport/SeoPress/Sitemap.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\ImportExport\SeoPress;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
10
+
11
+ /**
12
+ * Migrates the Sitemap Settings.
13
+ *
14
+ * @since 4.1.4
15
+ */
16
+ class Sitemap {
17
+ /**
18
+ * Class constructor.
19
+ *
20
+ * @since 4.1.4
21
+ */
22
+ public function __construct() {
23
+ $this->options = get_option( 'seopress_xml_sitemap_option_name' );
24
+ if ( empty( $this->options ) ) {
25
+ return;
26
+ }
27
+
28
+ $this->migratePostTypesInclude();
29
+ $this->migrateTaxonomiesInclude();
30
+
31
+ $settings = [
32
+ 'seopress_xml_sitemap_general_enable' => [ 'type' => 'boolean', 'newOption' => [ 'sitemap', 'general', 'enable' ] ],
33
+ 'seopress_xml_sitemap_author_enable' => [ 'type' => 'boolean', 'newOption' => [ 'sitemap', 'general', 'author' ] ],
34
+ ];
35
+
36
+ aioseo()->importExport->seoPress->helpers->mapOldToNew( $settings, $this->options );
37
+ }
38
+
39
+ /**
40
+ * Migrates the post types to include in sitemap settings.
41
+ *
42
+ * @since 4.1.4
43
+ *
44
+ * @return void
45
+ */
46
+ public function migratePostTypesInclude() {
47
+ $postTypesMigrate = $this->options['seopress_xml_sitemap_post_types_list'];
48
+ $postTypesInclude = [];
49
+
50
+ foreach ( $postTypesMigrate as $postType => $options ) {
51
+ $postTypesInclude[] = $postType;
52
+ }
53
+
54
+ aioseo()->options->sitemap->general->postTypes->included = $postTypesInclude;
55
+ }
56
+
57
+ /**
58
+ * Migrates the taxonomies to include in sitemap settings.
59
+ *
60
+ * @since 4.1.4
61
+ *
62
+ * @return void
63
+ */
64
+ public function migrateTaxonomiesInclude() {
65
+ $taxonomiesMigrate = $this->options['seopress_xml_sitemap_taxonomies_list'];
66
+ $taxonomiesInclude = [];
67
+
68
+ foreach ( $taxonomiesMigrate as $taxonomy => $options ) {
69
+ $taxonomiesInclude[] = $taxonomy;
70
+ }
71
+
72
+ aioseo()->options->sitemap->general->taxonomies->included = $taxonomiesInclude;
73
+ }
74
+ }
app/Common/ImportExport/SeoPress/SocialMeta.php ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\ImportExport\SeoPress;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
10
+
11
+ /**
12
+ * Migrates the Social Meta Settings.
13
+ *
14
+ * @since 4.1.4
15
+ */
16
+ class SocialMeta {
17
+ /**
18
+ * Class constructor.
19
+ *
20
+ * @since 4.1.4
21
+ */
22
+ public function __construct() {
23
+ $this->options = get_option( 'seopress_social_option_name' );
24
+ if ( empty( $this->options ) ) {
25
+ return;
26
+ }
27
+
28
+ $this->migrateSocialUrls();
29
+ $this->migrateKnowledge();
30
+ $this->migrateFacebookSettings();
31
+ $this->migrateTwitterSettings();
32
+ }
33
+
34
+ /**
35
+ * Migrates Basic Social Profiles URLs.
36
+ *
37
+ * @since 4.1.4
38
+ *
39
+ * @return void
40
+ */
41
+ private function migrateSocialUrls() {
42
+ $settings = [
43
+ 'seopress_social_accounts_facebook' => [ 'type' => 'string', 'newOption' => [ 'social', 'profiles', 'urls', 'facebookPageUrl' ] ],
44
+ 'seopress_social_accounts_twitter' => [ 'type' => 'string', 'newOption' => [ 'social', 'profiles', 'urls', 'twitterUrl' ] ],
45
+ 'seopress_social_accounts_pinterest' => [ 'type' => 'string', 'newOption' => [ 'social', 'profiles', 'urls', 'pinterestUrl' ] ],
46
+ 'seopress_social_accounts_instagram' => [ 'type' => 'string', 'newOption' => [ 'social', 'profiles', 'urls', 'instagramUrl' ] ],
47
+ 'seopress_social_accounts_youtube' => [ 'type' => 'string', 'newOption' => [ 'social', 'profiles', 'urls', 'youtubeUrl' ] ],
48
+ 'seopress_social_accounts_linkedin' => [ 'type' => 'string', 'newOption' => [ 'social', 'profiles', 'urls', 'linkedinUrl' ] ],
49
+ 'seopress_social_accounts_myspace' => [ 'type' => 'string', 'newOption' => [ 'social', 'profiles', 'urls', 'myspaceUrl' ] ],
50
+ 'seopress_social_accounts_soundcloud' => [ 'type' => 'string', 'newOption' => [ 'social', 'profiles', 'urls', 'soundCloudUrl' ] ],
51
+ 'seopress_social_accounts_tumblr' => [ 'type' => 'string', 'newOption' => [ 'social', 'profiles', 'urls', 'tumblrUrl' ] ],
52
+ ];
53
+
54
+ aioseo()->importExport->seoPress->helpers->mapOldToNew( $settings, $this->options );
55
+ }
56
+
57
+ /**
58
+ * Migrates Knowledge Graph data.
59
+ *
60
+ * @since 4.1.4
61
+ *
62
+ * @return void
63
+ */
64
+ private function migrateKnowledge() {
65
+ $type = 'organization';
66
+ if ( ! empty( $this->options['seopress_social_knowledge_type'] ) ) {
67
+ $type = strtolower( $this->options['seopress_social_knowledge_type'] );
68
+ if ( 'person' === $type ) {
69
+ aioseo()->options->searchAppearance->global->schema->person = 'manual';
70
+ }
71
+ }
72
+
73
+ aioseo()->options->searchAppearance->global->schema->siteRepresents = $type;
74
+
75
+ if ( ! empty( $this->options['seopress_social_knowledge_contact_type'] ) ) {
76
+ aioseo()->options->searchAppearance->global->schema->contactType = ucwords( $this->options['seopress_social_knowledge_contact_type'] );
77
+ }
78
+
79
+ $settings = [
80
+ 'seopress_social_knowledge_img' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'global', 'schema', $type . 'Logo' ] ],
81
+ 'seopress_social_knowledge_name' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'global', 'schema', $type . 'Name' ] ],
82
+ 'seopress_social_knowledge_phone' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'global', 'schema', 'phone' ] ],
83
+ ];
84
+
85
+ aioseo()->importExport->seoPress->helpers->mapOldToNew( $settings, $this->options );
86
+ }
87
+
88
+ /**
89
+ * Migrates the Facebook settings.
90
+ *
91
+ * @since 4.1.4
92
+ *
93
+ * @return void
94
+ */
95
+ private function migrateFacebookSettings() {
96
+ if ( ! empty( $this->options['seopress_social_facebook_admin_id'] ) || ! empty( $this->options['seopress_social_facebook_app_id'] ) ) {
97
+ aioseo()->options->social->facebook->advanced->enable = true;
98
+ }
99
+
100
+ $settings = [
101
+ 'seopress_social_facebook_og' => [ 'type' => 'boolean', 'newOption' => [ 'social', 'facebook', 'general', 'enable' ] ],
102
+ 'seopress_social_facebook_img' => [ 'type' => 'string', 'newOption' => [ 'social', 'facebook', 'homePage', 'image' ] ],
103
+ 'seopress_social_facebook_admin_id' => [ 'type' => 'string', 'newOption' => [ 'social', 'facebook', 'advanced', 'adminId' ] ],
104
+ 'seopress_social_facebook_app_id' => [ 'type' => 'string', 'newOption' => [ 'social', 'facebook', 'advanced', 'appId' ] ],
105
+ ];
106
+
107
+ aioseo()->importExport->seoPress->helpers->mapOldToNew( $settings, $this->options );
108
+ }
109
+
110
+ /**
111
+ * Migrates the Twitter settings.
112
+ *
113
+ * @since 4.1.4
114
+ *
115
+ * @return void
116
+ */
117
+ private function migrateTwitterSettings() {
118
+ if ( ! empty( $this->options['seopress_social_twitter_card_img_size'] ) ) {
119
+ $twitterCard = ( 'large' === $this->options['seopress_social_twitter_card_img_size'] ) ? 'summary-card' : 'summary';
120
+ aioseo()->options->social->twitter->general->defaultCardType = $twitterCard;
121
+ }
122
+
123
+ $settings = [
124
+ 'seopress_social_twitter_card' => [ 'type' => 'boolean', 'newOption' => [ 'social', 'twitter', 'general', 'enable' ] ],
125
+ 'seopress_social_twitter_card_img' => [ 'type' => 'string', 'newOption' => [ 'social', 'twitter', 'homePage', 'image' ] ],
126
+ ];
127
+
128
+ aioseo()->importExport->seoPress->helpers->mapOldToNew( $settings, $this->options );
129
+ }
130
+ }
app/Common/ImportExport/SeoPress/Titles.php ADDED
@@ -0,0 +1,288 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\ImportExport\SeoPress;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
10
+
11
+ /**
12
+ * Migrates the Titles Settings.
13
+ *
14
+ * @since 4.1.4
15
+ */
16
+ class Titles {
17
+ /**
18
+ * Class constructor.
19
+ *
20
+ * @since 4.1.4
21
+ */
22
+ public function __construct() {
23
+ $this->options = get_option( 'seopress_titles_option_name' );
24
+ if ( empty( $this->options ) ) {
25
+ return;
26
+ }
27
+
28
+ if (
29
+ ! empty( $this->options['seopress_titles_archives_author_title'] ) ||
30
+ ! empty( $this->options['seopress_titles_archives_author_desc'] ) ||
31
+ ! empty( $this->options['seopress_titles_archives_author_noindex'] )
32
+ ) {
33
+ aioseo()->options->searchAppearance->archives->author->show = true;
34
+ }
35
+
36
+ if (
37
+ ! empty( $this->options['seopress_titles_archives_date_title'] ) ||
38
+ ! empty( $this->options['seopress_titles_archives_date_desc'] ) ||
39
+ ! empty( $this->options['seopress_titles_archives_date_noindex'] )
40
+ ) {
41
+ aioseo()->options->searchAppearance->archives->date->show = true;
42
+ }
43
+
44
+ if (
45
+ ! empty( $this->options['seopress_titles_archives_search_title'] ) ||
46
+ ! empty( $this->options['seopress_titles_archives_search_desc'] )
47
+ ) {
48
+ aioseo()->options->searchAppearance->archives->search->show = true;
49
+ }
50
+
51
+ $this->migrateTitleFormats();
52
+ $this->migrateDescriptionFormats();
53
+ $this->migrateNoIndexFormats();
54
+ $this->migratePostTypeSettings();
55
+ $this->migrateTaxonomiesSettings();
56
+ $this->migrateArchiveSettings();
57
+ $this->migrateAdvancedSettings();
58
+
59
+ $settings = [
60
+ 'seopress_titles_sep' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'global', 'separator' ] ],
61
+ ];
62
+
63
+ aioseo()->importExport->seoPress->helpers->mapOldToNew( $settings, $this->options, true );
64
+ }
65
+
66
+ /**
67
+ * Migrates the title formats.
68
+ *
69
+ * @since 4.1.4
70
+ *
71
+ * @return void
72
+ */
73
+ private function migrateTitleFormats() {
74
+ $settings = [
75
+ 'seopress_titles_home_site_title' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'global', 'siteTitle' ] ],
76
+ 'seopress_titles_archives_author_title' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'archives', 'author', 'title' ] ],
77
+ 'seopress_titles_archives_date_title' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'archives', 'date', 'title' ] ],
78
+ 'seopress_titles_archives_search_title' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'archives', 'search', 'title' ] ],
79
+ ];
80
+
81
+ aioseo()->importExport->seoPress->helpers->mapOldToNew( $settings, $this->options, true );
82
+ }
83
+
84
+ /**
85
+ * Migrates the description formats.
86
+ *
87
+ * @since 4.1.4
88
+ *
89
+ * @return void
90
+ */
91
+ private function migrateDescriptionFormats() {
92
+ $settings = [
93
+ 'seopress_titles_home_site_desc' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'global', 'metaDescription' ] ],
94
+ 'seopress_titles_archives_author_desc' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'archives', 'author', 'metaDescription' ] ],
95
+ 'seopress_titles_archives_date_desc' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'archives', 'date', 'metaDescription' ] ],
96
+ 'seopress_titles_archives_search_desc' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'archives', 'search', 'metaDescription' ] ],
97
+ ];
98
+
99
+ aioseo()->importExport->seoPress->helpers->mapOldToNew( $settings, $this->options, true );
100
+ }
101
+
102
+ /**
103
+ * Migrates the NoIndex formats.
104
+ *
105
+ * @since 4.1.4
106
+ *
107
+ * @return void
108
+ */
109
+ private function migrateNoIndexFormats() {
110
+ $settings = [
111
+ 'seopress_titles_archives_author_noindex' => [ 'type' => 'boolean', 'newOption' => [ 'searchAppearance', 'archives', 'author', 'show' ] ],
112
+ 'seopress_titles_archives_date_noindex' => [ 'type' => 'boolean', 'newOption' => [ 'searchAppearance', 'archives', 'date', 'show' ] ],
113
+ ];
114
+
115
+ aioseo()->importExport->seoPress->helpers->mapOldToNew( $settings, $this->options );
116
+ }
117
+
118
+ /**
119
+ * Migrates the post type settings.
120
+ *
121
+ * @since 4.1.4
122
+ *
123
+ * @return void
124
+ */
125
+ private function migratePostTypeSettings() {
126
+ $titles = $this->options['seopress_titles_single_titles'];
127
+ if ( empty( $titles ) ) {
128
+ return;
129
+ }
130
+
131
+ foreach ( $titles as $postType => $options ) {
132
+ if ( ! aioseo()->dynamicOptions->searchAppearance->postTypes->has( $postType ) ) {
133
+ continue;
134
+ }
135
+
136
+ if ( ! empty( $options['title'] ) ) {
137
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->title =
138
+ aioseo()->helpers->sanitizeOption( aioseo()->importExport->seoPress->helpers->macrosToSmartTags( $options['title'] ) );
139
+ }
140
+
141
+ if ( ! empty( $options['description'] ) ) {
142
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->metaDescription =
143
+ aioseo()->helpers->sanitizeOption( aioseo()->importExport->seoPress->helpers->macrosToSmartTags( $options['description'] ) );
144
+ }
145
+
146
+ if ( ! empty( $options['enable'] ) ) {
147
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->showMetaBox = false;
148
+ }
149
+
150
+ if ( ! empty( $options['noindex'] ) ) {
151
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->show = false;
152
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->default = false;
153
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->noindex = true;
154
+ }
155
+
156
+ if ( ! empty( $options['nofollow'] ) ) {
157
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->show = false;
158
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->default = false;
159
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->nofollow = true;
160
+ }
161
+
162
+ if ( ! empty( $options['date'] ) ) {
163
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->showDateInGooglePreview = false;
164
+ }
165
+
166
+ if ( ! empty( $options['thumb_gcs'] ) ) {
167
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->showPostThumbnailInSearch = true;
168
+ }
169
+ }
170
+ }
171
+
172
+ /**
173
+ * Migrates the taxonomies settings.
174
+ *
175
+ * @since 4.1.4
176
+ *
177
+ * @return void
178
+ */
179
+ private function migrateTaxonomiesSettings() {
180
+ $titles = $this->options['seopress_titles_tax_titles'];
181
+ if ( empty( $titles ) ) {
182
+ return;
183
+ }
184
+
185
+ foreach ( $titles as $taxonomy => $options ) {
186
+ if ( ! aioseo()->dynamicOptions->searchAppearance->taxonomies->has( $taxonomy ) ) {
187
+ continue;
188
+ }
189
+
190
+ if ( ! empty( $options['title'] ) ) {
191
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->$taxonomy->title =
192
+ aioseo()->helpers->sanitizeOption( aioseo()->importExport->seoPress->helpers->macrosToSmartTags( $options['title'] ) );
193
+ }
194
+
195
+ if ( ! empty( $options['description'] ) ) {
196
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->$taxonomy->metaDescription =
197
+ aioseo()->helpers->sanitizeOption( aioseo()->importExport->seoPress->helpers->macrosToSmartTags( $options['description'] ) );
198
+ }
199
+
200
+ if ( ! empty( $options['enable'] ) ) {
201
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->$taxonomy->advanced->showMetaBox = false;
202
+ }
203
+
204
+ if ( ! empty( $options['noindex'] ) ) {
205
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->$taxonomy->show = false;
206
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->$taxonomy->advanced->robotsMeta->default = false;
207
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->$taxonomy->advanced->robotsMeta->noindex = true;
208
+ }
209
+
210
+ if ( ! empty( $options['nofollow'] ) ) {
211
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->$taxonomy->show = false;
212
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->$taxonomy->advanced->robotsMeta->default = false;
213
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->$taxonomy->advanced->robotsMeta->nofollow = true;
214
+ }
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Migrates the archives settings.
220
+ *
221
+ * @since 4.1.4
222
+ *
223
+ * @return void
224
+ */
225
+ private function migrateArchiveSettings() {
226
+ $titles = $this->options['seopress_titles_archive_titles'];
227
+ if ( empty( $titles ) ) {
228
+ return;
229
+ }
230
+
231
+ foreach ( $titles as $archive => $options ) {
232
+ if ( ! aioseo()->dynamicOptions->searchAppearance->archives->has( $archive ) ) {
233
+ continue;
234
+ }
235
+
236
+ if ( ! empty( $options['title'] ) ) {
237
+ aioseo()->dynamicOptions->searchAppearance->archives->$archive->title =
238
+ aioseo()->helpers->sanitizeOption( aioseo()->importExport->seoPress->helpers->macrosToSmartTags( $options['title'] ) );
239
+ }
240
+
241
+ if ( ! empty( $options['description'] ) ) {
242
+ aioseo()->dynamicOptions->searchAppearance->archives->$archive->metaDescription =
243
+ aioseo()->helpers->sanitizeOption( aioseo()->importExport->seoPress->helpers->macrosToSmartTags( $options['description'] ) );
244
+ }
245
+
246
+ if ( ! empty( $options['noindex'] ) ) {
247
+ aioseo()->dynamicOptions->searchAppearance->archives->$archive->show = false;
248
+ aioseo()->dynamicOptions->searchAppearance->archives->$archive->advanced->robotsMeta->default = false;
249
+ aioseo()->dynamicOptions->searchAppearance->archives->$archive->advanced->robotsMeta->noindex = true;
250
+ }
251
+
252
+ if ( ! empty( $options['nofollow'] ) ) {
253
+ aioseo()->dynamicOptions->searchAppearance->archives->$archive->show = false;
254
+ aioseo()->dynamicOptions->searchAppearance->archives->$archive->advanced->robotsMeta->default = false;
255
+ aioseo()->dynamicOptions->searchAppearance->archives->$archive->advanced->robotsMeta->nofollow = true;
256
+ }
257
+ }
258
+ }
259
+
260
+ /**
261
+ * Migrates the advanced settings.
262
+ *
263
+ * @since 4.1.4
264
+ *
265
+ * @return void
266
+ */
267
+ private function migrateAdvancedSettings() {
268
+ if (
269
+ ! empty( $this->options['seopress_titles_noindex'] ) || ! empty( $this->options['seopress_titles_nofollow'] ) || ! empty( $this->options['seopress_titles_noodp'] ) ||
270
+ ! empty( $this->options['seopress_titles_noimageindex'] ) || ! empty( $this->options['seopress_titles_noarchive'] ) ||
271
+ ! empty( $this->options['seopress_titles_nosnippet'] ) || ! empty( $this->options['seopress_titles_paged_noindex'] )
272
+ ) {
273
+ aioseo()->options->searchAppearance->advanced->globalRobotsMeta->default = false;
274
+ }
275
+
276
+ $settings = [
277
+ 'seopress_titles_noindex' => [ 'type' => 'boolean', 'newOption' => [ 'searchAppearance', 'advanced', 'globalRobotsMeta', 'noindex' ] ],
278
+ 'seopress_titles_nofollow' => [ 'type' => 'boolean', 'newOption' => [ 'searchAppearance', 'advanced', 'globalRobotsMeta', 'nofollow' ] ],
279
+ 'seopress_titles_noodp' => [ 'type' => 'boolean', 'newOption' => [ 'searchAppearance', 'advanced', 'globalRobotsMeta', 'noodp' ] ],
280
+ 'seopress_titles_noimageindex' => [ 'type' => 'boolean', 'newOption' => [ 'searchAppearance', 'advanced', 'globalRobotsMeta', 'noimageindex' ] ],
281
+ 'seopress_titles_noarchive' => [ 'type' => 'boolean', 'newOption' => [ 'searchAppearance', 'advanced', 'globalRobotsMeta', 'noarchive' ] ],
282
+ 'seopress_titles_nosnippet' => [ 'type' => 'boolean', 'newOption' => [ 'searchAppearance', 'advanced', 'globalRobotsMeta', 'nosnippet' ] ],
283
+ 'seopress_titles_paged_noindex' => [ 'type' => 'boolean', 'newOption' => [ 'searchAppearance', 'advanced', 'globalRobotsMeta', 'noindexPaginated' ] ],
284
+ ];
285
+
286
+ aioseo()->importExport->seoPress->helpers->mapOldToNew( $settings, $this->options );
287
+ }
288
+ }
app/Common/ImportExport/YoastSeo/GeneralSettings.php CHANGED
@@ -25,8 +25,6 @@ class GeneralSettings {
25
  return;
26
  }
27
 
28
- $this->checkIfTrueSeoIsDisabled();
29
-
30
  $settings = [
31
  'googleverify' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'google' ] ],
32
  'msverify' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'bing' ] ],
@@ -37,21 +35,4 @@ class GeneralSettings {
37
 
38
  aioseo()->importExport->yoastSeo->helpers->mapOldToNew( $settings, $this->options );
39
  }
40
-
41
- /**
42
- * Checks if TrueSEO should be disabled.
43
- *
44
- * @since 4.0.0
45
- *
46
- * @return void
47
- */
48
- private function checkIfTrueSeoIsDisabled() {
49
- if ( ! isset( $this->options['content_analysis_active'] ) || ! isset( $this->options['keyword_analysis_active'] ) ) {
50
- return;
51
- }
52
-
53
- if ( ! $this->options['content_analysis_active'] && ! $this->options['keyword_analysis_active'] ) {
54
- aioseo()->options->advanced->truSeo = false;
55
- }
56
- }
57
  }
25
  return;
26
  }
27
 
 
 
28
  $settings = [
29
  'googleverify' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'google' ] ],
30
  'msverify' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'bing' ] ],
35
 
36
  aioseo()->importExport->yoastSeo->helpers->mapOldToNew( $settings, $this->options );
37
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  }
app/Common/ImportExport/YoastSeo/PostMeta.php CHANGED
@@ -53,9 +53,7 @@ class PostMeta {
53
  $posts = aioseo()->db
54
  ->start( 'posts' . ' as p' )
55
  ->select( 'p.ID, p.post_type' )
56
- ->join( 'postmeta as pm', '`p`.`ID` = `pm`.`post_id`' )
57
  ->leftJoin( 'aioseo_posts as ap', '`p`.`ID` = `ap`.`post_id`' )
58
- ->whereRaw( "pm.meta_key LIKE '_yoast_wpseo_%'" )
59
  ->whereRaw( "( p.post_type IN ( '$publicPostTypes' ) )" )
60
  ->whereRaw( "( ap.post_id IS NULL OR ap.updated < '$timeStarted' )" )
61
  ->orderBy( 'p.ID DESC' )
@@ -84,7 +82,8 @@ class PostMeta {
84
  '_yoast_wpseo_twitter-description' => 'twitter_description',
85
  '_yoast_wpseo_twitter-image' => 'twitter_image_custom_url',
86
  '_yoast_wpseo_schema_page_type' => '',
87
- '_yoast_wpseo_schema_article_type' => ''
 
88
  ];
89
 
90
  foreach ( $posts as $post ) {
@@ -96,14 +95,25 @@ class PostMeta {
96
  ->run()
97
  ->result();
98
 
 
 
 
 
 
 
 
 
 
99
  if ( ! $postMeta || ! count( $postMeta ) ) {
 
 
 
 
 
100
  continue;
101
  }
102
 
103
- $meta = [
104
- 'post_id' => (int) $post->ID,
105
- ];
106
-
107
  foreach ( $postMeta as $record ) {
108
  $name = $record->meta_key;
109
  $value = $record->meta_value;
@@ -113,6 +123,17 @@ class PostMeta {
113
  }
114
 
115
  switch ( $name ) {
 
 
 
 
 
 
 
 
 
 
 
116
  case '_yoast_wpseo_meta-robots-noindex':
117
  case '_yoast_wpseo_meta-robots-nofollow':
118
  if ( (bool) $value ) {
@@ -205,20 +226,39 @@ class PostMeta {
205
  case '_yoast_wpseo_metadesc':
206
  case '_yoast_wpseo_opengraph-title':
207
  case '_yoast_wpseo_opengraph-description':
 
 
208
  if ( 'page' === $post->post_type ) {
209
  $value = aioseo()->helpers->pregReplace( '#%%primary_category%%#', '', $value );
210
  $value = aioseo()->helpers->pregReplace( '#%%excerpt%%#', '', $value );
211
  }
 
 
 
 
 
212
  $value = aioseo()->importExport->yoastSeo->helpers->macrosToSmartTags( $value, 'post', $post->post_type );
 
 
 
 
213
  default:
214
  $meta[ $mappedMeta[ $name ] ] = esc_html( wp_strip_all_tags( strval( $value ) ) );
215
  break;
216
  }
217
  }
218
 
 
 
 
 
 
 
219
  $aioseoPost = Models\Post::getPost( (int) $post->ID );
220
  $aioseoPost->set( $meta );
221
  $aioseoPost->save();
 
 
222
  }
223
 
224
  if ( count( $posts ) === $postsPerAction ) {
53
  $posts = aioseo()->db
54
  ->start( 'posts' . ' as p' )
55
  ->select( 'p.ID, p.post_type' )
 
56
  ->leftJoin( 'aioseo_posts as ap', '`p`.`ID` = `ap`.`post_id`' )
 
57
  ->whereRaw( "( p.post_type IN ( '$publicPostTypes' ) )" )
58
  ->whereRaw( "( ap.post_id IS NULL OR ap.updated < '$timeStarted' )" )
59
  ->orderBy( 'p.ID DESC' )
82
  '_yoast_wpseo_twitter-description' => 'twitter_description',
83
  '_yoast_wpseo_twitter-image' => 'twitter_image_custom_url',
84
  '_yoast_wpseo_schema_page_type' => '',
85
+ '_yoast_wpseo_schema_article_type' => '',
86
+ '_yoast_wpseo_primary_category' => 'og_article_section'
87
  ];
88
 
89
  foreach ( $posts as $post ) {
95
  ->run()
96
  ->result();
97
 
98
+ $categories = aioseo()->helpers->getAllCategories( $post->ID );
99
+ $featuredImage = get_the_post_thumbnail_url( $post->ID );
100
+ $meta = [
101
+ 'post_id' => (int) $post->ID,
102
+ 'twitter_use_og' => true,
103
+ 'og_image_type' => $featuredImage ? 'featured' : 'content',
104
+ 'og_article_section' => ! empty( $categories ) ? $categories[0] : null
105
+ ];
106
+
107
  if ( ! $postMeta || ! count( $postMeta ) ) {
108
+ $aioseoPost = Models\Post::getPost( (int) $post->ID );
109
+ $aioseoPost->set( $meta );
110
+ $aioseoPost->save();
111
+
112
+ aioseo()->migration->meta->migrateAdditionalPostMeta( $post->ID );
113
  continue;
114
  }
115
 
116
+ $title = '';
 
 
 
117
  foreach ( $postMeta as $record ) {
118
  $name = $record->meta_key;
119
  $value = $record->meta_value;
123
  }
124
 
125
  switch ( $name ) {
126
+ case '_yoast_wpseo_primary_category':
127
+ $primaryCategory = get_cat_name( $value );
128
+ foreach ( $categories as $category ) {
129
+ if ( aioseo()->helpers->toLowerCase( $primaryCategory ) === aioseo()->helpers->toLowerCase( $category ) ) {
130
+ $meta[ $mappedMeta[ $name ] ] = $category;
131
+ break 2;
132
+ }
133
+ }
134
+
135
+ $meta[ $mappedMeta[ $name ] ] = ! empty( $categories ) ? $categories[0] : ( ! empty( $primaryCategory ) ? $primaryCategory : '' );
136
+ break;
137
  case '_yoast_wpseo_meta-robots-noindex':
138
  case '_yoast_wpseo_meta-robots-nofollow':
139
  if ( (bool) $value ) {
226
  case '_yoast_wpseo_metadesc':
227
  case '_yoast_wpseo_opengraph-title':
228
  case '_yoast_wpseo_opengraph-description':
229
+ case '_yoast_wpseo_twitter-title':
230
+ case '_yoast_wpseo_twitter-description':
231
  if ( 'page' === $post->post_type ) {
232
  $value = aioseo()->helpers->pregReplace( '#%%primary_category%%#', '', $value );
233
  $value = aioseo()->helpers->pregReplace( '#%%excerpt%%#', '', $value );
234
  }
235
+
236
+ if ( '_yoast_wpseo_twitter-title' === $name || '_yoast_wpseo_twitter-description' === $name ) {
237
+ $meta['twitter_use_og'] = false;
238
+ }
239
+
240
  $value = aioseo()->importExport->yoastSeo->helpers->macrosToSmartTags( $value, 'post', $post->post_type );
241
+
242
+ if ( '_yoast_wpseo_title' === $name ) {
243
+ $title = $value;
244
+ }
245
  default:
246
  $meta[ $mappedMeta[ $name ] ] = esc_html( wp_strip_all_tags( strval( $value ) ) );
247
  break;
248
  }
249
  }
250
 
251
+ // Resetting the `twitter_use_og` option if the user has a custom title and no twitter title.
252
+ if ( $meta['twitter_use_og'] && $title && empty( $meta['twitter_title'] ) ) {
253
+ $meta['twitter_use_og'] = false;
254
+ $meta['twitter_title'] = $title;
255
+ }
256
+
257
  $aioseoPost = Models\Post::getPost( (int) $post->ID );
258
  $aioseoPost->set( $meta );
259
  $aioseoPost->save();
260
+
261
+ aioseo()->migration->meta->migrateAdditionalPostMeta( $post->ID );
262
  }
263
 
264
  if ( count( $posts ) === $postsPerAction ) {
app/Common/ImportExport/YoastSeo/SearchAppearance.php CHANGED
@@ -161,7 +161,7 @@ class SearchAppearance {
161
  $value = aioseo()->helpers->pregReplace( '#%%primary_category%%#', '', $value );
162
  $value = aioseo()->helpers->pregReplace( '#%%excerpt%%#', '', $value );
163
  }
164
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->title =
165
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->yoastSeo->helpers->macrosToSmartTags( $value, $postType ) );
166
  break;
167
  case 'metadesc':
@@ -169,17 +169,17 @@ class SearchAppearance {
169
  $value = aioseo()->helpers->pregReplace( '#%%primary_category%%#', '', $value );
170
  $value = aioseo()->helpers->pregReplace( '#%%excerpt%%#', '', $value );
171
  }
172
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->metaDescription =
173
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->yoastSeo->helpers->macrosToSmartTags( $value, $postType ) );
174
  break;
175
  case 'noindex':
176
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->show = empty( $value ) ? true : false;
177
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->default = empty( $value ) ? true : false;
178
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->noindex = empty( $value ) ? false : true;
179
  break;
180
  case 'display-metabox-pt':
181
  if ( empty( $value ) ) {
182
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->advanced->showMetaBox = false;
183
  }
184
  break;
185
  case 'schema-page-type':
@@ -187,25 +187,25 @@ class SearchAppearance {
187
  if ( in_array( $postType, [ 'post', 'page', 'attachment' ], true ) ) {
188
  break;
189
  }
190
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->schemaType = 'WebPage';
191
  if ( in_array( $value, ImportExport\SearchAppearance::$supportedWebPageGraphs, true ) ) {
192
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->webPageType = $value;
193
  }
194
  break;
195
  case 'schema-article-type':
196
  $value = aioseo()->helpers->pregReplace( '#\s#', '', $value );
197
  if ( 'none' === lcfirst( $value ) ) {
198
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->articleType = 'none';
199
  break;
200
  }
201
 
202
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->articleType = 'Article';
203
  if ( in_array( $value, ImportExport\SearchAppearance::$supportedArticleGraphs, true ) ) {
204
  if ( ! in_array( $postType, [ 'page', 'attachment' ], true ) ) {
205
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->articleType = $value;
206
  }
207
  } else {
208
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->articleType = 'BlogPosting';
209
  }
210
  break;
211
  default:
@@ -237,17 +237,17 @@ class SearchAppearance {
237
 
238
  switch ( $match[1] ) {
239
  case 'title':
240
- aioseo()->options->searchAppearance->dynamic->archives->$postType->title =
241
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->yoastSeo->helpers->macrosToSmartTags( $value, $postType, 'archive' ) );
242
  break;
243
  case 'metadesc':
244
- aioseo()->options->searchAppearance->dynamic->archives->$postType->metaDescription =
245
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->yoastSeo->helpers->macrosToSmartTags( $value, $postType, 'archive' ) );
246
  break;
247
  case 'noindex':
248
- aioseo()->options->searchAppearance->dynamic->archives->$postType->show = empty( $value ) ? true : false;
249
- aioseo()->options->searchAppearance->dynamic->archives->$postType->advanced->robotsMeta->default = empty( $value ) ? true : false;
250
- aioseo()->options->searchAppearance->dynamic->archives->$postType->advanced->robotsMeta->noindex = empty( $value ) ? false : true;
251
  break;
252
  default:
253
  break;
@@ -305,6 +305,6 @@ class SearchAppearance {
305
  * @return void
306
  */
307
  private function migrateRedirectAttachments() {
308
- aioseo()->options->searchAppearance->dynamic->postTypes->attachment->redirectAttachmentUrls = empty( $this->options['disable-attachment'] ) ? 'disabled' : 'attachment';
309
  }
310
  }
161
  $value = aioseo()->helpers->pregReplace( '#%%primary_category%%#', '', $value );
162
  $value = aioseo()->helpers->pregReplace( '#%%excerpt%%#', '', $value );
163
  }
164
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->title =
165
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->yoastSeo->helpers->macrosToSmartTags( $value, $postType ) );
166
  break;
167
  case 'metadesc':
169
  $value = aioseo()->helpers->pregReplace( '#%%primary_category%%#', '', $value );
170
  $value = aioseo()->helpers->pregReplace( '#%%excerpt%%#', '', $value );
171
  }
172
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->metaDescription =
173
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->yoastSeo->helpers->macrosToSmartTags( $value, $postType ) );
174
  break;
175
  case 'noindex':
176
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->show = empty( $value ) ? true : false;
177
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->default = empty( $value ) ? true : false;
178
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->noindex = empty( $value ) ? false : true;
179
  break;
180
  case 'display-metabox-pt':
181
  if ( empty( $value ) ) {
182
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->showMetaBox = false;
183
  }
184
  break;
185
  case 'schema-page-type':
187
  if ( in_array( $postType, [ 'post', 'page', 'attachment' ], true ) ) {
188
  break;
189
  }
190
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->schemaType = 'WebPage';
191
  if ( in_array( $value, ImportExport\SearchAppearance::$supportedWebPageGraphs, true ) ) {
192
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->webPageType = $value;
193
  }
194
  break;
195
  case 'schema-article-type':
196
  $value = aioseo()->helpers->pregReplace( '#\s#', '', $value );
197
  if ( 'none' === lcfirst( $value ) ) {
198
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->articleType = 'none';
199
  break;
200
  }
201
 
202
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->articleType = 'Article';
203
  if ( in_array( $value, ImportExport\SearchAppearance::$supportedArticleGraphs, true ) ) {
204
  if ( ! in_array( $postType, [ 'page', 'attachment' ], true ) ) {
205
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->articleType = $value;
206
  }
207
  } else {
208
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->articleType = 'BlogPosting';
209
  }
210
  break;
211
  default:
237
 
238
  switch ( $match[1] ) {
239
  case 'title':
240
+ aioseo()->dynamicOptions->searchAppearance->archives->$postType->title =
241
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->yoastSeo->helpers->macrosToSmartTags( $value, $postType, 'archive' ) );
242
  break;
243
  case 'metadesc':
244
+ aioseo()->dynamicOptions->searchAppearance->archives->$postType->metaDescription =
245
  aioseo()->helpers->sanitizeOption( aioseo()->importExport->yoastSeo->helpers->macrosToSmartTags( $value, $postType, 'archive' ) );
246
  break;
247
  case 'noindex':
248
+ aioseo()->dynamicOptions->searchAppearance->archives->$postType->show = empty( $value ) ? true : false;
249
+ aioseo()->dynamicOptions->searchAppearance->archives->$postType->advanced->robotsMeta->default = empty( $value ) ? true : false;
250
+ aioseo()->dynamicOptions->searchAppearance->archives->$postType->advanced->robotsMeta->noindex = empty( $value ) ? false : true;
251
  break;
252
  default:
253
  break;
305
  * @return void
306
  */
307
  private function migrateRedirectAttachments() {
308
+ aioseo()->dynamicOptions->searchAppearance->postTypes->attachment->redirectAttachmentUrls = empty( $this->options['disable-attachment'] ) ? 'disabled' : 'attachment';
309
  }
310
  }
app/Common/ImportExport/YoastSeo/SocialMeta.php CHANGED
@@ -6,6 +6,8 @@ if ( ! defined( 'ABSPATH' ) ) {
6
  exit;
7
  }
8
 
 
 
9
  // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
10
 
11
  /**
@@ -30,6 +32,9 @@ class SocialMeta {
30
  $this->migrateFacebookSettings();
31
  $this->migrateTwitterSettings();
32
  $this->migrateFacebookAdminId();
 
 
 
33
 
34
  $settings = [
35
  'pinterestverify' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'pinterest' ] ]
@@ -38,6 +43,13 @@ class SocialMeta {
38
  aioseo()->importExport->yoastSeo->helpers->mapOldToNew( $settings, $this->options );
39
  }
40
 
 
 
 
 
 
 
 
41
  private function migrateSocialUrls() {
42
  $settings = [
43
  'facebook_site' => [ 'type' => 'string', 'newOption' => [ 'social', 'profiles', 'urls', 'facebookPageUrl' ] ],
@@ -82,6 +94,18 @@ class SocialMeta {
82
  ];
83
 
84
  aioseo()->importExport->yoastSeo->helpers->mapOldToNew( $settings, $this->options, true );
 
 
 
 
 
 
 
 
 
 
 
 
85
  }
86
 
87
  /**
@@ -113,4 +137,41 @@ class SocialMeta {
113
  aioseo()->options->social->facebook->advanced->adminId = aioseo()->helpers->sanitizeOption( $this->options['fbadminapp'] );
114
  }
115
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  }
6
  exit;
7
  }
8
 
9
+ use AIOSEO\Plugin\Common\Models;
10
+
11
  // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
12
 
13
  /**
32
  $this->migrateFacebookSettings();
33
  $this->migrateTwitterSettings();
34
  $this->migrateFacebookAdminId();
35
+ $this->migrateSiteName();
36
+ $this->migrateArticleTags();
37
+ $this->migrateAdditionalTwitterData();
38
 
39
  $settings = [
40
  'pinterestverify' => [ 'type' => 'string', 'newOption' => [ 'webmasterTools', 'pinterest' ] ]
43
  aioseo()->importExport->yoastSeo->helpers->mapOldToNew( $settings, $this->options );
44
  }
45
 
46
+ /**
47
+ * Migrates the Social URLs.
48
+ *
49
+ * @since 4.0.0
50
+ *
51
+ * @return void
52
+ */
53
  private function migrateSocialUrls() {
54
  $settings = [
55
  'facebook_site' => [ 'type' => 'string', 'newOption' => [ 'social', 'profiles', 'urls', 'facebookPageUrl' ] ],
94
  ];
95
 
96
  aioseo()->importExport->yoastSeo->helpers->mapOldToNew( $settings, $this->options, true );
97
+
98
+ // Migrate home page object type.
99
+ aioseo()->options->social->facebook->homePage->objectType = 'website';
100
+ if ( 'page' === get_option( 'show_on_front' ) ) {
101
+ $staticHomePageId = get_option( 'page_on_front' );
102
+
103
+ $aioseoPost = Models\Post::getPost( (int) $staticHomePageId );
104
+ $aioseoPost->set( [
105
+ 'og_object_type' => 'website'
106
+ ] );
107
+ $aioseoPost->save();
108
+ }
109
  }
110
 
111
  /**
137
  aioseo()->options->social->facebook->advanced->adminId = aioseo()->helpers->sanitizeOption( $this->options['fbadminapp'] );
138
  }
139
  }
140
+
141
+ /**
142
+ * Yoast sets the og:site_name to '#site_title';
143
+ *
144
+ * @since 4.1.4
145
+ *
146
+ * @return void
147
+ */
148
+ private function migrateSiteName() {
149
+ aioseo()->options->social->facebook->general->siteName = '#site_title';
150
+ }
151
+
152
+ /**
153
+ * Yoast uses post tags by default, so we need to enable this.
154
+ *
155
+ * @since 4.1.4
156
+ *
157
+ * @return void
158
+ */
159
+ private function migrateArticleTags() {
160
+ aioseo()->options->social->facebook->advanced->enable = true;
161
+ aioseo()->options->social->facebook->advanced->generateArticleTags = true;
162
+ aioseo()->options->social->facebook->advanced->usePostTagsInTags = true;
163
+ aioseo()->options->social->facebook->advanced->useKeywordsInTags = false;
164
+ aioseo()->options->social->facebook->advanced->useCategoriesInTags = false;
165
+ }
166
+
167
+ /**
168
+ * Enable additional Twitter Data.
169
+ *
170
+ * @since 4.1.4
171
+ *
172
+ * @return void
173
+ */
174
+ private function migrateAdditionalTwitterData() {
175
+ aioseo()->options->social->twitter->general->additionalData = true;
176
+ }
177
  }
app/Common/ImportExport/YoastSeo/UserMeta.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\ImportExport\YoastSeo;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ use AIOSEO\Plugin\Common\ImportExport;
10
+ use AIOSEO\Plugin\Common\Models;
11
+
12
+ // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
13
+
14
+ /**
15
+ * Imports the user meta from Yoast SEO.
16
+ *
17
+ * @since 4.0.0
18
+ */
19
+ class UserMeta {
20
+ /**
21
+ * Class constructor.
22
+ *
23
+ * @since 4.0.0
24
+ */
25
+ public function scheduleImport() {
26
+ aioseo()->helpers->scheduleSingleAction( aioseo()->importExport->yoastSeo->userActionName, 30 );
27
+
28
+ if ( ! aioseo()->transients->get( 'import_user_meta_yoast_seo' ) ) {
29
+ aioseo()->transients->update( 'import_user_meta_yoast_seo', 0, WEEK_IN_SECONDS );
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Imports the post meta.
35
+ *
36
+ * @since 4.0.0
37
+ *
38
+ * @return void
39
+ */
40
+ public function importUserMeta() {
41
+ $usersPerAction = 100;
42
+ $offset = aioseo()->transients->get( 'import_user_meta_yoast_seo' );
43
+
44
+ $usersMeta = aioseo()->db
45
+ ->start( 'usermeta' . ' as um' )
46
+ ->whereRaw( "um.meta_key IN ('facebook', 'twitter')" )
47
+ ->whereRaw( "um.meta_value != ''" )
48
+ ->limit( $offset . ',' . $usersPerAction )
49
+ ->run()
50
+ ->result();
51
+
52
+ if ( ! $usersMeta || ! count( $usersMeta ) ) {
53
+ aioseo()->transients->delete( 'import_user_meta_yoast_seo' );
54
+ return;
55
+ }
56
+
57
+ foreach ( $usersMeta as $meta ) {
58
+ update_user_meta( $meta->user_id, 'aioseo_' . $meta->meta_key, $meta->meta_value );
59
+ }
60
+
61
+ if ( count( $usersMeta ) === $usersPerAction ) {
62
+ aioseo()->transients->update( 'import_user_meta_yoast_seo', 100 + $offset, WEEK_IN_SECONDS );
63
+ aioseo()->helpers->scheduleSingleAction( aioseo()->importExport->yoastSeo->userActionName, 5 );
64
+ } else {
65
+ aioseo()->transients->delete( 'import_user_meta_yoast_seo' );
66
+ }
67
+ }
68
+ }
app/Common/ImportExport/YoastSeo/YoastSeo.php CHANGED
@@ -40,6 +40,15 @@ class YoastSeo extends ImportExport\Importer {
40
  */
41
  public $postActionName = 'aioseo_import_post_meta_yoast_seo';
42
 
 
 
 
 
 
 
 
 
 
43
  /**
44
  * The post action name.
45
  *
@@ -50,7 +59,9 @@ class YoastSeo extends ImportExport\Importer {
50
  public function __construct( $importer ) {
51
  $this->helpers = new Helpers();
52
  $this->postMeta = new PostMeta();
 
53
  add_action( $this->postActionName, [ $this->postMeta, 'importPostMeta' ] );
 
54
 
55
  $plugins = $this->plugins;
56
  foreach ( $plugins as $key => $plugin ) {
@@ -70,5 +81,6 @@ class YoastSeo extends ImportExport\Importer {
70
  new GeneralSettings();
71
  new SearchAppearance();
72
  new SocialMeta();
 
73
  }
74
  }
40
  */
41
  public $postActionName = 'aioseo_import_post_meta_yoast_seo';
42
 
43
+ /**
44
+ * The user action name.
45
+ *
46
+ * @since 4.1.4
47
+ *
48
+ * @var string
49
+ */
50
+ public $userActionName = 'aioseo_import_user_meta_yoast_seo';
51
+
52
  /**
53
  * The post action name.
54
  *
59
  public function __construct( $importer ) {
60
  $this->helpers = new Helpers();
61
  $this->postMeta = new PostMeta();
62
+ $this->userMeta = new UserMeta();
63
  add_action( $this->postActionName, [ $this->postMeta, 'importPostMeta' ] );
64
+ add_action( $this->userActionName, [ $this->userMeta, 'importUserMeta' ] );
65
 
66
  $plugins = $this->plugins;
67
  foreach ( $plugins as $key => $plugin ) {
81
  new GeneralSettings();
82
  new SearchAppearance();
83
  new SocialMeta();
84
+ $this->userMeta->scheduleImport();
85
  }
86
  }
app/Common/Main/Activate.php CHANGED
@@ -20,7 +20,17 @@ class Activate {
20
  public function __construct() {
21
  register_activation_hook( AIOSEO_FILE, [ $this, 'activate' ] );
22
  register_deactivation_hook( AIOSEO_FILE, [ $this, 'deactivate' ] );
 
 
23
 
 
 
 
 
 
 
 
 
24
  // If Pro just deactivated the lite version, we need to manually run the activation hook, because it doesn't run here.
25
  $proDeactivatedLite = (bool) aioseo()->transients->get( 'pro_just_deactivated_lite' );
26
  if ( $proDeactivatedLite ) {
20
  public function __construct() {
21
  register_activation_hook( AIOSEO_FILE, [ $this, 'activate' ] );
22
  register_deactivation_hook( AIOSEO_FILE, [ $this, 'deactivate' ] );
23
+ add_action( 'init', [ $this, 'init' ] );
24
+ }
25
 
26
+ /**
27
+ * Initialize activation.
28
+ *
29
+ * @since 4.1.5
30
+ *
31
+ * @return void
32
+ */
33
+ public function init() {
34
  // If Pro just deactivated the lite version, we need to manually run the activation hook, because it doesn't run here.
35
  $proDeactivatedLite = (bool) aioseo()->transients->get( 'pro_just_deactivated_lite' );
36
  if ( $proDeactivatedLite ) {
app/Common/Main/Filters.php CHANGED
@@ -23,6 +23,15 @@ abstract class Filters {
23
  */
24
  private $plugin;
25
 
 
 
 
 
 
 
 
 
 
26
  /**
27
  * Construct method.
28
  *
@@ -44,11 +53,15 @@ abstract class Filters {
44
  add_filter( 'wpaas_cdn_file_ext', [ $this, 'goDaddySitemapXml' ] );
45
 
46
  // Duplicate Post integration.
47
- add_action( 'dp_duplicate_post', [ $this, 'duplicatePostIntegration' ], 10, 3 );
48
- add_action( 'dp_duplicate_page', [ $this, 'duplicatePostIntegration' ], 10, 3 );
 
49
 
50
  // Classic Editor emoji
51
  add_action( 'init', [ $this, 'removeEmojiScript' ] );
 
 
 
52
  }
53
 
54
  /**
@@ -58,11 +71,11 @@ abstract class Filters {
58
  *
59
  * @param integer $newPostId The new post ID.
60
  * @param WP_Post $originalPost The original post object.
61
- * @param string $status The status of the post.
62
  * @return void
63
  */
64
- public function duplicatePostIntegration( $newPostId, $originalPost, $status ) {
65
- $originalAioseoPost = Models\Post::getPost( $originalPost->ID );
 
66
  if ( ! $originalAioseoPost->exists() ) {
67
  return;
68
  }
@@ -89,6 +102,37 @@ abstract class Filters {
89
  $newPost->save();
90
  }
91
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  /**
93
  * Disable SEO inside the Genesis theme if it's running.
94
  *
@@ -178,4 +222,18 @@ abstract class Filters {
178
  remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
179
  }
180
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
181
  }
23
  */
24
  private $plugin;
25
 
26
+ /**
27
+ * ID of the WooCommerce product that is being duplicated.
28
+ *
29
+ * @since 4.1.4
30
+ *
31
+ * @var integer
32
+ */
33
+ private static $originalProductId;
34
+
35
  /**
36
  * Construct method.
37
  *
53
  add_filter( 'wpaas_cdn_file_ext', [ $this, 'goDaddySitemapXml' ] );
54
 
55
  // Duplicate Post integration.
56
+ add_action( 'dp_duplicate_post', [ $this, 'duplicatePost' ], 10, 2 );
57
+ add_action( 'dp_duplicate_page', [ $this, 'duplicatePost' ], 10, 2 );
58
+ add_action( 'woocommerce_product_duplicate_before_save', [ $this, 'scheduleDuplicateProduct' ], 10, 2 );
59
 
60
  // Classic Editor emoji
61
  add_action( 'init', [ $this, 'removeEmojiScript' ] );
62
+
63
+ // Bypass the JWT Auth plugin's unnecessary restrictions. https://wordpress.org/plugins/jwt-auth/
64
+ add_filter( 'jwt_auth_default_whitelist', [ $this, 'allowRestRoutes' ] );
65
  }
66
 
67
  /**
71
  *
72
  * @param integer $newPostId The new post ID.
73
  * @param WP_Post $originalPost The original post object.
 
74
  * @return void
75
  */
76
+ public function duplicatePost( $newPostId, $originalPost ) {
77
+ $originalPostId = is_object( $originalPost ) ? $originalPost->ID : $originalPost;
78
+ $originalAioseoPost = Models\Post::getPost( $originalPostId );
79
  if ( ! $originalAioseoPost->exists() ) {
80
  return;
81
  }
102
  $newPost->save();
103
  }
104
 
105
+ /**
106
+ * Schedules an action to duplicate our meta after the duplicated WooCommerce product has been saved.
107
+ *
108
+ * @since 4.1.4
109
+ *
110
+ * @param \WP_Product $newProduct The new, duplicated product.
111
+ * @param \WP_Product $originalProduct The original product.
112
+ * @return void
113
+ */
114
+ public function scheduleDuplicateProduct( $newProduct, $originalProduct ) {
115
+ self::$originalProductId = $originalProduct->get_id();
116
+ add_action( 'wp_insert_post', [ $this, 'duplicateProduct' ], 10, 2 );
117
+ }
118
+
119
+ /**
120
+ * Duplicates our meta for the new WooCommerce product.
121
+ *
122
+ * @since 4.1.4
123
+ *
124
+ * @param integer $postId The new post ID.
125
+ * @param \WP_Post $post The new post object.
126
+ * @return void
127
+ */
128
+ public function duplicateProduct( $postId, $post ) {
129
+ if ( ! self::$originalProductId || 'product' !== $post->post_type ) {
130
+ return;
131
+ }
132
+
133
+ $this->duplicatePost( $postId, self::$originalProductId );
134
+ }
135
+
136
  /**
137
  * Disable SEO inside the Genesis theme if it's running.
138
  *
222
  remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
223
  }
224
  }
225
+
226
+ /**
227
+ * Add our routes to this plugins allow list.
228
+ *
229
+ * @since 4.1.4
230
+ *
231
+ * @param array $allowList The original list.
232
+ * @return array The modified list.
233
+ */
234
+ public function allowRestRoutes( $allowList ) {
235
+ return array_merge( $allowList, [
236
+ '/aioseo/'
237
+ ] );
238
+ }
239
  }
app/Common/Main/Media.php CHANGED
@@ -34,12 +34,12 @@ class Media {
34
  }
35
 
36
  if (
37
- ! aioseo()->options->searchAppearance->dynamic->postTypes->has( 'attachment' )
38
  ) {
39
  return;
40
  }
41
 
42
- $redirect = aioseo()->options->searchAppearance->dynamic->postTypes->attachment->redirectAttachmentUrls;
43
  if ( 'disabled' === $redirect ) {
44
  return;
45
  }
34
  }
35
 
36
  if (
37
+ ! aioseo()->dynamicOptions->searchAppearance->postTypes->has( 'attachment' )
38
  ) {
39
  return;
40
  }
41
 
42
+ $redirect = aioseo()->dynamicOptions->searchAppearance->postTypes->attachment->redirectAttachmentUrls;
43
  if ( 'disabled' === $redirect ) {
44
  return;
45
  }
app/Common/Main/Updates.php CHANGED
@@ -66,6 +66,9 @@ class Updates {
66
  * @return void
67
  */
68
  public function runUpdates() {
 
 
 
69
  $lastActiveVersion = aioseo()->internalOptions->internal->lastActiveVersion;
70
  if ( version_compare( $lastActiveVersion, '4.0.5', '<' ) ) {
71
  $this->addImageScanDateColumn();
@@ -102,9 +105,30 @@ class Updates {
102
  $this->accessControlNewCapabilities();
103
  }
104
 
 
 
 
 
105
  do_action( 'aioseo_run_updates', $lastActiveVersion );
106
  }
107
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  /**
109
  * Updates the latest version after all migrations and updates have run.
110
  *
@@ -113,7 +137,9 @@ class Updates {
113
  * @return void
114
  */
115
  public function updateLatestVersion() {
116
- aioseo()->internalOptions->internal->lastActiveVersion = aioseo()->version;
 
 
117
  }
118
 
119
  /**
@@ -442,4 +468,124 @@ class Updates {
442
  public function accessControlNewCapabilities() {
443
  aioseo()->access->addCapabilities();
444
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
445
  }
66
  * @return void
67
  */
68
  public function runUpdates() {
69
+ // The dynamic options have not yet fully loaded, so let's refresh here to force that to happen.
70
+ aioseo()->dynamicOptions->refresh(); // TODO: Check if we still need this since it already runs on 999 in the main AIOSEO file.
71
+
72
  $lastActiveVersion = aioseo()->internalOptions->internal->lastActiveVersion;
73
  if ( version_compare( $lastActiveVersion, '4.0.5', '<' ) ) {
74
  $this->addImageScanDateColumn();
105
  $this->accessControlNewCapabilities();
106
  }
107
 
108
+ if ( version_compare( $lastActiveVersion, '4.1.4.3', '<' ) ) {
109
+ $this->migrateDynamicSettings();
110
+ }
111
+
112
  do_action( 'aioseo_run_updates', $lastActiveVersion );
113
  }
114
 
115
+ /**
116
+ * Retrieve the raw options from the database for migration.
117
+ *
118
+ * @since 4.1.4
119
+ *
120
+ * @return array An array of options.
121
+ */
122
+ private function getRawOptions() {
123
+ // Options from the DB.
124
+ $commonOptions = json_decode( get_option( aioseo()->options->optionsName ), true );
125
+ if ( empty( $commonOptions ) ) {
126
+ $commonOptions = [];
127
+ }
128
+
129
+ return $commonOptions;
130
+ }
131
+
132
  /**
133
  * Updates the latest version after all migrations and updates have run.
134
  *
137
  * @return void
138
  */
139
  public function updateLatestVersion() {
140
+ if ( aioseo()->version !== aioseo()->internalOptions->internal->lastActiveVersion ) {
141
+ aioseo()->internalOptions->internal->lastActiveVersion = aioseo()->version;
142
+ }
143
  }
144
 
145
  /**
468
  public function accessControlNewCapabilities() {
469
  aioseo()->access->addCapabilities();
470
  }
471
+
472
+ /**
473
+ * Migrate dynamic settings to a separate options structure.
474
+ *
475
+ * @since 4.1.4
476
+ *
477
+ * @return void
478
+ */
479
+ public function migrateDynamicSettings() {
480
+ $rawOptions = $this->getRawOptions();
481
+ $options = aioseo()->dynamicOptions->noConflict();
482
+
483
+ // Sitemap post type priorities/frequencies.
484
+ if (
485
+ ! empty( $rawOptions['sitemap']['dynamic']['priority']['postTypes'] )
486
+ ) {
487
+ foreach ( $rawOptions['sitemap']['dynamic']['priority']['postTypes'] as $postTypeName => $data ) {
488
+ if ( $options->sitemap->priority->postTypes->has( $postTypeName ) ) {
489
+ $options->sitemap->priority->postTypes->$postTypeName->priority = $data['priority'];
490
+ $options->sitemap->priority->postTypes->$postTypeName->frequency = $data['frequency'];
491
+ }
492
+ }
493
+ }
494
+
495
+ // Sitemap taxonomy priorities/frequencies.
496
+ if (
497
+ ! empty( $rawOptions['sitemap']['dynamic']['priority']['taxonomies'] )
498
+ ) {
499
+ foreach ( $rawOptions['sitemap']['dynamic']['priority']['taxonomies'] as $taxonomyName => $data ) {
500
+ if ( $options->sitemap->priority->taxonomies->has( $taxonomyName ) ) {
501
+ $options->sitemap->priority->taxonomies->$taxonomyName->priority = $data['priority'];
502
+ $options->sitemap->priority->taxonomies->$taxonomyName->frequency = $data['frequency'];
503
+ }
504
+ }
505
+ }
506
+
507
+ // Facebook post type object types.
508
+ if (
509
+ ! empty( $rawOptions['social']['facebook']['general']['dynamic']['postTypes'] )
510
+ ) {
511
+ foreach ( $rawOptions['social']['facebook']['general']['dynamic']['postTypes'] as $postTypeName => $data ) {
512
+ if ( $options->social->facebook->general->postTypes->has( $postTypeName ) ) {
513
+ $options->social->facebook->general->postTypes->$postTypeName->objectType = $data['objectType'];
514
+ }
515
+ }
516
+ }
517
+
518
+ // Search appearance post type data.
519
+ if (
520
+ ! empty( $rawOptions['searchAppearance']['dynamic']['postTypes'] )
521
+ ) {
522
+ foreach ( $rawOptions['searchAppearance']['dynamic']['postTypes'] as $postTypeName => $data ) {
523
+ if ( $options->searchAppearance->postTypes->has( $postTypeName ) ) {
524
+ $options->searchAppearance->postTypes->$postTypeName->show = $data['show'];
525
+ $options->searchAppearance->postTypes->$postTypeName->title = $data['title'];
526
+ $options->searchAppearance->postTypes->$postTypeName->metaDescription = $data['metaDescription'];
527
+ $options->searchAppearance->postTypes->$postTypeName->schemaType = $data['schemaType'];
528
+ $options->searchAppearance->postTypes->$postTypeName->webPageType = $data['webPageType'];
529
+ $options->searchAppearance->postTypes->$postTypeName->articleType = $data['articleType'];
530
+ $options->searchAppearance->postTypes->$postTypeName->customFields = $data['customFields'];
531
+
532
+ // Advanced settings.
533
+ $advanced = ! empty( $data['advanced']['robotsMeta'] ) ? $data['advanced']['robotsMeta'] : null;
534
+ if ( ! empty( $advanced ) ) {
535
+ $options->searchAppearance->postTypes->$postTypeName->advanced->robotsMeta->default = $data['advanced']['robotsMeta']['default'];
536
+ $options->searchAppearance->postTypes->$postTypeName->advanced->robotsMeta->noindex = $data['advanced']['robotsMeta']['noindex'];
537
+ $options->searchAppearance->postTypes->$postTypeName->advanced->robotsMeta->nofollow = $data['advanced']['robotsMeta']['nofollow'];
538
+ $options->searchAppearance->postTypes->$postTypeName->advanced->robotsMeta->noarchive = $data['advanced']['robotsMeta']['noarchive'];
539
+ $options->searchAppearance->postTypes->$postTypeName->advanced->robotsMeta->noimageindex = $data['advanced']['robotsMeta']['noimageindex'];
540
+ $options->searchAppearance->postTypes->$postTypeName->advanced->robotsMeta->notranslate = $data['advanced']['robotsMeta']['notranslate'];
541
+ $options->searchAppearance->postTypes->$postTypeName->advanced->robotsMeta->nosnippet = $data['advanced']['robotsMeta']['nosnippet'];
542
+ $options->searchAppearance->postTypes->$postTypeName->advanced->robotsMeta->noodp = $data['advanced']['robotsMeta']['noodp'];
543
+ $options->searchAppearance->postTypes->$postTypeName->advanced->robotsMeta->maxSnippet = $data['advanced']['robotsMeta']['maxSnippet'];
544
+ $options->searchAppearance->postTypes->$postTypeName->advanced->robotsMeta->maxVideoPreview = $data['advanced']['robotsMeta']['maxVideoPreview'];
545
+ $options->searchAppearance->postTypes->$postTypeName->advanced->robotsMeta->maxImagePreview = $data['advanced']['robotsMeta']['maxImagePreview'];
546
+ $options->searchAppearance->postTypes->$postTypeName->advanced->showDateInGooglePreview = $data['advanced']['showDateInGooglePreview'];
547
+ $options->searchAppearance->postTypes->$postTypeName->advanced->showPostThumbnailInSearch = $data['advanced']['showPostThumbnailInSearch'];
548
+ $options->searchAppearance->postTypes->$postTypeName->advanced->showMetaBox = $data['advanced']['showMetaBox'];
549
+ $options->searchAppearance->postTypes->$postTypeName->advanced->bulkEditing = $data['advanced']['bulkEditing'];
550
+ }
551
+
552
+ if ( 'attachment' === $postTypeName ) {
553
+ $options->searchAppearance->postTypes->$postTypeName->redirectAttachmentUrls = $data['redirectAttachmentUrls'];
554
+ }
555
+ }
556
+ }
557
+ }
558
+
559
+ // Search appearance taxonomy data.
560
+ if (
561
+ ! empty( $rawOptions['searchAppearance']['dynamic']['taxonomies'] )
562
+ ) {
563
+ foreach ( $rawOptions['searchAppearance']['dynamic']['taxonomies'] as $taxonomyName => $data ) {
564
+ if ( $options->searchAppearance->taxonomies->has( $taxonomyName ) ) {
565
+ $options->searchAppearance->taxonomies->$taxonomyName->show = $data['show'];
566
+ $options->searchAppearance->taxonomies->$taxonomyName->title = $data['title'];
567
+ $options->searchAppearance->taxonomies->$taxonomyName->metaDescription = $data['metaDescription'];
568
+
569
+ // Advanced settings.
570
+ $advanced = ! empty( $data['advanced']['robotsMeta'] ) ? $data['advanced']['robotsMeta'] : null;
571
+ if ( ! empty( $advanced ) ) {
572
+ $options->searchAppearance->taxonomies->$taxonomyName->advanced->robotsMeta->default = $data['advanced']['robotsMeta']['default'];
573
+ $options->searchAppearance->taxonomies->$taxonomyName->advanced->robotsMeta->noindex = $data['advanced']['robotsMeta']['noindex'];
574
+ $options->searchAppearance->taxonomies->$taxonomyName->advanced->robotsMeta->nofollow = $data['advanced']['robotsMeta']['nofollow'];
575
+ $options->searchAppearance->taxonomies->$taxonomyName->advanced->robotsMeta->noarchive = $data['advanced']['robotsMeta']['noarchive'];
576
+ $options->searchAppearance->taxonomies->$taxonomyName->advanced->robotsMeta->noimageindex = $data['advanced']['robotsMeta']['noimageindex'];
577
+ $options->searchAppearance->taxonomies->$taxonomyName->advanced->robotsMeta->notranslate = $data['advanced']['robotsMeta']['notranslate'];
578
+ $options->searchAppearance->taxonomies->$taxonomyName->advanced->robotsMeta->nosnippet = $data['advanced']['robotsMeta']['nosnippet'];
579
+ $options->searchAppearance->taxonomies->$taxonomyName->advanced->robotsMeta->noodp = $data['advanced']['robotsMeta']['noodp'];
580
+ $options->searchAppearance->taxonomies->$taxonomyName->advanced->robotsMeta->maxSnippet = $data['advanced']['robotsMeta']['maxSnippet'];
581
+ $options->searchAppearance->taxonomies->$taxonomyName->advanced->robotsMeta->maxVideoPreview = $data['advanced']['robotsMeta']['maxVideoPreview'];
582
+ $options->searchAppearance->taxonomies->$taxonomyName->advanced->robotsMeta->maxImagePreview = $data['advanced']['robotsMeta']['maxImagePreview'];
583
+ $options->searchAppearance->taxonomies->$taxonomyName->advanced->showDateInGooglePreview = $data['advanced']['showDateInGooglePreview'];
584
+ $options->searchAppearance->taxonomies->$taxonomyName->advanced->showPostThumbnailInSearch = $data['advanced']['showPostThumbnailInSearch'];
585
+ $options->searchAppearance->taxonomies->$taxonomyName->advanced->showMetaBox = $data['advanced']['showMetaBox'];
586
+ }
587
+ }
588
+ }
589
+ }
590
+ }
591
  }
app/Common/Meta/Description.php CHANGED
@@ -89,10 +89,10 @@ class Description {
89
  }
90
 
91
  if ( is_archive() ) {
92
- $postType = get_queried_object();
93
- $options = aioseo()->options->noConflict();
94
- if ( $options->searchAppearance->dynamic->archives->has( $postType->name ) ) {
95
- return $this->helpers->prepare( aioseo()->options->searchAppearance->dynamic->archives->{ $postType->name }->metaDescription );
96
  }
97
  }
98
  }
@@ -177,8 +177,8 @@ class Description {
177
  return $postTypeDescription[ $postType ];
178
  }
179
 
180
- if ( aioseo()->options->searchAppearance->dynamic->postTypes->has( $postType ) ) {
181
- $description = aioseo()->options->searchAppearance->dynamic->postTypes->{$postType}->metaDescription;
182
  }
183
 
184
  $postTypeDescription[ $postType ] = empty( $description ) ? '' : $description;
@@ -210,9 +210,9 @@ class Description {
210
  return $description;
211
  }
212
 
213
- $options = aioseo()->options->noConflict();
214
- if ( ! $description && $options->searchAppearance->dynamic->taxonomies->has( $term->taxonomy ) ) {
215
- $description = $this->helpers->prepare( aioseo()->options->searchAppearance->dynamic->taxonomies->{$term->taxonomy}->metaDescription, false, $default );
216
  }
217
 
218
  $terms[ $term->term_id ] = $description ? $description : $this->helpers->prepare( term_description( $term->term_id ), false, $default );
89
  }
90
 
91
  if ( is_archive() ) {
92
+ $postType = get_queried_object();
93
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
94
+ if ( $dynamicOptions->searchAppearance->archives->has( $postType->name ) ) {
95
+ return $this->helpers->prepare( aioseo()->dynamicOptions->searchAppearance->archives->{ $postType->name }->metaDescription );
96
  }
97
  }
98
  }
177
  return $postTypeDescription[ $postType ];
178
  }
179
 
180
+ if ( aioseo()->dynamicOptions->searchAppearance->postTypes->has( $postType ) ) {
181
+ $description = aioseo()->dynamicOptions->searchAppearance->postTypes->{$postType}->metaDescription;
182
  }
183
 
184
  $postTypeDescription[ $postType ] = empty( $description ) ? '' : $description;
210
  return $description;
211
  }
212
 
213
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
214
+ if ( ! $description && $dynamicOptions->searchAppearance->taxonomies->has( $term->taxonomy ) ) {
215
+ $description = $this->helpers->prepare( aioseo()->dynamicOptions->searchAppearance->taxonomies->{$term->taxonomy}->metaDescription, false, $default );
216
  }
217
 
218
  $terms[ $term->term_id ] = $description ? $description : $this->helpers->prepare( term_description( $term->term_id ), false, $default );
app/Common/Meta/Helpers.php CHANGED
@@ -61,7 +61,7 @@ class Helpers {
61
  }
62
 
63
  $value = aioseo()->helpers->decodeHtmlEntities( $value );
64
- $value = aioseo()->helpers->encodeExceptions( $value );
65
  $value = wp_strip_all_tags( strip_shortcodes( $value ) );
66
  // Because we encoded the exceptions, we need to decode them again first to prevent double encoding later down the line.
67
  $value = aioseo()->helpers->decodeHtmlEntities( $value );
@@ -91,4 +91,21 @@ class Helpers {
91
 
92
  return $this->sanitize( $value, $objectId, $replaceTags );
93
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  }
61
  }
62
 
63
  $value = aioseo()->helpers->decodeHtmlEntities( $value );
64
+ $value = $this->encodeExceptions( $value );
65
  $value = wp_strip_all_tags( strip_shortcodes( $value ) );
66
  // Because we encoded the exceptions, we need to decode them again first to prevent double encoding later down the line.
67
  $value = aioseo()->helpers->decodeHtmlEntities( $value );
91
 
92
  return $this->sanitize( $value, $objectId, $replaceTags );
93
  }
94
+
95
+ /**
96
+ * Encodes a number of exceptions before we strip tags.
97
+ * We need this function to allow certain character (combinations) in the title/description.
98
+ *
99
+ * @since 4.1.1
100
+ *
101
+ * @param string $string The string.
102
+ * @return string $string The string with exceptions encoded.
103
+ */
104
+ public function encodeExceptions( $string ) {
105
+ $exceptions = [ '<3' ];
106
+ foreach ( $exceptions as $exception ) {
107
+ $string = preg_replace( "/$exception/", aioseo()->helpers->encodeOutputHtml( $exception ), $string );
108
+ }
109
+ return $string;
110
+ }
111
  }
app/Common/Meta/Keywords.php CHANGED
@@ -52,10 +52,10 @@ class Keywords {
52
  return $this->prepareKeywords( $keywords );
53
  }
54
 
55
- $postType = get_queried_object();
56
- $options = aioseo()->options->noConflict();
57
- if ( $postType && $options->searchAppearance->dynamic->archives->has( $postType->name ) ) {
58
- $keywords = $this->extractMetaKeywords( aioseo()->options->searchAppearance->dynamic->archives->{ $postType->name }->advanced->keywords );
59
  return $this->prepareKeywords( $keywords );
60
  }
61
 
@@ -136,11 +136,11 @@ class Keywords {
136
 
137
  if ( $post ) {
138
  if ( aioseo()->options->searchAppearance->advanced->useTagsForMetaKeywords ) {
139
- $keywords = array_merge( $keywords, aioseo()->social->helpers->getAllTags( $post->ID ) );
140
  }
141
 
142
  if ( aioseo()->options->searchAppearance->advanced->useCategoriesForMetaKeywords && ! is_page() ) {
143
- $keywords = array_merge( $keywords, aioseo()->social->helpers->getAllCategories( $post->ID ) );
144
  }
145
  }
146
 
52
  return $this->prepareKeywords( $keywords );
53
  }
54
 
55
+ $postType = get_queried_object();
56
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
57
+ if ( $postType && $dynamicOptions->searchAppearance->archives->has( $postType->name ) ) {
58
+ $keywords = $this->extractMetaKeywords( aioseo()->dynamicOptions->searchAppearance->archives->{ $postType->name }->advanced->keywords );
59
  return $this->prepareKeywords( $keywords );
60
  }
61
 
136
 
137
  if ( $post ) {
138
  if ( aioseo()->options->searchAppearance->advanced->useTagsForMetaKeywords ) {
139
+ $keywords = array_merge( $keywords, aioseo()->helpers->getAllTags( $post->ID ) );
140
  }
141
 
142
  if ( aioseo()->options->searchAppearance->advanced->useCategoriesForMetaKeywords && ! is_page() ) {
143
+ $keywords = array_merge( $keywords, aioseo()->helpers->getAllCategories( $post->ID ) );
144
  }
145
  }
146
 
app/Common/Meta/Robots.php CHANGED
@@ -99,10 +99,6 @@ class Robots {
99
  return $this->term();
100
  }
101
 
102
- if ( ! get_option( 'blog_public' ) ) {
103
- return false;
104
- }
105
-
106
  if ( is_home() && 'posts' === get_option( 'show_on_front' ) ) {
107
  $this->globalValues();
108
  return $this->metaHelper();
@@ -171,6 +167,12 @@ class Robots {
171
  $this->attributes['noindex'] = '';
172
  }
173
 
 
 
 
 
 
 
174
  $this->attributes = apply_filters( 'aioseo_robots_meta', $this->attributes );
175
  return implode( ', ', array_filter( $this->attributes ) );
176
  }
@@ -183,17 +185,17 @@ class Robots {
183
  * @return void
184
  */
185
  private function post() {
186
- $options = aioseo()->options->noConflict();
187
- $post = aioseo()->helpers->getPost();
188
- $metaData = aioseo()->meta->metaData->getMetaData( $post );
189
 
190
  if ( ! empty( $metaData ) && ! $metaData->robots_default ) {
191
  $this->metaValues( $metaData );
192
  return;
193
  }
194
 
195
- if ( $options->searchAppearance->dynamic->postTypes->has( $post->post_type ) ) {
196
- $this->globalValues( [ 'dynamic', 'postTypes', $post->post_type ] );
197
  }
198
  }
199
 
@@ -205,11 +207,11 @@ class Robots {
205
  * @return string The robots meta tag value.
206
  */
207
  private function term() {
208
- $options = aioseo()->options->noConflict();
209
- $term = get_queried_object();
210
 
211
- if ( $options->searchAppearance->dynamic->taxonomies->has( $term->taxonomy ) ) {
212
- $this->globalValues( [ 'dynamic', 'taxonomies', $term->taxonomy ] );
213
  return$this->metaHelper();
214
  }
215
 
@@ -225,11 +227,11 @@ class Robots {
225
  * @return void
226
  */
227
  private function archives() {
228
- $options = aioseo()->options->noConflict();
229
- $postType = get_queried_object();
230
 
231
- if ( $options->searchAppearance->dynamic->archives->has( $postType->name ) ) {
232
- $this->globalValues( [ 'dynamic', 'archives', $postType->name ] );
233
  }
234
  }
235
 
@@ -238,13 +240,14 @@ class Robots {
238
  *
239
  * @since 4.0.0
240
  *
241
- * @param array $optionOrder The order in which the options need to be called to get the relevant robots meta settings.
 
242
  * @return void
243
  */
244
- protected function globalValues( $optionOrder = [] ) {
245
  $robotsMeta = [];
246
  if ( count( $optionOrder ) ) {
247
- $options = aioseo()->options->noConflict()->searchAppearance;
248
  foreach ( $optionOrder as $option ) {
249
  if ( ! $options->has( $option, false ) ) {
250
  return;
@@ -265,6 +268,8 @@ class Robots {
265
  $robotsMeta = aioseo()->options->searchAppearance->advanced->globalRobotsMeta->all();
266
  }
267
 
 
 
268
  if ( $robotsMeta['default'] ) {
269
  return;
270
  }
@@ -282,10 +287,6 @@ class Robots {
282
  if ( $noSnippet ) {
283
  $this->attributes['nosnippet'] = 'nosnippet';
284
  }
285
- $noImageIndex = $robotsMeta['noimageindex'];
286
- if ( $noImageIndex ) {
287
- $this->attributes['noimageindex'] = 'noimageindex';
288
- }
289
  if ( $robotsMeta['noodp'] ) {
290
  $this->attributes['noodp'] = 'noodp';
291
  }
@@ -297,6 +298,7 @@ class Robots {
297
  $this->attributes['max-snippet'] = "max-snippet:$maxSnippet";
298
  }
299
  $maxImagePreview = $robotsMeta['maxImagePreview'];
 
300
  if ( ! $noImageIndex && $maxImagePreview && in_array( $maxImagePreview, [ 'none', 'standard', 'large' ], true ) ) {
301
  $this->attributes['max-image-preview'] = "max-image-preview:$maxImagePreview";
302
  }
@@ -304,6 +306,12 @@ class Robots {
304
  if ( $maxVideoPreview && intval( $maxVideoPreview ) ) {
305
  $this->attributes['max-video-preview'] = "max-video-preview:$maxVideoPreview";
306
  }
 
 
 
 
 
 
307
  }
308
 
309
  /**
@@ -327,9 +335,6 @@ class Robots {
327
  if ( $metaData->robots_nosnippet ) {
328
  $this->attributes['nosnippet'] = 'nosnippet';
329
  }
330
- if ( $metaData->robots_noimageindex ) {
331
- $this->attributes['noimageindex'] = 'noimageindex';
332
- }
333
  if ( $metaData->robots_noodp ) {
334
  $this->attributes['noodp'] = 'noodp';
335
  }
@@ -345,6 +350,12 @@ class Robots {
345
  if ( $metaData->robots_max_videopreview && intval( $metaData->robots_max_videopreview ) ) {
346
  $this->attributes['max-video-preview'] = "max-video-preview:$metaData->robots_max_videopreview";
347
  }
 
 
 
 
 
 
348
  }
349
 
350
  /**
99
  return $this->term();
100
  }
101
 
 
 
 
 
102
  if ( is_home() && 'posts' === get_option( 'show_on_front' ) ) {
103
  $this->globalValues();
104
  return $this->metaHelper();
167
  $this->attributes['noindex'] = '';
168
  }
169
 
170
+ // Because we prevent WordPress Core from outputting a robots tag in disableWpRobotsCore(), we need to noindex/nofollow non-public sites ourselves.
171
+ if ( ! get_option( 'blog_public' ) ) {
172
+ $this->attributes['noindex'] = 'noindex';
173
+ $this->attributes['nofollow'] = 'nofollow';
174
+ }
175
+
176
  $this->attributes = apply_filters( 'aioseo_robots_meta', $this->attributes );
177
  return implode( ', ', array_filter( $this->attributes ) );
178
  }
185
  * @return void
186
  */
187
  private function post() {
188
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
189
+ $post = aioseo()->helpers->getPost();
190
+ $metaData = aioseo()->meta->metaData->getMetaData( $post );
191
 
192
  if ( ! empty( $metaData ) && ! $metaData->robots_default ) {
193
  $this->metaValues( $metaData );
194
  return;
195
  }
196
 
197
+ if ( $dynamicOptions->searchAppearance->postTypes->has( $post->post_type ) ) {
198
+ $this->globalValues( [ 'postTypes', $post->post_type ], true );
199
  }
200
  }
201
 
207
  * @return string The robots meta tag value.
208
  */
209
  private function term() {
210
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
211
+ $term = get_queried_object();
212
 
213
+ if ( $dynamicOptions->searchAppearance->taxonomies->has( $term->taxonomy ) ) {
214
+ $this->globalValues( [ 'taxonomies', $term->taxonomy ], true );
215
  return$this->metaHelper();
216
  }
217
 
227
  * @return void
228
  */
229
  private function archives() {
230
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
231
+ $postType = get_queried_object();
232
 
233
+ if ( $dynamicOptions->searchAppearance->archives->has( $postType->name ) ) {
234
+ $this->globalValues( [ 'archives', $postType->name ], true );
235
  }
236
  }
237
 
240
  *
241
  * @since 4.0.0
242
  *
243
+ * @param array $optionOrder The order in which the options need to be called to get the relevant robots meta settings.
244
+ * @param boolean $isDynamicOption Whether this is for a dynamic option.
245
  * @return void
246
  */
247
+ protected function globalValues( $optionOrder = [], $isDynamicOption = false ) {
248
  $robotsMeta = [];
249
  if ( count( $optionOrder ) ) {
250
+ $options = $isDynamicOption ? aioseo()->dynamicOptions->noConflict()->searchAppearance : aioseo()->options->noConflict()->searchAppearance;
251
  foreach ( $optionOrder as $option ) {
252
  if ( ! $options->has( $option, false ) ) {
253
  return;
268
  $robotsMeta = aioseo()->options->searchAppearance->advanced->globalRobotsMeta->all();
269
  }
270
 
271
+ $this->attributes['max-image-preview'] = 'max-image-preview:large';
272
+
273
  if ( $robotsMeta['default'] ) {
274
  return;
275
  }
287
  if ( $noSnippet ) {
288
  $this->attributes['nosnippet'] = 'nosnippet';
289
  }
 
 
 
 
290
  if ( $robotsMeta['noodp'] ) {
291
  $this->attributes['noodp'] = 'noodp';
292
  }
298
  $this->attributes['max-snippet'] = "max-snippet:$maxSnippet";
299
  }
300
  $maxImagePreview = $robotsMeta['maxImagePreview'];
301
+ $noImageIndex = $robotsMeta['noimageindex'];
302
  if ( ! $noImageIndex && $maxImagePreview && in_array( $maxImagePreview, [ 'none', 'standard', 'large' ], true ) ) {
303
  $this->attributes['max-image-preview'] = "max-image-preview:$maxImagePreview";
304
  }
306
  if ( $maxVideoPreview && intval( $maxVideoPreview ) ) {
307
  $this->attributes['max-video-preview'] = "max-video-preview:$maxVideoPreview";
308
  }
309
+
310
+ // Check this last so that we can prevent max-image-preview from being output if noimageindex is enabled.
311
+ if ( $noImageIndex ) {
312
+ $this->attributes['max-image-preview'] = '';
313
+ $this->attributes['noimageindex'] = 'noimageindex';
314
+ }
315
  }
316
 
317
  /**
335
  if ( $metaData->robots_nosnippet ) {
336
  $this->attributes['nosnippet'] = 'nosnippet';
337
  }
 
 
 
338
  if ( $metaData->robots_noodp ) {
339
  $this->attributes['noodp'] = 'noodp';
340
  }
350
  if ( $metaData->robots_max_videopreview && intval( $metaData->robots_max_videopreview ) ) {
351
  $this->attributes['max-video-preview'] = "max-video-preview:$metaData->robots_max_videopreview";
352
  }
353
+
354
+ // Check this last so that we can prevent max-image-preview from being output if noimageindex is enabled.
355
+ if ( $metaData->robots_noimageindex ) {
356
+ $this->attributes['max-image-preview'] = '';
357
+ $this->attributes['noimageindex'] = 'noimageindex';
358
+ }
359
  }
360
 
361
  /**
app/Common/Meta/Title.php CHANGED
@@ -88,10 +88,10 @@ class Title {
88
  }
89
 
90
  if ( is_archive() ) {
91
- $postType = get_queried_object();
92
- $options = aioseo()->options->noConflict();
93
- if ( $options->searchAppearance->dynamic->archives->has( $postType->name ) ) {
94
- return $this->helpers->prepare( aioseo()->options->searchAppearance->dynamic->archives->{ $postType->name }->title );
95
  }
96
  }
97
  }
@@ -146,8 +146,8 @@ class Title {
146
  return $postTypeTitle[ $postType ];
147
  }
148
 
149
- if ( aioseo()->options->searchAppearance->dynamic->postTypes->has( $postType ) ) {
150
- $title = aioseo()->options->searchAppearance->dynamic->postTypes->{$postType}->title;
151
  }
152
 
153
  $postTypeTitle[ $postType ] = empty( $title ) ? '' : $title;
@@ -170,10 +170,10 @@ class Title {
170
  return $terms[ $term->term_id ];
171
  }
172
 
173
- $title = '';
174
- $options = aioseo()->options->noConflict();
175
- if ( ! $title && $options->searchAppearance->dynamic->taxonomies->has( $term->taxonomy ) ) {
176
- $newTitle = aioseo()->options->searchAppearance->dynamic->taxonomies->{$term->taxonomy}->title;
177
  $newTitle = preg_replace( '/#taxonomy_title/', aioseo()->helpers->escapeRegexReplacement( $term->name ), $newTitle );
178
  $title = $this->helpers->prepare( $newTitle, false, $default );
179
  }
88
  }
89
 
90
  if ( is_archive() ) {
91
+ $postType = get_queried_object();
92
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
93
+ if ( $dynamicOptions->searchAppearance->archives->has( $postType->name ) ) {
94
+ return $this->helpers->prepare( aioseo()->dynamicOptions->searchAppearance->archives->{ $postType->name }->title );
95
  }
96
  }
97
  }
146
  return $postTypeTitle[ $postType ];
147
  }
148
 
149
+ if ( aioseo()->dynamicOptions->searchAppearance->postTypes->has( $postType ) ) {
150
+ $title = aioseo()->dynamicOptions->searchAppearance->postTypes->{$postType}->title;
151
  }
152
 
153
  $postTypeTitle[ $postType ] = empty( $title ) ? '' : $title;
170
  return $terms[ $term->term_id ];
171
  }
172
 
173
+ $title = '';
174
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
175
+ if ( ! $title && $dynamicOptions->searchAppearance->taxonomies->has( $term->taxonomy ) ) {
176
+ $newTitle = aioseo()->dynamicOptions->searchAppearance->taxonomies->{$term->taxonomy}->title;
177
  $newTitle = preg_replace( '/#taxonomy_title/', aioseo()->helpers->escapeRegexReplacement( $term->name ), $newTitle );
178
  $title = $this->helpers->prepare( $newTitle, false, $default );
179
  }
app/Common/Migration/GeneralSettings.php CHANGED
@@ -104,8 +104,8 @@ class GeneralSettings {
104
  * @return void
105
  */
106
  private function setDefaultArticleType() {
107
- if ( aioseo()->options->searchAppearance->dynamic->postTypes->has( 'post' ) ) {
108
- aioseo()->options->searchAppearance->dynamic->postTypes->post->articleType = 'Article';
109
  }
110
  }
111
 
@@ -385,19 +385,19 @@ class GeneralSettings {
385
  */
386
  private function migrateTitleFormats() {
387
  if ( ! empty( $this->oldOptions['aiosp_archive_title_format'] ) ) {
388
- $archives = array_keys( aioseo()->options->searchAppearance->dynamic->archives->all() );
389
  $format = aioseo()->helpers->sanitizeOption( aioseo()->migration->helpers->macrosToSmartTags( $this->oldOptions['aiosp_archive_title_format'] ) );
390
  foreach ( $archives as $archive ) {
391
- aioseo()->options->searchAppearance->dynamic->archives->$archive->title = $format;
392
  }
393
  }
394
 
395
  $settings = [
396
- 'aiosp_post_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'dynamic', 'postTypes', 'post', 'title' ] ],
397
- 'aiosp_page_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'dynamic', 'postTypes', 'page', 'title' ] ],
398
- 'aiosp_attachment_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'dynamic', 'postTypes', 'attachment', 'title' ] ],
399
- 'aiosp_category_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'dynamic', 'taxonomies', 'category', 'title' ] ],
400
- 'aiosp_tag_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'dynamic', 'taxonomies', 'post_tag', 'title' ] ],
401
  'aiosp_date_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'archives', 'date', 'title' ] ],
402
  'aiosp_author_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'archives', 'author', 'title' ] ],
403
  'aiosp_search_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'archives', 'search', 'title' ] ],
@@ -415,11 +415,11 @@ class GeneralSettings {
415
 
416
  $objectSlug = aioseo()->helpers->pregReplace( '#_tax#', '', $slug[1] );
417
  if ( in_array( $objectSlug, aioseo()->helpers->getPublicPostTypes( true ), true ) ) {
418
- $settings[ $name ] = [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'dynamic', 'postTypes', $objectSlug, 'title' ] ];
419
  continue;
420
  }
421
  if ( in_array( $objectSlug, aioseo()->helpers->getPublicTaxonomies( true ), true ) ) {
422
- $settings[ $name ] = [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'dynamic', 'taxonomies', $objectSlug, 'title' ] ];
423
  }
424
  }
425
  }
@@ -488,8 +488,8 @@ class GeneralSettings {
488
  continue;
489
  }
490
 
491
- if ( aioseo()->options->searchAppearance->dynamic->postTypes->has( $postType['name'] ) ) {
492
- aioseo()->options->searchAppearance->dynamic->postTypes->{$postType['name']}->metaDescription = '#post_excerpt';
493
  }
494
  }
495
  }
@@ -523,10 +523,10 @@ class GeneralSettings {
523
 
524
  $noindexedPostTypes = is_array( $this->oldOptions['aiosp_cpostnoindex'] ) ? $this->oldOptions['aiosp_cpostnoindex'] : explode( ', ', $this->oldOptions['aiosp_cpostnoindex'] );
525
  foreach ( array_intersect( aioseo()->helpers->getPublicPostTypes( true ), $noindexedPostTypes ) as $postType ) {
526
- if ( aioseo()->options->noConflict()->searchAppearance->dynamic->postTypes->has( $postType ) ) {
527
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->show = false;
528
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->default = false;
529
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->noindex = true;
530
  }
531
  }
532
 
@@ -541,10 +541,10 @@ class GeneralSettings {
541
 
542
  if ( ! empty( $noindexedTaxonomies ) ) {
543
  foreach ( array_intersect( aioseo()->helpers->getPublicTaxonomies( true ), $noindexedTaxonomies ) as $taxonomy ) {
544
- if ( aioseo()->options->noConflict()->searchAppearance->dynamic->taxonomies->has( $taxonomy ) ) {
545
- aioseo()->options->searchAppearance->dynamic->taxonomies->$taxonomy->show = false;
546
- aioseo()->options->searchAppearance->dynamic->taxonomies->$taxonomy->advanced->robotsMeta->default = false;
547
- aioseo()->options->searchAppearance->dynamic->taxonomies->$taxonomy->advanced->robotsMeta->noindex = true;
548
  }
549
  }
550
  }
@@ -588,9 +588,9 @@ class GeneralSettings {
588
  private function migrateNofollowSettings() {
589
  if ( ! empty( $this->oldOptions['aiosp_cpostnofollow'] ) ) {
590
  foreach ( array_intersect( aioseo()->helpers->getPublicPostTypes( true ), $this->oldOptions['aiosp_cpostnofollow'] ) as $postType ) {
591
- if ( aioseo()->options->noConflict()->searchAppearance->dynamic->postTypes->has( $postType ) ) {
592
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->default = false;
593
- aioseo()->options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->nofollow = true;
594
  }
595
  }
596
  }
@@ -818,9 +818,9 @@ class GeneralSettings {
818
  private function migrateRedirectToParent() {
819
  if ( isset( $this->oldOptions['aiosp_redirect_attachement_parent'] ) ) {
820
  if ( ! empty( $this->oldOptions['aiosp_redirect_attachement_parent'] ) ) {
821
- aioseo()->options->searchAppearance->dynamic->postTypes->attachment->redirectAttachmentUrls = 'attachment_parent';
822
  } else {
823
- aioseo()->options->searchAppearance->dynamic->postTypes->attachment->redirectAttachmentUrls = 'disabled';
824
  }
825
  }
826
  }
104
  * @return void
105
  */
106
  private function setDefaultArticleType() {
107
+ if ( aioseo()->dynamicOptions->searchAppearance->postTypes->has( 'post' ) ) {
108
+ aioseo()->dynamicOptions->searchAppearance->postTypes->post->articleType = 'Article';
109
  }
110
  }
111
 
385
  */
386
  private function migrateTitleFormats() {
387
  if ( ! empty( $this->oldOptions['aiosp_archive_title_format'] ) ) {
388
+ $archives = array_keys( aioseo()->dynamicOptions->searchAppearance->archives->all() );
389
  $format = aioseo()->helpers->sanitizeOption( aioseo()->migration->helpers->macrosToSmartTags( $this->oldOptions['aiosp_archive_title_format'] ) );
390
  foreach ( $archives as $archive ) {
391
+ aioseo()->dynamicOptions->searchAppearance->archives->$archive->title = $format;
392
  }
393
  }
394
 
395
  $settings = [
396
+ 'aiosp_post_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'postTypes', 'post', 'title' ], 'dynamic' => true ],
397
+ 'aiosp_page_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'postTypes', 'page', 'title' ], 'dynamic' => true ],
398
+ 'aiosp_attachment_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'postTypes', 'attachment', 'title' ], 'dynamic' => true ],
399
+ 'aiosp_category_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'taxonomies', 'category', 'title' ], 'dynamic' => true ],
400
+ 'aiosp_tag_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'taxonomies', 'post_tag', 'title' ], 'dynamic' => true ],
401
  'aiosp_date_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'archives', 'date', 'title' ] ],
402
  'aiosp_author_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'archives', 'author', 'title' ] ],
403
  'aiosp_search_title_format' => [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'archives', 'search', 'title' ] ],
415
 
416
  $objectSlug = aioseo()->helpers->pregReplace( '#_tax#', '', $slug[1] );
417
  if ( in_array( $objectSlug, aioseo()->helpers->getPublicPostTypes( true ), true ) ) {
418
+ $settings[ $name ] = [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'postTypes', $objectSlug, 'title' ], 'dynamic' => true ];
419
  continue;
420
  }
421
  if ( in_array( $objectSlug, aioseo()->helpers->getPublicTaxonomies( true ), true ) ) {
422
+ $settings[ $name ] = [ 'type' => 'string', 'newOption' => [ 'searchAppearance', 'taxonomies', $objectSlug, 'title' ], 'dynamic' => true ];
423
  }
424
  }
425
  }
488
  continue;
489
  }
490
 
491
+ if ( aioseo()->dynamicOptions->searchAppearance->postTypes->has( $postType['name'] ) ) {
492
+ aioseo()->dynamicOptions->searchAppearance->postTypes->{$postType['name']}->metaDescription = '#post_excerpt';
493
  }
494
  }
495
  }
523
 
524
  $noindexedPostTypes = is_array( $this->oldOptions['aiosp_cpostnoindex'] ) ? $this->oldOptions['aiosp_cpostnoindex'] : explode( ', ', $this->oldOptions['aiosp_cpostnoindex'] );
525
  foreach ( array_intersect( aioseo()->helpers->getPublicPostTypes( true ), $noindexedPostTypes ) as $postType ) {
526
+ if ( aioseo()->dynamicOptions->noConflict()->searchAppearance->postTypes->has( $postType ) ) {
527
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->show = false;
528
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->default = false;
529
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->noindex = true;
530
  }
531
  }
532
 
541
 
542
  if ( ! empty( $noindexedTaxonomies ) ) {
543
  foreach ( array_intersect( aioseo()->helpers->getPublicTaxonomies( true ), $noindexedTaxonomies ) as $taxonomy ) {
544
+ if ( aioseo()->dynamicOptions->noConflict()->searchAppearance->taxonomies->has( $taxonomy ) ) {
545
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->$taxonomy->show = false;
546
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->$taxonomy->advanced->robotsMeta->default = false;
547
+ aioseo()->dynamicOptions->searchAppearance->taxonomies->$taxonomy->advanced->robotsMeta->noindex = true;
548
  }
549
  }
550
  }
588
  private function migrateNofollowSettings() {
589
  if ( ! empty( $this->oldOptions['aiosp_cpostnofollow'] ) ) {
590
  foreach ( array_intersect( aioseo()->helpers->getPublicPostTypes( true ), $this->oldOptions['aiosp_cpostnofollow'] ) as $postType ) {
591
+ if ( aioseo()->dynamicOptions->noConflict()->searchAppearance->postTypes->has( $postType ) ) {
592
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->default = false;
593
+ aioseo()->dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->nofollow = true;
594
  }
595
  }
596
  }
818
  private function migrateRedirectToParent() {
819
  if ( isset( $this->oldOptions['aiosp_redirect_attachement_parent'] ) ) {
820
  if ( ! empty( $this->oldOptions['aiosp_redirect_attachement_parent'] ) ) {
821
+ aioseo()->dynamicOptions->searchAppearance->postTypes->attachment->redirectAttachmentUrls = 'attachment_parent';
822
  } else {
823
+ aioseo()->dynamicOptions->searchAppearance->postTypes->attachment->redirectAttachmentUrls = 'disabled';
824
  }
825
  }
826
  }
app/Common/Migration/Helpers.php CHANGED
@@ -34,13 +34,15 @@ class Helpers {
34
  return;
35
  }
36
 
 
 
37
  foreach ( $mappings as $name => $values ) {
38
  if ( ! isset( $group[ $name ] ) ) {
39
  continue;
40
  }
41
 
42
  $error = false;
43
- $options = aioseo()->options->noConflict();
44
  $lastOption = '';
45
  for ( $i = 0; $i < count( $values['newOption'] ); $i++ ) {
46
  $lastOption = $values['newOption'][ $i ];
@@ -81,8 +83,6 @@ class Helpers {
81
  break;
82
  }
83
  }
84
-
85
- aioseo()->options->refresh();
86
  }
87
 
88
  /**
34
  return;
35
  }
36
 
37
+ $mainOptions = aioseo()->options->noConflict();
38
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
39
  foreach ( $mappings as $name => $values ) {
40
  if ( ! isset( $group[ $name ] ) ) {
41
  continue;
42
  }
43
 
44
  $error = false;
45
+ $options = ! empty( $values['dynamic'] ) ? $dynamicOptions : $mainOptions;
46
  $lastOption = '';
47
  for ( $i = 0; $i < count( $values['newOption'] ); $i++ ) {
48
  $lastOption = $values['newOption'][ $i ];
83
  break;
84
  }
85
  }
 
 
86
  }
87
 
88
  /**
app/Common/Migration/Meta.php CHANGED
@@ -67,6 +67,7 @@ class Meta {
67
  ->leftJoin( 'aioseo_posts as ap', '`p`.`ID` = `ap`.`post_id`' )
68
  ->whereRaw( "( ap.post_id IS NULL OR ap.updated < '$timeStarted' )" )
69
  ->whereRaw( "( p.post_type IN ( '$publicPostTypes' ) )" )
 
70
  ->orderBy( 'p.ID DESC' )
71
  ->limit( $postsPerAction )
72
  ->run()
@@ -327,8 +328,23 @@ class Meta {
327
  * @param int $postId The post ID.
328
  * @return void
329
  */
330
- protected function migrateAdditionalPostMeta( $postId ) {
331
- return $postId;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
332
  }
333
 
334
  /**
67
  ->leftJoin( 'aioseo_posts as ap', '`p`.`ID` = `ap`.`post_id`' )
68
  ->whereRaw( "( ap.post_id IS NULL OR ap.updated < '$timeStarted' )" )
69
  ->whereRaw( "( p.post_type IN ( '$publicPostTypes' ) )" )
70
+ ->whereRaw( 'p.post_status NOT IN( \'auto-draft\' )' )
71
  ->orderBy( 'p.ID DESC' )
72
  ->limit( $postsPerAction )
73
  ->run()
328
  * @param int $postId The post ID.
329
  * @return void
330
  */
331
+ public function migrateAdditionalPostMeta( $postId ) {
332
+ static $disabled = null;
333
+
334
+ if ( null === $disabled ) {
335
+ $disabled = (
336
+ ! aioseo()->options->sitemap->general->enable ||
337
+ (
338
+ aioseo()->options->sitemap->general->advancedSettings->enable &&
339
+ aioseo()->options->sitemap->general->advancedSettings->excludeImages
340
+ )
341
+ );
342
+ }
343
+ if ( $disabled ) {
344
+ return;
345
+ }
346
+
347
+ aioseo()->sitemap->image->scanPost( $postId );
348
  }
349
 
350
  /**
app/Common/Migration/Sitemap.php CHANGED
@@ -275,8 +275,8 @@ class Sitemap {
275
  'aiosp_sitemap_freq_homepage' => [ 'type' => 'string', 'newOption' => [ 'sitemap', 'general', 'advancedSettings', 'priority', 'homePage', 'frequency' ] ],
276
  'aiosp_sitemap_prio_post' => [ 'type' => 'float', 'newOption' => [ 'sitemap', 'general', 'advancedSettings', 'priority', 'postTypes', 'priority' ] ],
277
  'aiosp_sitemap_freq_post' => [ 'type' => 'string', 'newOption' => [ 'sitemap', 'general', 'advancedSettings', 'priority', 'postTypes', 'frequency' ] ],
278
- 'aiosp_sitemap_prio_post_post' => [ 'type' => 'float', 'newOption' => [ 'sitemap', 'dynamic', 'priority', 'postTypes', 'post', 'priority' ] ],
279
- 'aiosp_sitemap_freq_post_post' => [ 'type' => 'string', 'newOption' => [ 'sitemap', 'dynamic', 'priority', 'postTypes', 'post', 'frequency' ] ],
280
  'aiosp_sitemap_prio_taxonomies' => [ 'type' => 'float', 'newOption' => [ 'sitemap', 'general', 'advancedSettings', 'priority', 'taxonomies', 'priority' ] ],
281
  'aiosp_sitemap_freq_taxonomies' => [ 'type' => 'string', 'newOption' => [ 'sitemap', 'general', 'advancedSettings', 'priority', 'taxonomies', 'frequency' ] ],
282
  'aiosp_sitemap_prio_archive' => [ 'type' => 'float', 'newOption' => [ 'sitemap', 'general', 'advancedSettings', 'priority', 'archive', 'priority' ] ],
@@ -308,7 +308,8 @@ class Sitemap {
308
  if ( in_array( $objectSlug, aioseo()->helpers->getPublicPostTypes( true ), true ) ) {
309
  $settings[ $name ] = [
310
  'type' => 'priority' === $type ? 'float' : 'string',
311
- 'newOption' => [ 'sitemap', 'dynamic', 'priority', 'postTypes', $objectSlug, $type ]
 
312
  ];
313
  continue;
314
  }
@@ -316,11 +317,14 @@ class Sitemap {
316
  if ( in_array( $objectSlug, aioseo()->helpers->getPublicTaxonomies( true ), true ) ) {
317
  $settings[ $name ] = [
318
  'type' => 'priority' === $type ? 'float' : 'string',
319
- 'newOption' => [ 'sitemap', 'dynamic', 'priority', 'taxonomies', $objectSlug, $type ]
 
320
  ];
321
  }
322
  }
323
 
 
 
324
  foreach ( $settings as $name => $values ) {
325
  // If setting is set to default, do nothing.
326
  if (
@@ -347,7 +351,7 @@ class Sitemap {
347
  $object->value = $value;
348
 
349
  $error = false;
350
- $options = aioseo()->options->noConflict();
351
  $lastOption = '';
352
  for ( $i = 0; $i < count( $values['newOption'] ); $i++ ) {
353
  $lastOption = $values['newOption'][ $i ];
@@ -365,11 +369,10 @@ class Sitemap {
365
  }
366
 
367
  $options->$lastOption = wp_json_encode( $object );
368
- aioseo()->options->refresh();
369
  }
370
 
371
  if ( count( $settings ) ) {
372
- aioseo()->options->sitemap->general->advancedSettings->enable = true;
373
  }
374
  }
375
 
275
  'aiosp_sitemap_freq_homepage' => [ 'type' => 'string', 'newOption' => [ 'sitemap', 'general', 'advancedSettings', 'priority', 'homePage', 'frequency' ] ],
276
  'aiosp_sitemap_prio_post' => [ 'type' => 'float', 'newOption' => [ 'sitemap', 'general', 'advancedSettings', 'priority', 'postTypes', 'priority' ] ],
277
  'aiosp_sitemap_freq_post' => [ 'type' => 'string', 'newOption' => [ 'sitemap', 'general', 'advancedSettings', 'priority', 'postTypes', 'frequency' ] ],
278
+ 'aiosp_sitemap_prio_post_post' => [ 'type' => 'float', 'newOption' => [ 'sitemap', 'priority', 'postTypes', 'post', 'priority' ], 'dynamic' => true ],
279
+ 'aiosp_sitemap_freq_post_post' => [ 'type' => 'string', 'newOption' => [ 'sitemap', 'priority', 'postTypes', 'post', 'frequency' ], 'dynamic' => true ],
280
  'aiosp_sitemap_prio_taxonomies' => [ 'type' => 'float', 'newOption' => [ 'sitemap', 'general', 'advancedSettings', 'priority', 'taxonomies', 'priority' ] ],
281
  'aiosp_sitemap_freq_taxonomies' => [ 'type' => 'string', 'newOption' => [ 'sitemap', 'general', 'advancedSettings', 'priority', 'taxonomies', 'frequency' ] ],
282
  'aiosp_sitemap_prio_archive' => [ 'type' => 'float', 'newOption' => [ 'sitemap', 'general', 'advancedSettings', 'priority', 'archive', 'priority' ] ],
308
  if ( in_array( $objectSlug, aioseo()->helpers->getPublicPostTypes( true ), true ) ) {
309
  $settings[ $name ] = [
310
  'type' => 'priority' === $type ? 'float' : 'string',
311
+ 'newOption' => [ 'sitemap', 'priority', 'postTypes', $objectSlug, $type ],
312
+ 'dynamic' => true
313
  ];
314
  continue;
315
  }
317
  if ( in_array( $objectSlug, aioseo()->helpers->getPublicTaxonomies( true ), true ) ) {
318
  $settings[ $name ] = [
319
  'type' => 'priority' === $type ? 'float' : 'string',
320
+ 'newOption' => [ 'sitemap', 'priority', 'taxonomies', $objectSlug, $type ],
321
+ 'dynamic' => true
322
  ];
323
  }
324
  }
325
 
326
+ $mainOptions = aioseo()->options->noConflict();
327
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
328
  foreach ( $settings as $name => $values ) {
329
  // If setting is set to default, do nothing.
330
  if (
351
  $object->value = $value;
352
 
353
  $error = false;
354
+ $options = ! empty( $values['dynamic'] ) ? $dynamicOptions : $mainOptions;
355
  $lastOption = '';
356
  for ( $i = 0; $i < count( $values['newOption'] ); $i++ ) {
357
  $lastOption = $values['newOption'][ $i ];
369
  }
370
 
371
  $options->$lastOption = wp_json_encode( $object );
 
372
  }
373
 
374
  if ( count( $settings ) ) {
375
+ $mainOptions->sitemap->general->advancedSettings->enable = true;
376
  }
377
  }
378
 
app/Common/Migration/SocialMeta.php CHANGED
@@ -376,9 +376,9 @@ class SocialMeta {
376
  continue;
377
  }
378
 
379
- $options = aioseo()->options->noConflict();
380
- if ( $options->social->facebook->general->dynamic->postTypes->has( $postType ) ) {
381
- aioseo()->options->social->facebook->general->dynamic->postTypes->$postType->objectType =
382
  aioseo()->helpers->sanitizeOption( $this->oldOptions['modules']['aiosp_opengraph_options'][ $settingName ] );
383
  }
384
 
376
  continue;
377
  }
378
 
379
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
380
+ if ( $dynamicOptions->social->facebook->general->postTypes->has( $postType ) ) {
381
+ aioseo()->dynamicOptions->social->facebook->general->postTypes->$postType->objectType =
382
  aioseo()->helpers->sanitizeOption( $this->oldOptions['modules']['aiosp_opengraph_options'][ $settingName ] );
383
  }
384
 
app/Common/Models/Model.php CHANGED
@@ -236,6 +236,9 @@ class Model implements \JsonSerializable {
236
 
237
  foreach ( $this->jsonFields as $field ) {
238
  if ( isset( $data[ $field ] ) && ! aioseo()->helpers->isJsonString( $data[ $field ] ) ) {
 
 
 
239
  $data[ $field ] = wp_json_encode( $data[ $field ] );
240
  }
241
  }
@@ -495,119 +498,4 @@ class Model implements \JsonSerializable {
495
 
496
  return wp_json_encode( $existingOptions );
497
  }
498
-
499
- /**
500
- * Returns a JSON object with default local seo options.
501
- *
502
- * @since 4.0.0
503
- *
504
- * @param string $existingOptions The existing options in JSON.
505
- * @return string The existing options with defaults added in JSON.
506
- */
507
- public static function getDefaultLocalSeoOptions( $existingOptions = '' ) {
508
- $defaults = [
509
- 'locations' => [
510
- 'business' => [
511
- 'name' => '',
512
- 'businessType' => '',
513
- 'image' => '',
514
- 'areaServed' => '',
515
- 'urls' => [
516
- 'website' => '',
517
- 'aboutPage' => '',
518
- 'contactPage' => ''
519
- ],
520
- 'address' => [
521
- 'streetLine1' => '',
522
- 'streetLine2' => '',
523
- 'zipCode' => '',
524
- 'city' => '',
525
- 'state' => '',
526
- 'country' => '',
527
- 'addressFormat' => '#streetLineOne\n#streetLineTwo\n#city, #state #zipCode'
528
- ],
529
- 'contact' => [
530
- 'email' => '',
531
- 'phone' => '',
532
- 'phoneFormatted' => '',
533
- 'fax' => '',
534
- 'faxFormatted' => ''
535
- ],
536
- 'ids' => [
537
- 'vat' => '',
538
- 'tax' => '',
539
- 'chamberOfCommerce' => ''
540
- ],
541
- 'payment' => [
542
- 'priceRange' => '',
543
- 'currenciesAccepted' => '',
544
- 'methods' => ''
545
- ],
546
- ],
547
- ],
548
- 'openingHours' => [
549
- 'useDefaults' => true,
550
- 'show' => true,
551
- 'alwaysOpen' => false,
552
- 'use24hFormat' => false,
553
- 'timezone' => '',
554
- 'labels' => [
555
- 'closed' => '',
556
- 'alwaysOpen' => ''
557
- ],
558
- 'days' => [
559
- 'monday' => [
560
- 'open24h' => false,
561
- 'closed' => false,
562
- 'openTime' => '09:00',
563
- 'closeTime' => '17:00'
564
- ],
565
- 'tuesday' => [
566
- 'open24h' => false,
567
- 'closed' => false,
568
- 'openTime' => '09:00',
569
- 'closeTime' => '17:00'
570
- ],
571
- 'wednesday' => [
572
- 'open24h' => false,
573
- 'closed' => false,
574
- 'openTime' => '09:00',
575
- 'closeTime' => '17:00'
576
- ],
577
- 'thursday' => [
578
- 'open24h' => false,
579
- 'closed' => false,
580
- 'openTime' => '09:00',
581
- 'closeTime' => '17:00'
582
- ],
583
- 'friday' => [
584
- 'open24h' => false,
585
- 'closed' => false,
586
- 'openTime' => '09:00',
587
- 'closeTime' => '17:00'
588
- ],
589
- 'saturday' => [
590
- 'open24h' => false,
591
- 'closed' => false,
592
- 'openTime' => '09:00',
593
- 'closeTime' => '17:00'
594
- ],
595
- 'sunday' => [
596
- 'open24h' => false,
597
- 'closed' => false,
598
- 'openTime' => '09:00',
599
- 'closeTime' => '17:00'
600
- ]
601
- ]
602
- ]
603
- ];
604
-
605
- if ( empty( $existingOptions ) ) {
606
- $defaults = wp_json_encode( $defaults );
607
- return str_replace( '\\\n', '\n', $defaults );
608
- }
609
-
610
- $existingOptions = json_decode( $existingOptions, true );
611
- return array_replace_recursive( $defaults, $existingOptions );
612
- }
613
  }
236
 
237
  foreach ( $this->jsonFields as $field ) {
238
  if ( isset( $data[ $field ] ) && ! aioseo()->helpers->isJsonString( $data[ $field ] ) ) {
239
+ if ( is_array( $data[ $field ] ) && aioseo()->helpers->isArrayNumeric( $data[ $field ] ) ) {
240
+ $data[ $field ] = array_values( $data[ $field ] );
241
+ }
242
  $data[ $field ] = wp_json_encode( $data[ $field ] );
243
  }
244
  }
498
 
499
  return wp_json_encode( $existingOptions );
500
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
501
  }
app/Common/Models/Post.php CHANGED
@@ -74,8 +74,25 @@ class Post extends Model {
74
  ->run()
75
  ->model( 'AIOSEO\\Plugin\\Common\\Models\\Post' );
76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  if (
78
- ! $post->exists() &&
79
  'page' === get_post_type( $postId ) && // This check cannot be deleted and is required to prevent errors after WordPress cleans up the attachment it creates when a plugin is updated.
80
  (
81
  aioseo()->helpers->isWooCommerceCheckoutPage( $postId ) ||
@@ -86,6 +103,11 @@ class Post extends Model {
86
  $post->robots_default = false;
87
  $post->robots_noindex = true;
88
  }
 
 
 
 
 
89
  return $post;
90
  }
91
 
@@ -94,9 +116,9 @@ class Post extends Model {
94
  *
95
  * @since 4.0.3
96
  *
97
- * @param int $postId The Post ID.
98
- * @param array $data The post data to save.
99
- * @return bool|\WP_REST_Response True if post data was saved or error response.
100
  */
101
  public static function savePost( $postId, $data ) {
102
  $thePost = self::getPost( $postId );
@@ -189,8 +211,6 @@ class Post extends Model {
189
  if ( ! empty( $lastError ) ) {
190
  return $lastError;
191
  }
192
-
193
- return true;
194
  }
195
 
196
  /**
74
  ->run()
75
  ->model( 'AIOSEO\\Plugin\\Common\\Models\\Post' );
76
 
77
+ if ( ! $post->exists() ) {
78
+ $post->post_id = $postId;
79
+ $post = self::setDynamicDefaults( $post, $postId );
80
+ }
81
+
82
+ return $post;
83
+ }
84
+
85
+ /**
86
+ * Sets the dynamic defaults on the post object if it doesn't exist in the DB yet.
87
+ *
88
+ * @since 4.1.4
89
+ *
90
+ * @param Post $post The post object.
91
+ * @param int $postId The post ID.
92
+ * @return Post The modified post object.
93
+ */
94
+ private static function setDynamicDefaults( $post, $postId ) {
95
  if (
 
96
  'page' === get_post_type( $postId ) && // This check cannot be deleted and is required to prevent errors after WordPress cleans up the attachment it creates when a plugin is updated.
97
  (
98
  aioseo()->helpers->isWooCommerceCheckoutPage( $postId ) ||
103
  $post->robots_default = false;
104
  $post->robots_noindex = true;
105
  }
106
+
107
+ if ( aioseo()->helpers->isStaticHomePage( $postId ) ) {
108
+ $post->og_object_type = 'website';
109
+ }
110
+
111
  return $post;
112
  }
113
 
116
  *
117
  * @since 4.0.3
118
  *
119
+ * @param int $postId The Post ID.
120
+ * @param array $data The post data to save.
121
+ * @return void|string True if post data was saved or error response.
122
  */
123
  public static function savePost( $postId, $data ) {
124
  $thePost = self::getPost( $postId );
211
  if ( ! empty( $lastError ) ) {
212
  return $lastError;
213
  }
 
 
214
  }
215
 
216
  /**
app/Common/Options/Cache.php ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\Options;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ /**
10
+ * Class that holds all the cache for the AIOSEO options.
11
+ *
12
+ * @since 4.1.4
13
+ */
14
+ class Cache {
15
+ /**
16
+ * The DB options cache.
17
+ *
18
+ * @since 4.1.4
19
+ *
20
+ * @var array
21
+ */
22
+ private static $db = [];
23
+
24
+ /**
25
+ * The options cache.
26
+ *
27
+ * @since 4.1.4
28
+ *
29
+ * @var array
30
+ */
31
+ private static $options = [];
32
+
33
+ /**
34
+ * Sets the cache for the DB option.
35
+ *
36
+ * @since 4.1.4
37
+ *
38
+ * @param string $name The cache name.
39
+ * @param array $value The value.
40
+ * @return void
41
+ */
42
+ public function setDb( $name, $value ) {
43
+ self::$db[ $name ] = $value;
44
+ }
45
+
46
+ /**
47
+ * Gets the cache for the DB option.
48
+ *
49
+ * @since 4.1.4
50
+ *
51
+ * @param string $name The cache name.
52
+ * @return array The data from the cache.
53
+ */
54
+ public function getDb( $name ) {
55
+ return ! empty( self::$db[ $name ] ) ? self::$db[ $name ] : [];
56
+ }
57
+
58
+ /**
59
+ * Sets the cache for the options.
60
+ *
61
+ * @since 4.1.4
62
+ *
63
+ * @param string $name The cache name.
64
+ * @param array $value The value.
65
+ * @return void
66
+ */
67
+ public function setOptions( $name, $value ) {
68
+ self::$options[ $name ] = $value;
69
+ }
70
+
71
+ /**
72
+ * Gets the cache for the options.
73
+ *
74
+ * @since 4.1.4
75
+ *
76
+ * @param string $name The cache name.
77
+ * @return array The data from the cache.
78
+ */
79
+ public function getOptions( $name ) {
80
+ return ! empty( self::$options[ $name ] ) ? self::$options[ $name ] : [];
81
+ }
82
+
83
+ /**
84
+ * Resets the DB cache.
85
+ *
86
+ * @since 4.1.4
87
+ *
88
+ * @return void
89
+ */
90
+ public function resetDb() {
91
+ self::$db = [];
92
+ }
93
+ }
app/Common/{Utils → Options}/DynamicBackup.php RENAMED
@@ -1,11 +1,16 @@
1
  <?php
2
- namespace AIOSEO\Plugin\Common\Utils;
3
 
4
  // Exit if accessed directly.
5
  if ( ! defined( 'ABSPATH' ) ) {
6
  exit;
7
  }
8
 
 
 
 
 
 
9
  class DynamicBackup {
10
  /**
11
  * A the name of the option to save dynamic backups to.
@@ -25,15 +30,6 @@ class DynamicBackup {
25
  */
26
  protected $backup = [];
27
 
28
- /**
29
- * Whether the backup data needs to updated after it has been restored.
30
- *
31
- * @since 4.1.3
32
- *
33
- * @var boolean
34
- */
35
- protected $needsUpdate = false;
36
-
37
  /**
38
  * Whether the backup should be updated.
39
  *
@@ -58,7 +54,7 @@ class DynamicBackup {
58
  * @since 4.1.3
59
  */
60
  public function __construct() {
61
- add_action( 'wp_loaded', [ $this, 'init' ], 99999 );
62
  add_action( 'shutdown', [ $this, 'updateBackup' ] );
63
  }
64
 
@@ -70,9 +66,10 @@ class DynamicBackup {
70
  * @return void
71
  */
72
  public function updateBackup() {
73
- if ( $this->needsUpdate ) {
74
- $this->needsUpdate = false;
75
- update_option( $this->optionsName, wp_json_encode( $this->backup ) );
 
76
  }
77
  }
78
 
@@ -91,7 +88,7 @@ class DynamicBackup {
91
  }
92
 
93
  $this->backup = $backup;
94
- $this->options = aioseo()->options->getDefaults();
95
 
96
  $this->restorePostTypes();
97
  $this->restoreTaxonomies();
@@ -114,15 +111,15 @@ class DynamicBackup {
114
  }
115
 
116
  if ( ! empty( $this->backup['postTypes'][ $name ]['searchAppearance'] ) ) {
117
- $this->restoreOptions( $this->backup['postTypes'][ $name ]['searchAppearance'], [ 'searchAppearance', 'dynamic', 'postTypes', $name ] );
118
  unset( $this->backup['postTypes'][ $name ]['searchAppearance'] );
119
- $this->needsUpdate = true;
120
  }
121
 
122
  if ( ! empty( $this->backup['postTypes'][ $name ]['social']['facebook'] ) ) {
123
- $this->restoreOptions( $this->backup['postTypes'][ $name ]['social']['facebook'], [ 'social', 'facebook', 'general', 'dynamic', 'postTypes', $name ] );
124
  unset( $this->backup['postTypes'][ $name ]['social']['facebook'] );
125
- $this->needsUpdate = true;
126
  }
127
  }
128
  }
@@ -143,15 +140,15 @@ class DynamicBackup {
143
  }
144
 
145
  if ( ! empty( $this->backup['taxonomies'][ $name ]['searchAppearance'] ) ) {
146
- $this->restoreOptions( $this->backup['taxonomies'][ $name ]['searchAppearance'], [ 'searchAppearance', 'dynamic', 'taxonomies', $name ] );
147
  unset( $this->backup['taxonomies'][ $name ]['searchAppearance'] );
148
- $this->needsUpdate = true;
149
  }
150
 
151
  if ( ! empty( $this->backup['taxonomies'][ $name ]['social']['facebook'] ) ) {
152
- $this->restoreOptions( $this->backup['taxonomies'][ $name ]['social']['facebook'], [ 'social', 'facebook', 'general', 'dynamic', 'taxonomies', $name ] );
153
  unset( $this->backup['taxonomies'][ $name ]['social']['facebook'] );
154
- $this->needsUpdate = true;
155
  }
156
  }
157
  }
@@ -172,9 +169,9 @@ class DynamicBackup {
172
  }
173
 
174
  if ( ! empty( $this->backup['archives'][ $name ]['searchAppearance'] ) ) {
175
- $this->restoreOptions( $this->backup['archives'][ $name ]['searchAppearance'], [ 'searchAppearance', 'dynamic', 'archives', $name ] );
176
  unset( $this->backup['archives'][ $name ]['searchAppearance'] );
177
- $this->needsUpdate = true;
178
  }
179
  }
180
  }
@@ -197,7 +194,7 @@ class DynamicBackup {
197
  $groupPath = $groupPath[ $group ];
198
  }
199
 
200
- $options = aioseo()->options->noConflict();
201
  foreach ( $backupOptions as $setting => $value ) {
202
  // Check if the option exists by checking if the type is defined.
203
  $type = ! empty( $groupPath[ $setting ]['type'] ) ? $groupPath[ $setting ]['type'] : '';
@@ -209,9 +206,8 @@ class DynamicBackup {
209
  $options = $options->$group;
210
  }
211
 
212
- $options->$setting = $value['value']['value'];
213
  }
214
- aioseo()->options->refresh();
215
  }
216
 
217
  /**
@@ -223,14 +219,9 @@ class DynamicBackup {
223
  * @return void
224
  */
225
  public function maybeBackup( $newOptions ) {
226
- $this->maybeBackupPostType( $newOptions['searchAppearance']['dynamic']['postTypes'], $newOptions['social']['facebook']['general']['dynamic']['postTypes'] );
227
- $this->maybeBackupTaxonomy( $newOptions['searchAppearance']['dynamic']['taxonomies'], $newOptions['social']['facebook']['general']['dynamic']['taxonomies'] );
228
- $this->maybeBackupArchives( $newOptions['searchAppearance']['dynamic']['archives'] );
229
-
230
- if ( $this->shouldBackup ) {
231
- $this->shouldBackup = false;
232
- update_option( $this->optionsName, wp_json_encode( $this->backup ) );
233
- }
234
  }
235
 
236
  /**
@@ -244,7 +235,7 @@ class DynamicBackup {
244
  */
245
  private function maybeBackupPostType( $dynamicPostTypes, $dynamicPostTypesOG ) {
246
  $postTypes = aioseo()->helpers->getPublicPostTypes();
247
- $postTypes = aioseo()->helpers->normalizePostTypeTaxonomyNames( $postTypes );
248
 
249
  foreach ( $dynamicPostTypes as $dynamicPostTypeName => $dynamicPostTypeSettings ) {
250
  $found = wp_list_filter( $postTypes, [ 'name' => $dynamicPostTypeName ] );
@@ -272,9 +263,9 @@ class DynamicBackup {
272
  * @param array $dynamicTaxonomiesOG An array of dynamic taxonomy from Social Facebook to check.
273
  * @return void
274
  */
275
- private function maybeBackupTaxonomy( $dynamicTaxonomies, $dynamicTaxonomiesOG ) {
276
  $taxonomies = aioseo()->helpers->getPublicTaxonomies();
277
- $taxonomies = aioseo()->helpers->normalizePostTypeTaxonomyNames( $taxonomies );
278
 
279
  foreach ( $dynamicTaxonomies as $dynamicTaxonomyName => $dynamicTaxonomySettings ) {
280
  $found = wp_list_filter( $taxonomies, [ 'name' => $dynamicTaxonomyName ] );
@@ -283,14 +274,6 @@ class DynamicBackup {
283
  $this->shouldBackup = true;
284
  }
285
  }
286
-
287
- foreach ( $dynamicTaxonomiesOG as $dynamicTaxonomyNameOG => $dynamicTaxonomySettingsOG ) {
288
- $found = wp_list_filter( $taxonomies, [ 'name' => $dynamicTaxonomyNameOG ] );
289
- if ( count( $found ) === 0 ) {
290
- $this->backup['taxonomies'][ $dynamicTaxonomyNameOG ]['social']['facebook'] = $dynamicTaxonomySettingsOG;
291
- $this->shouldBackup = true;
292
- }
293
- }
294
  }
295
 
296
  /**
@@ -303,7 +286,7 @@ class DynamicBackup {
303
  */
304
  private function maybeBackupArchives( $dynamicArchives ) {
305
  $postTypes = aioseo()->helpers->getPublicPostTypes( false, true );
306
- $postTypes = aioseo()->helpers->normalizePostTypeTaxonomyNames( $postTypes );
307
 
308
  foreach ( $dynamicArchives as $archiveName => $archiveSettings ) {
309
  $found = wp_list_filter( $postTypes, [ 'name' => $archiveName ] );
@@ -313,4 +296,22 @@ class DynamicBackup {
313
  }
314
  }
315
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
316
  }
1
  <?php
2
+ namespace AIOSEO\Plugin\Common\Options;
3
 
4
  // Exit if accessed directly.
5
  if ( ! defined( 'ABSPATH' ) ) {
6
  exit;
7
  }
8
 
9
+ /**
10
+ * Handles the dynamic backup.
11
+ *
12
+ * @since 4.1.3
13
+ */
14
  class DynamicBackup {
15
  /**
16
  * A the name of the option to save dynamic backups to.
30
  */
31
  protected $backup = [];
32
 
 
 
 
 
 
 
 
 
 
33
  /**
34
  * Whether the backup should be updated.
35
  *
54
  * @since 4.1.3
55
  */
56
  public function __construct() {
57
+ add_action( 'wp_loaded', [ $this, 'init' ], 5000 );
58
  add_action( 'shutdown', [ $this, 'updateBackup' ] );
59
  }
60
 
66
  * @return void
67
  */
68
  public function updateBackup() {
69
+ if ( $this->shouldBackup ) {
70
+ $this->shouldBackup = false;
71
+ $backup = aioseo()->dynamicOptions->convertOptionsToValues( $this->backup, 'value' );
72
+ update_option( $this->optionsName, wp_json_encode( $backup ) );
73
  }
74
  }
75
 
88
  }
89
 
90
  $this->backup = $backup;
91
+ $this->options = aioseo()->dynamicOptions->getDefaults();
92
 
93
  $this->restorePostTypes();
94
  $this->restoreTaxonomies();
111
  }
112
 
113
  if ( ! empty( $this->backup['postTypes'][ $name ]['searchAppearance'] ) ) {
114
+ $this->restoreOptions( $this->backup['postTypes'][ $name ]['searchAppearance'], [ 'searchAppearance', 'postTypes', $name ] );
115
  unset( $this->backup['postTypes'][ $name ]['searchAppearance'] );
116
+ $this->shouldBackup = true;
117
  }
118
 
119
  if ( ! empty( $this->backup['postTypes'][ $name ]['social']['facebook'] ) ) {
120
+ $this->restoreOptions( $this->backup['postTypes'][ $name ]['social']['facebook'], [ 'social', 'facebook', 'general', 'postTypes', $name ] );
121
  unset( $this->backup['postTypes'][ $name ]['social']['facebook'] );
122
+ $this->shouldBackup = true;
123
  }
124
  }
125
  }
140
  }
141
 
142
  if ( ! empty( $this->backup['taxonomies'][ $name ]['searchAppearance'] ) ) {
143
+ $this->restoreOptions( $this->backup['taxonomies'][ $name ]['searchAppearance'], [ 'searchAppearance', 'taxonomies', $name ] );
144
  unset( $this->backup['taxonomies'][ $name ]['searchAppearance'] );
145
+ $this->shouldBackup = true;
146
  }
147
 
148
  if ( ! empty( $this->backup['taxonomies'][ $name ]['social']['facebook'] ) ) {
149
+ $this->restoreOptions( $this->backup['taxonomies'][ $name ]['social']['facebook'], [ 'social', 'facebook', 'general', 'taxonomies', $name ] );
150
  unset( $this->backup['taxonomies'][ $name ]['social']['facebook'] );
151
+ $this->shouldBackup = true;
152
  }
153
  }
154
  }
169
  }
170
 
171
  if ( ! empty( $this->backup['archives'][ $name ]['searchAppearance'] ) ) {
172
+ $this->restoreOptions( $this->backup['archives'][ $name ]['searchAppearance'], [ 'searchAppearance', 'archives', $name ] );
173
  unset( $this->backup['archives'][ $name ]['searchAppearance'] );
174
+ $this->shouldBackup = true;
175
  }
176
  }
177
  }
194
  $groupPath = $groupPath[ $group ];
195
  }
196
 
197
+ $options = aioseo()->dynamicOptions->noConflict();
198
  foreach ( $backupOptions as $setting => $value ) {
199
  // Check if the option exists by checking if the type is defined.
200
  $type = ! empty( $groupPath[ $setting ]['type'] ) ? $groupPath[ $setting ]['type'] : '';
206
  $options = $options->$group;
207
  }
208
 
209
+ $options->$setting = $value;
210
  }
 
211
  }
212
 
213
  /**
219
  * @return void
220
  */
221
  public function maybeBackup( $newOptions ) {
222
+ $this->maybeBackupPostType( $newOptions['searchAppearance']['postTypes'], $newOptions['social']['facebook']['general']['postTypes'] );
223
+ $this->maybeBackupTaxonomy( $newOptions['searchAppearance']['taxonomies'] );
224
+ $this->maybeBackupArchives( $newOptions['searchAppearance']['archives'] );
 
 
 
 
 
225
  }
226
 
227
  /**
235
  */
236
  private function maybeBackupPostType( $dynamicPostTypes, $dynamicPostTypesOG ) {
237
  $postTypes = aioseo()->helpers->getPublicPostTypes();
238
+ $postTypes = $this->normalizeObjectName( $postTypes );
239
 
240
  foreach ( $dynamicPostTypes as $dynamicPostTypeName => $dynamicPostTypeSettings ) {
241
  $found = wp_list_filter( $postTypes, [ 'name' => $dynamicPostTypeName ] );
263
  * @param array $dynamicTaxonomiesOG An array of dynamic taxonomy from Social Facebook to check.
264
  * @return void
265
  */
266
+ protected function maybeBackupTaxonomy( $dynamicTaxonomies, $dynamicTaxonomiesOG = [] ) {
267
  $taxonomies = aioseo()->helpers->getPublicTaxonomies();
268
+ $taxonomies = $this->normalizeObjectName( $taxonomies );
269
 
270
  foreach ( $dynamicTaxonomies as $dynamicTaxonomyName => $dynamicTaxonomySettings ) {
271
  $found = wp_list_filter( $taxonomies, [ 'name' => $dynamicTaxonomyName ] );
274
  $this->shouldBackup = true;
275
  }
276
  }
 
 
 
 
 
 
 
 
277
  }
278
 
279
  /**
286
  */
287
  private function maybeBackupArchives( $dynamicArchives ) {
288
  $postTypes = aioseo()->helpers->getPublicPostTypes( false, true );
289
+ $postTypes = $this->normalizeObjectName( $postTypes );
290
 
291
  foreach ( $dynamicArchives as $archiveName => $archiveSettings ) {
292
  $found = wp_list_filter( $postTypes, [ 'name' => $archiveName ] );
296
  }
297
  }
298
  }
299
+
300
+ /**
301
+ * Normalize object name to work properly with AIOSEO.
302
+ *
303
+ * @since 4.1.3
304
+ *
305
+ * @param array $items The items.
306
+ * @return array The normalized items.
307
+ */
308
+ public function normalizeObjectName( $items ) {
309
+ foreach ( $items as &$item ) {
310
+ if ( 'type' === $item['name'] ) {
311
+ $item['name'] = '_aioseo_type';
312
+ }
313
+ }
314
+
315
+ return $items;
316
+ }
317
  }
app/Common/Options/DynamicOptions.php ADDED
@@ -0,0 +1,387 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\Options;
3
+
4
+ use AIOSEO\Plugin\Common\Traits;
5
+
6
+ // Exit if accessed directly.
7
+ if ( ! defined( 'ABSPATH' ) ) {
8
+ exit;
9
+ }
10
+
11
+ /**
12
+ * Handles the dynamic options.
13
+ *
14
+ * @since 4.1.4
15
+ */
16
+ class DynamicOptions {
17
+ use Traits\Options;
18
+
19
+ /**
20
+ * The default options.
21
+ *
22
+ * @since 4.1.4
23
+ *
24
+ * @var array
25
+ */
26
+ protected $defaults = [
27
+ // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
28
+ 'sitemap' => [
29
+ 'priority' => [
30
+ 'postTypes' => [],
31
+ 'taxonomies' => []
32
+ ]
33
+ ],
34
+ 'social' => [
35
+ 'facebook' => [
36
+ 'general' => [
37
+ 'postTypes' => []
38
+ ]
39
+ ]
40
+ ],
41
+ 'searchAppearance' => [
42
+ 'postTypes' => [],
43
+ 'taxonomies' => [],
44
+ 'archives' => []
45
+ ]
46
+ // phpcs:enable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
47
+ ];
48
+
49
+ /**
50
+ * Class constructor.
51
+ *
52
+ * @since 4.1.4
53
+ *
54
+ * @param string $optionsName The options name.
55
+ */
56
+ public function __construct( $optionsName = 'aioseo_options_dynamic' ) {
57
+ $this->optionsName = is_network_admin() ? $optionsName . '_network' : $optionsName;
58
+
59
+ // Load defaults in case this is a complete fresh install.
60
+ $this->init();
61
+
62
+ add_action( 'shutdown', [ $this, 'save' ] );
63
+ }
64
+
65
+ /**
66
+ * Initializes the options.
67
+ *
68
+ * @since 4.1.4
69
+ *
70
+ * @return void
71
+ */
72
+ protected function init() {
73
+ $this->addDynamicDefaults();
74
+ $this->setDbOptions();
75
+ }
76
+
77
+ /**
78
+ * Sets the DB options.
79
+ *
80
+ * @since 4.1.4
81
+ *
82
+ * @return void
83
+ */
84
+ protected function setDbOptions() {
85
+ $dbOptions = $this->getDbOptions( $this->optionsName );
86
+
87
+ // Refactor options.
88
+ $this->defaultsMerged = array_replace_recursive( $this->defaults, $this->defaultsMerged );
89
+
90
+ $dbOptions = array_replace_recursive(
91
+ $this->defaultsMerged,
92
+ $this->addValueToValuesArray( $this->defaultsMerged, $dbOptions )
93
+ );
94
+
95
+ aioseo()->optionsCache->setOptions( $this->optionsName, $dbOptions );
96
+
97
+ // Get the localized options.
98
+ $dbOptionsLocalized = get_option( $this->optionsName . '_localized' );
99
+ if ( empty( $dbOptionsLocalized ) ) {
100
+ $dbOptionsLocalized = [];
101
+ }
102
+ $this->localized = $dbOptionsLocalized;
103
+ }
104
+
105
+ /**
106
+ * Sanitizes, then saves the options to the database.
107
+ *
108
+ * @since 4.1.4
109
+ *
110
+ * @param array $options An array of options to sanitize, then save.
111
+ * @return void
112
+ */
113
+ public function sanitizeAndSave( $options ) {
114
+ if ( ! is_array( $options ) ) {
115
+ return;
116
+ }
117
+
118
+ $cachedOptions = aioseo()->optionsCache->getOptions( $this->optionsName );
119
+
120
+ aioseo()->dynamicBackup->maybeBackup( $cachedOptions );
121
+
122
+ // Refactor options.
123
+ $dbOptions = array_replace_recursive(
124
+ $cachedOptions,
125
+ $this->addValueToValuesArray( $cachedOptions, $options, [], true )
126
+ );
127
+
128
+ aioseo()->optionsCache->setOptions( $this->optionsName, $dbOptions );
129
+
130
+ // Update localized options.
131
+ update_option( $this->optionsName . '_localized', $this->localized );
132
+
133
+ // Update values.
134
+ $this->save( true );
135
+ }
136
+
137
+ /**
138
+ * Adds some defaults that are dynamically generated.
139
+ *
140
+ * @since 4.1.4
141
+ *
142
+ * @return void
143
+ */
144
+ public function addDynamicDefaults() {
145
+ $this->addDynamicPostTypeDefaults();
146
+ $this->addDynamicTaxonomyDefaults();
147
+ $this->addDynamicArchiveDefaults();
148
+ }
149
+
150
+ /**
151
+ * Adds the dynamic defaults for the public post types.
152
+ *
153
+ * @since 4.1.4
154
+ *
155
+ * @return void
156
+ */
157
+ protected function addDynamicPostTypeDefaults() {
158
+ $postTypes = aioseo()->helpers->getPublicPostTypes();
159
+ foreach ( $postTypes as $postType ) {
160
+ if ( 'type' === $postType['name'] ) {
161
+ $postType['name'] = '_aioseo_type';
162
+ }
163
+
164
+ $defaultTitle = '#post_title #separator_sa #site_title';
165
+ $defaultDescription = $postType['hasExcerpt'] ? '#post_excerpt' : '#post_content';
166
+ $defaultSchemaType = 'WebPage';
167
+ $defaultWebPageType = 'WebPage';
168
+ $defaultArticleType = 'BlogPosting';
169
+
170
+ switch ( $postType['name'] ) {
171
+ case 'post':
172
+ $defaultSchemaType = 'Article';
173
+ break;
174
+ case 'attachment':
175
+ $defaultDescription = '#attachment_caption';
176
+ $defaultSchemaType = 'ItemPage';
177
+ $defaultWebPageType = 'ItemPage';
178
+ break;
179
+ case 'product':
180
+ $defaultSchemaType = 'WebPage';
181
+ $defaultWebPageType = 'ItemPage';
182
+ break;
183
+ case 'news':
184
+ $defaultArticleType = 'NewsArticle';
185
+ break;
186
+ default:
187
+ break;
188
+ }
189
+
190
+ $defaultOptions = array_replace_recursive(
191
+ $this->getDefaultSearchAppearanceOptions(),
192
+ [
193
+ 'title' => [
194
+ 'type' => 'string',
195
+ 'localized' => true,
196
+ 'default' => $defaultTitle
197
+ ],
198
+ 'metaDescription' => [
199
+ 'type' => 'string',
200
+ 'localized' => true,
201
+ 'default' => $defaultDescription
202
+ ],
203
+ 'schemaType' => [
204
+ 'type' => 'string',
205
+ 'default' => $defaultSchemaType
206
+ ],
207
+ 'webPageType' => [
208
+ 'type' => 'string',
209
+ 'default' => $defaultWebPageType
210
+ ],
211
+ 'articleType' => [
212
+ 'type' => 'string',
213
+ 'default' => $defaultArticleType
214
+ ],
215
+ 'customFields' => [ 'type' => 'html' ],
216
+ 'advanced' => [
217
+ 'bulkEditing' => [
218
+ 'type' => 'string',
219
+ 'default' => 'enabled'
220
+ ]
221
+ ]
222
+ ]
223
+ );
224
+
225
+ if ( 'attachment' === $postType['name'] ) {
226
+ $defaultOptions['redirectAttachmentUrls'] = [
227
+ 'type' => 'string',
228
+ 'default' => 'attachment'
229
+ ];
230
+ }
231
+
232
+ $this->defaults['searchAppearance']['postTypes'][ $postType['name'] ] = $defaultOptions;
233
+ $this->setDynamicSocialOptions( 'postTypes', $postType['name'] );
234
+ $this->setDynamicSitemapOptions( 'postTypes', $postType['name'] );
235
+ }
236
+ }
237
+
238
+ /**
239
+ * Adds the dynamic defaults for the public taxonomies.
240
+ *
241
+ * @since 4.1.4
242
+ *
243
+ * @return void
244
+ */
245
+ protected function addDynamicTaxonomyDefaults() {
246
+ $taxonomies = aioseo()->helpers->getPublicTaxonomies();
247
+ foreach ( $taxonomies as $taxonomy ) {
248
+ if ( 'type' === $taxonomy['name'] ) {
249
+ $taxonomy['name'] = '_aioseo_type';
250
+ }
251
+
252
+ $defaultOptions = array_replace_recursive(
253
+ $this->getDefaultSearchAppearanceOptions(),
254
+ [
255
+ 'title' => [
256
+ 'type' => 'string',
257
+ 'localized' => true,
258
+ 'default' => '#taxonomy_title #separator_sa #site_title'
259
+ ],
260
+ 'metaDescription' => [
261
+ 'type' => 'string',
262
+ 'localized' => true,
263
+ 'default' => '#taxonomy_description'
264
+ ],
265
+ ]
266
+ );
267
+
268
+ $this->defaults['searchAppearance']['taxonomies'][ $taxonomy['name'] ] = $defaultOptions;
269
+ }
270
+ }
271
+
272
+ /**
273
+ * Adds the dynamic defaults for the archive pages.
274
+ *
275
+ * @since 4.1.4
276
+ *
277
+ * @return void
278
+ */
279
+ protected function addDynamicArchiveDefaults() {
280
+ $postTypes = aioseo()->helpers->getPublicPostTypes( false, true );
281
+ foreach ( $postTypes as $postType ) {
282
+ if ( 'type' === $postType['name'] ) {
283
+ $postType['name'] = '_aioseo_type';
284
+ }
285
+
286
+ $defaultOptions = array_replace_recursive(
287
+ $this->getDefaultSearchAppearanceOptions(),
288
+ [
289
+ 'title' => [
290
+ 'type' => 'string',
291
+ 'localized' => true,
292
+ 'default' => '#archive_title #separator_sa #site_title'
293
+ ],
294
+ 'metaDescription' => [
295
+ 'type' => 'string',
296
+ 'localized' => true,
297
+ 'default' => ''
298
+ ],
299
+ 'customFields' => [ 'type' => 'html' ],
300
+ 'advanced' => [
301
+ 'keywords' => [
302
+ 'type' => 'string',
303
+ 'localized' => true
304
+ ]
305
+ ]
306
+ ]
307
+ );
308
+
309
+ $this->defaults['searchAppearance']['archives'][ $postType['name'] ] = $defaultOptions;
310
+ }
311
+ }
312
+
313
+ /**
314
+ * Returns the search appearance options for dynamic objects.
315
+ *
316
+ * @since 4.1.4
317
+ *
318
+ * @return array The default options.
319
+ */
320
+ protected function getDefaultSearchAppearanceOptions() {
321
+ // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
322
+ return [
323
+ 'show' => [ 'type' => 'boolean', 'default' => true ],
324
+ 'advanced' => [
325
+ 'robotsMeta' => [
326
+ 'default' => [ 'type' => 'boolean', 'default' => true ],
327
+ 'noindex' => [ 'type' => 'boolean', 'default' => false ],
328
+ 'nofollow' => [ 'type' => 'boolean', 'default' => false ],
329
+ 'noarchive' => [ 'type' => 'boolean', 'default' => false ],
330
+ 'noimageindex' => [ 'type' => 'boolean', 'default' => false ],
331
+ 'notranslate' => [ 'type' => 'boolean', 'default' => false ],
332
+ 'nosnippet' => [ 'type' => 'boolean', 'default' => false ],
333
+ 'noodp' => [ 'type' => 'boolean', 'default' => false ],
334
+ 'maxSnippet' => [ 'type' => 'number', 'default' => -1 ],
335
+ 'maxVideoPreview' => [ 'type' => 'number', 'default' => -1 ],
336
+ 'maxImagePreview' => [ 'type' => 'string', 'default' => 'large' ]
337
+ ],
338
+ 'showDateInGooglePreview' => [ 'type' => 'boolean', 'default' => true ],
339
+ 'showPostThumbnailInSearch' => [ 'type' => 'boolean', 'default' => true ],
340
+ 'showMetaBox' => [ 'type' => 'boolean', 'default' => true ]
341
+ ]
342
+ ];
343
+ // phpcs:enable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
344
+ }
345
+
346
+ /**
347
+ * Sets the dynamic social settings for a given post type or taxonomy.
348
+ *
349
+ * @since 4.1.4
350
+ *
351
+ * @param string $objectType Whether the object belongs to the dynamic "postTypes" or "taxonomies".
352
+ * @param string $objectName The object name.
353
+ * @return void
354
+ */
355
+ protected function setDynamicSocialOptions( $objectType, $objectName ) {
356
+ $defaultOptions = [
357
+ 'objectType' => [
358
+ 'type' => 'string',
359
+ 'default' => 'article'
360
+ ]
361
+ ];
362
+
363
+ $this->defaults['social']['facebook']['general'][ $objectType ][ $objectName ] = $defaultOptions;
364
+ }
365
+
366
+ /**
367
+ * Sets the dynamic sitemap settings for a given post type or taxonomy.
368
+ *
369
+ * @since 4.1.4
370
+ *
371
+ * @param string $objectType Whether the object belongs to the dynamic "postTypes" or "taxonomies".
372
+ * @param string $objectName The object name.
373
+ * @return void
374
+ */
375
+ protected function setDynamicSitemapOptions( $objectType, $objectName ) {
376
+ $this->defaults['sitemap']['priority'][ $objectType ][ $objectName ] = [
377
+ 'priority' => [
378
+ 'type' => 'string',
379
+ 'default' => '{"label":"default","value":"default"}'
380
+ ],
381
+ 'frequency' => [
382
+ 'type' => 'string',
383
+ 'default' => '{"label":"default","value":"default"}'
384
+ ]
385
+ ];
386
+ }
387
+ }
app/Common/{Utils → Options}/InternalOptions.php RENAMED
@@ -1,5 +1,5 @@
1
  <?php
2
- namespace AIOSEO\Plugin\Common\Utils;
3
 
4
  // Exit if accessed directly.
5
  if ( ! defined( 'ABSPATH' ) ) {
@@ -77,12 +77,14 @@ class InternalOptions {
77
  *
78
  * @since 4.0.0
79
  *
80
- * @param string $optionsName An array of options.
81
  */
82
  public function __construct( $optionsName = 'aioseo_options_internal' ) {
83
  $this->optionsName = is_network_admin() ? $optionsName . '_network' : $optionsName;
84
 
85
  $this->init();
 
 
86
  }
87
 
88
  /**
@@ -94,10 +96,7 @@ class InternalOptions {
94
  */
95
  protected function init() {
96
  // Options from the DB.
97
- $dbOptions = json_decode( get_option( $this->optionsName ), true );
98
- if ( empty( $dbOptions ) ) {
99
- $dbOptions = [];
100
- }
101
 
102
  // Refactor options.
103
  $this->defaultsMerged = array_replace_recursive( $this->defaults, $this->defaultsMerged );
@@ -107,7 +106,7 @@ class InternalOptions {
107
  $this->addValueToValuesArray( $this->defaultsMerged, $dbOptions )
108
  );
109
 
110
- $this->options = apply_filters( 'aioseo_get_options_internal', $options );
111
 
112
  // Get the localized options.
113
  $dbOptionsLocalized = get_option( $this->optionsName . '_localized' );
@@ -142,17 +141,20 @@ class InternalOptions {
142
  }
143
 
144
  // Refactor options.
145
- $this->options = array_replace_recursive(
146
- $this->options,
147
- $this->addValueToValuesArray( $this->options, $options, [], true )
 
148
  );
149
 
150
- $this->options['internal']['siteAnalysis']['competitors']['value'] = $this->sanitizeField( $options['internal']['siteAnalysis']['competitors'], 'array', true );
 
 
151
 
152
  // Update localized options.
153
  update_option( $this->optionsName . '_localized', $this->localized );
154
 
155
  // Update values.
156
- $this->update();
157
  }
158
  }
1
  <?php
2
+ namespace AIOSEO\Plugin\Common\Options;
3
 
4
  // Exit if accessed directly.
5
  if ( ! defined( 'ABSPATH' ) ) {
77
  *
78
  * @since 4.0.0
79
  *
80
+ * @param string $optionsName The options name.
81
  */
82
  public function __construct( $optionsName = 'aioseo_options_internal' ) {
83
  $this->optionsName = is_network_admin() ? $optionsName . '_network' : $optionsName;
84
 
85
  $this->init();
86
+
87
+ add_action( 'shutdown', [ $this, 'save' ] );
88
  }
89
 
90
  /**
96
  */
97
  protected function init() {
98
  // Options from the DB.
99
+ $dbOptions = $this->getDbOptions( $this->optionsName );
 
 
 
100
 
101
  // Refactor options.
102
  $this->defaultsMerged = array_replace_recursive( $this->defaults, $this->defaultsMerged );
106
  $this->addValueToValuesArray( $this->defaultsMerged, $dbOptions )
107
  );
108
 
109
+ aioseo()->optionsCache->setOptions( $this->optionsName, apply_filters( 'aioseo_get_options_internal', $options ) );
110
 
111
  // Get the localized options.
112
  $dbOptionsLocalized = get_option( $this->optionsName . '_localized' );
141
  }
142
 
143
  // Refactor options.
144
+ $cachedOptions = aioseo()->optionsCache->getOptions( $this->optionsName );
145
+ $dbOptions = array_replace_recursive(
146
+ $cachedOptions,
147
+ $this->addValueToValuesArray( $cachedOptions, $options, [], true )
148
  );
149
 
150
+ $dbOptions['internal']['siteAnalysis']['competitors']['value'] = $this->sanitizeField( $options['internal']['siteAnalysis']['competitors'], 'array', true );
151
+
152
+ aioseo()->optionsCache->setOptions( $this->optionsName, $dbOptions );
153
 
154
  // Update localized options.
155
  update_option( $this->optionsName . '_localized', $this->localized );
156
 
157
  // Update values.
158
+ $this->save( true );
159
  }
160
  }
app/Common/{Utils → Options}/Options.php RENAMED
@@ -1,5 +1,5 @@
1
  <?php
2
- namespace AIOSEO\Plugin\Common\Utils;
3
 
4
  // Exit if accessed directly.
5
  if ( ! defined( 'ABSPATH' ) ) {
@@ -17,15 +17,6 @@ use AIOSEO\Plugin\Common\Traits;
17
  class Options {
18
  use Traits\Options;
19
 
20
- /**
21
- * Whether the options need to be updated.
22
- *
23
- * @since 4.1.1
24
- *
25
- * @var bool
26
- */
27
- protected $needsUpdate = false;
28
-
29
  /**
30
  * All the default options.
31
  *
@@ -169,12 +160,6 @@ TEMPLATE
169
  'excludeTerms' => [ 'type' => 'array', 'default' => [] ]
170
  ]
171
  ],
172
- 'dynamic' => [
173
- 'priority' => [
174
- 'postTypes' => [],
175
- 'taxonomies' => []
176
- ]
177
- ]
178
  ],
179
  'social' => [
180
  'profiles' => [
@@ -208,12 +193,7 @@ TEMPLATE
208
  'defaultImagePostsWidth' => [ 'type' => 'number', 'default' => '' ],
209
  'defaultImagePostsHeight' => [ 'type' => 'number', 'default' => '' ],
210
  'showAuthor' => [ 'type' => 'boolean', 'default' => true ],
211
- 'siteName' => [ 'type' => 'string', 'localized' => true, 'default' => '#site_title #separator_sa #tagline' ],
212
- 'dynamic' => [
213
- 'postTypes' => [],
214
- 'taxonomies' => [],
215
- 'archives' => []
216
- ]
217
  ],
218
  'homePage' => [
219
  'image' => [ 'type' => 'string', 'default' => '' ],
@@ -371,11 +351,6 @@ TEMPLATE
371
  'keywords' => [ 'type' => 'string', 'localized' => true ]
372
  ]
373
  ]
374
- ],
375
- 'dynamic' => [
376
- 'postTypes' => [],
377
- 'taxonomies' => [],
378
- 'archives' => []
379
  ]
380
  ],
381
  'tools' => [
@@ -456,6 +431,8 @@ TEMPLATE
456
  $this->optionsName = is_network_admin() ? $optionsName . '_network' : $optionsName;
457
 
458
  $this->init();
 
 
459
  }
460
 
461
  /**
@@ -463,322 +440,63 @@ TEMPLATE
463
  *
464
  * @since 4.0.0
465
  *
466
- * @param boolean $resetKeys Whether or not to reset keys after init.
467
  * @return void
468
  */
469
- protected function init( $resetKeys = false ) {
470
- if ( $resetKeys ) {
471
- $originalGroupKey = $this->groupKey;
472
- $originalSubGroups = $this->subGroups;
473
- }
474
-
475
- $this->addDynamicDefaults();
476
  $this->translateDefaults();
477
 
478
- $options = $this->getDbOptions();
479
-
480
- $this->options = apply_filters( 'aioseo_get_options', $options );
481
-
482
- // Get the localized options.
483
- $dbOptionsLocalized = get_option( $this->optionsName . '_localized' );
484
- if ( empty( $dbOptionsLocalized ) ) {
485
- $dbOptionsLocalized = [];
486
- }
487
- $this->localized = $dbOptionsLocalized;
488
-
489
- if ( $resetKeys ) {
490
- $this->groupKey = $originalGroupKey;
491
- $this->subGroups = $originalSubGroups;
492
- }
493
 
494
  add_action( 'wp_loaded', [ $this, 'maybeFlushRewriteRules' ] );
495
  }
496
 
497
  /**
498
- * Get the DB options.
499
  *
500
- * @since 4.0.12
501
  *
502
- * @return array An array of options.
503
  */
504
- public function getDbOptions() {
505
- // Options from the DB.
506
- $dbOptions = json_decode( get_option( $this->optionsName ), true );
507
- if ( empty( $dbOptions ) ) {
508
- $dbOptions = [];
509
- }
510
-
511
  // Refactor options.
512
  $this->defaultsMerged = array_replace_recursive( $this->defaults, $this->defaultsMerged );
513
 
514
- return array_replace_recursive(
 
 
515
  $this->defaultsMerged,
516
  $this->addValueToValuesArray( $this->defaultsMerged, $dbOptions )
517
  );
518
- }
519
-
520
- /**
521
- * Adds some defaults that are dynamically generated.
522
- *
523
- * @since 4.0.0
524
- *
525
- * @return void
526
- */
527
- public function addDynamicDefaults() {
528
- $this->addDynamicPostTypeDefaults();
529
- $this->addDynamicTaxonomyDefaults();
530
- $this->addDynamicArchiveDefaults();
531
-
532
- $this->defaults['searchAppearance']['global']['schema']['organizationName']['default'] = aioseo()->helpers->decodeHtmlEntities( get_bloginfo( 'name' ) );
533
- $this->defaults['deprecated']['tools']['blocker']['custom']['bots']['default'] = implode( "\n", aioseo()->badBotBlocker->getBotList() );
534
- $this->defaults['deprecated']['tools']['blocker']['custom']['referer']['default'] = implode( "\n", aioseo()->badBotBlocker->getRefererList() );
535
-
536
- if ( $this->needsUpdate ) {
537
- $this->needsUpdate = false;
538
- $this->update( $this->getDbOptions() );
539
- }
540
- }
541
-
542
- /**
543
- * Adds the dynamic defaults for the public post types.
544
- *
545
- * @since 4.1.1
546
- *
547
- * @return void
548
- */
549
- protected function addDynamicPostTypeDefaults() {
550
- $postTypes = aioseo()->helpers->getPublicPostTypes();
551
- foreach ( $postTypes as $postType ) {
552
- if ( 'type' === $postType['name'] ) {
553
- $postType['name'] = '_aioseo_type';
554
- }
555
-
556
- $defaultTitle = '#post_title #separator_sa #site_title';
557
- $defaultDescription = $postType['hasExcerpt'] ? '#post_excerpt' : '#post_content';
558
- $defaultSchemaType = 'WebPage';
559
- $defaultWebPageType = 'WebPage';
560
- $defaultArticleType = 'BlogPosting';
561
-
562
- switch ( $postType['name'] ) {
563
- case 'post':
564
- $defaultSchemaType = 'Article';
565
- break;
566
- case 'attachment':
567
- $defaultDescription = '#attachment_caption';
568
- $defaultSchemaType = 'ItemPage';
569
- $defaultWebPageType = 'ItemPage';
570
- break;
571
- case 'product':
572
- $defaultSchemaType = 'WebPage';
573
- $defaultWebPageType = 'ItemPage';
574
- break;
575
- case 'news':
576
- $defaultArticleType = 'NewsArticle';
577
- break;
578
- default:
579
- break;
580
- }
581
-
582
- $defaultOptions = array_replace_recursive(
583
- $this->getDefaultSearchAppearanceOptions(),
584
- [
585
- 'title' => [
586
- 'type' => 'string',
587
- 'localized' => true,
588
- 'default' => $defaultTitle
589
- ],
590
- 'metaDescription' => [
591
- 'type' => 'string',
592
- 'localized' => true,
593
- 'default' => $defaultDescription
594
- ],
595
- 'schemaType' => [
596
- 'type' => 'string',
597
- 'default' => $defaultSchemaType
598
- ],
599
- 'webPageType' => [
600
- 'type' => 'string',
601
- 'default' => $defaultWebPageType
602
- ],
603
- 'articleType' => [
604
- 'type' => 'string',
605
- 'default' => $defaultArticleType
606
- ],
607
- 'customFields' => [ 'type' => 'html' ],
608
- 'advanced' => [
609
- 'bulkEditing' => [
610
- 'type' => 'string',
611
- 'default' => 'enabled'
612
- ]
613
- ]
614
- ]
615
- );
616
-
617
- if ( 'attachment' === $postType['name'] ) {
618
- $defaultOptions['redirectAttachmentUrls'] = [
619
- 'type' => 'string',
620
- 'default' => 'attachment'
621
- ];
622
- }
623
-
624
- $this->defaults['searchAppearance']['dynamic']['postTypes'][ $postType['name'] ] = $defaultOptions;
625
- $this->setDynamicSocialOptions( 'postTypes', $postType['name'] );
626
- $this->setDynamicSitemapOptions( 'postTypes', $postType['name'] );
627
- }
628
- }
629
 
630
- /**
631
- * Adds the dynamic defaults for the public taxonomies.
632
- *
633
- * @since 4.1.1
634
- *
635
- * @return void
636
- */
637
- protected function addDynamicTaxonomyDefaults() {
638
- $taxonomies = aioseo()->helpers->getPublicTaxonomies();
639
- foreach ( $taxonomies as $taxonomy ) {
640
- if ( 'type' === $taxonomy['name'] ) {
641
- $taxonomy['name'] = '_aioseo_type';
642
- }
643
 
644
- $defaultOptions = array_replace_recursive(
645
- $this->getDefaultSearchAppearanceOptions(),
646
- [
647
- 'title' => [
648
- 'type' => 'string',
649
- 'localized' => true,
650
- 'default' => '#taxonomy_title #separator_sa #site_title'
651
- ],
652
- 'metaDescription' => [
653
- 'type' => 'string',
654
- 'localized' => true,
655
- 'default' => '#taxonomy_description'
656
- ],
657
- ]
658
- );
659
-
660
- $this->defaults['searchAppearance']['dynamic']['taxonomies'][ $taxonomy['name'] ] = $defaultOptions;
661
- $this->setDynamicSocialOptions( 'taxonomies', $taxonomy['name'] );
662
- $this->setDynamicSitemapOptions( 'taxonomies', $taxonomy['name'] );
663
  }
664
-
665
  }
666
 
667
  /**
668
- * Adds the dynamic defaults for the archive pages.
669
  *
670
- * @since 4.1.1
671
  *
672
  * @return void
673
  */
674
- protected function addDynamicArchiveDefaults() {
675
- $postTypes = aioseo()->helpers->getPublicPostTypes( false, true );
676
- foreach ( $postTypes as $postType ) {
677
- if ( 'type' === $postType['name'] ) {
678
- $postType['name'] = '_aioseo_type';
679
- }
680
-
681
- $defaultOptions = array_replace_recursive(
682
- $this->getDefaultSearchAppearanceOptions(),
683
- [
684
- 'title' => [
685
- 'type' => 'string',
686
- 'localized' => true,
687
- 'default' => '#archive_title #separator_sa #site_title'
688
- ],
689
- 'metaDescription' => [
690
- 'type' => 'string',
691
- 'localized' => true,
692
- 'default' => ''
693
- ],
694
- 'customFields' => [ 'type' => 'html' ],
695
- 'advanced' => [
696
- 'keywords' => [
697
- 'type' => 'string',
698
- 'localized' => true
699
- ]
700
- ]
701
- ]
702
- );
703
-
704
- $this->defaults['searchAppearance']['dynamic']['archives'][ $postType['name'] ] = $defaultOptions;
705
- $this->setDynamicSocialOptions( 'archives', $postType['name'] );
706
  }
707
- }
708
-
709
- /**
710
- * Returns the search appearance options for dynamic objects.
711
- *
712
- * @since 4.1.1
713
- *
714
- * @return array The default options.
715
- */
716
- protected function getDefaultSearchAppearanceOptions() {
717
- // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
718
- return [
719
- 'show' => [ 'type' => 'boolean', 'default' => true ],
720
- 'advanced' => [
721
- 'robotsMeta' => [
722
- 'default' => [ 'type' => 'boolean', 'default' => true ],
723
- 'noindex' => [ 'type' => 'boolean', 'default' => false ],
724
- 'nofollow' => [ 'type' => 'boolean', 'default' => false ],
725
- 'noarchive' => [ 'type' => 'boolean', 'default' => false ],
726
- 'noimageindex' => [ 'type' => 'boolean', 'default' => false ],
727
- 'notranslate' => [ 'type' => 'boolean', 'default' => false ],
728
- 'nosnippet' => [ 'type' => 'boolean', 'default' => false ],
729
- 'noodp' => [ 'type' => 'boolean', 'default' => false ],
730
- 'maxSnippet' => [ 'type' => 'number', 'default' => -1 ],
731
- 'maxVideoPreview' => [ 'type' => 'number', 'default' => -1 ],
732
- 'maxImagePreview' => [ 'type' => 'string', 'default' => 'large' ]
733
- ],
734
- 'showDateInGooglePreview' => [ 'type' => 'boolean', 'default' => true ],
735
- 'showPostThumbnailInSearch' => [ 'type' => 'boolean', 'default' => true ],
736
- 'showMetaBox' => [ 'type' => 'boolean', 'default' => true ]
737
- ]
738
- ];
739
- // phpcs:enable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
740
- }
741
 
742
- /**
743
- * Sets the dynamic social settings for a given post type or taxonomy.
744
- *
745
- * @since 4.1.1
746
- *
747
- * @param string $objectType Whether the object belongs to the dynamic "postTypes" or "taxonomies".
748
- * @param string $objectName The object name.
749
- * @return void
750
- */
751
- protected function setDynamicSocialOptions( $objectType, $objectName ) {
752
- $defaultOptions = [
753
- 'objectType' => [
754
- 'type' => 'string',
755
- 'default' => 'article'
756
- ]
757
- ];
758
 
759
- $this->defaults['social']['facebook']['general']['dynamic'][ $objectType ][ $objectName ] = $defaultOptions;
760
- }
761
-
762
- /**
763
- * Sets the dynamic sitemap settings for a given post type or taxonomy.
764
- *
765
- * @since 4.1.1
766
- *
767
- * @param string $objectType Whether the object belongs to the dynamic "postTypes" or "taxonomies".
768
- * @param string $objectName The object name.
769
- * @return void
770
- */
771
- protected function setDynamicSitemapOptions( $objectType, $objectName ) {
772
- $this->defaults['sitemap']['dynamic']['priority'][ $objectType ][ $objectName ] = [
773
- 'priority' => [
774
- 'type' => 'string',
775
- 'default' => '{"label":"default","value":"default"}'
776
- ],
777
- 'frequency' => [
778
- 'type' => 'string',
779
- 'default' => '{"label":"default","value":"default"}'
780
- ]
781
- ];
782
  }
783
 
784
  /**
@@ -789,6 +507,13 @@ TEMPLATE
789
  * @return void
790
  */
791
  public function translateDefaults() {
 
 
 
 
 
 
 
792
  $default = sprintf( '{"label":"%1$s","value":"default"}', __( 'default', 'all-in-one-seo-pack' ) );
793
  $this->defaults['sitemap']['general']['advancedSettings']['priority']['homePage']['priority']['default'] = $default;
794
  $this->defaults['sitemap']['general']['advancedSettings']['priority']['homePage']['frequency']['default'] = $default;
@@ -836,42 +561,42 @@ TEMPLATE
836
  }
837
 
838
  // Refactor options.
839
- $this->options = array_replace_recursive(
840
- $this->options,
841
- $this->addValueToValuesArray( $this->options, $options, [], true )
 
842
  );
843
 
844
- aioseo()->dynamicBackup->maybeBackup( $this->options );
845
-
846
  // The above works for most options, but there are a few that need to be forcibly updated.
847
  if ( $sitemapOptions ) {
848
- $this->options['sitemap']['general']['postTypes']['included']['value'] = $this->sanitizeField( $options['sitemap']['general']['postTypes']['included'], 'array' );
849
- $this->options['sitemap']['general']['taxonomies']['included']['value'] = $this->sanitizeField( $options['sitemap']['general']['taxonomies']['included'], 'array' );
850
- $this->options['sitemap']['general']['additionalPages']['pages']['value'] = $this->sanitizeField( $options['sitemap']['general']['additionalPages']['pages'], 'array' );
851
- $this->options['sitemap']['general']['advancedSettings']['excludePosts']['value'] = $this->sanitizeField( $options['sitemap']['general']['advancedSettings']['excludePosts'], 'array' );
852
- $this->options['sitemap']['general']['advancedSettings']['excludeTerms']['value'] = $this->sanitizeField( $options['sitemap']['general']['advancedSettings']['excludeTerms'], 'array' );
853
- $this->options['sitemap']['rss']['postTypes']['included']['value'] = $this->sanitizeField( $options['sitemap']['rss']['postTypes']['included'], 'array' );
854
- $this->options['sitemap']['html']['postTypes']['included']['value'] = $this->sanitizeField( $options['sitemap']['html']['postTypes']['included'], 'array' );
855
- $this->options['sitemap']['html']['taxonomies']['included']['value'] = $this->sanitizeField( $options['sitemap']['html']['taxonomies']['included'], 'array' );
856
- $this->options['sitemap']['html']['advancedSettings']['excludePosts']['value'] = $this->sanitizeField( $options['sitemap']['html']['advancedSettings']['excludePosts'], 'array' );
857
- $this->options['sitemap']['html']['advancedSettings']['excludeTerms']['value'] = $this->sanitizeField( $options['sitemap']['html']['advancedSettings']['excludeTerms'], 'array' );
858
  }
859
 
860
  // Advanced options.
861
  if ( ! empty( $options['advanced'] ) ) {
862
  if ( isset( $options['advanced']['postTypes']['included'] ) ) {
863
- $this->options['advanced']['postTypes']['included']['value'] = $this->sanitizeField( $options['advanced']['postTypes']['included'], 'array' );
864
  }
865
 
866
  if ( isset( $options['advanced']['taxonomies']['included'] ) ) {
867
- $this->options['advanced']['taxonomies']['included']['value'] = $this->sanitizeField( $options['advanced']['taxonomies']['included'], 'array' );
868
  }
869
  }
870
 
871
  // Tools.
872
  if ( ! empty( $options['tools'] ) ) {
873
  if ( isset( $options['tools']['robots']['rules'] ) ) {
874
- $this->options['tools']['robots']['rules']['value'] = $this->sanitizeField( $options['tools']['robots']['rules'], 'array' );
875
  }
876
  }
877
 
@@ -879,23 +604,24 @@ TEMPLATE
879
  if ( ! empty( $options['deprecated'] ) ) {
880
 
881
  if ( isset( $options['deprecated']['webmasterTools']['googleAnalytics']['excludeUsers'] ) ) {
882
- $this->options['deprecated']['webmasterTools']['googleAnalytics']['excludeUsers']['value'] = $this->sanitizeField( $options['deprecated']['webmasterTools']['googleAnalytics']['excludeUsers'], 'array' ); // phpcs:ignore Generic.Files.LineLength.MaxExceeded
883
  }
884
  if ( isset( $options['deprecated']['searchAppearance']['advanced']['excludePosts'] ) ) {
885
- $this->options['deprecated']['searchAppearance']['advanced']['excludePosts']['value'] = $this->sanitizeField( $options['deprecated']['searchAppearance']['advanced']['excludePosts'], 'array' ); // phpcs:ignore Generic.Files.LineLength.MaxExceeded
886
  }
887
 
888
  if ( isset( $options['deprecated']['searchAppearance']['advanced']['excludeTerms'] ) ) {
889
- $this->options['deprecated']['searchAppearance']['advanced']['excludeTerms']['value'] = $this->sanitizeField( $options['deprecated']['searchAppearance']['advanced']['excludeTerms'], 'array' ); // phpcs:ignore Generic.Files.LineLength.MaxExceeded
890
  }
891
  }
892
 
893
  // Social networks.
894
  if ( isset( $options['social']['profiles']['sameUsername']['included'] ) ) {
895
- $this->options['social']['profiles']['sameUsername']['included']['value'] = $this->sanitizeField( $options['social']['profiles']['sameUsername']['included'], 'array' );
896
  }
897
 
898
- if ( $this->sitemap->html->enable ) {
 
899
  $newOptions = ! empty( $options['sitemap']['html'] ) ? $options['sitemap']['html'] : null;
900
 
901
  $pageUrl = wp_parse_url( $newOptions['pageUrl'] );
@@ -909,11 +635,13 @@ TEMPLATE
909
  }
910
  }
911
 
 
 
912
  // Update localized options.
913
  update_option( $this->optionsName . '_localized', $this->localized );
914
 
915
  // Update values.
916
- $this->update();
917
 
918
  // If phone settings have changed, let's see if we need to dump the phone number notice.
919
  if (
@@ -942,6 +670,9 @@ TEMPLATE
942
  aioseo()->sitemap->scheduleRegeneration();
943
  }
944
  }
 
 
 
945
  }
946
 
947
  /**
1
  <?php
2
+ namespace AIOSEO\Plugin\Common\Options;
3
 
4
  // Exit if accessed directly.
5
  if ( ! defined( 'ABSPATH' ) ) {
17
  class Options {
18
  use Traits\Options;
19
 
 
 
 
 
 
 
 
 
 
20
  /**
21
  * All the default options.
22
  *
160
  'excludeTerms' => [ 'type' => 'array', 'default' => [] ]
161
  ]
162
  ],
 
 
 
 
 
 
163
  ],
164
  'social' => [
165
  'profiles' => [
193
  'defaultImagePostsWidth' => [ 'type' => 'number', 'default' => '' ],
194
  'defaultImagePostsHeight' => [ 'type' => 'number', 'default' => '' ],
195
  'showAuthor' => [ 'type' => 'boolean', 'default' => true ],
196
+ 'siteName' => [ 'type' => 'string', 'localized' => true, 'default' => '#site_title #separator_sa #tagline' ]
 
 
 
 
 
197
  ],
198
  'homePage' => [
199
  'image' => [ 'type' => 'string', 'default' => '' ],
351
  'keywords' => [ 'type' => 'string', 'localized' => true ]
352
  ]
353
  ]
 
 
 
 
 
354
  ]
355
  ],
356
  'tools' => [
431
  $this->optionsName = is_network_admin() ? $optionsName . '_network' : $optionsName;
432
 
433
  $this->init();
434
+
435
+ add_action( 'shutdown', [ $this, 'save' ] );
436
  }
437
 
438
  /**
440
  *
441
  * @since 4.0.0
442
  *
 
443
  * @return void
444
  */
445
+ protected function init() {
446
+ $this->setInitialDefaults();
 
 
 
 
 
447
  $this->translateDefaults();
448
 
449
+ $this->setDbOptions();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
450
 
451
  add_action( 'wp_loaded', [ $this, 'maybeFlushRewriteRules' ] );
452
  }
453
 
454
  /**
455
+ * Sets the DB options to the class after merging in new defaults and dropping unknown values.
456
  *
457
+ * @since 4.0.14
458
  *
459
+ * @return void
460
  */
461
+ public function setDbOptions() {
 
 
 
 
 
 
462
  // Refactor options.
463
  $this->defaultsMerged = array_replace_recursive( $this->defaults, $this->defaultsMerged );
464
 
465
+ $dbOptions = $this->getDbOptions( $this->optionsName );
466
+
467
+ $options = array_replace_recursive(
468
  $this->defaultsMerged,
469
  $this->addValueToValuesArray( $this->defaultsMerged, $dbOptions )
470
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
471
 
472
+ aioseo()->optionsCache->setOptions( $this->optionsName, apply_filters( 'aioseo_get_options', $options ) );
 
 
 
 
 
 
 
 
 
 
 
 
473
 
474
+ // Get the localized options.
475
+ $dbOptionsLocalized = get_option( $this->optionsName . '_localized' );
476
+ if ( empty( $dbOptionsLocalized ) ) {
477
+ $dbOptionsLocalized = [];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
478
  }
479
+ $this->localized = $dbOptionsLocalized;
480
  }
481
 
482
  /**
483
+ * Sets the initial defaults that can't be defined in the property because of PHP 5.4.
484
  *
485
+ * @since 4.1.4
486
  *
487
  * @return void
488
  */
489
+ protected function setInitialDefaults() {
490
+ static $hasInitialized = false;
491
+ if ( $hasInitialized ) {
492
+ return;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
493
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
494
 
495
+ $hasInitialized = true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
496
 
497
+ $this->defaults['searchAppearance']['global']['schema']['organizationName']['default'] = aioseo()->helpers->decodeHtmlEntities( get_bloginfo( 'name' ) );
498
+ $this->defaults['deprecated']['tools']['blocker']['custom']['bots']['default'] = implode( "\n", aioseo()->badBotBlocker->getBotList() );
499
+ $this->defaults['deprecated']['tools']['blocker']['custom']['referer']['default'] = implode( "\n", aioseo()->badBotBlocker->getRefererList() );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
500
  }
501
 
502
  /**
507
  * @return void
508
  */
509
  public function translateDefaults() {
510
+ static $hasInitialized = false;
511
+ if ( $hasInitialized ) {
512
+ return;
513
+ }
514
+
515
+ $hasInitialized = true;
516
+
517
  $default = sprintf( '{"label":"%1$s","value":"default"}', __( 'default', 'all-in-one-seo-pack' ) );
518
  $this->defaults['sitemap']['general']['advancedSettings']['priority']['homePage']['priority']['default'] = $default;
519
  $this->defaults['sitemap']['general']['advancedSettings']['priority']['homePage']['frequency']['default'] = $default;
561
  }
562
 
563
  // Refactor options.
564
+ $cachedOptions = aioseo()->optionsCache->getOptions( $this->optionsName );
565
+ $dbOptions = array_replace_recursive(
566
+ $cachedOptions,
567
+ $this->addValueToValuesArray( $cachedOptions, $options, [], true )
568
  );
569
 
570
+ // TODO: Refactor this into an array since importing old settings imports fail because new settings might not exist in the $options being passed in here. (i.e. 'html' below).
 
571
  // The above works for most options, but there are a few that need to be forcibly updated.
572
  if ( $sitemapOptions ) {
573
+ $dbOptions['sitemap']['general']['postTypes']['included']['value'] = $this->sanitizeField( $options['sitemap']['general']['postTypes']['included'], 'array' );
574
+ $dbOptions['sitemap']['general']['taxonomies']['included']['value'] = $this->sanitizeField( $options['sitemap']['general']['taxonomies']['included'], 'array' );
575
+ $dbOptions['sitemap']['general']['additionalPages']['pages']['value'] = $this->sanitizeField( $options['sitemap']['general']['additionalPages']['pages'], 'array' );
576
+ $dbOptions['sitemap']['general']['advancedSettings']['excludePosts']['value'] = $this->sanitizeField( $options['sitemap']['general']['advancedSettings']['excludePosts'], 'array' );
577
+ $dbOptions['sitemap']['general']['advancedSettings']['excludeTerms']['value'] = $this->sanitizeField( $options['sitemap']['general']['advancedSettings']['excludeTerms'], 'array' );
578
+ $dbOptions['sitemap']['rss']['postTypes']['included']['value'] = $this->sanitizeField( $options['sitemap']['rss']['postTypes']['included'], 'array' );
579
+ $dbOptions['sitemap']['html']['postTypes']['included']['value'] = $this->sanitizeField( $options['sitemap']['html']['postTypes']['included'], 'array' );
580
+ $dbOptions['sitemap']['html']['taxonomies']['included']['value'] = $this->sanitizeField( $options['sitemap']['html']['taxonomies']['included'], 'array' );
581
+ $dbOptions['sitemap']['html']['advancedSettings']['excludePosts']['value'] = $this->sanitizeField( $options['sitemap']['html']['advancedSettings']['excludePosts'], 'array' );
582
+ $dbOptions['sitemap']['html']['advancedSettings']['excludeTerms']['value'] = $this->sanitizeField( $options['sitemap']['html']['advancedSettings']['excludeTerms'], 'array' );
583
  }
584
 
585
  // Advanced options.
586
  if ( ! empty( $options['advanced'] ) ) {
587
  if ( isset( $options['advanced']['postTypes']['included'] ) ) {
588
+ $dbOptions['advanced']['postTypes']['included']['value'] = $this->sanitizeField( $options['advanced']['postTypes']['included'], 'array' );
589
  }
590
 
591
  if ( isset( $options['advanced']['taxonomies']['included'] ) ) {
592
+ $dbOptions['advanced']['taxonomies']['included']['value'] = $this->sanitizeField( $options['advanced']['taxonomies']['included'], 'array' );
593
  }
594
  }
595
 
596
  // Tools.
597
  if ( ! empty( $options['tools'] ) ) {
598
  if ( isset( $options['tools']['robots']['rules'] ) ) {
599
+ $dbOptions['tools']['robots']['rules']['value'] = $this->sanitizeField( $options['tools']['robots']['rules'], 'array' );
600
  }
601
  }
602
 
604
  if ( ! empty( $options['deprecated'] ) ) {
605
 
606
  if ( isset( $options['deprecated']['webmasterTools']['googleAnalytics']['excludeUsers'] ) ) {
607
+ $dbOptions['deprecated']['webmasterTools']['googleAnalytics']['excludeUsers']['value'] = $this->sanitizeField( $options['deprecated']['webmasterTools']['googleAnalytics']['excludeUsers'], 'array' ); // phpcs:ignore Generic.Files.LineLength.MaxExceeded
608
  }
609
  if ( isset( $options['deprecated']['searchAppearance']['advanced']['excludePosts'] ) ) {
610
+ $dbOptions['deprecated']['searchAppearance']['advanced']['excludePosts']['value'] = $this->sanitizeField( $options['deprecated']['searchAppearance']['advanced']['excludePosts'], 'array' ); // phpcs:ignore Generic.Files.LineLength.MaxExceeded
611
  }
612
 
613
  if ( isset( $options['deprecated']['searchAppearance']['advanced']['excludeTerms'] ) ) {
614
+ $dbOptions['deprecated']['searchAppearance']['advanced']['excludeTerms']['value'] = $this->sanitizeField( $options['deprecated']['searchAppearance']['advanced']['excludeTerms'], 'array' ); // phpcs:ignore Generic.Files.LineLength.MaxExceeded
615
  }
616
  }
617
 
618
  // Social networks.
619
  if ( isset( $options['social']['profiles']['sameUsername']['included'] ) ) {
620
+ $dbOptions['social']['profiles']['sameUsername']['included']['value'] = $this->sanitizeField( $options['social']['profiles']['sameUsername']['included'], 'array' );
621
  }
622
 
623
+ $newOptions = ! empty( $options['sitemap']['html'] ) ? $options['sitemap']['html'] : null;
624
+ if ( ! empty( $newOptions ) && $this->sitemap->html->enable ) {
625
  $newOptions = ! empty( $options['sitemap']['html'] ) ? $options['sitemap']['html'] : null;
626
 
627
  $pageUrl = wp_parse_url( $newOptions['pageUrl'] );
635
  }
636
  }
637
 
638
+ aioseo()->optionsCache->setOptions( $this->optionsName, $dbOptions );
639
+
640
  // Update localized options.
641
  update_option( $this->optionsName . '_localized', $this->localized );
642
 
643
  // Update values.
644
+ $this->save( true );
645
 
646
  // If phone settings have changed, let's see if we need to dump the phone number notice.
647
  if (
670
  aioseo()->sitemap->scheduleRegeneration();
671
  }
672
  }
673
+
674
+ // This is required in order for the Pro options to be refreshed before they save data again.
675
+ $this->refresh();
676
  }
677
 
678
  /**
app/Common/Schema/Graphs/Article.php CHANGED
@@ -40,6 +40,7 @@ class Article extends Graph {
40
  '@id' => aioseo()->schema->context['url'] . '#article',
41
  'name' => aioseo()->schema->context['name'],
42
  'description' => aioseo()->schema->context['description'],
 
43
  'headline' => $post->post_title,
44
  'author' => [ '@id' => get_author_posts_url( $post->post_author ) . '#author' ],
45
  'publisher' => [ '@id' => trailingslashit( home_url() ) . '#' . aioseo()->options->searchAppearance->global->schema->siteRepresents ],
40
  '@id' => aioseo()->schema->context['url'] . '#article',
41
  'name' => aioseo()->schema->context['name'],
42
  'description' => aioseo()->schema->context['description'],
43
+ 'inLanguage' => aioseo()->helpers->currentLanguageCodeBCP47(),
44
  'headline' => $post->post_title,
45
  'author' => [ '@id' => get_author_posts_url( $post->post_author ) . '#author' ],
46
  'publisher' => [ '@id' => trailingslashit( home_url() ) . '#' . aioseo()->options->searchAppearance->global->schema->siteRepresents ],
app/Common/Schema/Graphs/BreadcrumbList.php CHANGED
@@ -20,8 +20,8 @@ class BreadcrumbList extends Graph {
20
  * @return array $data The graph data.
21
  */
22
  public function get() {
23
- $breadcrumbs = aioseo()->schema->context['breadcrumb'];
24
- if ( ! is_array( $breadcrumbs ) || ! count( $breadcrumbs ) ) {
25
  return [];
26
  }
27
 
20
  * @return array $data The graph data.
21
  */
22
  public function get() {
23
+ $breadcrumbs = isset( aioseo()->schema->context['breadcrumb'] ) ? aioseo()->schema->context['breadcrumb'] : '';
24
+ if ( ! $breadcrumbs || ! count( $breadcrumbs ) ) {
25
  return [];
26
  }
27
 
app/Common/Schema/Graphs/Graph.php CHANGED
@@ -44,17 +44,34 @@ abstract class Graph {
44
 
45
  $metaData = wp_get_attachment_metadata( $attachmentId );
46
  if ( $metaData ) {
47
- $data['width'] = $metaData['width'];
48
- $data['height'] = $metaData['height'];
49
  }
50
 
51
- $caption = wp_get_attachment_caption( $attachmentId );
52
- if ( false !== $caption || ! empty( $caption ) ) {
53
  $data['caption'] = $caption;
54
  }
55
  return $data;
56
  }
57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  /**
59
  * Returns the graph data for the avatar of a given user.
60
  *
44
 
45
  $metaData = wp_get_attachment_metadata( $attachmentId );
46
  if ( $metaData ) {
47
+ $data['width'] = (int) $metaData['width'];
48
+ $data['height'] = (int) $metaData['height'];
49
  }
50
 
51
+ $caption = $this->getImageCaption( $attachmentId );
52
+ if ( ! empty( $caption ) ) {
53
  $data['caption'] = $caption;
54
  }
55
  return $data;
56
  }
57
 
58
+ /**
59
+ * Get the image caption.
60
+ *
61
+ * @since 4.1.4
62
+ *
63
+ * @param int $attachmentId The attachment ID.
64
+ * @return string The caption.
65
+ */
66
+ private function getImageCaption( $attachmentId ) {
67
+ $caption = wp_get_attachment_caption( $attachmentId );
68
+ if ( ! empty( $caption ) ) {
69
+ return $caption;
70
+ }
71
+
72
+ return get_post_meta( $attachmentId, '_wp_attachment_image_alt', true );
73
+ }
74
+
75
  /**
76
  * Returns the graph data for the avatar of a given user.
77
  *
app/Common/Schema/Graphs/WebPage.php CHANGED
@@ -38,7 +38,7 @@ class WebPage extends Graph {
38
  'url' => aioseo()->schema->context['url'],
39
  'name' => aioseo()->meta->title->getTitle(),
40
  'description' => aioseo()->schema->context['description'],
41
- 'inLanguage' => get_bloginfo( 'language' ),
42
  'isPartOf' => [ '@id' => $homeUrl . '#website' ],
43
  'breadcrumb' => [ '@id' => aioseo()->schema->context['url'] . '#breadcrumblist' ]
44
  ];
38
  'url' => aioseo()->schema->context['url'],
39
  'name' => aioseo()->meta->title->getTitle(),
40
  'description' => aioseo()->schema->context['description'],
41
+ 'inLanguage' => aioseo()->helpers->currentLanguageCodeBCP47(),
42
  'isPartOf' => [ '@id' => $homeUrl . '#website' ],
43
  'breadcrumb' => [ '@id' => aioseo()->schema->context['url'] . '#breadcrumblist' ]
44
  ];
app/Common/Schema/Graphs/WebSite.php CHANGED
@@ -27,13 +27,17 @@ class WebSite extends Graph {
27
  'url' => $homeUrl,
28
  'name' => aioseo()->helpers->decodeHtmlEntities( get_bloginfo( 'name' ) ),
29
  'description' => aioseo()->helpers->decodeHtmlEntities( get_bloginfo( 'description' ) ),
 
30
  'publisher' => [ '@id' => $homeUrl . '#' . aioseo()->options->searchAppearance->global->schema->siteRepresents ]
31
  ];
32
 
33
  if ( is_front_page() && aioseo()->options->searchAppearance->advanced->sitelinks ) {
34
  $data['potentialAction'] = [
35
  '@type' => 'SearchAction',
36
- 'target' => $homeUrl . '?s={search_term_string}',
 
 
 
37
  'query-input' => 'required name=search_term_string',
38
  ];
39
  }
27
  'url' => $homeUrl,
28
  'name' => aioseo()->helpers->decodeHtmlEntities( get_bloginfo( 'name' ) ),
29
  'description' => aioseo()->helpers->decodeHtmlEntities( get_bloginfo( 'description' ) ),
30
+ 'inLanguage' => aioseo()->helpers->currentLanguageCodeBCP47(),
31
  'publisher' => [ '@id' => $homeUrl . '#' . aioseo()->options->searchAppearance->global->schema->siteRepresents ]
32
  ];
33
 
34
  if ( is_front_page() && aioseo()->options->searchAppearance->advanced->sitelinks ) {
35
  $data['potentialAction'] = [
36
  '@type' => 'SearchAction',
37
+ 'target' => [
38
+ '@type' => 'EntryPoint',
39
+ 'urlTemplate' => $homeUrl . '?s={search_term_string}'
40
+ ],
41
  'query-input' => 'required name=search_term_string',
42
  ];
43
  }
app/Common/Schema/Schema.php CHANGED
@@ -205,8 +205,8 @@ class Schema {
205
  * @return string|array The graph name(s).
206
  */
207
  public function getPostGraphs( $post = null ) {
208
- $post = is_object( $post ) ? $post : aioseo()->helpers->getPost();
209
- $options = aioseo()->options->noConflict();
210
 
211
  $schemaType = 'default';
212
  $schemaTypeOptions = '';
@@ -219,18 +219,18 @@ class Schema {
219
  }
220
 
221
  // Get global settings if set to default.
222
- if ( 'default' === $schemaType && $options->searchAppearance->dynamic->postTypes->has( $post->post_type ) ) {
223
- $schemaType = $options->searchAppearance->dynamic->postTypes->{$post->post_type}->schemaType;
224
  }
225
 
226
  switch ( $schemaType ) {
227
  case 'WebPage':
228
  $webPageGraph = ! empty( $metaData->schema_type ) && 'default' !== $metaData->schema_type ? $schemaTypeOptions->webPage->webPageType :
229
- $options->searchAppearance->dynamic->postTypes->{$post->post_type}->webPageType;
230
  return ucfirst( $webPageGraph );
231
  case 'Article':
232
  $articleGraph = ! empty( $metaData->schema_type ) && 'default' !== $metaData->schema_type ? $schemaTypeOptions->article->articleType :
233
- $options->searchAppearance->dynamic->postTypes->{$post->post_type}->articleType;
234
  return [ 'WebPage', ucfirst( $articleGraph ) ];
235
  case 'none':
236
  return '';
@@ -260,7 +260,7 @@ class Schema {
260
  if ( is_array( $v ) ) {
261
  $v = $this->cleanData( $v );
262
  } else {
263
- $v = trim( wp_strip_all_tags( $v ) );
264
  }
265
 
266
  if ( empty( $v ) && ! in_array( $k, $this->nullableFields, true ) ) {
205
  * @return string|array The graph name(s).
206
  */
207
  public function getPostGraphs( $post = null ) {
208
+ $post = is_object( $post ) ? $post : aioseo()->helpers->getPost();
209
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
210
 
211
  $schemaType = 'default';
212
  $schemaTypeOptions = '';
219
  }
220
 
221
  // Get global settings if set to default.
222
+ if ( 'default' === $schemaType && $dynamicOptions->searchAppearance->postTypes->has( $post->post_type ) ) {
223
+ $schemaType = $dynamicOptions->searchAppearance->postTypes->{$post->post_type}->schemaType;
224
  }
225
 
226
  switch ( $schemaType ) {
227
  case 'WebPage':
228
  $webPageGraph = ! empty( $metaData->schema_type ) && 'default' !== $metaData->schema_type ? $schemaTypeOptions->webPage->webPageType :
229
+ $dynamicOptions->searchAppearance->postTypes->{$post->post_type}->webPageType;
230
  return ucfirst( $webPageGraph );
231
  case 'Article':
232
  $articleGraph = ! empty( $metaData->schema_type ) && 'default' !== $metaData->schema_type ? $schemaTypeOptions->article->articleType :
233
+ $dynamicOptions->searchAppearance->postTypes->{$post->post_type}->articleType;
234
  return [ 'WebPage', ucfirst( $articleGraph ) ];
235
  case 'none':
236
  return '';
260
  if ( is_array( $v ) ) {
261
  $v = $this->cleanData( $v );
262
  } else {
263
+ $v = is_int( $v ) ? $v : trim( wp_strip_all_tags( $v ) );
264
  }
265
 
266
  if ( empty( $v ) && ! in_array( $k, $this->nullableFields, true ) ) {
app/Common/Sitemap/Content.php CHANGED
@@ -154,6 +154,7 @@ class Content {
154
 
155
  // Override priority/frequency for static homepage.
156
  if ( $isStaticHomepage && $homePageId === $post->ID ) {
 
157
  $entry['changefreq'] = aioseo()->sitemap->priority->frequency( 'homePage' );
158
  $entry['priority'] = aioseo()->sitemap->priority->priority( 'homePage' );
159
  }
@@ -256,9 +257,9 @@ class Content {
256
  $entries = [];
257
  foreach ( aioseo()->sitemap->helpers->includedPostTypes( true ) as $postType ) {
258
  if (
259
- aioseo()->options->noConflict()->searchAppearance->dynamic->archives->has( $postType ) &&
260
- ! aioseo()->options->searchAppearance->dynamic->archives->$postType->advanced->robotsMeta->default &&
261
- aioseo()->options->searchAppearance->dynamic->archives->$postType->advanced->robotsMeta->noindex
262
  ) {
263
  continue;
264
  }
@@ -374,10 +375,11 @@ class Content {
374
  public function addl() {
375
  $entries = [];
376
  if ( 'posts' === get_option( 'show_on_front' ) || ! in_array( 'page', aioseo()->sitemap->helpers->includedPostTypes(), true ) ) {
377
- $frontPageId = (int) get_option( 'page_on_front' );
378
- $post = aioseo()->helpers->getPost( $frontPageId );
 
379
  $entries[] = [
380
- 'loc' => aioseo()->helpers->localizedUrl( '/' ),
381
  'lastmod' => $post ? aioseo()->helpers->formatDateTime( $post->post_modified_gmt ) : aioseo()->sitemap->helpers->lastModifiedPostTime(),
382
  'changefreq' => aioseo()->sitemap->priority->frequency( 'homePage' ),
383
  'priority' => aioseo()->sitemap->priority->priority( 'homePage' ),
154
 
155
  // Override priority/frequency for static homepage.
156
  if ( $isStaticHomepage && $homePageId === $post->ID ) {
157
+ $entry['loc'] = aioseo()->helpers->maybeRemoveTrailingSlash( $entry['loc'] );
158
  $entry['changefreq'] = aioseo()->sitemap->priority->frequency( 'homePage' );
159
  $entry['priority'] = aioseo()->sitemap->priority->priority( 'homePage' );
160
  }
257
  $entries = [];
258
  foreach ( aioseo()->sitemap->helpers->includedPostTypes( true ) as $postType ) {
259
  if (
260
+ aioseo()->dynamicOptions->noConflict()->searchAppearance->archives->has( $postType ) &&
261
+ ! aioseo()->dynamicOptions->searchAppearance->archives->$postType->advanced->robotsMeta->default &&
262
+ aioseo()->dynamicOptions->searchAppearance->archives->$postType->advanced->robotsMeta->noindex
263
  ) {
264
  continue;
265
  }
375
  public function addl() {
376
  $entries = [];
377
  if ( 'posts' === get_option( 'show_on_front' ) || ! in_array( 'page', aioseo()->sitemap->helpers->includedPostTypes(), true ) ) {
378
+ $frontPageId = (int) get_option( 'page_on_front' );
379
+ $frontPageUrl = aioseo()->helpers->localizedUrl( '/' );
380
+ $post = aioseo()->helpers->getPost( $frontPageId );
381
  $entries[] = [
382
+ 'loc' => aioseo()->helpers->maybeRemoveTrailingSlash( $frontPageUrl ),
383
  'lastmod' => $post ? aioseo()->helpers->formatDateTime( $post->post_modified_gmt ) : aioseo()->sitemap->helpers->lastModifiedPostTime(),
384
  'changefreq' => aioseo()->sitemap->priority->frequency( 'homePage' ),
385
  'priority' => aioseo()->sitemap->priority->priority( 'homePage' ),
app/Common/Sitemap/Helpers.php CHANGED
@@ -208,10 +208,11 @@ class Helpers {
208
  }
209
 
210
  $options = aioseo()->options->noConflict();
 
211
  $publicPostTypes = aioseo()->helpers->getPublicPostTypes( true, $hasArchivesOnly );
212
  foreach ( $postTypes as $postType ) {
213
  // Check if post type is no longer registered.
214
- if ( ! in_array( $postType, $publicPostTypes, true ) || ! $options->searchAppearance->dynamic->postTypes->has( $postType ) ) {
215
  $postTypes = aioseo()->helpers->unsetValue( $postTypes, $postType );
216
  continue;
217
  }
@@ -225,7 +226,7 @@ class Helpers {
225
  }
226
 
227
  if (
228
- $options->searchAppearance->dynamic->postTypes->$postType->advanced->robotsMeta->default &&
229
  ! $options->searchAppearance->advanced->globalRobotsMeta->default &&
230
  $options->searchAppearance->advanced->globalRobotsMeta->noindex
231
  ) {
@@ -284,10 +285,11 @@ class Helpers {
284
  }
285
 
286
  $options = aioseo()->options->noConflict();
 
287
  $publicTaxonomies = aioseo()->helpers->getPublicTaxonomies( true );
288
  foreach ( $taxonomies as $taxonomy ) {
289
  // Check if taxonomy is no longer registered.
290
- if ( ! in_array( $taxonomy, $publicTaxonomies, true ) || ! $options->searchAppearance->dynamic->taxonomies->has( $taxonomy ) ) {
291
  $taxonomies = aioseo()->helpers->unsetValue( $taxonomies, $taxonomy );
292
  continue;
293
  }
@@ -299,7 +301,7 @@ class Helpers {
299
  }
300
 
301
  if (
302
- $options->searchAppearance->dynamic->taxonomies->$taxonomy->advanced->robotsMeta->default &&
303
  ! $options->searchAppearance->advanced->globalRobotsMeta->default &&
304
  $options->searchAppearance->advanced->globalRobotsMeta->noindex
305
  ) {
@@ -392,26 +394,10 @@ class Helpers {
392
  }
393
 
394
  if ( 'excludePosts' === $option ) {
395
- /**
396
- * Filters the posts exclusion before creating the query.
397
- *
398
- * @since 4.1.3
399
- *
400
- * @param array $ids The array of excluded posts id.
401
- * @param string $type The type of sitemap.
402
- */
403
  $ids = apply_filters( 'aioseo_sitemap_exclude_posts', $ids, $type );
404
  }
405
 
406
  if ( 'excludeTerms' === $option ) {
407
- /**
408
- * Filters the terms exclusion before creating the query.
409
- *
410
- * @since 4.1.3
411
- *
412
- * @param array $ids The array of excluded ters id.
413
- * @param string $type The type of sitemap.
414
- */
415
  $ids = apply_filters( 'aioseo_sitemap_exclude_terms', $ids, $type );
416
  }
417
 
208
  }
209
 
210
  $options = aioseo()->options->noConflict();
211
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
212
  $publicPostTypes = aioseo()->helpers->getPublicPostTypes( true, $hasArchivesOnly );
213
  foreach ( $postTypes as $postType ) {
214
  // Check if post type is no longer registered.
215
+ if ( ! in_array( $postType, $publicPostTypes, true ) || ! $dynamicOptions->searchAppearance->postTypes->has( $postType ) ) {
216
  $postTypes = aioseo()->helpers->unsetValue( $postTypes, $postType );
217
  continue;
218
  }
226
  }
227
 
228
  if (
229
+ $dynamicOptions->searchAppearance->postTypes->$postType->advanced->robotsMeta->default &&
230
  ! $options->searchAppearance->advanced->globalRobotsMeta->default &&
231
  $options->searchAppearance->advanced->globalRobotsMeta->noindex
232
  ) {
285
  }
286
 
287
  $options = aioseo()->options->noConflict();
288
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
289
  $publicTaxonomies = aioseo()->helpers->getPublicTaxonomies( true );
290
  foreach ( $taxonomies as $taxonomy ) {
291
  // Check if taxonomy is no longer registered.
292
+ if ( ! in_array( $taxonomy, $publicTaxonomies, true ) || ! $dynamicOptions->searchAppearance->taxonomies->has( $taxonomy ) ) {
293
  $taxonomies = aioseo()->helpers->unsetValue( $taxonomies, $taxonomy );
294
  continue;
295
  }
301
  }
302
 
303
  if (
304
+ $dynamicOptions->searchAppearance->taxonomies->$taxonomy->advanced->robotsMeta->default &&
305
  ! $options->searchAppearance->advanced->globalRobotsMeta->default &&
306
  $options->searchAppearance->advanced->globalRobotsMeta->noindex
307
  ) {
394
  }
395
 
396
  if ( 'excludePosts' === $option ) {
 
 
 
 
 
 
 
 
397
  $ids = apply_filters( 'aioseo_sitemap_exclude_posts', $ids, $type );
398
  }
399
 
400
  if ( 'excludeTerms' === $option ) {
 
 
 
 
 
 
 
 
401
  $ids = apply_filters( 'aioseo_sitemap_exclude_terms', $ids, $type );
402
  }
403
 
app/Common/Sitemap/Html/Sitemap.php CHANGED
@@ -99,12 +99,6 @@ namespace AIOSEO\Plugin\Common\Sitemap\Html {
99
  }
100
 
101
  $sitemapUrl = trim( $sitemapUrl['path'], '/' );
102
-
103
- $page = get_page_by_path( $sitemapUrl, OBJECT, aioseo()->helpers->getPublicPostTypes( true ) );
104
- if ( is_object( $page ) ) {
105
- return;
106
- }
107
-
108
  if ( trim( $wp->request, '/' ) === $sitemapUrl ) {
109
  $this->isDedicatedPage = true;
110
  $this->generatePage();
99
  }
100
 
101
  $sitemapUrl = trim( $sitemapUrl['path'], '/' );
 
 
 
 
 
 
102
  if ( trim( $wp->request, '/' ) === $sitemapUrl ) {
103
  $this->isDedicatedPage = true;
104
  $this->generatePage();
app/Common/Sitemap/Image.php CHANGED
@@ -32,6 +32,11 @@ class Image {
32
  return;
33
  }
34
 
 
 
 
 
 
35
  add_action( $this->imageScanAction, [ $this, 'scanPosts' ] );
36
 
37
  if ( wp_doing_ajax() || wp_doing_cron() ) {
32
  return;
33
  }
34
 
35
+ // Don't schedule a scan if an importer is running.
36
+ if ( aioseo()->importExport->isImportRunning() ) {
37
+ return;
38
+ }
39
+
40
  add_action( $this->imageScanAction, [ $this, 'scanPosts' ] );
41
 
42
  if ( wp_doing_ajax() || wp_doing_cron() ) {
app/Common/Sitemap/Priority.php CHANGED
@@ -85,6 +85,7 @@ class Priority {
85
 
86
  if ( ! isset( self::$globalPriority[ $pageType . $objectType ] ) ) {
87
  $options = aioseo()->options->noConflict();
 
88
  $pageTypeConditional = 'date' === $pageType ? 'archive' : $pageType;
89
  self::$globalPriority[ $pageType . $objectType ] = self::$advanced && $options->sitemap->general->advancedSettings->priority->has( $pageTypeConditional )
90
  ? json_decode( $options->sitemap->general->advancedSettings->priority->$pageTypeConditional->priority )
@@ -102,8 +103,10 @@ class Priority {
102
 
103
  if ( empty( self::$grouped[ $pageType . $objectType ] ) && self::$advanced ) {
104
  if ( ! isset( self::$objectTypePriority[ $pageType . $objectType ] ) ) {
105
- self::$objectTypePriority[ $pageType . $objectType ] = $options->sitemap->dynamic->priority->has( $pageType ) && $options->sitemap->dynamic->priority->$pageType->has( $objectType )
106
- ? json_decode( $options->sitemap->dynamic->priority->$pageType->$objectType->priority )
 
 
107
  : false;
108
  }
109
  }
@@ -155,8 +158,10 @@ class Priority {
155
 
156
  if ( empty( self::$grouped[ $pageType . $objectType ] ) && self::$advanced ) {
157
  if ( ! isset( self::$objectTypeFrequency[ $pageType . $objectType ] ) ) {
158
- self::$objectTypeFrequency[ $pageType . $objectType ] = $options->sitemap->dynamic->priority->has( $pageType ) && $options->sitemap->dynamic->priority->$pageType->has( $objectType )
159
- ? json_decode( $options->sitemap->dynamic->priority->$pageType->$objectType->frequency )
 
 
160
  : false;
161
  }
162
  }
85
 
86
  if ( ! isset( self::$globalPriority[ $pageType . $objectType ] ) ) {
87
  $options = aioseo()->options->noConflict();
88
+
89
  $pageTypeConditional = 'date' === $pageType ? 'archive' : $pageType;
90
  self::$globalPriority[ $pageType . $objectType ] = self::$advanced && $options->sitemap->general->advancedSettings->priority->has( $pageTypeConditional )
91
  ? json_decode( $options->sitemap->general->advancedSettings->priority->$pageTypeConditional->priority )
103
 
104
  if ( empty( self::$grouped[ $pageType . $objectType ] ) && self::$advanced ) {
105
  if ( ! isset( self::$objectTypePriority[ $pageType . $objectType ] ) ) {
106
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
107
+
108
+ self::$objectTypePriority[ $pageType . $objectType ] = $dynamicOptions->sitemap->priority->has( $pageType ) && $dynamicOptions->sitemap->priority->$pageType->has( $objectType )
109
+ ? json_decode( $dynamicOptions->sitemap->priority->$pageType->$objectType->priority )
110
  : false;
111
  }
112
  }
158
 
159
  if ( empty( self::$grouped[ $pageType . $objectType ] ) && self::$advanced ) {
160
  if ( ! isset( self::$objectTypeFrequency[ $pageType . $objectType ] ) ) {
161
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
162
+
163
+ self::$objectTypeFrequency[ $pageType . $objectType ] = $dynamicOptions->sitemap->priority->has( $pageType ) && $dynamicOptions->sitemap->priority->$pageType->has( $objectType )
164
+ ? json_decode( $dynamicOptions->sitemap->priority->$pageType->$objectType->frequency )
165
  : false;
166
  }
167
  }
app/Common/Sitemap/Query.php CHANGED
@@ -1,6 +1,8 @@
1
  <?php
2
  namespace AIOSEO\Plugin\Common\Sitemap;
3
 
 
 
4
  // Exit if accessed directly.
5
  if ( ! defined( 'ABSPATH' ) ) {
6
  exit;
@@ -29,7 +31,7 @@ class Query {
29
 
30
  if (
31
  empty( $includedPostTypes ) ||
32
- ( 'attachment' === $includedPostTypes && 'disabled' !== aioseo()->options->searchAppearance->dynamic->postTypes->attachment->redirectAttachmentUrls )
33
  ) {
34
  return [];
35
  }
@@ -101,8 +103,10 @@ class Query {
101
  $query->limit( aioseo()->sitemap->linksPerIndex, aioseo()->sitemap->offset );
102
  }
103
 
104
- $posts = $query->orderBy( $orderBy )
105
- ->run()
 
 
106
  ->result();
107
 
108
  // Convert ID from string to int.
@@ -114,56 +118,44 @@ class Query {
114
  }
115
 
116
  /**
117
- * Filters the queried posts.
118
  *
119
- * @since 4.0.0
120
  *
121
- * @param array $posts The posts.
122
- * @return array $remainingPosts The remaining posts.
 
123
  */
124
- public function filterPosts( $posts ) {
125
- $remainingPosts = [];
126
- $isWooCommerceActive = aioseo()->helpers->isWooCommerceActive();
127
- $excludeHiddenProducts = apply_filters( 'aioseo_sitemap_woocommerce_exclude_hidden_products', true );
128
-
129
- foreach ( $posts as $post ) {
130
- if ( 'product' !== $post->post_type && is_numeric( $post ) ) {
131
- $remainingPosts[] = $post;
132
- continue;
133
- }
134
-
135
- switch ( $post->post_type ) {
136
- case 'product':
137
- if ( ! $isWooCommerceActive || ! $excludeHiddenProducts || ! $this->isHiddenProduct( $post ) ) {
138
- $remainingPosts[] = $post;
139
- }
140
- break;
141
- case 'attachment':
142
- if ( ! $this->isInvalidAttachment( $post ) ) {
143
- $remainingPosts[] = $post;
144
- }
145
- break;
146
- default:
147
- $remainingPosts[] = $post;
148
- break;
149
- }
150
  }
151
-
152
- return $remainingPosts;
153
  }
154
 
155
  /**
156
- * Whether the WooCommerce product is hidden.
157
  *
158
- * @since 4.0.0
159
  *
160
- * @param Object $post The post.
161
- * @return boolean Whether the post is a hidden product.
162
  */
163
- private function isHiddenProduct( $post ) {
 
 
 
 
 
 
 
164
  static $hiddenProductIds = null;
165
  if ( null === $hiddenProductIds ) {
166
- $hiddenProducts = aioseo()->db->start( 'term_relationships as tr' )
 
167
  ->select( 'tr.object_id' )
168
  ->join( 'term_taxonomy as tt', 'tr.term_taxonomy_id = tt.term_taxonomy_id' )
169
  ->join( 'terms as t', 'tt.term_id = t.term_id' )
@@ -172,19 +164,44 @@ class Query {
172
  ->result();
173
 
174
  $hiddenProductIds = [];
175
- if ( ! empty( $hiddenProducts ) ) {
176
- foreach ( $hiddenProducts as $hiddenProduct ) {
177
- $hiddenProductIds[] = (int) $hiddenProduct->object_id;
178
- }
179
  }
 
 
 
 
 
180
  }
181
 
182
- $postId = $post;
183
- if ( ! is_numeric( $post ) ) {
184
- $postId = $post->ID;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  }
186
 
187
- return in_array( $postId, $hiddenProductIds, true );
188
  }
189
 
190
  /**
1
  <?php
2
  namespace AIOSEO\Plugin\Common\Sitemap;
3
 
4
+ use AIOSEO\Plugin\Common\Utils as CommonUtils;
5
+
6
  // Exit if accessed directly.
7
  if ( ! defined( 'ABSPATH' ) ) {
8
  exit;
31
 
32
  if (
33
  empty( $includedPostTypes ) ||
34
+ ( 'attachment' === $includedPostTypes && 'disabled' !== aioseo()->dynamicOptions->searchAppearance->postTypes->attachment->redirectAttachmentUrls )
35
  ) {
36
  return [];
37
  }
103
  $query->limit( aioseo()->sitemap->linksPerIndex, aioseo()->sitemap->offset );
104
  }
105
 
106
+ $query->orderBy( $orderBy );
107
+ $query = $this->filterPostQuery( $query, $postTypes );
108
+
109
+ $posts = $query->run()
110
  ->result();
111
 
112
  // Convert ID from string to int.
118
  }
119
 
120
  /**
121
+ * Filters the post query.
122
  *
123
+ * @since 4.1.4
124
  *
125
+ * @param \AIOSEO\Plugin\Common\Utils\Database $query The query.
126
+ * @param string $postType The post type.
127
+ * @return \AIOSEO\Plugin\Common\Utils\Database The filtered query.
128
  */
129
+ private function filterPostQuery( $query, $postType ) {
130
+ switch ( $postType ) {
131
+ case 'product':
132
+ return $this->excludeHiddenProducts( $query );
133
+ default:
134
+ break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
  }
136
+ return $query;
 
137
  }
138
 
139
  /**
140
+ * Adds a condition to the query to exclude hidden WooCommerce products.
141
  *
142
+ * @since 4.1.4
143
  *
144
+ * @param \AIOSEO\Plugin\Common\Utils\Database $query The query.
145
+ * @return \AIOSEO\Plugin\Common\Utils\Database The filtered query.
146
  */
147
+ private function excludeHiddenProducts( $query ) {
148
+ if (
149
+ ! aioseo()->helpers->isWooCommerceActive() ||
150
+ ! apply_filters( 'aioseo_sitemap_woocommerce_exclude_hidden_products', true )
151
+ ) {
152
+ return $query;
153
+ }
154
+
155
  static $hiddenProductIds = null;
156
  if ( null === $hiddenProductIds ) {
157
+ $tempDb = new CommonUtils\Database();
158
+ $hiddenProducts = $tempDb->start( 'term_relationships as tr' )
159
  ->select( 'tr.object_id' )
160
  ->join( 'term_taxonomy as tt', 'tr.term_taxonomy_id = tt.term_taxonomy_id' )
161
  ->join( 'terms as t', 'tt.term_id = t.term_id' )
164
  ->result();
165
 
166
  $hiddenProductIds = [];
167
+ if ( empty( $hiddenProducts ) ) {
168
+ return $query;
 
 
169
  }
170
+
171
+ foreach ( $hiddenProducts as $hiddenProduct ) {
172
+ $hiddenProductIds[] = (int) $hiddenProduct->object_id;
173
+ }
174
+ $hiddenProductIds = esc_sql( implode( ', ', $hiddenProductIds ) );
175
  }
176
 
177
+ $query->whereRaw( "p.ID NOT IN ( $hiddenProductIds )" );
178
+ return $query;
179
+ }
180
+
181
+ /**
182
+ * Filters the queried posts.
183
+ *
184
+ * @since 4.0.0
185
+ *
186
+ * @param array $posts The posts.
187
+ * @return array $remainingPosts The remaining posts.
188
+ */
189
+ public function filterPosts( $posts ) {
190
+ $remainingPosts = [];
191
+ foreach ( $posts as $post ) {
192
+ switch ( $post->post_type ) {
193
+ case 'attachment':
194
+ if ( ! $this->isInvalidAttachment( $post ) ) {
195
+ $remainingPosts[] = $post;
196
+ }
197
+ break;
198
+ default:
199
+ $remainingPosts[] = $post;
200
+ break;
201
+ }
202
  }
203
 
204
+ return $remainingPosts;
205
  }
206
 
207
  /**
app/Common/Sitemap/Root.php CHANGED
@@ -70,10 +70,10 @@ class Root {
70
 
71
  if (
72
  get_post_type_archive_link( $postType ) &&
73
- aioseo()->options->noConflict()->searchAppearance->dynamic->archives->has( $postType ) &&
74
  (
75
- aioseo()->options->searchAppearance->dynamic->archives->$postType->advanced->robotsMeta->default ||
76
- ! aioseo()->options->searchAppearance->dynamic->archives->$postType->advanced->robotsMeta->noindex
77
  )
78
  ) {
79
  $hasPostArchive = true;
70
 
71
  if (
72
  get_post_type_archive_link( $postType ) &&
73
+ aioseo()->dynamicOptions->noConflict()->searchAppearance->archives->has( $postType ) &&
74
  (
75
+ aioseo()->dynamicOptions->searchAppearance->archives->$postType->advanced->robotsMeta->default ||
76
+ ! aioseo()->dynamicOptions->searchAppearance->archives->$postType->advanced->robotsMeta->noindex
77
  )
78
  ) {
79
  $hasPostArchive = true;
app/Common/Social/Facebook.php CHANGED
@@ -178,9 +178,9 @@ class Facebook {
178
  }
179
 
180
  $postType = get_post_type();
181
- $options = aioseo()->options->noConflict();
182
- $defaultObjectType = $options->social->facebook->general->dynamic->postTypes->has( $postType )
183
- ? $options->social->facebook->general->dynamic->postTypes->$postType->objectType
184
  : '';
185
 
186
  return ! empty( $defaultObjectType ) ? $defaultObjectType : 'article';
@@ -273,7 +273,7 @@ class Facebook {
273
  */
274
  public function getPublishedTime() {
275
  $post = aioseo()->helpers->getPost();
276
- return $post ? gmdate( 'Y-m-d\TH:i:s\Z', mysql2date( 'U', aioseo()->helpers->getPost()->post_date_gmt ) ) : '';
277
  }
278
 
279
  /**
@@ -285,7 +285,7 @@ class Facebook {
285
  */
286
  public function getModifiedTime() {
287
  $post = aioseo()->helpers->getPost();
288
- return $post ? gmdate( 'Y-m-d\TH:i:s\Z', mysql2date( 'U', aioseo()->helpers->getPost()->post_modified_gmt ) ) : '';
289
  }
290
 
291
 
@@ -331,14 +331,216 @@ class Facebook {
331
  }
332
 
333
  if ( aioseo()->options->social->facebook->advanced->useCategoriesInTags ) {
334
- $tags = array_merge( $tags, aioseo()->social->helpers->getAllCategories( $post->ID ) );
335
  }
336
 
337
  if ( aioseo()->options->social->facebook->advanced->usePostTagsInTags ) {
338
- $tags = array_merge( $tags, aioseo()->social->helpers->getAllTags( $post->ID ) );
339
  }
340
  }
341
 
342
  return aioseo()->meta->keywords->getUniqueKeywords( $tags, false );
343
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
344
  }
178
  }
179
 
180
  $postType = get_post_type();
181
+ $dynamicOptions = aioseo()->dynamicOptions->noConflict();
182
+ $defaultObjectType = $dynamicOptions->social->facebook->general->postTypes->has( $postType )
183
+ ? $dynamicOptions->social->facebook->general->postTypes->$postType->objectType
184
  : '';
185
 
186
  return ! empty( $defaultObjectType ) ? $defaultObjectType : 'article';
273
  */
274
  public function getPublishedTime() {
275
  $post = aioseo()->helpers->getPost();
276
+ return $post ? aioseo()->helpers->formatDateTime( $post->post_date_gmt ) : '';
277
  }
278
 
279
  /**
285
  */
286
  public function getModifiedTime() {
287
  $post = aioseo()->helpers->getPost();
288
+ return $post ? aioseo()->helpers->formatDateTime( $post->post_modified_gmt ) : '';
289
  }
290
 
291
 
331
  }
332
 
333
  if ( aioseo()->options->social->facebook->advanced->useCategoriesInTags ) {
334
+ $tags = array_merge( $tags, aioseo()->helpers->getAllCategories( $post->ID ) );
335
  }
336
 
337
  if ( aioseo()->options->social->facebook->advanced->usePostTagsInTags ) {
338
+ $tags = array_merge( $tags, aioseo()->helpers->getAllTags( $post->ID ) );
339
  }
340
  }
341
 
342
  return aioseo()->meta->keywords->getUniqueKeywords( $tags, false );
343
  }
344
+
345
+ /**
346
+ * Retreive the locale.
347
+ *
348
+ * @since 4.1.4
349
+ *
350
+ * @return string The locale.
351
+ */
352
+ public function getLocale() {
353
+ $locale = get_locale();
354
+
355
+ // These are the locales FB supports.
356
+ $validLocales = [
357
+ 'af_ZA', // Afrikaans.
358
+ 'ak_GH', // Akan.
359
+ 'am_ET', // Amharic.
360
+ 'ar_AR', // Arabic.
361
+ 'as_IN', // Assamese.
362
+ 'ay_BO', // Aymara.
363
+ 'az_AZ', // Azerbaijani.
364
+ 'be_BY', // Belarusian.
365
+ 'bg_BG', // Bulgarian.
366
+ 'bp_IN', // Bhojpuri.
367
+ 'bn_IN', // Bengali.
368
+ 'br_FR', // Breton.
369
+ 'bs_BA', // Bosnian.
370
+ 'ca_ES', // Catalan.
371
+ 'cb_IQ', // Sorani Kurdish.
372
+ 'ck_US', // Cherokee.
373
+ 'co_FR', // Corsican.
374
+ 'cs_CZ', // Czech.
375
+ 'cx_PH', // Cebuano.
376
+ 'cy_GB', // Welsh.
377
+ 'da_DK', // Danish.
378
+ 'de_DE', // German.
379
+ 'el_GR', // Greek.
380
+ 'en_GB', // English (UK).
381
+ 'en_PI', // English (Pirate).
382
+ 'en_UD', // English (Upside Down).
383
+ 'en_US', // English (US).
384
+ 'em_ZM',
385
+ 'eo_EO', // Esperanto.
386
+ 'es_ES', // Spanish (Spain).
387
+ 'es_LA', // Spanish.
388
+ 'es_MX', // Spanish (Mexico).
389
+ 'et_EE', // Estonian.
390
+ 'eu_ES', // Basque.
391
+ 'fa_IR', // Persian.
392
+ 'fb_LT', // Leet Speak.
393
+ 'ff_NG', // Fulah.
394
+ 'fi_FI', // Finnish.
395
+ 'fo_FO', // Faroese.
396
+ 'fr_CA', // French (Canada).
397
+ 'fr_FR', // French (France).
398
+ 'fy_NL', // Frisian.
399
+ 'ga_IE', // Irish.
400
+ 'gl_ES', // Galician.
401
+ 'gn_PY', // Guarani.
402
+ 'gu_IN', // Gujarati.
403
+ 'gx_GR', // Classical Greek.
404
+ 'ha_NG', // Hausa.
405
+ 'he_IL', // Hebrew.
406
+ 'hi_IN', // Hindi.
407
+ 'hr_HR', // Croatian.
408
+ 'hu_HU', // Hungarian.
409
+ 'ht_HT', // Haitian Creole.
410
+ 'hy_AM', // Armenian.
411
+ 'id_ID', // Indonesian.
412
+ 'ig_NG', // Igbo.
413
+ 'is_IS', // Icelandic.
414
+ 'it_IT', // Italian.
415
+ 'ik_US',
416
+ 'iu_CA',
417
+ 'ja_JP', // Japanese.
418
+ 'ja_KS', // Japanese (Kansai).
419
+ 'jv_ID', // Javanese.
420
+ 'ka_GE', // Georgian.
421
+ 'kk_KZ', // Kazakh.
422
+ 'km_KH', // Khmer.
423
+ 'kn_IN', // Kannada.
424
+ 'ko_KR', // Korean.
425
+ 'ks_IN', // Kashmiri.
426
+ 'ku_TR', // Kurdish (Kurmanji).
427
+ 'ky_KG', // Kyrgyz.
428
+ 'la_VA', // Latin.
429
+ 'lg_UG', // Ganda.
430
+ 'li_NL', // Limburgish.
431
+ 'ln_CD', // Lingala.
432
+ 'lo_LA', // Lao.
433
+ 'lt_LT', // Lithuanian.
434
+ 'lv_LV', // Latvian.
435
+ 'mg_MG', // Malagasy.
436
+ 'mi_NZ', // Maori.
437
+ 'mk_MK', // Macedonian.
438
+ 'ml_IN', // Malayalam.
439
+ 'mn_MN', // Mongolian.
440
+ 'mr_IN', // Marathi.
441
+ 'ms_MY', // Malay.
442
+ 'mt_MT', // Maltese.
443
+ 'my_MM', // Burmese.
444
+ 'nb_NO', // Norwegian (bokmal).
445
+ 'nd_ZW', // Ndebele.
446
+ 'ne_NP', // Nepali.
447
+ 'nl_BE', // Dutch (Belgie).
448
+ 'nl_NL', // Dutch.
449
+ 'nn_NO', // Norwegian (nynorsk).
450
+ 'nr_ZA', // Southern Ndebele.
451
+ 'ns_ZA', // Northern Sotho.
452
+ 'ny_MW', // Chewa.
453
+ 'om_ET', // Oromo.
454
+ 'or_IN', // Oriya.
455
+ 'pa_IN', // Punjabi.
456
+ 'pl_PL', // Polish.
457
+ 'ps_AF', // Pashto.
458
+ 'pt_BR', // Portuguese (Brazil).
459
+ 'pt_PT', // Portuguese (Portugal).
460
+ 'qc_GT', // Quiché.
461
+ 'qu_PE', // Quechua.
462
+ 'qr_GR',
463
+ 'qz_MM', // Burmese (Zawgyi).
464
+ 'rm_CH', // Romansh.
465
+ 'ro_RO', // Romanian.
466
+ 'ru_RU', // Russian.
467
+ 'rw_RW', // Kinyarwanda.
468
+ 'sa_IN', // Sanskrit.
469
+ 'sc_IT', // Sardinian.
470
+ 'se_NO', // Northern Sami.
471
+ 'si_LK', // Sinhala.
472
+ 'su_ID', // Sundanese.
473
+ 'sk_SK', // Slovak.
474
+ 'sl_SI', // Slovenian.
475
+ 'sn_ZW', // Shona.
476
+ 'so_SO', // Somali.
477
+ 'sq_AL', // Albanian.
478
+ 'sr_RS', // Serbian.
479
+ 'ss_SZ', // Swazi.
480
+ 'st_ZA', // Southern Sotho.
481
+ 'sv_SE', // Swedish.
482
+ 'sw_KE', // Swahili.
483
+ 'sy_SY', // Syriac.
484
+ 'sz_PL', // Silesian.
485
+ 'ta_IN', // Tamil.
486
+ 'te_IN', // Telugu.
487
+ 'tg_TJ', // Tajik.
488
+ 'th_TH', // Thai.
489
+ 'tk_TM', // Turkmen.
490
+ 'tl_PH', // Filipino.
491
+ 'tl_ST', // Klingon.
492
+ 'tn_BW', // Tswana.
493
+ 'tr_TR', // Turkish.
494
+ 'ts_ZA', // Tsonga.
495
+ 'tt_RU', // Tatar.
496
+ 'tz_MA', // Tamazight.
497
+ 'uk_UA', // Ukrainian.
498
+ 'ur_PK', // Urdu.
499
+ 'uz_UZ', // Uzbek.
500
+ 've_ZA', // Venda.
501
+ 'vi_VN', // Vietnamese.
502
+ 'wo_SN', // Wolof.
503
+ 'xh_ZA', // Xhosa.
504
+ 'yi_DE', // Yiddish.
505
+ 'yo_NG', // Yoruba.
506
+ 'zh_CN', // Simplified Chinese (China).
507
+ 'zh_HK', // Traditional Chinese (Hong Kong).
508
+ 'zh_TW', // Traditional Chinese (Taiwan).
509
+ 'zu_ZA', // Zulu.
510
+ 'zz_TR', // Zazaki.
511
+ ];
512
+
513
+ // Catch some weird locales served out by WP that are not easily doubled up.
514
+ $fixLocales = [
515
+ 'ca' => 'ca_ES',
516
+ 'en' => 'en_US',
517
+ 'el' => 'el_GR',
518
+ 'et' => 'et_EE',
519
+ 'ja' => 'ja_JP',
520
+ 'sq' => 'sq_AL',
521
+ 'uk' => 'uk_UA',
522
+ 'vi' => 'vi_VN',
523
+ 'zh' => 'zh_CN',
524
+ ];
525
+
526
+ if ( isset( $fixLocales[ $locale ] ) ) {
527
+ $locale = $fixLocales[ $locale ];
528
+ }
529
+
530
+ // Convert locales like "es" to "es_ES", in case that works for the given locale (sometimes it does).
531
+ if ( 2 === strlen( $locale ) ) {
532
+ $locale = strtolower( $locale ) . '_' . strtoupper( $locale );
533
+ }
534
+
535
+ // Check to see if the locale is a valid FB one, if not, use en_US as a fallback.
536
+ if ( ! in_array( $locale, $validLocales, true ) ) {
537
+ $locale = strtolower( substr( $locale, 0, 2 ) ) . '_' . strtoupper( substr( $locale, 0, 2 ) );
538
+
539
+ if ( ! in_array( $locale, $validLocales, true ) ) {
540
+ $locale = 'en_US';
541
+ }
542
+ }
543
+
544
+ return apply_filters( 'aioseo_og_locale', $locale );
545
+ }
546
  }
app/Common/Social/Helpers.php DELETED
@@ -1,55 +0,0 @@
1
- <?php
2
- namespace AIOSEO\Plugin\Common\Social;
3
-
4
- // Exit if accessed directly.
5
- if ( ! defined( 'ABSPATH' ) ) {
6
- exit;
7
- }
8
-
9
- /**
10
- * Contains helper methods specific to the Social Meta.
11
- *
12
- * @since 4.0.0
13
- */
14
- class Helpers {
15
- /**
16
- * Returns all categories for a post.
17
- *
18
- * @since 4.0.0
19
- *
20
- * @param int $postId The post ID.
21
- * @return array $names The category names.
22
- */
23
- public function getAllCategories( $postId = 0 ) {
24
- $names = [];
25
- $categories = get_the_category( $postId );
26
- if ( $categories && count( $categories ) ) {
27
- foreach ( $categories as $category ) {
28
- $names[] = aioseo()->helpers->internationalize( $category->cat_name );
29
- }
30
- }
31
- return $names;
32
- }
33
-
34
- /**
35
- * Returns all tags for a post.
36
- *
37
- * @since 4.0.0
38
- *
39
- * @param int $postId The post ID.
40
- * @return array $names The tag names.
41
- */
42
- public function getAllTags( $postId = 0 ) {
43
- $names = [];
44
-
45
- $tags = get_the_tags( $postId );
46
- if ( ! empty( $tags ) && ! is_wp_error( $tags ) ) {
47
- foreach ( $tags as $tag ) {
48
- if ( ! empty( $tag->name ) ) {
49
- $names[] = aioseo()->helpers->internationalize( $tag->name );
50
- }
51
- }
52
- }
53
- return $names;
54
- }
55
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/Common/Social/Output.php CHANGED
@@ -46,6 +46,7 @@ class Output {
46
  }
47
 
48
  $meta = [
 
49
  'og:site_name' => aioseo()->helpers->encodeOutputHtml( aioseo()->social->facebook->getSiteName() ),
50
  'og:type' => aioseo()->social->facebook->getObjectType(),
51
  'og:title' => aioseo()->helpers->encodeOutputHtml( aioseo()->social->facebook->getTitle() ),
46
  }
47
 
48
  $meta = [
49
+ 'og:locale' => aioseo()->social->facebook->getLocale(),
50
  'og:site_name' => aioseo()->helpers->encodeOutputHtml( aioseo()->social->facebook->getSiteName() ),
51
  'og:type' => aioseo()->social->facebook->getObjectType(),
52
  'og:title' => aioseo()->helpers->encodeOutputHtml( aioseo()->social->facebook->getTitle() ),
app/Common/Social/Social.php CHANGED
@@ -30,7 +30,6 @@ class Social {
30
  $this->facebook = new Facebook();
31
  $this->twitter = new Twitter();
32
  $this->output = new Output();
33
- $this->helpers = new Helpers();
34
 
35
  $this->hooks();
36
  }
30
  $this->facebook = new Facebook();
31
  $this->twitter = new Twitter();
32
  $this->output = new Output();
 
33
 
34
  $this->hooks();
35
  }
app/Common/Social/Twitter.php CHANGED
@@ -58,7 +58,8 @@ class Twitter {
58
  $post = aioseo()->helpers->getPost();
59
  if ( $post && aioseo()->options->social->twitter->general->showAuthor ) {
60
  $twitterUser = get_the_author_meta( 'aioseo_twitter', $post->post_author );
61
- $author = aioseo()->social->twitter->prepareUsername( $twitterUser );
 
62
  }
63
  return $author;
64
  }
@@ -224,7 +225,7 @@ class Twitter {
224
  }
225
 
226
  if ( ! empty( $post->post_content ) ) {
227
- $minutes = aioseo()->helpers->getReadingTime( $post->post_content );
228
  if ( ! empty( $minutes ) ) {
229
  $data[] = [
230
  'label' => __( 'Est. reading time', 'all-in-one-seo-pack' ),
@@ -236,4 +237,18 @@ class Twitter {
236
 
237
  return $data;
238
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
239
  }
58
  $post = aioseo()->helpers->getPost();
59
  if ( $post && aioseo()->options->social->twitter->general->showAuthor ) {
60
  $twitterUser = get_the_author_meta( 'aioseo_twitter', $post->post_author );
61
+ $author = $twitterUser ? $twitterUser : aioseo()->social->twitter->getTwitterUrl();
62
+ $author = aioseo()->social->twitter->prepareUsername( $author );
63
  }
64
  return $author;
65
  }
225
  }
226
 
227
  if ( ! empty( $post->post_content ) ) {
228
+ $minutes = $this->getReadingTime( $post->post_content );
229
  if ( ! empty( $minutes ) ) {
230
  $data[] = [
231
  'label' => __( 'Est. reading time', 'all-in-one-seo-pack' ),
237
 
238
  return $data;
239
  }
240
+
241
+ /**
242
+ * Returns the estimated reading time for a string.
243
+ *
244
+ * @since 4.0.0
245
+ *
246
+ * @param string $string The string to count.
247
+ * @return integer The estimated reading time as an integer.
248
+ */
249
+ private function getReadingTime( $string ) {
250
+ $wpm = 200;
251
+ $word = str_word_count( wp_strip_all_tags( $string ) );
252
+ return round( $word / $wpm );
253
+ }
254
  }
app/Common/Tools/Htaccess.php CHANGED
@@ -38,7 +38,8 @@ class Htaccess {
38
  return false;
39
  }
40
 
41
- return @$wpfs->get_contents( $this->path );
 
42
  }
43
 
44
  /**
38
  return false;
39
  }
40
 
41
+ $contents = @$wpfs->get_contents( $this->path );
42
+ return aioseo()->helpers->encodeOutputHtml( $contents );
43
  }
44
 
45
  /**
app/Common/Tools/RobotsTxt.php CHANGED
@@ -240,7 +240,7 @@ class RobotsTxt {
240
  * @param array $lines The lines to extract from.
241
  * @return array An array of extracted rules.
242
  */
243
- private function extractRules( $lines ) {
244
  $rules = [];
245
  $userAgent = null;
246
  foreach ( $lines as $line ) {
@@ -388,6 +388,20 @@ class RobotsTxt {
388
  $currentRules = $this->parseRules( aioseo()->options->tools->robots->rules );
389
  $allRules = $this->mergeRules( $currentRules, $allRules, false, true );
390
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
391
  $robots = [];
392
  foreach ( $allRules as $userAgent => $rules ) {
393
  if ( empty( $userAgent ) ) {
@@ -416,9 +430,7 @@ class RobotsTxt {
416
  }
417
  }
418
 
419
- aioseo()->options->tools->robots->rules = $robots;
420
-
421
- return true;
422
  }
423
 
424
  /**
240
  * @param array $lines The lines to extract from.
241
  * @return array An array of extracted rules.
242
  */
243
+ public function extractRules( $lines ) {
244
  $rules = [];
245
  $userAgent = null;
246
  foreach ( $lines as $line ) {
388
  $currentRules = $this->parseRules( aioseo()->options->tools->robots->rules );
389
  $allRules = $this->mergeRules( $currentRules, $allRules, false, true );
390
 
391
+ aioseo()->options->tools->robots->rules = aioseo()->robotsTxt->prepareRobotsTxt( $allRules );
392
+
393
+ return true;
394
+ }
395
+
396
+ /**
397
+ * Prepare robots.txt rules to save.
398
+ *
399
+ * @since 4.1.4
400
+ *
401
+ * @param array $allRules Array with the rules.
402
+ * @return array The prepared rules array.
403
+ */
404
+ public function prepareRobotsTxt( $allRules = [] ) {
405
  $robots = [];
406
  foreach ( $allRules as $userAgent => $rules ) {
407
  if ( empty( $userAgent ) ) {
430
  }
431
  }
432
 
433
+ return $robots;
 
 
434
  }
435
 
436
  /**
app/Common/Traits/Helpers/ActionScheduler.php CHANGED
@@ -49,4 +49,16 @@ trait ActionScheduler {
49
  ]);
50
  return ! empty( $actions );
51
  }
 
 
 
 
 
 
 
 
 
 
 
 
52
  }
49
  ]);
50
  return ! empty( $actions );
51
  }
52
+
53
+ /**
54
+ * Unschedule an action.
55
+ *
56
+ * @since 4.1.4
57
+ *
58
+ * @param string $actionName The action name to unschedule.
59
+ * @return void
60
+ */
61
+ public function unscheduleAction( $actionName ) {
62
+ as_unschedule_action( $actionName, [], 'aioseo' );
63
+ }
64
  }
app/Common/Traits/Helpers/Arrays.php ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\Traits\Helpers;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ /**
10
+ * Contains array specific helper methods.
11
+ *
12
+ * @since 4.1.4
13
+ */
14
+ trait Arrays {
15
+ /**
16
+ * Unsets a given value in a given array.
17
+ * This should only be used if the given value only appears once in the array.
18
+ *
19
+ * @since 4.0.0
20
+ *
21
+ * @param array $array The array.
22
+ * @param string $value The value that needs to be removed from the array.
23
+ * @return array $array The filtered array.
24
+ */
25
+ public function unsetValue( $array, $value ) {
26
+ if ( in_array( $value, $array, true ) ) {
27
+ unset( $array[ array_search( $value, $array, true ) ] );
28
+ };
29
+ return $array;
30
+ }
31
+
32
+ /**
33
+ * Compares two multidimensional arrays to see if they're different.
34
+ *
35
+ * @since 4.0.0
36
+ *
37
+ * @param array $array1 The first array.
38
+ * @param array $array2 The second array.
39
+ * @return boolean Whether the arrays are different.
40
+ */
41
+ public function arraysDifferent( $array1, $array2 ) {
42
+ foreach ( $array1 as $key => $value ) {
43
+ // Check for non-existing values.
44
+ if ( ! isset( $array2[ $key ] ) ) {
45
+ return true;
46
+ }
47
+ if ( is_array( $value ) ) {
48
+ if ( $this->arraysDifferent( $value, $array2[ $key ] ) ) {
49
+ return true;
50
+ };
51
+ } else {
52
+ if ( $value !== $array2[ $key ] ) {
53
+ return true;
54
+ }
55
+ }
56
+ }
57
+ return false;
58
+ }
59
+
60
+ /**
61
+ * Checks whether the given array is associative.
62
+ * Arrays that only have consecutive, sequential numeric keys are numeric.
63
+ * Otherwise they are associative.
64
+ *
65
+ * @since 4.1.4
66
+ *
67
+ * @param array $array The array.
68
+ * @return bool Whether the array is associative.
69
+ */
70
+ public function isArrayAssociative( $array ) {
71
+ return 0 < count( array_filter( array_keys( $array ), 'is_string' ) );
72
+ }
73
+
74
+ /**
75
+ * Checks whether the given array is numeric.
76
+ *
77
+ * @since 4.1.4
78
+ *
79
+ * @param array $array The array.
80
+ * @return bool Whether the array is numeric.
81
+ */
82
+ public function isArrayNumeric( $array ) {
83
+ return ! $this->isArrayAssociative( $array );
84
+ }
85
+ }
app/Common/Traits/Helpers/Constants.php CHANGED
@@ -8,6 +8,20 @@ namespace AIOSEO\Plugin\Common\Traits\Helpers;
8
  * @since 4.0.17
9
  */
10
  trait Constants {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  /**
12
  * Returns the country name by code.
13
  *
@@ -21,7 +35,7 @@ trait Constants {
21
  }
22
 
23
  /**
24
- * Country list
25
  *
26
  * @since 4.0.17
27
  *
8
  * @since 4.0.17
9
  */
10
  trait Constants {
11
+ /**
12
+ * Returns the All in One SEO Logo
13
+ *
14
+ * @since 4.0.0
15
+ *
16
+ * @param string $width The width of the image.
17
+ * @param string $height The height of the image.
18
+ * @param string $colorCode The color of the image.
19
+ * @return string The logo as a string.
20
+ */
21
+ public function logo( $width, $height, $colorCode ) {
22
+ return '<svg viewBox="0 0 20 20" width="' . $width . '" height="' . $height . '" fill="none" xmlns="http://www.w3.org/2000/svg" class="aioseo-gear"><path fill-rule="evenodd" clip-rule="evenodd" d="M9.98542 19.9708C15.5002 19.9708 19.9708 15.5002 19.9708 9.98542C19.9708 4.47063 15.5002 0 9.98542 0C4.47063 0 0 4.47063 0 9.98542C0 15.5002 4.47063 19.9708 9.98542 19.9708ZM8.39541 3.65464C8.26016 3.4485 8.0096 3.35211 7.77985 3.43327C7.51816 3.52572 7.26218 3.63445 7.01349 3.7588C6.79519 3.86796 6.68566 4.11731 6.73372 4.36049L6.90493 5.22694C6.949 5.44996 6.858 5.6763 6.68522 5.82009C6.41216 6.04734 6.16007 6.30426 5.93421 6.58864C5.79383 6.76539 5.57233 6.85907 5.35361 6.81489L4.50424 6.6433C4.26564 6.5951 4.02157 6.70788 3.91544 6.93121C3.85549 7.05738 3.79889 7.1862 3.74583 7.31758C3.69276 7.44896 3.64397 7.58105 3.59938 7.71369C3.52048 7.94847 3.61579 8.20398 3.81839 8.34133L4.53958 8.83027C4.72529 8.95617 4.81778 9.1819 4.79534 9.40826C4.75925 9.77244 4.76072 10.136 4.79756 10.4936C4.82087 10.7198 4.72915 10.9459 4.54388 11.0724L3.82408 11.5642C3.62205 11.7022 3.52759 11.9579 3.60713 12.1923C3.69774 12.4593 3.8043 12.7205 3.92615 12.9743C4.03313 13.1971 4.27749 13.3088 4.51581 13.2598L5.36495 13.0851C5.5835 13.0401 5.80533 13.133 5.94623 13.3093C6.16893 13.5879 6.42071 13.8451 6.6994 14.0756C6.87261 14.2188 6.96442 14.4448 6.92112 14.668L6.75296 15.5348C6.70572 15.7782 6.81625 16.0273 7.03511 16.1356C7.15876 16.1967 7.285 16.2545 7.41375 16.3086C7.54251 16.3628 7.67196 16.4126 7.80195 16.4581C8.18224 16.5912 8.71449 16.1147 9.108 15.7625C9.30205 15.5888 9.42174 15.343 9.42301 15.0798C9.42301 15.0784 9.42302 15.077 9.42302 15.0756L9.42301 13.6263C9.42301 13.6109 9.4236 13.5957 9.42476 13.5806C8.26248 13.2971 7.39838 12.2301 7.39838 10.9572V9.41823C7.39838 9.30125 7.49131 9.20642 7.60596 9.20642H8.32584V7.6922C8.32584 7.48312 8.49193 7.31364 8.69683 7.31364C8.90171 7.31364 9.06781 7.48312 9.06781 7.6922V9.20642H11.0155V7.6922C11.0155 7.48312 11.1816 7.31364 11.3865 7.31364C11.5914 7.31364 11.7575 7.48312 11.7575 7.6922V9.20642H12.4773C12.592 9.20642 12.6849 9.30125 12.6849 9.41823V10.9572C12.6849 12.2704 11.7653 13.3643 10.5474 13.6051C10.5477 13.6121 10.5478 13.6192 10.5478 13.6263L10.5478 15.0694C10.5478 15.3377 10.6711 15.5879 10.871 15.7622C11.2715 16.1115 11.8129 16.5837 12.191 16.4502C12.4527 16.3577 12.7086 16.249 12.9573 16.1246C13.1756 16.0155 13.2852 15.7661 13.2371 15.5229L13.0659 14.6565C13.0218 14.4334 13.1128 14.2071 13.2856 14.0633C13.5587 13.8361 13.8107 13.5792 14.0366 13.2948C14.177 13.118 14.3985 13.0244 14.6172 13.0685L15.4666 13.2401C15.7052 13.2883 15.9493 13.1756 16.0554 12.9522C16.1153 12.8261 16.1719 12.6972 16.225 12.5659C16.2781 12.4345 16.3269 12.3024 16.3714 12.1698C16.4503 11.935 16.355 11.6795 16.1524 11.5421L15.4312 11.0532C15.2455 10.9273 15.153 10.7015 15.1755 10.4752C15.2116 10.111 15.2101 9.74744 15.1733 9.38986C15.1499 9.16361 15.2417 8.93757 15.4269 8.811L16.1467 8.31927C16.3488 8.18126 16.4432 7.92558 16.3637 7.69115C16.2731 7.42411 16.1665 7.16292 16.0447 6.90915C15.9377 6.68638 15.6933 6.57462 15.455 6.62366L14.6059 6.79837C14.3873 6.84334 14.1655 6.75048 14.0246 6.57418C13.8019 6.29554 13.5501 6.03832 13.2714 5.80784C13.0982 5.6646 13.0064 5.43858 13.0497 5.2154L13.2179 4.34868C13.2651 4.10521 13.1546 3.85616 12.9357 3.74787C12.8121 3.68669 12.6858 3.62895 12.5571 3.5748C12.4283 3.52065 12.2989 3.47086 12.1689 3.42537C11.9388 3.34485 11.6884 3.44211 11.5538 3.64884L11.0746 4.38475C10.9513 4.57425 10.73 4.66862 10.5082 4.64573C10.1513 4.6089 9.79502 4.61039 9.44459 4.64799C9.22286 4.67177 9.00134 4.57818 8.87731 4.38913L8.39541 3.65464Z" fill="' . $colorCode . '" /></svg>'; // phpcs:ignore Generic.Files.LineLength.MaxExceeded
23
+ }
24
+
25
  /**
26
  * Returns the country name by code.
27
  *
35
  }
36
 
37
  /**
38
+ * Returns a list of countries.
39
  *
40
  * @since 4.0.17
41
  *
app/Common/Traits/Helpers/DateTime.php CHANGED
@@ -12,6 +12,43 @@ if ( ! defined( 'ABSPATH' ) ) {
12
  * @since 4.1.2
13
  */
14
  trait DateTime {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  /**
16
  * Formats a date in ISO8601 format.
17
  *
12
  * @since 4.1.2
13
  */
14
  trait DateTime {
15
+ /**
16
+ * Formats a timestamp as an ISO 8601 date.
17
+ *
18
+ * @since 4.0.0
19
+ *
20
+ * @param string $dateTime The raw datetime.
21
+ * @return string The formatted datetime.
22
+ */
23
+ public function formatDateTime( $dateTime ) {
24
+ return gmdate( 'c', mysql2date( 'U', $dateTime ) );
25
+ }
26
+
27
+ /**
28
+ * Returns the timezone offset.
29
+ * We use the code from wp_timezone_string() which became available in WP 5.3+
30
+ *
31
+ * @since 4.0.0
32
+ *
33
+ * @return string The timezone offset.
34
+ */
35
+ public function getTimeZoneOffset() {
36
+ $timezoneString = get_option( 'timezone_string' );
37
+ if ( $timezoneString ) {
38
+ return $timezoneString;
39
+ }
40
+
41
+ $offset = (float) get_option( 'gmt_offset' );
42
+ $hours = (int) $offset;
43
+ $minutes = ( $offset - $hours );
44
+ $sign = ( $offset < 0 ) ? '-' : '+';
45
+ $absHour = abs( $hours );
46
+ $absMins = abs( $minutes * 60 );
47
+ $tzOffset = sprintf( '%s%02d:%02d', $sign, $absHour, $absMins );
48
+
49
+ return $tzOffset;
50
+ }
51
+
52
  /**
53
  * Formats a date in ISO8601 format.
54
  *
app/Common/Traits/Helpers/ECommerce.php DELETED
@@ -1,109 +0,0 @@
1
- <?php
2
- namespace AIOSEO\Plugin\Common\Traits\Helpers;
3
-
4
- // Exit if accessed directly.
5
- if ( ! defined( 'ABSPATH' ) ) {
6
- exit;
7
- }
8
-
9
- /**
10
- * Contains helper functions for eCommerce plugins.
11
- *
12
- * @since 4.1.3
13
- */
14
- trait ECommerce {
15
- /**
16
- * Checks whether WooCommerce is active.
17
- *
18
- * @since 4.0.0
19
- *
20
- * @return boolean Whether WooCommerce is active.
21
- */
22
- public function isWooCommerceActive() {
23
- return class_exists( 'woocommerce' );
24
- }
25
-
26
- /**
27
- * Checks whether the queried object is the WooCommerce shop page.
28
- *
29
- * @since 4.0.0
30
- *
31
- * @param int $id The post ID to check against (optional).
32
- * @return bool Whether the current page is the WooCommerce shop page.
33
- */
34
- public function isWooCommerceShopPage( $id = 0 ) {
35
- if ( ! $this->isWooCommerceActive() ) {
36
- return false;
37
- }
38
-
39
- if ( ! is_admin() && ! aioseo()->helpers->isAjaxCronRest() && function_exists( 'is_shop' ) ) {
40
- return is_shop();
41
- }
42
-
43
- $id = ! $id && ! empty( $_GET['post'] ) ? (int) wp_unslash( $_GET['post'] ) : (int) $id; // phpcs:ignore HM.Security.ValidatedSanitizedInput
44
- return $id && wc_get_page_id( 'shop' ) === $id;
45
- }
46
-
47
- /**
48
- * Checks whether the queried object is the WooCommerce cart page.
49
- *
50
- * @since 4.1.3
51
- *
52
- * @param int $id The post ID to check against (optional).
53
- * @return bool Whether the current page is the WooCommerce cart page.
54
- */
55
- public function isWooCommerceCartPage( $id = 0 ) {
56
- if ( ! $this->isWooCommerceActive() ) {
57
- return false;
58
- }
59
-
60
- if ( ! is_admin() && ! aioseo()->helpers->isAjaxCronRest() && function_exists( 'is_cart' ) ) {
61
- return is_cart();
62
- }
63
-
64
- $id = ! $id && ! empty( $_GET['post'] ) ? (int) wp_unslash( $_GET['post'] ) : (int) $id; // phpcs:ignore HM.Security.ValidatedSanitizedInput
65
- return $id && wc_get_page_id( 'cart' ) === $id;
66
- }
67
-
68
- /**
69
- * Checks whether the queried object is the WooCommerce checkout page.
70
- *
71
- * @since 4.1.3
72
- *
73
- * @param int $id The post ID to check against (optional).
74
- * @return bool Whether the current page is the WooCommerce checkout page.
75
- */
76
- public function isWooCommerceCheckoutPage( $id = 0 ) {
77
- if ( ! $this->isWooCommerceActive() ) {
78
- return false;
79
- }
80
-
81
- if ( ! is_admin() && ! aioseo()->helpers->isAjaxCronRest() && function_exists( 'is_checkout' ) ) {
82
- return is_checkout();
83
- }
84
-
85
- $id = ! $id && ! empty( $_GET['post'] ) ? (int) wp_unslash( $_GET['post'] ) : (int) $id; // phpcs:ignore HM.Security.ValidatedSanitizedInput
86
- return $id && wc_get_page_id( 'checkout' ) === $id;
87
- }
88
-
89
- /**
90
- * Checks whether the queried object is the WooCommerce account page.
91
- *
92
- * @since 4.1.3
93
- *
94
- * @param int $id The post ID to check against (optional).
95
- * @return bool Whether the current page is the WooCommerce account page.
96
- */
97
- public function isWooCommerceAccountPage( $id = 0 ) {
98
- if ( ! $this->isWooCommerceActive() ) {
99
- return false;
100
- }
101
-
102
- if ( ! is_admin() && ! aioseo()->helpers->isAjaxCronRest() && function_exists( 'is_account_page' ) ) {
103
- return is_account_page();
104
- }
105
-
106
- $id = ! $id && ! empty( $_GET['post'] ) ? (int) wp_unslash( $_GET['post'] ) : (int) $id; // phpcs:ignore HM.Security.ValidatedSanitizedInput
107
- return $id && wc_get_page_id( 'myaccount' ) === $id;
108
- }
109
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/Common/Traits/Helpers/Language.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\Traits\Helpers;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ /**
10
+ * Contains i18n and language (code) helper methods.
11
+ *
12
+ * @since 4.1.4
13
+ */
14
+ trait Language {
15
+ /**
16
+ * Returns the language of the current response.
17
+ *
18
+ * @since 4.1.4
19
+ *
20
+ * @return string The language code.
21
+ */
22
+ public function currentLanguageCode() {
23
+ global $wp_version;
24
+ if ( version_compare( $wp_version, '5.0', '<' ) ) {
25
+ return get_locale();
26
+ }
27
+ return determine_locale();
28
+ }
29
+
30
+ /**
31
+ * Returns the language of the current response in BCP 47 format.
32
+ *
33
+ * @since 4.1.4
34
+ *
35
+ * @return string The language code in BCP 47 format.
36
+ */
37
+ public function currentLanguageCodeBCP47() {
38
+ return str_replace( '_', '-', $this->currentLanguageCode() );
39
+ }
40
+ }
app/Common/Traits/Helpers/Strings.php CHANGED
@@ -37,6 +37,7 @@ trait Strings {
37
  * @return string The converted string.
38
  */
39
  public function toCamelCase( $string, $capitalize = false ) {
 
40
  if ( $capitalize ) {
41
  $string[0] = strtoupper( $string[0] );
42
  }
@@ -62,6 +63,71 @@ trait Strings {
62
  return $string;
63
  }
64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  /**
66
  * Returns string after converting it to lowercase.
67
  *
@@ -101,10 +167,65 @@ trait Strings {
101
  return false;
102
  }
103
 
104
- // Decode the string.
105
  json_decode( $string );
106
 
107
  // Return a boolean whether or not the last error matches.
108
  return json_last_error() === JSON_ERROR_NONE;
109
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  }
37
  * @return string The converted string.
38
  */
39
  public function toCamelCase( $string, $capitalize = false ) {
40
+ $string[0] = strtolower( $string[0] );
41
  if ( $capitalize ) {
42
  $string[0] = strtoupper( $string[0] );
43
  }
63
  return $string;
64
  }
65
 
66
+ /**
67
+ * Truncates a given string.
68
+ *
69
+ * @since 4.0.0
70
+ *
71
+ * @param string $string The string.
72
+ * @param int $maxCharacters The max. amount of characters.
73
+ * @param boolean $shouldHaveEllipsis Whether the string should have a trailing ellipsis (defaults to true).
74
+ * @return string $string The string.
75
+ */
76
+ public function truncate( $string, $maxCharacters, $shouldHaveEllipsis = true ) {
77
+ $length = strlen( $string );
78
+ $excessLength = $length - $maxCharacters;
79
+ if ( 0 < $excessLength ) {
80
+ // If the string is longer than 65535 characters, we first need to shorten it due to the character limit of the regex pattern quantifier.
81
+ if ( 65535 < $length ) {
82
+ $string = substr( $string, 0, 65534 );
83
+ }
84
+ $string = preg_replace( "#[^\pZ\pP]*.{{$excessLength}}$#", '', $string );
85
+ if ( $shouldHaveEllipsis ) {
86
+ $string = $string . ' ...';
87
+ }
88
+ }
89
+ return $string;
90
+ }
91
+
92
+ /**
93
+ * Escapes special regex characters.
94
+ *
95
+ * @since 4.0.5
96
+ *
97
+ * @param string $string The string.
98
+ * @return string The escaped string.
99
+ */
100
+ public function escapeRegex( $string ) {
101
+ return preg_quote( $string, '/' );
102
+ }
103
+
104
+ /**
105
+ * Escapes special regex characters inside the replacement string.
106
+ *
107
+ * @since 4.0.7
108
+ *
109
+ * @param string $string The string.
110
+ * @return string The escaped string.
111
+ */
112
+ public function escapeRegexReplacement( $string ) {
113
+ return str_replace( '$', '\$', $string );
114
+ }
115
+
116
+ /**
117
+ * preg_replace but with the replacement escaped.
118
+ *
119
+ * @since 4.0.10
120
+ *
121
+ * @param string $pattern The pattern to search for.
122
+ * @param string $replacement The replacement string.
123
+ * @param string $subject The subject to search in.
124
+ * @return string The subject with matches replaced.
125
+ */
126
+ public function pregReplace( $pattern, $replacement, $subject ) {
127
+ $replacement = $this->escapeRegexReplacement( $replacement );
128
+ return preg_replace( $pattern, $replacement, $subject );
129
+ }
130
+
131
  /**
132
  * Returns string after converting it to lowercase.
133
  *
167
  return false;
168
  }
169
 
 
170
  json_decode( $string );
171
 
172
  // Return a boolean whether or not the last error matches.
173
  return json_last_error() === JSON_ERROR_NONE;
174
  }
175
+
176
+ /**
177
+ * Strips punctuation from a given string.
178
+ *
179
+ * @since 4.0.0
180
+ *
181
+ * @param string $string The string.
182
+ * @return string The string without punctuation.
183
+ */
184
+ public function stripPunctuation( $string ) {
185
+ $string = preg_replace( '#\p{P}#u', '', $string );
186
+ // Trim both internal and external whitespace.
187
+ return preg_replace( '/\s\s+/u', ' ', trim( $string ) );
188
+ }
189
+
190
+ /**
191
+ * Returns the string after it is encoded with htmlspecialchars().
192
+ *
193
+ * @since 4.0.0
194
+ *
195
+ * @param string $string The string to encode.
196
+ * @return string The encoded string.
197
+ */
198
+ public function encodeOutputHtml( $string ) {
199
+ return htmlspecialchars( $string, ENT_COMPAT | ENT_HTML401, get_option( 'blog_charset' ), false );
200
+ }
201
+
202
+ /**
203
+ * Returns the string after all HTML entities have been decoded.
204
+ *
205
+ * @since 4.0.0
206
+ *
207
+ * @param string $string The string to decode.
208
+ * @return string The decoded string.
209
+ */
210
+ public function decodeHtmlEntities( $string ) {
211
+ return html_entity_decode( (string) $string, ENT_QUOTES );
212
+ }
213
+
214
+ /**
215
+ * Returns the given JSON formatted data tags as a comma separated list with their values instead.
216
+ *
217
+ * @since 4.1.0
218
+ *
219
+ * @param string $tags The JSON formatted data tags.
220
+ * @return string The comma separated values.
221
+ */
222
+ public function jsonTagsToCommaSeparatedList( $tags ) {
223
+ $tags = json_decode( $tags );
224
+
225
+ $values = [];
226
+ foreach ( $tags as $k => $tag ) {
227
+ $values[ $k ] = $tag->value;
228
+ }
229
+ return implode( ',', $values );
230
+ }
231
  }
app/Common/Traits/Helpers/Svg.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\Traits\Helpers;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ /**
10
+ * Contains SVG specific helper methods.
11
+ *
12
+ * @since 4.1.4
13
+ */
14
+ trait Svg {
15
+ /**
16
+ * Sanitizes a SVG string.
17
+ *
18
+ * @since 4.1.4
19
+ *
20
+ * @param string $svgString The SVG to check.
21
+ * @return string The sanitized SVG.
22
+ */
23
+ public function escSvg( $svgString ) {
24
+ if ( ! is_string( $svgString ) ) {
25
+ return false;
26
+ }
27
+
28
+ $ksesDefaults = wp_kses_allowed_html( 'post' );
29
+
30
+ $svgArgs = [
31
+ 'svg' => [
32
+ 'class' => true,
33
+ 'aria-hidden' => true,
34
+ 'aria-labelledby' => true,
35
+ 'role' => true,
36
+ 'xmlns' => true,
37
+ 'width' => true,
38
+ 'height' => true,
39
+ 'viewbox' => true, // <= Must be lower case!
40
+ ],
41
+ 'g' => [ 'fill' => true ],
42
+ 'title' => [ 'title' => true ],
43
+ 'path' => [
44
+ 'd' => true,
45
+ 'fill' => true,
46
+ ]
47
+ ];
48
+
49
+ return wp_kses( $svgString, array_merge( $ksesDefaults, $svgArgs ) );
50
+ }
51
+ }
app/Common/Traits/Helpers/ThirdParty.php ADDED
@@ -0,0 +1,338 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\Traits\Helpers;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ /**
10
+ * Contains all third-party related helper methods.
11
+ *
12
+ * @since 4.1.4
13
+ */
14
+ trait ThirdParty {
15
+ /**
16
+ * Checks whether WooCommerce is active.
17
+ *
18
+ * @since 4.0.0
19
+ *
20
+ * @return boolean Whether WooCommerce is active.
21
+ */
22
+ public function isWooCommerceActive() {
23
+ return class_exists( 'woocommerce' );
24
+ }
25
+
26
+ /**
27
+ * Returns if the page is a WooCommerce page (Cart, Checkout, ...).
28
+ *
29
+ * @since 4.0.0
30
+ *
31
+ * @param int $postId The post ID.
32
+ * @return boolean Whether the page is a WooCommerce page or not.
33
+ */
34
+ public function isWooCommercePage( $postId = false ) {
35
+ if ( ! $this->isWooCommerceActive() ) {
36
+ return false;
37
+ }
38
+
39
+ static $cartPageId;
40
+ if ( ! $cartPageId ) {
41
+ $cartPageId = (int) get_option( 'woocommerce_cart_page_id' );
42
+ }
43
+
44
+ static $checkoutPageId;
45
+ if ( ! $checkoutPageId ) {
46
+ $checkoutPageId = (int) get_option( 'woocommerce_checkout_page_id' );
47
+ }
48
+
49
+ static $myAccountPageId;
50
+ if ( ! $myAccountPageId ) {
51
+ $myAccountPageId = (int) get_option( 'woocommerce_myaccount_page_id' );
52
+ }
53
+
54
+ static $termsPageId;
55
+ if ( ! $termsPageId ) {
56
+ $termsPageId = (int) get_option( 'woocommerce_terms_page_id' );
57
+ }
58
+
59
+ if (
60
+ $cartPageId === (int) $postId ||
61
+ $checkoutPageId === (int) $postId ||
62
+ $myAccountPageId === (int) $postId ||
63
+ $termsPageId === (int) $postId
64
+ ) {
65
+ return true;
66
+ }
67
+
68
+ return false;
69
+ }
70
+
71
+ /**
72
+ * Checks whether the queried object is the WooCommerce shop page.
73
+ *
74
+ * @since 4.0.0
75
+ *
76
+ * @param int $id The post ID to check against (optional).
77
+ * @return bool Whether the current page is the WooCommerce shop page.
78
+ */
79
+ public function isWooCommerceShopPage( $id = 0 ) {
80
+ if ( ! $this->isWooCommerceActive() ) {
81
+ return false;
82
+ }
83
+
84
+ if ( ! is_admin() && ! aioseo()->helpers->isAjaxCronRest() && function_exists( 'is_shop' ) ) {
85
+ return is_shop();
86
+ }
87
+
88
+ $id = ! $id && ! empty( $_GET['post'] ) ? (int) wp_unslash( $_GET['post'] ) : (int) $id; // phpcs:ignore HM.Security.ValidatedSanitizedInput
89
+ return $id && wc_get_page_id( 'shop' ) === $id;
90
+ }
91
+
92
+ /**
93
+ * Checks whether the queried object is the WooCommerce cart page.
94
+ *
95
+ * @since 4.1.3
96
+ *
97
+ * @param int $id The post ID to check against (optional).
98
+ * @return bool Whether the current page is the WooCommerce cart page.
99
+ */
100
+ public function isWooCommerceCartPage( $id = 0 ) {
101
+ if ( ! $this->isWooCommerceActive() ) {
102
+ return false;
103
+ }
104
+
105
+ if ( ! is_admin() && ! aioseo()->helpers->isAjaxCronRest() && function_exists( 'is_cart' ) ) {
106
+ return is_cart();
107
+ }
108
+
109
+ $id = ! $id && ! empty( $_GET['post'] ) ? (int) wp_unslash( $_GET['post'] ) : (int) $id; // phpcs:ignore HM.Security.ValidatedSanitizedInput
110
+ return $id && wc_get_page_id( 'cart' ) === $id;
111
+ }
112
+
113
+ /**
114
+ * Checks whether the queried object is the WooCommerce checkout page.
115
+ *
116
+ * @since 4.1.3
117
+ *
118
+ * @param int $id The post ID to check against (optional).
119
+ * @return bool Whether the current page is the WooCommerce checkout page.
120
+ */
121
+ public function isWooCommerceCheckoutPage( $id = 0 ) {
122
+ if ( ! $this->isWooCommerceActive() ) {
123
+ return false;
124
+ }
125
+
126
+ if ( ! is_admin() && ! aioseo()->helpers->isAjaxCronRest() && function_exists( 'is_checkout' ) ) {
127
+ return is_checkout();
128
+ }
129
+
130
+ $id = ! $id && ! empty( $_GET['post'] ) ? (int) wp_unslash( $_GET['post'] ) : (int) $id; // phpcs:ignore HM.Security.ValidatedSanitizedInput
131
+ return $id && wc_get_page_id( 'checkout' ) === $id;
132
+ }
133
+
134
+ /**
135
+ * Checks whether the queried object is the WooCommerce account page.
136
+ *
137
+ * @since 4.1.3
138
+ *
139
+ * @param int $id The post ID to check against (optional).
140
+ * @return bool Whether the current page is the WooCommerce account page.
141
+ */
142
+ public function isWooCommerceAccountPage( $id = 0 ) {
143
+ if ( ! $this->isWooCommerceActive() ) {
144
+ return false;
145
+ }
146
+
147
+ if ( ! is_admin() && ! aioseo()->helpers->isAjaxCronRest() && function_exists( 'is_account_page' ) ) {
148
+ return is_account_page();
149
+ }
150
+
151
+ $id = ! $id && ! empty( $_GET['post'] ) ? (int) wp_unslash( $_GET['post'] ) : (int) $id; // phpcs:ignore HM.Security.ValidatedSanitizedInput
152
+ return $id && wc_get_page_id( 'myaccount' ) === $id;
153
+ }
154
+
155
+ /**
156
+ * Internationalize.
157
+ *
158
+ * @since 4.0.0
159
+ *
160
+ * @param $in
161
+ * @return mixed|void
162
+ */
163
+ public function internationalize( $in ) {
164
+ if ( function_exists( 'langswitch_filter_langs_with_message' ) ) {
165
+ $in = langswitch_filter_langs_with_message( $in );
166
+ }
167
+
168
+ if ( function_exists( 'polyglot_filter' ) ) {
169
+ $in = polyglot_filter( $in );
170
+ }
171
+
172
+ if ( function_exists( 'qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage' ) ) {
173
+ $in = qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage( $in );
174
+ } elseif ( function_exists( 'ppqtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage' ) ) {
175
+ $in = ppqtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage( $in );
176
+ } elseif ( function_exists( 'qtranxf_useCurrentLanguageIfNotFoundUseDefaultLanguage' ) ) {
177
+ $in = qtranxf_useCurrentLanguageIfNotFoundUseDefaultLanguage( $in );
178
+ }
179
+
180
+ return apply_filters( 'localization', $in );
181
+ }
182
+
183
+ /**
184
+ * Checks if WPML is active.
185
+ *
186
+ * @since 4.0.0
187
+ *
188
+ * @return bool True if it is, false if not.
189
+ */
190
+ public function isWpmlActive() {
191
+ return class_exists( 'SitePress' );
192
+ }
193
+
194
+ /**
195
+ * Localizes a given URL.
196
+ *
197
+ * This is required for compatibility with WPML.
198
+ *
199
+ * @since 4.0.0
200
+ *
201
+ * @param string $path The relative path of the URL.
202
+ * @return string $url The filtered URL.
203
+ */
204
+ public function localizedUrl( $path ) {
205
+ $url = apply_filters( 'wpml_home_url', home_url( '/' ) );
206
+
207
+ // Remove URL parameters.
208
+ preg_match_all( '/\?[\s\S]+/', $url, $matches );
209
+
210
+ // Get the base URL.
211
+ $url = preg_replace( '/\?[\s\S]+/', '', $url );
212
+ $url = trailingslashit( $url );
213
+ $url .= preg_replace( '/\//', '', $path, 1 );
214
+
215
+ // Readd URL parameters.
216
+ if ( $matches && $matches[0] ) {
217
+ $url .= $matches[0][0];
218
+ }
219
+
220
+ return $url;
221
+ }
222
+
223
+ /**
224
+ * Checks whether BuddyPress is active.
225
+ *
226
+ * @since 4.0.0
227
+ *
228
+ * @return boolean
229
+ */
230
+ public function isBuddyPressActive() {
231
+ return class_exists( 'BuddyPress' );
232
+ }
233
+
234
+ /**
235
+ * Checks whether the queried object is a buddy press user page.
236
+ *
237
+ * @since 4.0.0
238
+ *
239
+ * @return boolean
240
+ */
241
+ public function isBuddyPressUser() {
242
+ return $this->isBuddyPressActive() && function_exists( 'bp_is_user' ) && bp_is_user();
243
+ }
244
+
245
+ /**
246
+ * Returns if the page is a BuddyPress page (Activity, Members, Groups).
247
+ *
248
+ * @since 4.0.0
249
+ *
250
+ * @param int $postId The post ID.
251
+ * @return boolean If the page is a BuddyPress page or not.
252
+ */
253
+ public function isBuddyPressPage( $postId = false ) {
254
+ $bpPages = get_option( 'bp-pages' );
255
+
256
+ if ( empty( $bpPages ) ) {
257
+ return false;
258
+ }
259
+
260
+ foreach ( $bpPages as $page ) {
261
+ if ( (int) $page === (int) $postId ) {
262
+ return true;
263
+ }
264
+ }
265
+
266
+ return false;
267
+ }
268
+
269
+ /**
270
+ * Returns ACF fields as an array of meta keys and values.
271
+ *
272
+ * @since 4.0.6
273
+ *
274
+ * @param WP_Post|int $post The post.
275
+ * @param array $allowedTypes A whitelist of ACF field types.
276
+ * @return array An array of meta keys and values.
277
+ */
278
+ public function getAcfContent( $post = null, $types = [] ) {
279
+ $post = ( $post && is_object( $post ) ) ? $post : $this->getPost( $post );
280
+
281
+ if ( ! class_exists( 'ACF' ) || ! function_exists( 'get_field_objects' ) ) {
282
+ return [];
283
+ }
284
+
285
+ if ( defined( 'ACF_VERSION' ) && version_compare( ACF_VERSION, '5.7.0', '<' ) ) {
286
+ return [];
287
+ }
288
+
289
+ // Set defaults.
290
+ $allowedTypes = [
291
+ 'text',
292
+ 'textarea',
293
+ 'email',
294
+ 'url',
295
+ 'wysiwyg',
296
+ 'image',
297
+ 'gallery',
298
+ // 'link',
299
+ // 'taxonomy',
300
+ ];
301
+
302
+ $types = wp_parse_args( $types, $allowedTypes );
303
+ $acfFields = [];
304
+
305
+ $fieldObjects = get_field_objects( $post->ID );
306
+ if ( ! empty( $fieldObjects ) ) {
307
+ foreach ( $fieldObjects as $field ) {
308
+ if ( empty( $field['value'] ) ) {
309
+ continue;
310
+ }
311
+
312
+ if ( ! in_array( $field['type'], $types, true ) ) {
313
+ continue;
314
+ }
315
+
316
+ if ( 'url' === $field['type'] ) {
317
+ // Url field
318
+ $value = "<a href='{$field['value']}'>{$field['value']}</a>";
319
+ } elseif ( 'image' === $field['type'] ) {
320
+ // Image field
321
+ $value = "<img src='{$field['value']['url']}'>";
322
+ } elseif ( 'gallery' === $field['type'] ) {
323
+ // Image field
324
+ $value = "<img src='{$field['value'][0]['url']}'>";
325
+ } else {
326
+ // Other fields
327
+ $value = $field['value'];
328
+ }
329
+
330
+ if ( $value ) {
331
+ $acfFields[ $field['name'] ] = $value;
332
+ }
333
+ }
334
+ }
335
+
336
+ return $acfFields;
337
+ }
338
+ }
app/Common/Traits/Helpers/Vue.php ADDED
@@ -0,0 +1,367 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\Traits\Helpers;
3
+
4
+ use AIOSEO\Plugin\Common\Models;
5
+ use AIOSEO\Plugin\Common\Tools;
6
+
7
+ // Exit if accessed directly.
8
+ if ( ! defined( 'ABSPATH' ) ) {
9
+ exit;
10
+ }
11
+
12
+ /**
13
+ * Contains all Vue related helper methods.
14
+ *
15
+ * @since 4.1.4
16
+ */
17
+ trait Vue {
18
+ /**
19
+ * Returns the data for Vue.
20
+ *
21
+ * @since 4.0.0
22
+ *
23
+ * @param string $page The current page.
24
+ * @return array The data.
25
+ */
26
+ public function getVueData( $page = null ) {
27
+ $postTypeObj = get_post_type_object( get_post_type( get_the_ID() ) );
28
+ $screen = get_current_screen();
29
+
30
+ // Check if user has a custom filename from the V3 migration.
31
+ $sitemapFilename = aioseo()->sitemap->helpers->filename( 'general' );
32
+ $sitemapFilename = $sitemapFilename ? $sitemapFilename : 'sitemap';
33
+
34
+ $isStaticHomePage = 'page' === get_option( 'show_on_front' );
35
+ $staticHomePage = intval( get_option( 'page_on_front' ) );
36
+ $data = [
37
+ 'page' => $page,
38
+ 'screen' => [
39
+ 'base' => $screen->base,
40
+ 'postType' => $screen->post_type,
41
+ 'blockEditor' => isset( $screen->is_block_editor ) ? $screen->is_block_editor : false
42
+ ],
43
+ 'internalOptions' => aioseo()->internalOptions->all(),
44
+ 'options' => aioseo()->options->all(),
45
+ 'dynamicOptions' => aioseo()->dynamicOptions->all(),
46
+ 'settings' => aioseo()->settings->all(),
47
+ 'tags' => aioseo()->tags->all( true ),
48
+ 'nonce' => wp_create_nonce( 'wp_rest' ),
49
+ 'urls' => [
50
+ 'domain' => $this->getSiteDomain(),
51
+ 'mainSiteUrl' => $this->getSiteUrl(),
52
+ 'home' => home_url(),
53
+ 'restUrl' => rest_url(),
54
+ 'publicPath' => plugin_dir_url( AIOSEO_FILE ),
55
+ 'rssFeedUrl' => get_bloginfo( 'rss2_url' ),
56
+ 'generalSitemapUrl' => home_url( "/$sitemapFilename.xml" ),
57
+ 'rssSitemapUrl' => home_url( '/sitemap.rss' ),
58
+ 'robotsTxtUrl' => $this->getSiteUrl() . '/robots.txt',
59
+ 'blockedBotsLogUrl' => wp_upload_dir()['baseurl'] . '/aioseo/logs/aioseo-bad-bot-blocker.log',
60
+ 'upgradeUrl' => apply_filters( 'aioseo_upgrade_link', AIOSEO_MARKETING_URL ),
61
+ 'staticHomePage' => 'page' === get_option( 'show_on_front' ) ? get_edit_post_link( get_option( 'page_on_front' ), 'url' ) : null,
62
+ 'connect' => add_query_arg( [
63
+ 'siteurl' => site_url(),
64
+ 'homeurl' => home_url(),
65
+ 'redirect' => rawurldecode( base64_encode( admin_url( 'index.php?page=aioseo-connect' ) ) )
66
+ ], defined( 'AIOSEO_CONNECT_URL' ) ? AIOSEO_CONNECT_URL : 'https://connect.aioseo.com' ),
67
+ 'aio' => [
68
+ 'wizard' => admin_url( 'index.php?page=aioseo-setup-wizard' ),
69
+ 'dashboard' => admin_url( 'admin.php?page=aioseo' ),
70
+ 'settings' => admin_url( 'admin.php?page=aioseo-settings' ),
71
+ 'localSeo' => admin_url( 'admin.php?page=aioseo-local-seo' ),
72
+ 'featureManager' => admin_url( 'admin.php?page=aioseo-feature-manager' ),
73
+ 'sitemaps' => admin_url( 'admin.php?page=aioseo-sitemaps' ),
74
+ 'seoAnalysis' => admin_url( 'admin.php?page=aioseo-seo-analysis' ),
75
+ 'searchAppearance' => admin_url( 'admin.php?page=aioseo-search-appearance' ),
76
+ 'socialNetworks' => admin_url( 'admin.php?page=aioseo-social-networks' ),
77
+ 'tools' => admin_url( 'admin.php?page=aioseo-tools' ),
78
+ 'monsterinsights' => admin_url( 'admin.php?page=aioseo-monsterinsights' )
79
+ ],
80
+ 'admin' => [
81
+ 'widgets' => admin_url( 'widgets.php' ),
82
+ 'optionsReading' => admin_url( 'options-reading.php' ),
83
+ 'scheduledActions' => admin_url( '/tools.php?page=action-scheduler&status=pending&s=aioseo' ),
84
+ 'generalSettings' => admin_url( 'options-general.php' )
85
+ ]
86
+ ],
87
+ 'backups' => [],
88
+ 'importers' => [],
89
+ 'data' => [
90
+ 'server' => [
91
+ 'apache' => null,
92
+ 'nginx' => null
93
+ ],
94
+ 'robots' => [
95
+ 'defaultRules' => [],
96
+ 'hasPhysicalRobots' => null,
97
+ 'rewriteExists' => null,
98
+ 'sitemapUrls' => []
99
+ ],
100
+ 'logSizes' => [
101
+ 'badBotBlockerLog' => null
102
+ ],
103
+ 'status' => [],
104
+ 'htaccess' => '',
105
+ 'multisite' => is_multisite(),
106
+ 'network' => is_network_admin(),
107
+ 'mainSite' => is_main_site(),
108
+ 'subdomain' => defined( 'SUBDOMAIN_INSTALL' ) && SUBDOMAIN_INSTALL,
109
+ 'isWooCommerceActive' => $this->isWooCommerceActive(),
110
+ 'isBBPressActive' => class_exists( 'bbPress' ),
111
+ 'staticHomePage' => $isStaticHomePage ? $staticHomePage : false,
112
+ 'staticBlogPage' => $this->getBlogPageId(),
113
+ 'staticBlogPageTitle' => get_the_title( $this->getBlogPageId() ),
114
+ 'isDev' => $this->isDev(),
115
+ 'isSsl' => is_ssl()
116
+ ],
117
+ 'user' => [
118
+ 'email' => wp_get_current_user()->user_email,
119
+ 'roles' => $this->getUserRoles(),
120
+ 'customRoles' => $this->getCustomRoles(),
121
+ 'canManage' => aioseo()->access->canManage(),
122
+ 'capabilities' => aioseo()->access->getAllCapabilities(),
123
+ 'unfilteredHtml' => current_user_can( 'unfiltered_html' ),
124
+ 'locale' => function_exists( 'get_user_locale' ) ? get_user_locale() : get_locale()
125
+ ],
126
+ 'plugins' => $this->getPluginData(),
127
+ 'postData' => [
128
+ 'postTypes' => $this->getPublicPostTypes( false, false, true ),
129
+ 'taxonomies' => $this->getPublicTaxonomies( false, true ),
130
+ 'archives' => $this->getPublicPostTypes( false, true, true )
131
+ ],
132
+ 'notifications' => Models\Notification::getNotifications( false ),
133
+ 'addons' => aioseo()->addons->getAddons(),
134
+ 'version' => AIOSEO_VERSION,
135
+ 'helpPanel' => json_decode( aioseo()->help->getDocs() ),
136
+ 'scheduledActions' => [
137
+ 'sitemaps' => []
138
+ ]
139
+ ];
140
+
141
+ if ( is_multisite() && ! is_network_admin() ) {
142
+ switch_to_blog( $this->getNetworkId() );
143
+ $options = aioseo()->options->noConflict();
144
+ $options->initNetwork();
145
+ $data['networkOptions'] = $options->all();
146
+ restore_current_blog();
147
+ }
148
+
149
+ if ( 'post' === $page ) {
150
+ $postId = get_the_ID();
151
+ $post = Models\Post::getPost( $postId );
152
+
153
+ $data['currentPost'] = [
154
+ 'context' => 'post',
155
+ 'tags' => aioseo()->tags->getDefaultPostTags( $postId ),
156
+ 'id' => $postId,
157
+ 'priority' => ! empty( $post->priority ) ? $post->priority : 'default',
158
+ 'frequency' => ! empty( $post->frequency ) ? $post->frequency : 'default',
159
+ 'permalink' => get_the_permalink(),
160
+ 'title' => ! empty( $post->title ) ? $post->title : aioseo()->meta->title->getPostTypeTitle( $postTypeObj->name ),
161
+ 'description' => ! empty( $post->description ) ? $post->description : aioseo()->meta->description->getPostTypeDescription( $postTypeObj->name ),
162
+ 'keywords' => ! empty( $post->keywords ) ? $post->keywords : wp_json_encode( [] ),
163
+ 'keyphrases' => ! empty( $post->keyphrases )
164
+ ? json_decode( $post->keyphrases )
165
+ : json_decode( '{"focus":{},"additional":[]}' ),
166
+ 'page_analysis' => ! empty( $post->page_analysis )
167
+ ? json_decode( $post->page_analysis )
168
+ : Models\Post::getPageAnalysisDefaults(),
169
+ 'loading' => [
170
+ 'focus' => false,
171
+ 'additional' => [],
172
+ ],
173
+ 'type' => $postTypeObj->labels->singular_name,
174
+ 'postType' => 'type' === $postTypeObj->name ? '_aioseo_type' : $postTypeObj->name,
175
+ 'isSpecialPage' => $this->isSpecialPage( $postId ),
176
+ 'isWooCommercePage' => $this->isWooCommercePage( $postId ),
177
+ 'seo_score' => (int) $post->seo_score,
178
+ 'pillar_content' => ( (int) $post->pillar_content ) === 0 ? false : true,
179
+ 'canonicalUrl' => $post->canonical_url,
180
+ 'default' => ( (int) $post->robots_default ) === 0 ? false : true,
181
+ 'noindex' => ( (int) $post->robots_noindex ) === 0 ? false : true,
182
+ 'noarchive' => ( (int) $post->robots_noarchive ) === 0 ? false : true,
183
+ 'nosnippet' => ( (int) $post->robots_nosnippet ) === 0 ? false : true,
184
+ 'nofollow' => ( (int) $post->robots_nofollow ) === 0 ? false : true,
185
+ 'noimageindex' => ( (int) $post->robots_noimageindex ) === 0 ? false : true,
186
+ 'noodp' => ( (int) $post->robots_noodp ) === 0 ? false : true,
187
+ 'notranslate' => ( (int) $post->robots_notranslate ) === 0 ? false : true,
188
+ 'maxSnippet' => null === $post->robots_max_snippet ? -1 : (int) $post->robots_max_snippet,
189
+ 'maxVideoPreview' => null === $post->robots_max_videopreview ? -1 : (int) $post->robots_max_videopreview,
190
+ 'maxImagePreview' => $post->robots_max_imagepreview,
191
+ 'modalOpen' => false,
192
+ 'tabs' => ( ! empty( $post->tabs ) )
193
+ ? json_decode( $post->tabs )
194
+ : json_decode( Models\Post::getDefaultTabsOptions() ),
195
+ 'generalMobilePrev' => false,
196
+ 'socialMobilePreview' => false,
197
+ 'og_object_type' => ! empty( $post->og_object_type ) ? $post->og_object_type : 'default',
198
+ 'og_title' => $post->og_title,
199
+ 'og_description' => $post->og_description,
200
+ 'og_image_custom_url' => $post->og_image_custom_url,
201
+ 'og_image_custom_fields' => $post->og_image_custom_fields,
202
+ 'og_image_type' => ! empty( $post->og_image_type ) ? $post->og_image_type : 'default',
203
+ 'og_video' => ! empty( $post->og_video ) ? $post->og_video : '',
204
+ 'og_article_section' => ! empty( $post->og_article_section ) ? $post->og_article_section : '',
205
+ 'og_article_tags' => ! empty( $post->og_article_tags ) ? $post->og_article_tags : wp_json_encode( [] ),
206
+ 'twitter_use_og' => ( (int) $post->twitter_use_og ) === 0 ? false : true,
207
+ 'twitter_card' => $post->twitter_card,
208
+ 'twitter_image_custom_url' => $post->twitter_image_custom_url,
209
+ 'twitter_image_custom_fields' => $post->twitter_image_custom_fields,
210
+ 'twitter_image_type' => $post->twitter_image_type,
211
+ 'twitter_title' => $post->twitter_title,
212
+ 'twitter_description' => $post->twitter_description,
213
+ 'schema_type' => ( ! empty( $post->schema_type ) ) ? $post->schema_type : 'default',
214
+ 'schema_type_options' => ( ! empty( $post->schema_type_options ) )
215
+ ? json_decode( Models\Post::getDefaultSchemaOptions( $post->schema_type_options ) )
216
+ : json_decode( Models\Post::getDefaultSchemaOptions() ),
217
+ 'metaDefaults' => [
218
+ 'title' => aioseo()->meta->title->getPostTypeTitle( $postTypeObj->name ),
219
+ 'description' => aioseo()->meta->description->getPostTypeDescription( $postTypeObj->name )
220
+ ]
221
+ ];
222
+
223
+ if ( ! $post->exists() ) {
224
+ $oldPostMeta = aioseo()->migration->meta->getMigratedPostMeta( $postId );
225
+ foreach ( $oldPostMeta as $k => $v ) {
226
+ if ( preg_match( '#robots_.*#', $k ) ) {
227
+ $oldPostMeta[ preg_replace( '#robots_#', '', $k ) ] = $v;
228
+ continue;
229
+ }
230
+ if ( 'canonical_url' === $k ) {
231
+ $oldPostMeta['canonicalUrl'] = $v;
232
+ }
233
+ }
234
+ $data['currentPost'] = array_merge( $data['currentPost'], $oldPostMeta );
235
+ }
236
+ }
237
+
238
+ if ( 'sitemaps' === $page ) {
239
+ try {
240
+ if ( as_next_scheduled_action( 'aioseo_static_sitemap_regeneration' ) ) {
241
+ $data['scheduledActions']['sitemap'][] = 'staticSitemapRegeneration';
242
+ }
243
+ } catch ( \Exception $e ) {
244
+ // Do nothing.
245
+ }
246
+ }
247
+
248
+ if ( 'setup-wizard' === $page ) {
249
+ $data['users'] = $this->getSiteUsers( [ 'administrator', 'editor', 'author' ] );
250
+ $data['importers'] = aioseo()->importExport->plugins();
251
+ }
252
+
253
+ if ( 'search-appearance' === $page ) {
254
+ $data['users'] = $this->getSiteUsers( [ 'administrator', 'editor', 'author' ] );
255
+ $data['data'] += [
256
+ 'staticHomePageTitle' => $isStaticHomePage ? aioseo()->meta->title->getTitle( $staticHomePage ) : '',
257
+ 'staticHomePageDescription' => $isStaticHomePage ? aioseo()->meta->description->getDescription( $staticHomePage ) : '',
258
+ ];
259
+ }
260
+
261
+ if ( 'social-networks' === $page ) {
262
+ $data['data'] += [
263
+ 'staticHomePageOgTitle' => $isStaticHomePage ? aioseo()->social->facebook->getTitle( $staticHomePage ) : '',
264
+ 'staticHomePageOgDescription' => $isStaticHomePage ? aioseo()->social->facebook->getDescription( $staticHomePage ) : '',
265
+ 'staticHomePageTwitterTitle' => $isStaticHomePage ? aioseo()->social->twitter->getTitle( $staticHomePage ) : '',
266
+ 'staticHomePageTwitterDescription' => $isStaticHomePage ? aioseo()->social->twitter->getDescription( $staticHomePage ) : '',
267
+ ];
268
+ }
269
+
270
+ if ( 'tools' === $page ) {
271
+ $data['backups'] = array_reverse( aioseo()->backup->all() );
272
+ $data['importers'] = aioseo()->importExport->plugins();
273
+ $data['data']['server'] = [
274
+ 'apache' => $this->isApache(),
275
+ 'nginx' => $this->isNginx()
276
+ ];
277
+ $data['data']['robots'] = [
278
+ 'defaultRules' => $page ? aioseo()->robotsTxt->getDefaultRules() : [],
279
+ 'hasPhysicalRobots' => aioseo()->robotsTxt->hasPhysicalRobotsTxt(),
280
+ 'rewriteExists' => aioseo()->robotsTxt->rewriteRulesExist(),
281
+ 'sitemapUrls' => array_merge( aioseo()->sitemap->helpers->getSitemapUrls(), $this->extractSitemapUrlsFromRobotsTxt() )
282
+ ];
283
+ $data['data']['logSizes'] = [
284
+ 'badBotBlockerLog' => $this->convertFileSize( aioseo()->badBotBlocker->getLogSize() )
285
+ ];
286
+ $data['data']['status'] = Tools\SystemStatus::getSystemStatusInfo();
287
+ $data['data']['htaccess'] = aioseo()->htaccess->getContents();
288
+ }
289
+
290
+ if ( 'settings' === $page ) {
291
+ $data['breadcrumbs']['defaultTemplate'] = aioseo()->helpers->encodeOutputHtml( aioseo()->breadcrumbs->frontend->getDefaultTemplate() );
292
+ }
293
+
294
+ $loadedAddons = aioseo()->addons->getLoadedAddons();
295
+ if ( ! empty( $loadedAddons ) ) {
296
+ foreach ( $loadedAddons as $addon ) {
297
+ if ( isset( $addon->helpers ) && method_exists( $addon->helpers, 'getVueData' ) ) {
298
+ $data = $addon->helpers->getVueData( $data, $page, isset( $post ) ? $post : null );
299
+ }
300
+ }
301
+ }
302
+
303
+ return $data;
304
+ }
305
+
306
+ /**
307
+ * Returns Jed-formatted localization data. Added for backwards-compatibility.
308
+ *
309
+ * @since 4.0.0
310
+ *
311
+ * @param string $domain Translation domain.
312
+ * @return array The information of the locale.
313
+ */
314
+ public function getJedLocaleData( $domain ) {
315
+ $translations = get_translations_for_domain( $domain );
316
+
317
+ $locale = [
318
+ '' => [
319
+ 'domain' => $domain,
320
+ 'lang' => is_admin() && function_exists( 'get_user_locale' ) ? get_user_locale() : get_locale(),
321
+ ],
322
+ ];
323
+
324
+ if ( ! empty( $translations->headers['Plural-Forms'] ) ) {
325
+ $locale['']['plural_forms'] = $translations->headers['Plural-Forms'];
326
+ }
327
+
328
+ foreach ( $translations->entries as $msgid => $entry ) {
329
+ $locale[ $msgid ] = $entry->translations;
330
+ }
331
+
332
+ // If any of the translated strings incorrectly contains HTML line breaks, we need to return or else the admin is no longer accessible - #2074.
333
+ $json = wp_json_encode( $locale );
334
+ if ( preg_match( '/<br[\s\/]*>/', $json ) ) {
335
+ return [];
336
+ }
337
+
338
+ return $locale;
339
+ }
340
+
341
+ /**
342
+ * Extracts existing sitemap URLs from the robots.txt file.
343
+ *
344
+ * We need this in case users have existing sitemap directives added to their robots.txt file.
345
+ *
346
+ * @since 4.0.10
347
+ *
348
+ * @return array An array with robots.txt sitemap directives.
349
+ */
350
+ private function extractSitemapUrlsFromRobotsTxt() {
351
+ // First, we need to remove our filter, so that it doesn't run unintentionally.
352
+ remove_filter( 'robots_txt', [ aioseo()->robotsTxt, 'buildRules' ], 10000 );
353
+ $robotsTxt = apply_filters( 'robots_txt', '', true );
354
+ add_filter( 'robots_txt', [ aioseo()->robotsTxt, 'buildRules' ], 10000, 2 );
355
+
356
+ if ( ! $robotsTxt ) {
357
+ return [];
358
+ }
359
+
360
+ $lines = explode( "\n", $robotsTxt );
361
+ if ( ! is_array( $lines ) || ! count( $lines ) ) {
362
+ return [];
363
+ }
364
+
365
+ return aioseo()->robotsTxt->extractSitemapUrls( explode( "\n", $robotsTxt ) );
366
+ }
367
+ }
app/Common/Traits/Helpers/Wp.php ADDED
@@ -0,0 +1,549 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\Traits\Helpers;
3
+
4
+ use AIOSEO\Plugin\Common\Utils;
5
+
6
+ // Exit if accessed directly.
7
+ if ( ! defined( 'ABSPATH' ) ) {
8
+ exit;
9
+ }
10
+
11
+ /**
12
+ * Contains all WP related helper methods.
13
+ *
14
+ * @since 4.1.4
15
+ */
16
+ trait Wp {
17
+ /**
18
+ * Whether or not we have a local connection.
19
+ *
20
+ * @since 4.0.0
21
+ *
22
+ * @var bool
23
+ */
24
+ private static $connection = false;
25
+
26
+ /**
27
+ * Helper method to enqueue scripts.
28
+ *
29
+ * @since 4.0.0
30
+ *
31
+ * @param string $script The script to enqueue.
32
+ * @param string $url The URL of the script.
33
+ * @param bool $vue Whether or not this is a vue script.
34
+ * @return void
35
+ */
36
+ public function enqueueScript( $script, $url, $vue = true ) {
37
+ if ( ! wp_script_is( $script, 'enqueued' ) ) {
38
+ wp_enqueue_script(
39
+ $script,
40
+ $this->getScriptUrl( $url, $vue ),
41
+ [],
42
+ aioseo()->version,
43
+ true
44
+ );
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Helper method to enqueue stylesheets.
50
+ *
51
+ * @since 4.0.0
52
+ *
53
+ * @param string $style The stylesheet to enqueue.
54
+ * @param string $url The URL of the stylesheet.
55
+ * @param bool $vue Whether or not this is a vue stylesheet.
56
+ * @return void
57
+ */
58
+ public function enqueueStyle( $style, $url, $vue = true ) {
59
+ if ( ! wp_style_is( $style, 'enqueued' ) && $this->shouldEnqueue( $url ) ) {
60
+ wp_enqueue_style(
61
+ $style,
62
+ $this->getScriptUrl( $url, $vue ),
63
+ [],
64
+ aioseo()->version
65
+ );
66
+ }
67
+ }
68
+
69
+ /** Whether or not we should enqueue a file.
70
+ *
71
+ * @since 4.0.0
72
+ *
73
+ * @param string $url The url to check against.
74
+ * @return bool Whether or not we should enqueue.
75
+ */
76
+ private function shouldEnqueue( $url ) {
77
+ $version = strtoupper( aioseo()->versionPath );
78
+ $host = defined( 'AIOSEO_DEV_' . $version ) ? constant( 'AIOSEO_DEV_' . $version ) : false;
79
+
80
+ if ( ! $host ) {
81
+ return true;
82
+ }
83
+
84
+ if ( false !== strpos( $url, 'chunk-common.css' ) ) {
85
+ // return false;
86
+ }
87
+
88
+ return true;
89
+ }
90
+
91
+ /**
92
+ * Retrieve the proper URL for this script or style.
93
+ *
94
+ * @since 4.0.0
95
+ *
96
+ * @param string $url The url.
97
+ * @param bool $vue Whether or not this is a vue script.
98
+ * @return string The modified url.
99
+ */
100
+ public function getScriptUrl( $url, $vue = true ) {
101
+ $version = strtoupper( aioseo()->versionPath );
102
+ $host = $vue && defined( 'AIOSEO_DEV_' . $version ) ? constant( 'AIOSEO_DEV_' . $version ) : false;
103
+ $localUrl = $url;
104
+ $url = plugins_url( 'dist/' . aioseo()->versionPath . '/assets/' . $url, AIOSEO_FILE );
105
+
106
+ if ( ! $host ) {
107
+ return $url;
108
+ }
109
+
110
+ if ( $host && ! self::$connection ) {
111
+ $splitHost = explode( ':', str_replace( '/', '', str_replace( 'http://', '', str_replace( 'https://', '', $host ) ) ) );
112
+ self::$connection = @fsockopen( $splitHost[0], $splitHost[1] ); // phpcs:ignore WordPress
113
+ }
114
+
115
+ if ( ! self::$connection ) {
116
+ return $url;
117
+ }
118
+
119
+ return $host . $localUrl;
120
+ }
121
+
122
+ /**
123
+ * Returns user roles in the current WP install.
124
+ *
125
+ * @since 4.0.0
126
+ *
127
+ * @return array An array of user roles.
128
+ */
129
+ public function getUserRoles() {
130
+ global $wp_roles;
131
+ if ( ! isset( $wp_roles ) ) {
132
+ $wp_roles = new \WP_Roles();
133
+ }
134
+ $roleNames = $wp_roles->get_names();
135
+ asort( $roleNames );
136
+
137
+ return $roleNames;
138
+ }
139
+
140
+ /**
141
+ * Returns the custom roles in the current WP install.
142
+ *
143
+ * @since 4.1.3
144
+ *
145
+ * @return array An array of custom roles.
146
+ */
147
+ public function getCustomRoles() {
148
+ $allRoles = $this->getUserRoles();
149
+
150
+ $toSkip = array_merge(
151
+ // Default WordPress roles.
152
+ [ 'superadmin', 'administrator', 'editor', 'author', 'contributor' ],
153
+ // Default AIOSEO roles.
154
+ [ 'aioseo_manager', 'aioseo_editor' ],
155
+ // Filterable roles.
156
+ apply_filters( 'aioseo_access_control_excluded_roles', array_merge( [
157
+ 'subscriber'
158
+ ], aioseo()->helpers->isWooCommerceActive() ? [ 'customer' ] : [] ) )
159
+ );
160
+
161
+ // Remove empty entries.
162
+ $toSkip = array_filter( $toSkip );
163
+
164
+ $customRoles = [];
165
+ foreach ( $allRoles as $roleName => $role ) {
166
+ // Skip specific roles.
167
+ if ( in_array( $roleName, $toSkip, true ) ) {
168
+ continue;
169
+ }
170
+
171
+ $customRoles[ $roleName ] = $role;
172
+ }
173
+
174
+ return $customRoles;
175
+ }
176
+
177
+ /**
178
+ * Returns an array of plugins with the active status.
179
+ *
180
+ * @since 4.0.0
181
+ *
182
+ * @return array An array of plugins with active status.
183
+ */
184
+ public function getPluginData() {
185
+ $pluginUpgrader = new Utils\PluginUpgraderSilentAjax();
186
+ $installedPlugins = array_keys( get_plugins() );
187
+
188
+ $plugins = [];
189
+ foreach ( $pluginUpgrader->pluginSlugs as $key => $slug ) {
190
+ $plugins[ $key ] = [
191
+ 'basename' => $slug,
192
+ 'installed' => in_array( $slug, $installedPlugins, true ),
193
+ 'activated' => is_plugin_active( $slug ),
194
+ 'adminUrl' => admin_url( $pluginUpgrader->pluginAdminUrls[ $key ] ),
195
+ 'canInstall' => aioseo()->addons->canInstall(),
196
+ 'canActivate' => aioseo()->addons->canActivate(),
197
+ 'wpLink' => ! empty( $pluginUpgrader->wpPluginLinks[ $key ] ) ? $pluginUpgrader->wpPluginLinks[ $key ] : null
198
+ ];
199
+ }
200
+
201
+ return $plugins;
202
+ }
203
+
204
+ /**
205
+ * Retrieve a list of public post types with slugs/icons.
206
+ *
207
+ * @since 4.0.0
208
+ *
209
+ * @param boolean $namesOnly Whether only the names should be returned.
210
+ * @param boolean $hasArchivesOnly Whether or not to only include post types which have archives.
211
+ * @param boolean $rewriteType Whether or not to rewrite the type slugs.
212
+ * @return array An array of public post types.
213
+ */
214
+ public function getPublicPostTypes( $namesOnly = false, $hasArchivesOnly = false, $rewriteType = false ) {
215
+ $postTypes = [];
216
+ $postObjects = get_post_types( [ 'public' => true ], 'objects' );
217
+ $woocommerce = class_exists( 'woocommerce' );
218
+ foreach ( $postObjects as $postObject ) {
219
+ if ( empty( $postObject->label ) ) {
220
+ continue;
221
+ }
222
+
223
+ // We don't want to include archives for the WooCommerce shop page.
224
+ if (
225
+ $hasArchivesOnly &&
226
+ (
227
+ ! $postObject->has_archive ||
228
+ ( 'product' === $postObject->name && $woocommerce )
229
+ )
230
+ ) {
231
+ continue;
232
+ }
233
+
234
+ if ( $namesOnly ) {
235
+ $postTypes[] = $postObject->name;
236
+ continue;
237
+ }
238
+
239
+ if ( 'attachment' === $postObject->name ) {
240
+ $postObject->label = __( 'Attachments', 'all-in-one-seo-pack' );
241
+ }
242
+
243
+ if ( 'product' === $postObject->name && $woocommerce ) {
244
+ $postObject->menu_icon = 'dashicons-products';
245
+ }
246
+
247
+ $name = $postObject->name;
248
+ if ( 'type' === $postObject->name && $rewriteType ) {
249
+ $name = '_aioseo_type';
250
+ }
251
+
252
+ $postTypes[] = [
253
+ 'name' => $name,
254
+ 'label' => ucwords( $postObject->label ),
255
+ 'singular' => ucwords( $postObject->labels->singular_name ),
256
+ 'icon' => $postObject->menu_icon,
257
+ 'hasExcerpt' => post_type_supports( $postObject->name, 'excerpt' ),
258
+ 'hasArchive' => $postObject->has_archive,
259
+ 'hierarchical' => $postObject->hierarchical,
260
+ 'taxonomies' => get_object_taxonomies( $name ),
261
+ 'slug' => isset( $postObject->rewrite['slug'] ) ? $postObject->rewrite['slug'] : $name
262
+ ];
263
+ }
264
+
265
+ return $postTypes;
266
+ }
267
+
268
+ /**
269
+ * Retrieve a list of public taxonomies with slugs/icons.
270
+ *
271
+ * @since 4.0.0
272
+ *
273
+ * @param boolean $namesOnly Whether only the names should be returned.
274
+ * @param boolean $rewriteType Whether or not to rewrite the type slugs.
275
+ * @return array An array of public taxonomies.
276
+ */
277
+ public function getPublicTaxonomies( $namesOnly = false, $rewriteType = false ) {
278
+ $taxonomies = [];
279
+ if ( count( $taxonomies ) ) {
280
+ return $taxonomies;
281
+ }
282
+
283
+ $taxObjects = get_taxonomies( [ 'public' => true ], 'objects' );
284
+ foreach ( $taxObjects as $taxObject ) {
285
+ if ( empty( $taxObject->label ) ) {
286
+ continue;
287
+ }
288
+
289
+ if ( in_array( $taxObject->name, [
290
+ 'product_shipping_class',
291
+ 'post_format'
292
+ ], true ) ) {
293
+ continue;
294
+ }
295
+
296
+ // We need to exclude product attributes from this list as well.
297
+ if (
298
+ 'pa_' === substr( $taxObject->name, 0, 3 ) &&
299
+ 'manage_product_terms' === $taxObject->cap->manage_terms &&
300
+ ! apply_filters( 'aioseo_woocommerce_product_attributes', false )
301
+ ) {
302
+ continue;
303
+ }
304
+
305
+ if ( $namesOnly ) {
306
+ $taxonomies[] = $taxObject->name;
307
+ continue;
308
+ }
309
+
310
+ $name = $taxObject->name;
311
+ if ( 'type' === $taxObject->name && $rewriteType ) {
312
+ $name = '_aioseo_type';
313
+ }
314
+
315
+ $taxonomies[] = [
316
+ 'name' => $name,
317
+ 'label' => ucwords( $taxObject->label ),
318
+ 'singular' => ucwords( $taxObject->labels->singular_name ),
319
+ 'icon' => strpos( $taxObject->label, 'categor' ) !== false ? 'dashicons-category' : 'dashicons-tag',
320
+ 'hierarchical' => $taxObject->hierarchical,
321
+ 'slug' => isset( $taxObject->rewrite['slug'] ) ? $taxObject->rewrite['slug'] : ''
322
+ ];
323
+ }
324
+
325
+ return $taxonomies;
326
+ }
327
+
328
+ /**
329
+ * Retrieve a list of users that match passed in roles.
330
+ *
331
+ * @since 4.0.0
332
+ *
333
+ * @return array An array of user data.
334
+ */
335
+ public function getSiteUsers( $roles ) {
336
+ static $users = [];
337
+
338
+ if ( ! empty( $users ) ) {
339
+ return $users;
340
+ }
341
+
342
+ $rolesWhere = [];
343
+ foreach ( $roles as $role ) {
344
+ $rolesWhere[] = '(um.meta_key = \'' . aioseo()->db->db->prefix . 'capabilities\' AND um.meta_value LIKE \'%\"' . $role . '\"%\')';
345
+ }
346
+ $dbUsers = aioseo()->db->start( 'users as u' )
347
+ ->select( 'u.ID, u.display_name, u.user_nicename, u.user_email' )
348
+ ->join( 'usermeta as um', 'u.ID = um.user_id' )
349
+ ->whereRaw( '(' . implode( ' OR ', $rolesWhere ) . ')' )
350
+ ->orderBy( 'u.user_nicename' )
351
+ ->run()
352
+ ->result();
353
+
354
+ foreach ( $dbUsers as $dbUser ) {
355
+ $users[] = [
356
+ 'id' => intval( $dbUser->ID ),
357
+ 'displayName' => $dbUser->display_name,
358
+ 'niceName' => $dbUser->user_nicename,
359
+ 'email' => $dbUser->user_email,
360
+ 'gravatar' => get_avatar_url( $dbUser->user_email )
361
+ ];
362
+ }
363
+
364
+ return $users;
365
+ }
366
+
367
+ /**
368
+ * Returns the ID of the site logo if it exists.
369
+ *
370
+ * @since 4.0.0
371
+ *
372
+ * @return int
373
+ */
374
+ public function getSiteLogoId() {
375
+ if ( ! get_theme_support( 'custom-logo' ) ) {
376
+ return false;
377
+ }
378
+ return get_theme_mod( 'custom_logo' );
379
+ }
380
+
381
+ /**
382
+ * Returns the URL of the site logo if it exists.
383
+ *
384
+ * @since 4.0.0
385
+ *
386
+ * @return string
387
+ */
388
+ public function getSiteLogoUrl() {
389
+ $id = $this->getSiteLogoId();
390
+ if ( ! $id ) {
391
+ return false;
392
+ }
393
+
394
+ $image = wp_get_attachment_image_src( $id, 'full' );
395
+ if ( empty( $image ) ) {
396
+ return false;
397
+ }
398
+ return $image[0];
399
+ }
400
+
401
+ /**
402
+ * Returns the filesystem object if we have access to it.
403
+ *
404
+ * @since 4.0.0
405
+ *
406
+ * @param array $args The connection args.
407
+ * @return WP_Filesystem The filesystem object.
408
+ */
409
+ public function wpfs( $args = [] ) {
410
+ require_once( ABSPATH . 'wp-admin/includes/file.php' );
411
+ WP_Filesystem( $args );
412
+
413
+ global $wp_filesystem;
414
+ if ( is_object( $wp_filesystem ) ) {
415
+ return $wp_filesystem;
416
+ }
417
+ return false;
418
+ }
419
+
420
+ /**
421
+ * Returns noindexed post types.
422
+ *
423
+ * @since 4.0.0
424
+ *
425
+ * @return array A list of noindexed post types.
426
+ */
427
+ public function getNoindexedPostTypes() {
428
+ return $this->getNoindexedObjects( 'postTypes' );
429
+ }
430
+
431
+ /**
432
+ * Checks whether a given post type is noindexed.
433
+ *
434
+ * @since 4.0.0
435
+ *
436
+ * @param string $postType The post type.
437
+ * @return bool Whether the post type is noindexed.
438
+ */
439
+ public function isPostTypeNoindexed( $postType ) {
440
+ $noindexedPostTypes = $this->getNoindexedPostTypes();
441
+ return in_array( $postType, $noindexedPostTypes, true );
442
+ }
443
+
444
+ /**
445
+ * Returns noindexed taxonomies.
446
+ *
447
+ * @since 4.0.0
448
+ *
449
+ * @return array A list of noindexed taxonomies.
450
+ */
451
+ public function getNoindexedTaxonomies() {
452
+ return $this->getNoindexedObjects( 'taxonomies' );
453
+ }
454
+
455
+ /**
456
+ * Checks whether a given post type is noindexed.
457
+ *
458
+ * @since 4.0.0
459
+ *
460
+ * @param string $taxonomy The taxonomy.
461
+ * @return bool Whether the taxonomy is noindexed.
462
+ */
463
+ public function isTaxonomyNoindexed( $taxonomy ) {
464
+ $noindexedTaxonomies = $this->getNoindexedTaxonomies();
465
+ return in_array( $taxonomy, $noindexedTaxonomies, true );
466
+ }
467
+
468
+ /**
469
+ * Returns noindexed object types of a given parent type.
470
+ *
471
+ * @since 4.0.0
472
+ *
473
+ * @param string $type The parent object type ("postTypes" or "taxonomies").
474
+ * @return array A list of noindexed objects types.
475
+ */
476
+ private function getNoindexedObjects( $type ) {
477
+ $noindexed = [];
478
+ foreach ( aioseo()->dynamicOptions->searchAppearance->$type->all() as $name => $object ) {
479
+ if (
480
+ ! $object['show'] ||
481
+ ( $object['advanced']['robotsMeta'] && ! $object['advanced']['robotsMeta']['default'] && $object['advanced']['robotsMeta']['noindex'] )
482
+ ) {
483
+ $noindexed[] = $name;
484
+ }
485
+ }
486
+ return $noindexed;
487
+ }
488
+
489
+ /**
490
+ * Returns all categories for a post.
491
+ *
492
+ * @since 4.1.4
493
+ *
494
+ * @param int $postId The post ID.
495
+ * @return array $names The category names.
496
+ */
497
+ public function getAllCategories( $postId = 0 ) {
498
+ $names = [];
499
+ $categories = get_the_category( $postId );
500
+ if ( $categories && count( $categories ) ) {
501
+ foreach ( $categories as $category ) {
502
+ $names[] = aioseo()->helpers->internationalize( $category->cat_name );
503
+ }
504
+ }
505
+ return $names;
506
+ }
507
+
508
+ /**
509
+ * Returns all tags for a post.
510
+ *
511
+ * @since 4.1.4
512
+ *
513
+ * @param int $postId The post ID.
514
+ * @return array $names The tag names.
515
+ */
516
+ public function getAllTags( $postId = 0 ) {
517
+ $names = [];
518
+
519
+ $tags = get_the_tags( $postId );
520
+ if ( ! empty( $tags ) && ! is_wp_error( $tags ) ) {
521
+ foreach ( $tags as $tag ) {
522
+ if ( ! empty( $tag->name ) ) {
523
+ $names[] = aioseo()->helpers->internationalize( $tag->name );
524
+ }
525
+ }
526
+ }
527
+ return $names;
528
+ }
529
+
530
+ /**
531
+ * Loads the translations for a given domain.
532
+ *
533
+ * @since 4.1.4
534
+ *
535
+ * @return void
536
+ */
537
+ public function loadTextDomain( $domain ) {
538
+ if ( ! is_user_logged_in() ) {
539
+ return;
540
+ }
541
+
542
+ // Unload the domain in case WordPress has enqueued the translations for the site language instead of profile language.
543
+ // Reloading the text domain will otherwise not override the existing loaded translations.
544
+ unload_textdomain( $domain );
545
+
546
+ $mofile = $domain . '-' . get_user_locale() . '.mo';
547
+ load_textdomain( $domain, WP_LANG_DIR . '/plugins/' . $mofile );
548
+ }
549
+ }
app/Common/Traits/Helpers/WpContext.php ADDED
@@ -0,0 +1,489 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\Traits\Helpers;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ /**
10
+ * Contains all context related helper methods.
11
+ * This includes methods to check the context of the current request, but also get WP objects.
12
+ *
13
+ * @since 4.1.4
14
+ */
15
+ trait WpContext {
16
+ /**
17
+ * Get the home page object.
18
+ *
19
+ * @since 4.1.1
20
+ *
21
+ * @return WP_Post|null The home page.
22
+ */
23
+ public function getHomePage() {
24
+ $homePageId = $this->getHomePageId();
25
+
26
+ return $homePageId ? get_post( $homePageId ) : null;
27
+ }
28
+
29
+ /**
30
+ * Get the ID of the home page.
31
+ *
32
+ * @since 4.0.0
33
+ *
34
+ * @return integer|null The home page ID.
35
+ */
36
+ public function getHomePageId() {
37
+ $pageShowOnFront = ( 'page' === get_option( 'show_on_front' ) );
38
+ $pageOnFrontId = get_option( 'page_on_front' );
39
+
40
+ return $pageShowOnFront && $pageOnFrontId ? (int) $pageOnFrontId : null;
41
+ }
42
+
43
+ /**
44
+ * Returns the blog page.
45
+ *
46
+ * @since 4.0.0
47
+ *
48
+ * @return WP_Post|null The blog page.
49
+ */
50
+ public function getBlogPage() {
51
+ $blogPageId = $this->getBlogPageId();
52
+
53
+ return $blogPageId ? get_post( $blogPageId ) : null;
54
+ }
55
+
56
+ /**
57
+ * Gets the current blog page id if it's configured.
58
+ *
59
+ * @since 4.1.1
60
+ *
61
+ * @return int|null
62
+ */
63
+ public function getBlogPageId() {
64
+ $pageShowOnFront = ( 'page' === get_option( 'show_on_front' ) );
65
+ $blogPageId = (int) get_option( 'page_for_posts' );
66
+
67
+ return $pageShowOnFront && $blogPageId ? $blogPageId : null;
68
+ }
69
+
70
+ /**
71
+ * Checks whether the current page is a taxonomy term archive.
72
+ *
73
+ * @since 4.0.0
74
+ *
75
+ * @return boolean Whether the current page is a taxonomy term archive.
76
+ */
77
+ public function isTaxTerm() {
78
+ $object = get_queried_object();
79
+ return $object instanceof \WP_Term;
80
+ }
81
+
82
+ /**
83
+ * Checks whether the current page is a static one.
84
+ *
85
+ * @since 4.0.0
86
+ *
87
+ * @return boolean Whether the current page is a static one.
88
+ */
89
+ public function isStaticPage() {
90
+ return $this->isStaticHomePage() || $this->isStaticPostsPage() || $this->isWooCommerceShopPage();
91
+ }
92
+
93
+ /**
94
+ * Checks whether the current page is the static homepage.
95
+ *
96
+ * @since 4.0.0
97
+ *
98
+ * @param mixed $post Pass in an optional post to check if its the static home page.
99
+ * @return boolean Whether the current page is the static homepage.
100
+ */
101
+ public function isStaticHomePage( $post = null ) {
102
+ static $isHomePage = null;
103
+ if ( null !== $isHomePage ) {
104
+ return $isHomePage;
105
+ }
106
+
107
+ $post = aioseo()->helpers->getPost( $post );
108
+ return ( 'page' === get_option( 'show_on_front' ) && ! empty( $post->ID ) && (int) get_option( 'page_on_front' ) === $post->ID );
109
+ }
110
+
111
+ /**
112
+ * Checks whether the current page is the static posts page.
113
+ *
114
+ * @since 4.0.0
115
+ *
116
+ * @return boolean Whether the current page is the static posts page.
117
+ */
118
+ public function isStaticPostsPage() {
119
+ return is_home() && ( 0 !== (int) get_option( 'page_for_posts' ) );
120
+ }
121
+
122
+ /**
123
+ * Checks whether current page supports meta.
124
+ *
125
+ * @since 4.0.0
126
+ *
127
+ * @return boolean Whether the current page supports meta.
128
+ */
129
+ public function supportsMeta() {
130
+ return ! is_date() && ! is_author() && ! is_search() && ! is_404();
131
+ }
132
+
133
+ /**
134
+ * Returns the network ID.
135
+ *
136
+ * @since 4.0.0
137
+ *
138
+ * @return int The integer of the blog/site id.
139
+ */
140
+ public function getNetworkId() {
141
+ if ( is_multisite() ) {
142
+ return get_network()->site_id;
143
+ }
144
+ return get_current_blog_id();
145
+ }
146
+
147
+ /**
148
+ * Returns the current post object.
149
+ *
150
+ * @since 4.0.0
151
+ *
152
+ * @param int $postId The post ID.
153
+ * @return WP_Post The post object.
154
+ */
155
+ public function getPost( $postId = false ) {
156
+ static $showOnFront = null;
157
+ static $pageOnFront = null;
158
+ static $pageForPosts = null;
159
+
160
+ $postId = is_a( $postId, 'WP_Post' ) ? $postId->ID : $postId;
161
+
162
+ if ( aioseo()->helpers->isWooCommerceShopPage( $postId ) ) {
163
+ return get_post( wc_get_page_id( 'shop' ) );
164
+ }
165
+
166
+ if ( is_front_page() || is_home() ) {
167
+ $showOnFront = $showOnFront ? $showOnFront : 'page' === get_option( 'show_on_front' );
168
+ if ( $showOnFront ) {
169
+ if ( is_front_page() ) {
170
+ $pageOnFront = $pageOnFront ? $pageOnFront : (int) get_option( 'page_on_front' );
171
+ return get_post( $pageOnFront );
172
+ } elseif ( is_home() ) {
173
+ $pageForPosts = $pageForPosts ? $pageForPosts : (int) get_option( 'page_for_posts' );
174
+ return get_post( $pageForPosts );
175
+ }
176
+ }
177
+
178
+ return get_post();
179
+ }
180
+
181
+ if (
182
+ $this->isScreenBase( 'post' ) ||
183
+ $postId ||
184
+ is_singular()
185
+ ) {
186
+ return get_post( $postId );
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Returns the page content.
192
+ *
193
+ * @since 4.0.0
194
+ *
195
+ * @param WP_Post|int $post The post.
196
+ * @return string The content.
197
+ */
198
+ public function getContent( $post = null ) {
199
+ $post = ( $post && is_object( $post ) ) ? $post : $post = $this->getPost( $post );
200
+
201
+ static $content = [];
202
+ if ( isset( $content[ $post->ID ] ) ) {
203
+ return $content[ $post->ID ];
204
+ }
205
+
206
+ if ( empty( $post->post_content ) ) {
207
+ return $post->post_content;
208
+ }
209
+
210
+ $postContent = $post->post_content;
211
+ if (
212
+ ! in_array( 'runShortcodesInDescription', aioseo()->internalOptions->deprecatedOptions, true ) ||
213
+ aioseo()->options->deprecated->searchAppearance->advanced->runShortcodesInDescription
214
+ ) {
215
+ $postContent = $this->doShortcodes( $postContent );
216
+ }
217
+
218
+ $postContent = wp_trim_words( $postContent, 55, apply_filters( 'excerpt_more', ' ' . '[&hellip;]' ) );
219
+ $postContent = str_replace( ']]>', ']]&gt;', $postContent );
220
+ $postContent = preg_replace( '#(<figure.*\/figure>|<img.*\/>)#', '', $postContent );
221
+ $content[ $post->ID ] = trim( wp_strip_all_tags( strip_shortcodes( $postContent ) ) );
222
+ return $content[ $post->ID ];
223
+ }
224
+
225
+ /**
226
+ * Returns custom fields as a string.
227
+ *
228
+ * @since 4.0.6
229
+ *
230
+ * @param WP_Post|int $post The post.
231
+ * @param array $keys The post meta_keys to check for values.
232
+ * @return string The custom field content.
233
+ */
234
+ public function getCustomFieldsContent( $post = null, $keys = [] ) {
235
+ $post = ( $post && is_object( $post ) ) ? $post : $this->getPost( $post );
236
+
237
+ $customFieldContent = '';
238
+
239
+ $acfFields = $this->getAcfContent( $post );
240
+ $acfFieldsKeys = [];
241
+
242
+ if ( ! empty( $acfFields ) ) {
243
+ foreach ( $acfFields as $acfField => $acfValue ) {
244
+ if ( in_array( $acfField, $keys, true ) ) {
245
+ $customFieldContent .= "{$acfValue} ";
246
+ $acfFieldsKeys[] = $acfField;
247
+ }
248
+ }
249
+ }
250
+
251
+ foreach ( $keys as $key ) {
252
+ if ( in_array( $key, $acfFieldsKeys, true ) ) {
253
+ continue;
254
+ }
255
+
256
+ $value = get_post_meta( $post->ID, $key, true );
257
+
258
+ if ( $value ) {
259
+ $customFieldContent .= "{$value} ";
260
+ }
261
+ }
262
+
263
+ return $customFieldContent;
264
+ }
265
+
266
+ /**
267
+ * Returns if the page is a special type (WooCommerce pages, Privacy page).
268
+ *
269
+ * @since 4.0.0
270
+ *
271
+ * @param int $postId The post ID.
272
+ * @return boolean If the page is special or not.
273
+ */
274
+ public function isSpecialPage( $postId = false ) {
275
+ if (
276
+ (int) get_option( 'page_for_posts' ) === (int) $postId ||
277
+ (int) get_option( 'wp_page_for_privacy_policy' ) === (int) $postId ||
278
+ $this->isBuddyPressPage( $postId ) ||
279
+ $this->isWooCommercePage( $postId )
280
+ ) {
281
+ return true;
282
+ }
283
+
284
+ return false;
285
+ }
286
+
287
+ /**
288
+ * Returns the page number of the current page.
289
+ *
290
+ * @since 4.0.0
291
+ *
292
+ * @return int The page number.
293
+ */
294
+ public function getPageNumber() {
295
+ $page = get_query_var( 'page' );
296
+ $paged = get_query_var( 'paged' );
297
+ return ! empty( $page )
298
+ ? $page
299
+ : (
300
+ ! empty( $paged )
301
+ ? $paged
302
+ : 1
303
+ );
304
+ }
305
+
306
+ /**
307
+ * Check if the post passed in is a valid post, not a revision or autosave.
308
+ *
309
+ * @since 4.0.5
310
+ *
311
+ * @param WP_Post $post The Post object to check.
312
+ * @return bool True if valid, false if not.
313
+ */
314
+ public function isValidPost( $post ) {
315
+ if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
316
+ return false;
317
+ }
318
+
319
+ if ( ! is_object( $post ) ) {
320
+ $post = get_post( $post );
321
+ }
322
+
323
+ // In order to prevent recursion, we are skipping scheduled-action posts.
324
+ if (
325
+ empty( $post ) ||
326
+ 'scheduled-action' === $post->post_type ||
327
+ 'revision' === $post->post_type ||
328
+ 'publish' !== $post->post_status
329
+ ) {
330
+ return false;
331
+ }
332
+
333
+ return true;
334
+ }
335
+
336
+ /**
337
+ * Checks whether the given URL is a valid attachment.
338
+ *
339
+ * @since 4.0.13
340
+ *
341
+ * @param string $url The URL.
342
+ * @return boolean Whether the URL is a valid attachment.
343
+ */
344
+ public function isValidAttachment( $url ) {
345
+ $uploadDirUrl = aioseo()->helpers->escapeRegex( $this->getWpContentUrl() );
346
+ return preg_match( "/$uploadDirUrl.*/", $url );
347
+ }
348
+
349
+ /**
350
+ * Tries to convert an attachment URL into a post ID.
351
+ *
352
+ * This our own optimized version of attachment_url_to_postid().
353
+ *
354
+ * @since 4.0.13
355
+ *
356
+ * @param string $url The attachment URL.
357
+ * @return int|boolean The attachment ID or false if no attachment could be found.
358
+ */
359
+ public function attachmentUrlToPostId( $url ) {
360
+ $cacheName = "aioseo_attachment_url_to_post_id_$url";
361
+
362
+ $cachedId = wp_cache_get( $cacheName, 'aioseo' );
363
+ if ( $cachedId ) {
364
+ return 'none' !== $cachedId && is_numeric( $cachedId ) ? (int) $cachedId : false;
365
+ }
366
+
367
+ $path = $url;
368
+ $uploadDirInfo = wp_get_upload_dir();
369
+
370
+ $siteUrl = wp_parse_url( $uploadDirInfo['url'] );
371
+ $imagePath = wp_parse_url( $path );
372
+
373
+ // Force the protocols to match if needed.
374
+ if ( isset( $imagePath['scheme'] ) && ( $imagePath['scheme'] !== $siteUrl['scheme'] ) ) {
375
+ $path = str_replace( $imagePath['scheme'], $siteUrl['scheme'], $path );
376
+ }
377
+
378
+ if ( ! $this->isValidAttachment( $path ) ) {
379
+ wp_cache_set( $cacheName, 'none', 'aioseo', DAY_IN_SECONDS );
380
+ return false;
381
+ }
382
+
383
+ if ( 0 === strpos( $path, $uploadDirInfo['baseurl'] . '/' ) ) {
384
+ $path = substr( $path, strlen( $uploadDirInfo['baseurl'] . '/' ) );
385
+ }
386
+
387
+ $results = aioseo()->db->start( 'postmeta' )
388
+ ->select( 'post_id' )
389
+ ->where( 'meta_key', '_wp_attached_file' )
390
+ ->where( 'meta_value', $path )
391
+ ->limit( 1 )
392
+ ->run()
393
+ ->result();
394
+
395
+ if ( empty( $results[0]->post_id ) ) {
396
+ wp_cache_set( $cacheName, 'none', 'aioseo', DAY_IN_SECONDS );
397
+ return false;
398
+ }
399
+
400
+ wp_cache_set( $cacheName, $results[0]->post_id, 'aioseo', DAY_IN_SECONDS );
401
+ return $results[0]->post_id;
402
+ }
403
+
404
+ /**
405
+ * Returns true if the request is a non-legacy REST API request.
406
+ * This function was copied from WooCommerce and improved.
407
+ *
408
+ * @since 4.1.2
409
+ *
410
+ * @return bool True if this is a REST API request.
411
+ */
412
+ public function isRestApiRequest() {
413
+ global $wp_rewrite;
414
+
415
+ if ( empty( $wp_rewrite ) ) {
416
+ return false;
417
+ }
418
+
419
+ if ( empty( $_SERVER['REQUEST_URI'] ) ) {
420
+ return false;
421
+ }
422
+
423
+ $restUrl = wp_parse_url( get_rest_url() );
424
+ $restUrl = $restUrl['path'] . ( ! empty( $restUrl['query'] ) ? '?' . $restUrl['query'] : '' );
425
+
426
+ $isRestApiRequest = ( 0 === strpos( $_SERVER['REQUEST_URI'], $restUrl ) );
427
+
428
+ return apply_filters( 'aioseo_is_rest_api_request', $isRestApiRequest );
429
+ }
430
+
431
+ /**
432
+ * Checks whether the current request is an AJAX, CRON or REST request.
433
+ *
434
+ * @since 4.1.3
435
+ *
436
+ * @return bool Wether the request is an AJAX, CRON or REST request.
437
+ */
438
+ public function isAjaxCronRest() {
439
+ return wp_doing_ajax() || wp_doing_cron() || $this->isRestApiRequest();
440
+ }
441
+
442
+ /**
443
+ * Checks whether we're on the given screen.
444
+ *
445
+ * @since 4.0.7
446
+ *
447
+ * @param string $screenName The screen name.
448
+ * @return boolean Whether we're on the given screen.
449
+ */
450
+ public function isScreenBase( $screenName ) {
451
+ $screen = $this->getCurrentScreen();
452
+ if ( ! $screen || ! isset( $screen->base ) ) {
453
+ return false;
454
+ }
455
+ return $screen->base === $screenName;
456
+ }
457
+
458
+ /**
459
+ * Returns if current screen is of a post type
460
+ *
461
+ * @since 4.0.17
462
+ *
463
+ * @param string $postType Post type slug
464
+ *
465
+ * @return bool
466
+ */
467
+ public function isScreenPostType( $postType ) {
468
+ $screen = $this->getCurrentScreen();
469
+ if ( ! $screen || ! isset( $screen->post_type ) ) {
470
+ return false;
471
+ }
472
+ return $screen->post_type === $postType;
473
+ }
474
+
475
+ /**
476
+ * Gets current admin screen
477
+ *
478
+ * @since 4.0.17
479
+ *
480
+ * @return false|\WP_Screen|null
481
+ */
482
+ public function getCurrentScreen() {
483
+ if ( ! is_admin() || ! function_exists( 'get_current_screen' ) ) {
484
+ return false;
485
+ }
486
+
487
+ return get_current_screen();
488
+ }
489
+ }
app/Common/Traits/Helpers/WpUri.php ADDED
@@ -0,0 +1,306 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Common\Traits\Helpers;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ /**
10
+ * Contains all WordPress related URL, URI, path, slug, etc. related helper methods.
11
+ *
12
+ * @since 4.1.4
13
+ */
14
+ trait WpUri {
15
+ /**
16
+ * Returns the site domain.
17
+ *
18
+ * @since 4.0.0
19
+ *
20
+ * @return string The site's domain.
21
+ */
22
+ public function getSiteDomain() {
23
+ return wp_parse_url( home_url(), PHP_URL_HOST );
24
+ }
25
+
26
+ /**
27
+ * Returns the site URL.
28
+ * NOTE: For multisites inside a sub-directory, this returns the URL for the main site.
29
+ * This is intentional.
30
+ *
31
+ * @since 4.0.0
32
+ *
33
+ * @return string The site's domain.
34
+ */
35
+ public function getSiteUrl() {
36
+ return wp_parse_url( home_url(), PHP_URL_SCHEME ) . '://' . wp_parse_url( home_url(), PHP_URL_HOST );
37
+ }
38
+
39
+ /**
40
+ * Returns the current URL.
41
+ *
42
+ * @since 4.0.0
43
+ *
44
+ * @param boolean $canonical Whether or not to get the canonical URL.
45
+ * @return string The URL.
46
+ */
47
+ public function getUrl( $canonical = false ) {
48
+ if ( is_singular() ) {
49
+ $object = get_queried_object_id();
50
+ return $canonical ? wp_get_canonical_url( $object ) : get_permalink( $object );
51
+ }
52
+
53
+ global $wp;
54
+ return trailingslashit( home_url( $wp->request ) );
55
+ }
56
+
57
+ /**
58
+ * Gets the canonical URL for the current page/post.
59
+ *
60
+ * @since 4.0.0
61
+ *
62
+ * @return string $url The canonical URL.
63
+ */
64
+ public function canonicalUrl() {
65
+ static $canonicalUrl = '';
66
+ if ( $canonicalUrl ) {
67
+ return $canonicalUrl;
68
+ }
69
+
70
+ $metaData = [];
71
+ $post = $this->getPost();
72
+ if ( $post ) {
73
+ $metaData = aioseo()->meta->metaData->getMetaData( $post );
74
+ }
75
+
76
+ if ( is_category() || is_tag() || is_tax() ) {
77
+ $metaData = aioseo()->meta->metaData->getMetaData( get_queried_object() );
78
+ }
79
+
80
+ if ( $metaData && ! empty( $metaData->canonical_url ) ) {
81
+ return $metaData->canonical_url;
82
+ }
83
+
84
+ $url = $this->getUrl( true );
85
+ if ( aioseo()->options->searchAppearance->advanced->noPaginationForCanonical && 1 < $this->getPageNumber() ) {
86
+ $url = preg_replace( '#(\d+\/|(?<=\/)page\/\d+\/)$#', '', $url );
87
+ }
88
+
89
+ $url = $this->maybeRemoveTrailingSlash( $url );
90
+
91
+ // Get rid of /amp at the end of the URL.
92
+ if ( ! apply_filters( 'aioseo_disable_canonical_url_amp', false ) ) {
93
+ $url = preg_replace( '/\/amp$/', '', $url );
94
+ $url = preg_replace( '/\/amp\/$/', '/', $url );
95
+ }
96
+
97
+ $searchTerm = get_query_var( 's' );
98
+ if ( is_search() && ! empty( $searchTerm ) ) {
99
+ $url = add_query_arg( 's', $searchTerm, $url );
100
+ }
101
+
102
+ return apply_filters( 'aioseo_canonical_url', $url );
103
+ }
104
+
105
+ /**
106
+ * Formats a given URl as an absolute URL if it is relative.
107
+ *
108
+ * @since 4.0.0
109
+ *
110
+ * @param string $url The URL.
111
+ * @return string $url The absolute URL.
112
+ */
113
+ public function makeUrlAbsolute( $url ) {
114
+ if ( 0 !== strpos( $url, 'http' ) && '/' !== $url ) {
115
+ if ( 0 === strpos( $url, '//' ) ) {
116
+ $scheme = wp_parse_url( home_url(), PHP_URL_SCHEME );
117
+ $url = $scheme . ':' . $url;
118
+ } else {
119
+ $url = home_url( $url );
120
+ }
121
+ }
122
+ return $url;
123
+ }
124
+
125
+ /**
126
+ * Sanitizes a given domain.
127
+ *
128
+ * @since 4.0.0
129
+ *
130
+ * @param string $domain The domain to sanitize.
131
+ * @return mixed|string The sanitized domain.
132
+ */
133
+ public function sanitizeDomain( $domain ) {
134
+ $domain = trim( $domain );
135
+ $domain = strtolower( $domain );
136
+ if ( 0 === strpos( $domain, 'http://' ) ) {
137
+ $domain = substr( $domain, 7 );
138
+ } elseif ( 0 === strpos( $domain, 'https://' ) ) {
139
+ $domain = substr( $domain, 8 );
140
+ }
141
+ $domain = untrailingslashit( $domain );
142
+
143
+ return $domain;
144
+ }
145
+
146
+ /**
147
+ * Remove trailing slashes if not set in the permalink structure.
148
+ *
149
+ * @since 4.0.0
150
+ *
151
+ * @param string $url The original URL.
152
+ * @return string The adjusted URL.
153
+ */
154
+ public function maybeRemoveTrailingSlash( $url ) {
155
+ $permalinks = get_option( 'permalink_structure' );
156
+ if ( $permalinks && ( ! is_home() || ! is_front_page() ) ) {
157
+ $trailing = substr( $permalinks, -1 );
158
+ if ( '/' !== $trailing ) {
159
+ $url = untrailingslashit( $url );
160
+ }
161
+ }
162
+
163
+ // Don't slash urls with query args.
164
+ if ( false !== strpos( $url, '?' ) ) {
165
+ $url = untrailingslashit( $url );
166
+ }
167
+
168
+ return $url;
169
+ }
170
+
171
+ /**
172
+ * Removes image dimensions from the slug of a URL.
173
+ *
174
+ * @since 4.0.0
175
+ *
176
+ * @param string $url The image URL.
177
+ * @return string The formatted image URL.
178
+ */
179
+ public function removeImageDimensions( $url ) {
180
+ return $this->isValidAttachment( $url ) ? preg_replace( '#(-[0-9]*x[0-9]*)#', '', $url ) : $url;
181
+ }
182
+
183
+ /**
184
+ * Returns the URL for the WP content folder.
185
+ *
186
+ * @since 4.0.5
187
+ *
188
+ * @return string The URL.
189
+ */
190
+ public function getWpContentUrl() {
191
+ $info = wp_get_upload_dir();
192
+ return isset( $info['baseurl'] ) ? $info['baseurl'] : '';
193
+ }
194
+
195
+ /**
196
+ * Checks whether the given path is unique or not.
197
+ *
198
+ * @since 4.1.4
199
+ *
200
+ * @param string $path The path.
201
+ * @return boolean Whether the path exists.
202
+ */
203
+ public function pathExists( $path ) {
204
+ $url = $this->isUrl( $path )
205
+ ? $path
206
+ : trailingslashit( home_url() ) . trim( $path, '/' );
207
+
208
+ $status = wp_remote_retrieve_response_code( wp_remote_get( $url ) );
209
+ if ( ! $status ) {
210
+ // If there is no status code, we might be in a local environment with CURL misconfigured.
211
+ // In that case we can still check if a post exists for the path by quering the DB.
212
+ // TODO: Add support for terms here.
213
+ $post = $this->getPostbyPath( $path, OBJECT, $this->getPublicPostTypes( true ) );
214
+ return is_object( $post );
215
+ }
216
+ return 200 === $status;
217
+ }
218
+
219
+ /**
220
+ * Retrieves a post by its given path.
221
+ * Based on the built-in get_page_by_path() function, but only checks ancestry if the post type is actually hierarchical.
222
+ *
223
+ * @since 4.1.4
224
+ *
225
+ * @param string $path The path.
226
+ * @param string $output The output type. OBJECT, ARRAY_A, or ARRAY_N.
227
+ * @param string|array $postType The post type(s) to check against.
228
+ * @return Object|false The post or false on failure.
229
+ */
230
+ public function getPostByPath( $path, $output = OBJECT, $postType = 'page' ) {
231
+ $lastChanged = wp_cache_get_last_changed( 'aioseo_posts_by_path' );
232
+ $hash = md5( $path . serialize( $postType ) );
233
+ $cacheKey = "get_page_by_path:$hash:$lastChanged";
234
+ $cached = wp_cache_get( $cacheKey, 'aioseo_posts_by_path' );
235
+
236
+ if ( false !== $cached ) {
237
+ // Special case: '0' is a bad `$path`.
238
+ if ( '0' === $cached || 0 === $cached ) {
239
+ return false;
240
+ }
241
+ return get_post( $cached, $output );
242
+ }
243
+
244
+ $path = rawurlencode( urldecode( $path ) );
245
+ $path = str_replace( '%2F', '/', $path );
246
+ $path = str_replace( '%20', ' ', $path );
247
+ $parts = explode( '/', trim( $path, '/' ) );
248
+ $reversedParts = array_reverse( $parts );
249
+ $postNames = "'" . implode( "','", $parts ) . "'";
250
+
251
+ $postTypes = is_array( $postType ) ? $postType : [ $postType, 'attachment' ];
252
+ $postTypes = "'" . implode( "','", $postTypes ) . "'";
253
+
254
+ $posts = aioseo()->db->start( 'posts' )
255
+ ->select( 'ID, post_name, post_parent, post_type' )
256
+ ->whereRaw( "post_name in ( $postNames )" )
257
+ ->whereRaw( "post_type in ( $postTypes )" )
258
+ ->run()
259
+ ->result();
260
+
261
+ $foundId = 0;
262
+ foreach ( $posts as $post ) {
263
+ if ( $post->post_name === $reversedParts[0] ) {
264
+ $count = 0;
265
+ $p = $post;
266
+
267
+ // Loop through the given path parts from right to left, ensuring each matches the post ancestry.
268
+ while ( 0 !== (int) $p->post_parent && isset( $posts[ $p->post_parent ] ) ) {
269
+ $count++;
270
+ $parent = $posts[ $p->post_parent ];
271
+ if ( ! isset( $reversedParts[ $count ] ) || $parent->post_name !== $reversedParts[ $count ] ) {
272
+ break;
273
+ }
274
+ $p = $parent;
275
+ }
276
+
277
+ if (
278
+ 0 === (int) $p->post_parent &&
279
+ ( ! is_post_type_hierarchical( $p->post_type ) || count( $reversedParts ) === $count + 1 ) &&
280
+ $p->post_name === $reversedParts[ $count ]
281
+ ) {
282
+ $foundId = $post->ID;
283
+ if ( $post->post_type === $postType ) {
284
+ break;
285
+ }
286
+ }
287
+ }
288
+ }
289
+
290
+ // We cache misses as well as hits.
291
+ wp_cache_set( $cacheKey, $foundId, 'aioseo_posts_by_path' );
292
+ return $foundId ? get_post( $foundId, $output ) : false;
293
+ }
294
+
295
+ /**
296
+ * Validates a URL.
297
+ *
298
+ * @since 4.1.2
299
+ *
300
+ * @param string $url The url.
301
+ * @return bool Is it a valid/safe url.
302
+ */
303
+ public function isUrl( $url ) {
304
+ return esc_url_raw( $url ) === $url;
305
+ }
306
+ }
app/Common/Traits/Options.php CHANGED
@@ -13,22 +13,31 @@ if ( ! defined( 'ABSPATH' ) ) {
13
  */
14
  trait Options {
15
  /**
16
- * The name to lookup the options with.
17
  *
18
- * @since 4.0.0
 
 
 
 
 
 
 
 
 
19
  *
20
  * @var string
21
  */
22
- public $optionsName = '';
23
 
24
  /**
25
- * The options array.
26
  *
27
  * @since 4.0.0
28
  *
29
- * @var array
30
  */
31
- protected $options = [];
32
 
33
  /**
34
  * Holds the localized options.
@@ -121,7 +130,8 @@ trait Options {
121
  }
122
 
123
  // If we need to set a sub-group, do that now.
124
- $defaults = $this->options[ $this->groupKey ];
 
125
  if ( ! empty( $this->subGroups ) ) {
126
  foreach ( $this->subGroups as $subGroup ) {
127
  $defaults = $defaults[ $subGroup ];
@@ -139,8 +149,8 @@ trait Options {
139
  return $this->setSubGroup( $name );
140
  }
141
 
142
- $value = isset( $this->options[ $this->groupKey ][ $name ]['value'] )
143
- ? $this->options[ $this->groupKey ][ $name ]['value']
144
  : (
145
  ! empty( $this->arguments[0] )
146
  ? $this->arguments[0]
@@ -170,7 +180,8 @@ trait Options {
170
  }
171
 
172
  // If we need to set a sub-group, do that now.
173
- $defaults = $this->options[ $this->groupKey ];
 
174
  if ( ! empty( $this->subGroups ) ) {
175
  foreach ( $this->subGroups as $subGroup ) {
176
  $defaults = $defaults[ $subGroup ];
@@ -252,7 +263,8 @@ trait Options {
252
  }
253
 
254
  // If we need to set a sub-group, do that now.
255
- $defaults = $this->options[ $this->groupKey ];
 
256
  if ( ! empty( $this->subGroups ) ) {
257
  foreach ( $this->subGroups as $subGroup ) {
258
  $defaults = &$defaults[ $subGroup ];
@@ -298,14 +310,15 @@ trait Options {
298
  update_option( $this->optionsName . '_localized', $this->localized );
299
  }
300
 
301
- $originalDefaults = $this->options[ $this->groupKey ];
302
  $pointer = &$originalDefaults;
303
  foreach ( $this->subGroups as $subGroup ) {
304
  $pointer = &$pointer[ $subGroup ];
305
  }
306
  $pointer = $defaults;
307
 
308
- $this->options[ $this->groupKey ] = $originalDefaults;
 
309
 
310
  $this->resetGroups();
311
 
@@ -326,7 +339,8 @@ trait Options {
326
  }
327
 
328
  // If we need to set a sub-group, do that now.
329
- $defaults = $this->options[ $this->groupKey ];
 
330
  if ( ! empty( $this->subGroups ) ) {
331
  foreach ( $this->subGroups as $subGroup ) {
332
  $defaults = &$defaults[ $subGroup ];
@@ -365,7 +379,8 @@ trait Options {
365
  }
366
 
367
  // If we need to set a sub-group, do that now.
368
- $defaults = $this->options[ $this->groupKey ];
 
369
  if ( ! empty( $this->subGroups ) ) {
370
  foreach ( $this->subGroups as $subGroup ) {
371
  $defaults = &$defaults[ $subGroup ];
@@ -388,11 +403,12 @@ trait Options {
388
 
389
  unset( $defaults[ $name ]['value'] );
390
 
391
- $this->options[ $this->groupKey ] = $defaults;
392
-
393
- $this->update();
394
 
395
  $this->resetGroups();
 
 
396
  }
397
 
398
  /**
@@ -405,13 +421,15 @@ trait Options {
405
  * @return array An array of options.
406
  */
407
  public function all( $include = [], $exclude = [] ) {
408
- // Make sure our dynamic options have loaded.
409
- $this->init( true );
410
 
411
- $originalGroupKey = $this->groupKey;
 
412
 
413
  // Refactor options.
414
- $refactored = $this->convertOptionsToValues( $this->options );
 
415
 
416
  $this->groupKey = null;
417
 
@@ -419,13 +437,13 @@ trait Options {
419
  return $this->allFiltered( $refactored, $include, $exclude );
420
  }
421
 
422
- if ( empty( $this->subGroups ) ) {
423
  $all = $refactored[ $originalGroupKey ];
424
  return $this->allFiltered( $all, $include, $exclude );
425
  }
426
 
427
  $returnable = &$refactored[ $originalGroupKey ];
428
- foreach ( $this->subGroups as $subGroup ) {
429
  $returnable = &$returnable[ $subGroup ];
430
  }
431
 
@@ -443,12 +461,17 @@ trait Options {
443
  * @return void
444
  */
445
  public function reset( $include = [], $exclude = [] ) {
 
 
 
446
  // Make sure our dynamic options have loaded.
447
- $this->init( true );
 
 
448
 
449
  // If we don't have a group key set, it means we want to reset everything.
450
- if ( empty( $this->groupKey ) ) {
451
- $groupKeys = array_keys( $this->options );
452
  foreach ( $groupKeys as $groupKey ) {
453
  $this->groupKey = $groupKey;
454
  $this->reset();
@@ -459,25 +482,27 @@ trait Options {
459
  }
460
 
461
  // If we need to set a sub-group, do that now.
462
- $keys = array_merge( [ $this->groupKey ], $this->subGroups );
463
- $defaults = $this->options[ $this->groupKey ];
464
- if ( ! empty( $this->subGroups ) ) {
465
- foreach ( $this->subGroups as $subGroup ) {
466
  $defaults = $defaults[ $subGroup ];
467
  }
468
  }
469
 
470
  // Refactor options.
471
- $defaults = $this->resetValues( $defaults, $this->defaultsMerged, $keys, $include, $exclude );
 
472
 
473
- $originalDefaults = $this->options[ $this->groupKey ];
474
  $pointer = &$originalDefaults;
475
- foreach ( $this->subGroups as $subGroup ) {
476
  $pointer = &$pointer[ $subGroup ];
477
  }
478
  $pointer = $defaults;
479
 
480
- $this->options[ $this->groupKey ] = $originalDefaults;
 
481
 
482
  $this->resetGroups();
483
 
@@ -527,22 +552,20 @@ trait Options {
527
  $optionOrGroup = '_aioseo_type';
528
  }
529
 
530
- static $hasInitialized = false;
 
531
 
532
- // Make sure our dynamic options have loaded.
533
  if ( ! $hasInitialized ) {
534
- foreach ( $this->subGroups as $subGroup ) {
535
- if ( 'dynamic' === $subGroup ) {
536
- $hasInitialized = true;
537
- $this->init( true );
538
- }
539
- }
540
  }
541
 
542
  // If we need to set a sub-group, do that now.
543
- $defaults = $this->groupKey ? $this->options[ $this->groupKey ] : $this->options;
544
- if ( ! empty( $this->subGroups ) ) {
545
- foreach ( $this->subGroups as $subGroup ) {
 
546
  $defaults = $defaults[ $subGroup ];
547
  }
548
  }
@@ -558,17 +581,6 @@ trait Options {
558
  return false;
559
  }
560
 
561
- /**
562
- * In order to not have a conflict, we need to return a clone.
563
- *
564
- * @since 4.0.0
565
- *
566
- * @return Options The cloned Options object.
567
- */
568
- public function noConflict() {
569
- return clone $this;
570
- }
571
-
572
  /**
573
  * Filters the results based on passed in array.
574
  *
@@ -655,19 +667,63 @@ trait Options {
655
  *
656
  * @since 4.0.0
657
  *
658
- * @param array|null $options An optional options array.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
659
  * @return void
660
  */
661
- public function update( $options = null ) {
 
 
 
 
 
 
 
 
 
662
  // First, we need to filter our options.
663
- $options = $this->filterOptions( $this->defaults, $options );
664
 
665
  // Refactor options.
666
  $refactored = $this->convertOptionsToValues( $options );
667
 
668
  $this->resetGroups();
669
 
670
- update_option( $this->optionsName, wp_json_encode( $refactored ) );
671
  }
672
 
673
  /**
@@ -680,7 +736,8 @@ trait Options {
680
  * @return array An array of filtered options.
681
  */
682
  public function filterOptions( $defaults, $options = null ) {
683
- $options = ! empty( $options ) ? $options : $this->options;
 
684
  return $this->filterRecursively( $options, $defaults );
685
  }
686
 
@@ -694,6 +751,10 @@ trait Options {
694
  * @return array A filtered array of options.
695
  */
696
  public function filterRecursively( $options, $defaults ) {
 
 
 
 
697
  foreach ( $options as $key => $value ) {
698
  if ( ! isset( $defaults[ $key ] ) ) {
699
  unset( $options[ $key ] );
@@ -734,6 +795,8 @@ trait Options {
734
  $array[ $k ] = sanitize_text_field( $preserveHtml ? htmlspecialchars( $v, ENT_NOQUOTES, 'UTF-8' ) : $v );
735
  }
736
  return $array;
 
 
737
  }
738
  }
739
 
@@ -856,9 +919,6 @@ trait Options {
856
 
857
  // @TODO: See if we need this? could just eliminate.
858
  if ( ! is_array( $value ) ) {
859
- $values[ $key ] = [
860
- 'value' => $value
861
- ];
862
  continue;
863
  }
864
 
@@ -880,14 +940,14 @@ trait Options {
880
  * @param array $options The options array.
881
  * @return array The converted options array.
882
  */
883
- protected function convertOptionsToValues( $options ) {
884
  foreach ( $options as $key => $value ) {
885
  if ( ! is_array( $value ) ) {
886
  continue;
887
  }
888
 
889
- if ( ! isset( $value['type'] ) ) {
890
- $options[ $key ] = $this->convertOptionsToValues( $value );
891
  continue;
892
  }
893
 
@@ -951,6 +1011,62 @@ trait Options {
951
  * @return void
952
  */
953
  public function refresh() {
 
 
954
  $this->init();
955
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
956
  }
13
  */
14
  trait Options {
15
  /**
16
+ * Whether or not this instance is a clone.
17
  *
18
+ * @since 4.1.4
19
+ *
20
+ * @var boolean
21
+ */
22
+ public $isClone = false;
23
+
24
+ /**
25
+ * Whether or not the options need to be saved to the DB.
26
+ *
27
+ * @since 4.1.4
28
  *
29
  * @var string
30
  */
31
+ public $shouldSave = false;
32
 
33
  /**
34
+ * The name to lookup the options with.
35
  *
36
  * @since 4.0.0
37
  *
38
+ * @var string
39
  */
40
+ public $optionsName = '';
41
 
42
  /**
43
  * Holds the localized options.
130
  }
131
 
132
  // If we need to set a sub-group, do that now.
133
+ $cachedOptions = aioseo()->optionsCache->getOptions( $this->optionsName );
134
+ $defaults = $cachedOptions[ $this->groupKey ];
135
  if ( ! empty( $this->subGroups ) ) {
136
  foreach ( $this->subGroups as $subGroup ) {
137
  $defaults = $defaults[ $subGroup ];
149
  return $this->setSubGroup( $name );
150
  }
151
 
152
+ $value = isset( $cachedOptions[ $this->groupKey ][ $name ]['value'] )
153
+ ? $cachedOptions[ $this->groupKey ][ $name ]['value']
154
  : (
155
  ! empty( $this->arguments[0] )
156
  ? $this->arguments[0]
180
  }
181
 
182
  // If we need to set a sub-group, do that now.
183
+ $cachedOptions = aioseo()->optionsCache->getOptions( $this->optionsName );
184
+ $defaults = $cachedOptions[ $this->groupKey ];
185
  if ( ! empty( $this->subGroups ) ) {
186
  foreach ( $this->subGroups as $subGroup ) {
187
  $defaults = $defaults[ $subGroup ];
263
  }
264
 
265
  // If we need to set a sub-group, do that now.
266
+ $cachedOptions = aioseo()->optionsCache->getOptions( $this->optionsName );
267
+ $defaults = json_decode( wp_json_encode( $cachedOptions[ $this->groupKey ] ), true );
268
  if ( ! empty( $this->subGroups ) ) {
269
  foreach ( $this->subGroups as $subGroup ) {
270
  $defaults = &$defaults[ $subGroup ];
310
  update_option( $this->optionsName . '_localized', $this->localized );
311
  }
312
 
313
+ $originalDefaults = json_decode( wp_json_encode( $cachedOptions[ $this->groupKey ] ), true );
314
  $pointer = &$originalDefaults;
315
  foreach ( $this->subGroups as $subGroup ) {
316
  $pointer = &$pointer[ $subGroup ];
317
  }
318
  $pointer = $defaults;
319
 
320
+ $cachedOptions[ $this->groupKey ] = $originalDefaults;
321
+ aioseo()->optionsCache->setOptions( $this->optionsName, $cachedOptions );
322
 
323
  $this->resetGroups();
324
 
339
  }
340
 
341
  // If we need to set a sub-group, do that now.
342
+ $cachedOptions = aioseo()->optionsCache->getOptions( $this->optionsName );
343
+ $defaults = $cachedOptions[ $this->groupKey ];
344
  if ( ! empty( $this->subGroups ) ) {
345
  foreach ( $this->subGroups as $subGroup ) {
346
  $defaults = &$defaults[ $subGroup ];
379
  }
380
 
381
  // If we need to set a sub-group, do that now.
382
+ $cachedOptions = aioseo()->optionsCache->getOptions( $this->optionsName );
383
+ $defaults = json_decode( wp_json_encode( $cachedOptions[ $this->groupKey ] ), true );
384
  if ( ! empty( $this->subGroups ) ) {
385
  foreach ( $this->subGroups as $subGroup ) {
386
  $defaults = &$defaults[ $subGroup ];
403
 
404
  unset( $defaults[ $name ]['value'] );
405
 
406
+ $cachedOptions[ $this->groupKey ] = $defaults;
407
+ aioseo()->optionsCache->setOptions( $this->optionsName, $cachedOptions );
 
408
 
409
  $this->resetGroups();
410
+
411
+ $this->update();
412
  }
413
 
414
  /**
421
  * @return array An array of options.
422
  */
423
  public function all( $include = [], $exclude = [] ) {
424
+ $originalGroupKey = $this->groupKey;
425
+ $originalSubGroups = $this->subGroups;
426
 
427
+ // Make sure our dynamic options have loaded.
428
+ $this->init();
429
 
430
  // Refactor options.
431
+ $cachedOptions = aioseo()->optionsCache->getOptions( $this->optionsName );
432
+ $refactored = $this->convertOptionsToValues( $cachedOptions );
433
 
434
  $this->groupKey = null;
435
 
437
  return $this->allFiltered( $refactored, $include, $exclude );
438
  }
439
 
440
+ if ( empty( $originalSubGroups ) ) {
441
  $all = $refactored[ $originalGroupKey ];
442
  return $this->allFiltered( $all, $include, $exclude );
443
  }
444
 
445
  $returnable = &$refactored[ $originalGroupKey ];
446
+ foreach ( $originalSubGroups as $subGroup ) {
447
  $returnable = &$returnable[ $subGroup ];
448
  }
449
 
461
  * @return void
462
  */
463
  public function reset( $include = [], $exclude = [] ) {
464
+ $originalGroupKey = $this->groupKey;
465
+ $originalSubGroups = $this->subGroups;
466
+
467
  // Make sure our dynamic options have loaded.
468
+ $this->init();
469
+
470
+ $cachedOptions = aioseo()->optionsCache->getOptions( $this->optionsName );
471
 
472
  // If we don't have a group key set, it means we want to reset everything.
473
+ if ( empty( $originalGroupKey ) ) {
474
+ $groupKeys = array_keys( $cachedOptions );
475
  foreach ( $groupKeys as $groupKey ) {
476
  $this->groupKey = $groupKey;
477
  $this->reset();
482
  }
483
 
484
  // If we need to set a sub-group, do that now.
485
+ $keys = array_merge( [ $originalGroupKey ], $originalSubGroups );
486
+ $defaults = json_decode( wp_json_encode( $cachedOptions[ $originalGroupKey ] ), true );
487
+ if ( ! empty( $originalSubGroups ) ) {
488
+ foreach ( $originalSubGroups as $subGroup ) {
489
  $defaults = $defaults[ $subGroup ];
490
  }
491
  }
492
 
493
  // Refactor options.
494
+ $resetValues = $this->resetValues( $defaults, $this->defaultsMerged, $keys, $include, $exclude );
495
+ $defaults = array_replace_recursive( $defaults, $resetValues );
496
 
497
+ $originalDefaults = json_decode( wp_json_encode( $cachedOptions[ $originalGroupKey ] ), true );
498
  $pointer = &$originalDefaults;
499
+ foreach ( $originalSubGroups as $subGroup ) {
500
  $pointer = &$pointer[ $subGroup ];
501
  }
502
  $pointer = $defaults;
503
 
504
+ $cachedOptions[ $originalGroupKey ] = $originalDefaults;
505
+ aioseo()->optionsCache->setOptions( $this->optionsName, $cachedOptions );
506
 
507
  $this->resetGroups();
508
 
552
  $optionOrGroup = '_aioseo_type';
553
  }
554
 
555
+ $originalGroupKey = $this->groupKey;
556
+ $originalSubGroups = $this->subGroups;
557
 
558
+ static $hasInitialized = false;
559
  if ( ! $hasInitialized ) {
560
+ $hasInitialized = true;
561
+ $this->init();
 
 
 
 
562
  }
563
 
564
  // If we need to set a sub-group, do that now.
565
+ $cachedOptions = aioseo()->optionsCache->getOptions( $this->optionsName );
566
+ $defaults = $originalGroupKey ? $cachedOptions[ $originalGroupKey ] : $cachedOptions;
567
+ if ( ! empty( $originalSubGroups ) ) {
568
+ foreach ( $originalSubGroups as $subGroup ) {
569
  $defaults = $defaults[ $subGroup ];
570
  }
571
  }
581
  return false;
582
  }
583
 
 
 
 
 
 
 
 
 
 
 
 
584
  /**
585
  * Filters the results based on passed in array.
586
  *
667
  *
668
  * @since 4.0.0
669
  *
670
+ * @param string $optionsName An optional option name to update.
671
+ * @param string $defaults The defaults to filter the options by.
672
+ * @param array|null $options An optional options array.
673
+ * @return void
674
+ */
675
+ public function update( $optionsName = null, $defaults = null, $options = null ) {
676
+ $optionsName = empty( $optionsName ) ? $this->optionsName : $optionsName;
677
+ $defaults = empty( $defaults ) ? $this->defaults : $defaults;
678
+
679
+ // First, we need to filter our options.
680
+ $options = $this->filterOptions( $defaults, $options );
681
+
682
+ // Refactor options.
683
+ $refactored = $this->convertOptionsToValues( $options );
684
+
685
+ $this->resetGroups();
686
+
687
+ // The following needs to happen here (possibly a clone) as well as in the main instance.
688
+ $originalInstance = $this->getOriginalInstance();
689
+
690
+ // Update the DB options.
691
+ aioseo()->optionsCache->setDb( $optionsName, $refactored );
692
+
693
+ // Force a save here and in the main class.
694
+ $this->shouldSave = true;
695
+ $originalInstance->shouldSave = true;
696
+ }
697
+
698
+ /**
699
+ * Updates the options in the database.
700
+ *
701
+ * @since 4.1.4
702
+ *
703
+ * @param boolean $force Whether or not to force an immediate save.
704
+ * @param string $optionsName An optional option name to update.
705
+ * @param string $defaults The defaults to filter the options by.
706
  * @return void
707
  */
708
+ public function save( $force = false, $optionsName = null, $defaults = null ) {
709
+ if ( ! $this->shouldSave && ! $force ) {
710
+ return;
711
+ }
712
+
713
+ $optionsName = empty( $optionsName ) ? $this->optionsName : $optionsName;
714
+ $defaults = empty( $defaults ) ? $this->defaults : $defaults;
715
+
716
+ $this->update( $optionsName );
717
+
718
  // First, we need to filter our options.
719
+ $options = $this->filterOptions( $defaults, null, $optionsName );
720
 
721
  // Refactor options.
722
  $refactored = $this->convertOptionsToValues( $options );
723
 
724
  $this->resetGroups();
725
 
726
+ update_option( $optionsName, wp_json_encode( $refactored ) );
727
  }
728
 
729
  /**
736
  * @return array An array of filtered options.
737
  */
738
  public function filterOptions( $defaults, $options = null ) {
739
+ $cachedOptions = aioseo()->optionsCache->getOptions( $this->optionsName );
740
+ $options = ! empty( $options ) ? $options : json_decode( wp_json_encode( $cachedOptions ), true );
741
  return $this->filterRecursively( $options, $defaults );
742
  }
743
 
751
  * @return array A filtered array of options.
752
  */
753
  public function filterRecursively( $options, $defaults ) {
754
+ if ( ! is_array( $options ) ) {
755
+ return $options;
756
+ }
757
+
758
  foreach ( $options as $key => $value ) {
759
  if ( ! isset( $defaults[ $key ] ) ) {
760
  unset( $options[ $key ] );
795
  $array[ $k ] = sanitize_text_field( $preserveHtml ? htmlspecialchars( $v, ENT_NOQUOTES, 'UTF-8' ) : $v );
796
  }
797
  return $array;
798
+ case 'float':
799
+ return floatval( $value );
800
  }
801
  }
802
 
919
 
920
  // @TODO: See if we need this? could just eliminate.
921
  if ( ! is_array( $value ) ) {
 
 
 
922
  continue;
923
  }
924
 
940
  * @param array $options The options array.
941
  * @return array The converted options array.
942
  */
943
+ public function convertOptionsToValues( $options, $optionKey = 'type' ) {
944
  foreach ( $options as $key => $value ) {
945
  if ( ! is_array( $value ) ) {
946
  continue;
947
  }
948
 
949
+ if ( ! isset( $value[ $optionKey ] ) ) {
950
+ $options[ $key ] = $this->convertOptionsToValues( $value, $optionKey );
951
  continue;
952
  }
953
 
1011
  * @return void
1012
  */
1013
  public function refresh() {
1014
+ // Reset DB options to clear the cache.
1015
+ aioseo()->optionsCache->resetDb();
1016
  $this->init();
1017
  }
1018
+
1019
+ /**
1020
+ * Returns the DB options.
1021
+ *
1022
+ * @since 4.1.4
1023
+ *
1024
+ * @param string $optionsName The options name.
1025
+ * @return array The options.
1026
+ */
1027
+ public function getDbOptions( $optionsName ) {
1028
+ $cache = aioseo()->optionsCache->getDb( $optionsName );
1029
+ if ( empty( $cache ) ) {
1030
+ $options = json_decode( get_option( $optionsName ), true );
1031
+ $options = ! empty( $options ) ? $options : [];
1032
+
1033
+ // Set the cache.
1034
+ aioseo()->optionsCache->setDb( $optionsName, $options );
1035
+ }
1036
+
1037
+ return aioseo()->optionsCache->getDb( $optionsName );
1038
+ }
1039
+
1040
+ /**
1041
+ * In order to not have a conflict, we need to return a clone.
1042
+ *
1043
+ * @since 4.0.0
1044
+ *
1045
+ * @return Options The cloned Options object.
1046
+ */
1047
+ public function noConflict() {
1048
+ $class = clone $this;
1049
+ $class->isClone = true;
1050
+ return $class;
1051
+ }
1052
+
1053
+ /**
1054
+ * Get original instance. Since this could be a cloned object, let's get the original instance.
1055
+ *
1056
+ * @since 4.1.4
1057
+ *
1058
+ * @return self
1059
+ */
1060
+ public function getOriginalInstance() {
1061
+ if ( ! $this->isClone ) {
1062
+ return $this;
1063
+ }
1064
+
1065
+ $class = new \ReflectionClass( get_called_class() );
1066
+ $optionName = aioseo()->helpers->toCamelCase( $class->getShortName() );
1067
+
1068
+ if ( isset( aioseo()->{ $optionName } ) ) {
1069
+ return aioseo()->{ $optionName };
1070
+ }
1071
+ }
1072
  }
app/Common/Utils/Database.php CHANGED
@@ -273,7 +273,7 @@ class Database {
273
  * @return boolean Whether or not the table exists.
274
  */
275
  public function tableExists( $table ) {
276
- $results = $this->db->get_results( 'SHOW TABLES LIKE "' . $this->prefix . $table . '"' );
277
  return ! ( empty( $results ) );
278
  }
279
 
@@ -696,7 +696,8 @@ class Database {
696
  }
697
 
698
  foreach ( $values as &$value ) {
699
- if ( is_numeric( $value ) ) {
 
700
  // No change.
701
  } elseif ( is_null( $value ) || false !== stristr( $value, 'NULL' ) ) {
702
  // Change to a true NULL value.
273
  * @return boolean Whether or not the table exists.
274
  */
275
  public function tableExists( $table ) {
276
+ $results = $this->db->get_results( "SHOW TABLES LIKE '" . $this->prefix . $table . "'" );
277
  return ! ( empty( $results ) );
278
  }
279
 
696
  }
697
 
698
  foreach ( $values as &$value ) {
699
+ // Note: We can no longer check for `is_numeric` because a value like `61021e6242255` returns true and breaks the query.
700
+ if ( is_integer( $value ) || is_float( $value ) ) {
701
  // No change.
702
  } elseif ( is_null( $value ) || false !== stristr( $value, 'NULL' ) ) {
703
  // Change to a true NULL value.
app/Common/Utils/Helpers.php CHANGED
@@ -6,8 +6,6 @@ if ( ! defined( 'ABSPATH' ) ) {
6
  exit;
7
  }
8
 
9
- use AIOSEO\Plugin\Common\Models;
10
- use AIOSEO\Plugin\Common\Tools;
11
  use AIOSEO\Plugin\Common\Traits\Helpers as TraitHelpers;
12
 
13
  /**
@@ -17,20 +15,18 @@ use AIOSEO\Plugin\Common\Traits\Helpers as TraitHelpers;
17
  */
18
  class Helpers {
19
  use TraitHelpers\ActionScheduler;
 
20
  use TraitHelpers\Constants;
21
  use TraitHelpers\DateTime;
22
- use TraitHelpers\ECommerce;
23
  use TraitHelpers\Shortcodes;
24
  use TraitHelpers\Strings;
25
-
26
- /**
27
- * Whether or not we have a local connection.
28
- *
29
- * @since 4.0.0
30
- *
31
- * @var bool
32
- */
33
- private static $connection = false;
34
 
35
  /**
36
  * Generate a UTM URL from the url and medium/content passed in.
@@ -66,1816 +62,94 @@ class Helpers {
66
 
67
  // Return the new URL.
68
  $url = add_query_arg( $args, $url );
69
- return $esc ? esc_url( $url ) : $url;
70
- }
71
-
72
- /**
73
- * Get the home page object.
74
- *
75
- * @since 4.1.1
76
- *
77
- * @return WP_Post|null The home page.
78
- */
79
- public function getHomePage() {
80
- $homePageId = $this->getHomePageId();
81
-
82
- return $homePageId ? get_post( $homePageId ) : null;
83
- }
84
-
85
- /**
86
- * Get the ID of the home page.
87
- *
88
- * @since 4.0.0
89
- *
90
- * @return integer|null The home page ID.
91
- */
92
- public function getHomePageId() {
93
- $pageShowOnFront = ( 'page' === get_option( 'show_on_front' ) );
94
- $pageOnFrontId = get_option( 'page_on_front' );
95
-
96
- return $pageShowOnFront && $pageOnFrontId ? (int) $pageOnFrontId : null;
97
- }
98
-
99
- /**
100
- * Returns the blog page.
101
- *
102
- * @since 4.0.0
103
- *
104
- * @return WP_Post|null The blog page.
105
- */
106
- public function getBlogPage() {
107
- $blogPageId = $this->getBlogPageId();
108
-
109
- return $blogPageId ? get_post( $blogPageId ) : null;
110
- }
111
-
112
- /**
113
- * Gets the current blog page id if it's configured.
114
- *
115
- * @since 4.1.1
116
- *
117
- * @return int|null
118
- */
119
- public function getBlogPageId() {
120
- $pageShowOnFront = ( 'page' === get_option( 'show_on_front' ) );
121
- $blogPageId = (int) get_option( 'page_for_posts' );
122
-
123
- return $pageShowOnFront && $blogPageId ? $blogPageId : null;
124
- }
125
-
126
- /**
127
- * Returns the All in One SEO Logo
128
- *
129
- * @since 4.0.0
130
- *
131
- * @param string $width The width of the image.
132
- * @param string $height The height of the image.
133
- * @param string $colorCode The color of the image.
134
- * @return string The logo as a string.
135
- */
136
- public function logo( $width, $height, $colorCode ) {
137
- return '<svg viewBox="0 0 20 20" width="' . $width . '" height="' . $height . '" fill="none" xmlns="http://www.w3.org/2000/svg" class="aioseo-gear"><path fill-rule="evenodd" clip-rule="evenodd" d="M9.98542 19.9708C15.5002 19.9708 19.9708 15.5002 19.9708 9.98542C19.9708 4.47063 15.5002 0 9.98542 0C4.47063 0 0 4.47063 0 9.98542C0 15.5002 4.47063 19.9708 9.98542 19.9708ZM8.39541 3.65464C8.26016 3.4485 8.0096 3.35211 7.77985 3.43327C7.51816 3.52572 7.26218 3.63445 7.01349 3.7588C6.79519 3.86796 6.68566 4.11731 6.73372 4.36049L6.90493 5.22694C6.949 5.44996 6.858 5.6763 6.68522 5.82009C6.41216 6.04734 6.16007 6.30426 5.93421 6.58864C5.79383 6.76539 5.57233 6.85907 5.35361 6.81489L4.50424 6.6433C4.26564 6.5951 4.02157 6.70788 3.91544 6.93121C3.85549 7.05738 3.79889 7.1862 3.74583 7.31758C3.69276 7.44896 3.64397 7.58105 3.59938 7.71369C3.52048 7.94847 3.61579 8.20398 3.81839 8.34133L4.53958 8.83027C4.72529 8.95617 4.81778 9.1819 4.79534 9.40826C4.75925 9.77244 4.76072 10.136 4.79756 10.4936C4.82087 10.7198 4.72915 10.9459 4.54388 11.0724L3.82408 11.5642C3.62205 11.7022 3.52759 11.9579 3.60713 12.1923C3.69774 12.4593 3.8043 12.7205 3.92615 12.9743C4.03313 13.1971 4.27749 13.3088 4.51581 13.2598L5.36495 13.0851C5.5835 13.0401 5.80533 13.133 5.94623 13.3093C6.16893 13.5879 6.42071 13.8451 6.6994 14.0756C6.87261 14.2188 6.96442 14.4448 6.92112 14.668L6.75296 15.5348C6.70572 15.7782 6.81625 16.0273 7.03511 16.1356C7.15876 16.1967 7.285 16.2545 7.41375 16.3086C7.54251 16.3628 7.67196 16.4126 7.80195 16.4581C8.18224 16.5912 8.71449 16.1147 9.108 15.7625C9.30205 15.5888 9.42174 15.343 9.42301 15.0798C9.42301 15.0784 9.42302 15.077 9.42302 15.0756L9.42301 13.6263C9.42301 13.6109 9.4236 13.5957 9.42476 13.5806C8.26248 13.2971 7.39838 12.2301 7.39838 10.9572V9.41823C7.39838 9.30125 7.49131 9.20642 7.60596 9.20642H8.32584V7.6922C8.32584 7.48312 8.49193 7.31364 8.69683 7.31364C8.90171 7.31364 9.06781 7.48312 9.06781 7.6922V9.20642H11.0155V7.6922C11.0155 7.48312 11.1816 7.31364 11.3865 7.31364C11.5914 7.31364 11.7575 7.48312 11.7575 7.6922V9.20642H12.4773C12.592 9.20642 12.6849 9.30125 12.6849 9.41823V10.9572C12.6849 12.2704 11.7653 13.3643 10.5474 13.6051C10.5477 13.6121 10.5478 13.6192 10.5478 13.6263L10.5478 15.0694C10.5478 15.3377 10.6711 15.5879 10.871 15.7622C11.2715 16.1115 11.8129 16.5837 12.191 16.4502C12.4527 16.3577 12.7086 16.249 12.9573 16.1246C13.1756 16.0155 13.2852 15.7661 13.2371 15.5229L13.0659 14.6565C13.0218 14.4334 13.1128 14.2071 13.2856 14.0633C13.5587 13.8361 13.8107 13.5792 14.0366 13.2948C14.177 13.118 14.3985 13.0244 14.6172 13.0685L15.4666 13.2401C15.7052 13.2883 15.9493 13.1756 16.0554 12.9522C16.1153 12.8261 16.1719 12.6972 16.225 12.5659C16.2781 12.4345 16.3269 12.3024 16.3714 12.1698C16.4503 11.935 16.355 11.6795 16.1524 11.5421L15.4312 11.0532C15.2455 10.9273 15.153 10.7015 15.1755 10.4752C15.2116 10.111 15.2101 9.74744 15.1733 9.38986C15.1499 9.16361 15.2417 8.93757 15.4269 8.811L16.1467 8.31927C16.3488 8.18126 16.4432 7.92558 16.3637 7.69115C16.2731 7.42411 16.1665 7.16292 16.0447 6.90915C15.9377 6.68638 15.6933 6.57462 15.455 6.62366L14.6059 6.79837C14.3873 6.84334 14.1655 6.75048 14.0246 6.57418C13.8019 6.29554 13.5501 6.03832 13.2714 5.80784C13.0982 5.6646 13.0064 5.43858 13.0497 5.2154L13.2179 4.34868C13.2651 4.10521 13.1546 3.85616 12.9357 3.74787C12.8121 3.68669 12.6858 3.62895 12.5571 3.5748C12.4283 3.52065 12.2989 3.47086 12.1689 3.42537C11.9388 3.34485 11.6884 3.44211 11.5538 3.64884L11.0746 4.38475C10.9513 4.57425 10.73 4.66862 10.5082 4.64573C10.1513 4.6089 9.79502 4.61039 9.44459 4.64799C9.22286 4.67177 9.00134 4.57818 8.87731 4.38913L8.39541 3.65464Z" fill="' . $colorCode . '" /></svg>'; // phpcs:ignore Generic.Files.LineLength.MaxExceeded
138
- }
139
-
140
- /**
141
- * Returns Jed-formatted localization data. Added for backwards-compatibility.
142
- *
143
- * @since 4.0.0
144
- *
145
- * @param string $domain Translation domain.
146
- * @return array An array of information for the locale.
147
- */
148
- public function getJedLocaleData( $domain ) {
149
- $translations = get_translations_for_domain( $domain );
150
-
151
- $locale = [
152
- '' => [
153
- 'domain' => $domain,
154
- 'lang' => is_admin() && function_exists( 'get_user_locale' ) ? get_user_locale() : get_locale(),
155
- ],
156
- ];
157
-
158
- if ( ! empty( $translations->headers['Plural-Forms'] ) ) {
159
- $locale['']['plural_forms'] = $translations->headers['Plural-Forms'];
160
- }
161
-
162
- foreach ( $translations->entries as $msgid => $entry ) {
163
- $locale[ $msgid ] = $entry->translations;
164
- }
165
-
166
- return $locale;
167
- }
168
-
169
- /**
170
- * Checks whether current page supports meta.
171
- *
172
- * @since 4.0.0
173
- *
174
- * @return boolean Whether the current page supports meta.
175
- */
176
- public function supportsMeta() {
177
- return ! is_date() && ! is_author() && ! is_search() && ! is_404();
178
- }
179
-
180
- /**
181
- * Checks whether the current page is a taxonomy term archive.
182
- *
183
- * @since 4.0.0
184
- *
185
- * @return boolean Whether the current page is a taxonomy term archive.
186
- */
187
- public function isTaxTerm() {
188
- $object = get_queried_object();
189
- return $object instanceof \WP_Term;
190
- }
191
-
192
- /**
193
- * Checks whether the current page is a static one.
194
- *
195
- * @since 4.0.0
196
- *
197
- * @return boolean Whether the current page is a static one.
198
- */
199
- public function isStaticPage() {
200
- return $this->isStaticHomePage() || $this->isStaticPostsPage() || $this->isWooCommerceShopPage();
201
- }
202
-
203
- /**
204
- * Checks whether the current page is the static homepage.
205
- *
206
- * @since 4.0.0
207
- *
208
- * @param mixed $post Pass in an optional post to check if its the static home page.
209
- * @return boolean Whether the current page is the static homepage.
210
- */
211
- public function isStaticHomePage( $post = null ) {
212
- static $isHomePage = null;
213
- if ( null !== $isHomePage ) {
214
- return $isHomePage;
215
- }
216
-
217
- $post = aioseo()->helpers->getPost( $post );
218
- return ( 'page' === get_option( 'show_on_front' ) && ! empty( $post->ID ) && (int) get_option( 'page_on_front' ) === $post->ID );
219
- }
220
-
221
- /**
222
- * Checks whether the current page is the static posts page.
223
- *
224
- * @since 4.0.0
225
- *
226
- * @return boolean Whether the current page is the static posts page.
227
- */
228
- public function isStaticPostsPage() {
229
- return is_home() && ( 0 !== (int) get_option( 'page_for_posts' ) );
230
- }
231
-
232
- /**
233
- * Checks whether BuddyPress is active.
234
- *
235
- * @since 4.0.0
236
- *
237
- * @return boolean
238
- */
239
- public function isBuddyPressActive() {
240
- return class_exists( 'BuddyPress' );
241
- }
242
-
243
- /**
244
- * Checks whether the queried object is a buddy press user page.
245
- *
246
- * @since 4.0.0
247
- *
248
- * @return boolean
249
- */
250
- public function isBuddyPressUser() {
251
- return $this->isBuddyPressActive() && function_exists( 'bp_is_user' ) && bp_is_user();
252
- }
253
-
254
- /**
255
- * Helper method to enqueue scripts.
256
- *
257
- * @since 4.0.0
258
- *
259
- * @param string $script The script to enqueue.
260
- * @param string $url The URL of the script.
261
- * @param bool $vue Whether or not this is a vue script.
262
- * @return void
263
- */
264
- public function enqueueScript( $script, $url, $vue = true ) {
265
- if ( ! wp_script_is( $script, 'enqueued' ) ) {
266
- wp_enqueue_script(
267
- $script,
268
- $this->getScriptUrl( $url, $vue ),
269
- [],
270
- aioseo()->version,
271
- true
272
- );
273
- }
274
- }
275
-
276
- /**
277
- * Helper method to enqueue stylesheets.
278
- *
279
- * @since 4.0.0
280
- *
281
- * @param string $style The stylesheet to enqueue.
282
- * @param string $url The URL of the stylesheet.
283
- * @param bool $vue Whether or not this is a vue stylesheet.
284
- * @return void
285
- */
286
- public function enqueueStyle( $style, $url, $vue = true ) {
287
- if ( ! wp_style_is( $style, 'enqueued' ) && $this->shouldEnqueue( $url ) ) {
288
- wp_enqueue_style(
289
- $style,
290
- $this->getScriptUrl( $url, $vue ),
291
- [],
292
- aioseo()->version
293
- );
294
- }
295
- }
296
-
297
- /**
298
- * Localizes a given URL.
299
- *
300
- * This is required for compatibility with WPML.
301
- *
302
- * @since 4.0.0
303
- *
304
- * @param string $path The relative path of the URL.
305
- * @return string $url The filtered URL.
306
- */
307
- public function localizedUrl( $path ) {
308
- $url = apply_filters( 'wpml_home_url', home_url( '/' ) );
309
-
310
- // Remove URL parameters.
311
- preg_match_all( '/\?[\s\S]+/', $url, $matches );
312
-
313
- // Get the base URL.
314
- $url = preg_replace( '/\?[\s\S]+/', '', $url );
315
- $url = trailingslashit( $url );
316
- $url .= preg_replace( '/\//', '', $path, 1 );
317
-
318
- // Readd URL parameters.
319
- if ( $matches && $matches[0] ) {
320
- $url .= $matches[0][0];
321
- }
322
-
323
- return $url;
324
- }
325
-
326
- /**
327
- * Unsets a given value in a given array.
328
- *
329
- * This function should only be used if the given value only appears once in the array.
330
- *
331
- * @since 4.0.0
332
- *
333
- * @param array $array The array.
334
- * @param string $value The value that needs to be removed from the array.
335
- * @return array $array The filtered array.
336
- */
337
- public function unsetValue( $array, $value ) {
338
- if ( in_array( $value, $array, true ) ) {
339
- unset( $array[ array_search( $value, $array, true ) ] );
340
- };
341
- return $array;
342
- }
343
-
344
- /**
345
- * Formats a timestamp as an ISO 8601 date.
346
- *
347
- * @since 4.0.0
348
- *
349
- * @param string $dateTime The raw datetime.
350
- * @return string The formatted datetime.
351
- */
352
- public function formatDateTime( $dateTime ) {
353
- return gmdate( 'c', mysql2date( 'U', $dateTime ) );
354
- }
355
-
356
- /**
357
- * Formats a given URl as an absolute URL if it is relative.
358
- *
359
- * @since 4.0.0
360
- *
361
- * @param string $url The URL.
362
- * @return string $url The absolute URL.
363
- */
364
- public function makeUrlAbsolute( $url ) {
365
- if ( 0 !== strpos( $url, 'http' ) && '/' !== $url ) {
366
- if ( 0 === strpos( $url, '//' ) ) {
367
- $scheme = wp_parse_url( home_url(), PHP_URL_SCHEME );
368
- $url = $scheme . ':' . $url;
369
- } else {
370
- $url = home_url( $url );
371
- }
372
- }
373
- return $url;
374
- }
375
-
376
- /** Whether or not we should enqueue a file.
377
- *
378
- * @since 4.0.0
379
- *
380
- * @param string $url The url to check against.
381
- * @return bool Whether or not we should enqueue.
382
- */
383
- private function shouldEnqueue( $url ) {
384
- $version = strtoupper( aioseo()->versionPath );
385
- $host = defined( 'AIOSEO_DEV_' . $version ) ? constant( 'AIOSEO_DEV_' . $version ) : false;
386
-
387
- if ( ! $host ) {
388
- return true;
389
- }
390
-
391
- if ( false !== strpos( $url, 'chunk-common.css' ) ) {
392
- // return false;
393
- }
394
-
395
- return true;
396
- }
397
-
398
- /**
399
- * Retrieve the proper URL for this script or style.
400
- *
401
- * @since 4.0.0
402
- *
403
- * @param string $url The url.
404
- * @param bool $vue Whether or not this is a vue script.
405
- * @return string The modified url.
406
- */
407
- public function getScriptUrl( $url, $vue = true ) {
408
- $version = strtoupper( aioseo()->versionPath );
409
- $host = $vue && defined( 'AIOSEO_DEV_' . $version ) ? constant( 'AIOSEO_DEV_' . $version ) : false;
410
- $localUrl = $url;
411
- $url = plugins_url( 'dist/' . aioseo()->versionPath . '/assets/' . $url, AIOSEO_FILE );
412
-
413
- if ( ! $host ) {
414
- return $url;
415
- }
416
-
417
- if ( $host && ! self::$connection ) {
418
- $splitHost = explode( ':', str_replace( '/', '', str_replace( 'http://', '', $host ) ) );
419
- self::$connection = @fsockopen( $splitHost[0], $splitHost[1] ); // phpcs:ignore WordPress
420
- }
421
-
422
- if ( ! self::$connection ) {
423
- return $url;
424
- }
425
-
426
- return $host . $localUrl;
427
- }
428
-
429
- /**
430
- * Gets the data for vue.
431
- *
432
- * @since 4.0.0
433
- *
434
- * @param string $page The current page.
435
- * @return array An array of data.
436
- */
437
- public function getVueData( $page = null ) {
438
- $postTypeObj = get_post_type_object( get_post_type( get_the_ID() ) );
439
- $screen = get_current_screen();
440
-
441
- // Check if user has a custom filename from the V3 migration.
442
- $sitemapFilename = aioseo()->sitemap->helpers->filename( 'general' );
443
- $sitemapFilename = $sitemapFilename ? $sitemapFilename : 'sitemap';
444
-
445
- $isStaticHomePage = 'page' === get_option( 'show_on_front' );
446
- $staticHomePage = intval( get_option( 'page_on_front' ) );
447
- $data = [
448
- 'page' => $page,
449
- 'screen' => [
450
- 'base' => $screen->base,
451
- 'postType' => $screen->post_type,
452
- 'blockEditor' => isset( $screen->is_block_editor ) ? $screen->is_block_editor : false
453
- ],
454
- 'internalOptions' => aioseo()->internalOptions->all(),
455
- 'options' => aioseo()->options->all(),
456
- 'settings' => aioseo()->settings->all(),
457
- 'tags' => aioseo()->tags->all( true ),
458
- 'nonce' => wp_create_nonce( 'wp_rest' ),
459
- 'urls' => [
460
- 'domain' => $this->getSiteDomain(),
461
- 'mainSiteUrl' => $this->getSiteUrl(),
462
- 'home' => home_url(),
463
- 'restUrl' => rest_url(),
464
- 'publicPath' => plugin_dir_url( AIOSEO_FILE ),
465
- 'rssFeedUrl' => get_bloginfo( 'rss2_url' ),
466
- 'generalSitemapUrl' => home_url( "/$sitemapFilename.xml" ),
467
- 'rssSitemapUrl' => home_url( '/sitemap.rss' ),
468
- 'robotsTxtUrl' => $this->getSiteUrl() . '/robots.txt',
469
- 'blockedBotsLogUrl' => wp_upload_dir()['baseurl'] . '/aioseo/logs/aioseo-bad-bot-blocker.log',
470
- 'upgradeUrl' => apply_filters( 'aioseo_upgrade_link', AIOSEO_MARKETING_URL ),
471
- 'staticHomePage' => 'page' === get_option( 'show_on_front' ) ? get_edit_post_link( get_option( 'page_on_front' ), 'url' ) : null,
472
- 'connect' => add_query_arg( [
473
- 'siteurl' => site_url(),
474
- 'homeurl' => home_url(),
475
- 'redirect' => rawurldecode( base64_encode( admin_url( 'index.php?page=aioseo-connect' ) ) )
476
- ], defined( 'AIOSEO_CONNECT_URL' ) ? AIOSEO_CONNECT_URL : 'https://connect.aioseo.com' ),
477
- 'aio' => [
478
- 'wizard' => admin_url( 'index.php?page=aioseo-setup-wizard' ),
479
- 'dashboard' => admin_url( 'admin.php?page=aioseo' ),
480
- 'settings' => admin_url( 'admin.php?page=aioseo-settings' ),
481
- 'localSeo' => admin_url( 'admin.php?page=aioseo-local-seo' ),
482
- 'featureManager' => admin_url( 'admin.php?page=aioseo-feature-manager' ),
483
- 'sitemaps' => admin_url( 'admin.php?page=aioseo-sitemaps' ),
484
- 'seoAnalysis' => admin_url( 'admin.php?page=aioseo-seo-analysis' ),
485
- 'searchAppearance' => admin_url( 'admin.php?page=aioseo-search-appearance' ),
486
- 'socialNetworks' => admin_url( 'admin.php?page=aioseo-social-networks' ),
487
- 'tools' => admin_url( 'admin.php?page=aioseo-tools' ),
488
- 'monsterinsights' => admin_url( 'admin.php?page=aioseo-monsterinsights' )
489
- ],
490
- 'admin' => [
491
- 'widgets' => admin_url( 'widgets.php' ),
492
- 'optionsReading' => admin_url( 'options-reading.php' ),
493
- 'scheduledActions' => admin_url( '/tools.php?page=action-scheduler&status=pending&s=aioseo' ),
494
- 'generalSettings' => admin_url( 'options-general.php' )
495
- ]
496
- ],
497
- 'backups' => [],
498
- 'importers' => [],
499
- 'data' => [
500
- 'server' => [
501
- 'apache' => null,
502
- 'nginx' => null
503
- ],
504
- 'robots' => [
505
- 'defaultRules' => [],
506
- 'hasPhysicalRobots' => null,
507
- 'rewriteExists' => null,
508
- 'sitemapUrls' => []
509
- ],
510
- 'logSizes' => [
511
- 'badBotBlockerLog' => null
512
- ],
513
- 'status' => [],
514
- 'htaccess' => '',
515
- 'multisite' => is_multisite(),
516
- 'network' => is_network_admin(),
517
- 'mainSite' => is_main_site(),
518
- 'subdomain' => defined( 'SUBDOMAIN_INSTALL' ) && SUBDOMAIN_INSTALL,
519
- 'isWooCommerceActive' => $this->isWooCommerceActive(),
520
- 'isBBPressActive' => class_exists( 'bbPress' ),
521
- 'staticHomePage' => $isStaticHomePage ? $staticHomePage : false,
522
- 'staticBlogPage' => $this->getBlogPageId(),
523
- 'staticBlogPageTitle' => get_the_title( $this->getBlogPageId() ),
524
- 'isDev' => $this->isDev(),
525
- 'isSsl' => is_ssl()
526
- ],
527
- 'user' => [
528
- 'email' => wp_get_current_user()->user_email,
529
- 'roles' => $this->getUserRoles(),
530
- 'customRoles' => $this->getCustomRoles(),
531
- 'canManage' => current_user_can( apply_filters( 'aioseo_manage_seo', 'aioseo_manage_seo' ) ),
532
- 'capabilities' => aioseo()->access->getAllCapabilities(),
533
- 'unfilteredHtml' => current_user_can( 'unfiltered_html' ),
534
- 'locale' => function_exists( 'get_user_locale' ) ? get_user_locale() : get_locale()
535
- ],
536
- 'plugins' => $this->getPluginData(),
537
- 'postData' => [
538
- 'postTypes' => $this->getPublicPostTypes( false, false, true ),
539
- 'taxonomies' => $this->getPublicTaxonomies( false, true ),
540
- 'archives' => $this->getPublicPostTypes( false, true, true )
541
- ],
542
- 'notifications' => Models\Notification::getNotifications( false ),
543
- 'addons' => aioseo()->addons->getAddons(),
544
- 'version' => AIOSEO_VERSION,
545
- 'helpPanel' => json_decode( aioseo()->help->getDocs() ),
546
- 'scheduledActions' => [
547
- 'sitemaps' => []
548
- ]
549
- ];
550
-
551
- if ( is_multisite() && ! is_network_admin() ) {
552
- switch_to_blog( $this->getNetworkId() );
553
- $options = aioseo()->options->noConflict();
554
- $options->initNetwork();
555
- $data['networkOptions'] = $options->all();
556
- restore_current_blog();
557
- }
558
-
559
- if ( 'post' === $page ) {
560
- $postId = get_the_ID();
561
- $post = Models\Post::getPost( $postId );
562
-
563
- $data['currentPost'] = [
564
- 'context' => 'post',
565
- 'tags' => aioseo()->tags->getDefaultPostTags( $postId ),
566
- 'id' => $postId,
567
- 'priority' => ! empty( $post->priority ) ? $post->priority : 'default',
568
- 'frequency' => ! empty( $post->frequency ) ? $post->frequency : 'default',
569
- 'permalink' => get_the_permalink(),
570
- 'title' => ! empty( $post->title ) ? $post->title : aioseo()->meta->title->getPostTypeTitle( $postTypeObj->name ),
571
- 'description' => ! empty( $post->description ) ? $post->description : aioseo()->meta->description->getPostTypeDescription( $postTypeObj->name ),
572
- 'keywords' => ! empty( $post->keywords ) ? $post->keywords : wp_json_encode( [] ),
573
- 'keyphrases' => ! empty( $post->keyphrases )
574
- ? json_decode( $post->keyphrases )
575
- : json_decode( '{"focus":{},"additional":[]}' ),
576
- 'page_analysis' => ! empty( $post->page_analysis )
577
- ? json_decode( $post->page_analysis )
578
- : Models\Post::getPageAnalysisDefaults(),
579
- 'loading' => [
580
- 'focus' => false,
581
- 'additional' => [],
582
- ],
583
- 'type' => $postTypeObj->labels->singular_name,
584
- 'postType' => 'type' === $postTypeObj->name ? '_aioseo_type' : $postTypeObj->name,
585
- 'isSpecialPage' => $this->isSpecialPage( $postId ),
586
- 'isWooCommercePage' => $this->isWooCommercePage( $postId ),
587
- 'seo_score' => (int) $post->seo_score,
588
- 'pillar_content' => ( (int) $post->pillar_content ) === 0 ? false : true,
589
- 'canonicalUrl' => $post->canonical_url,
590
- 'default' => ( (int) $post->robots_default ) === 0 ? false : true,
591
- 'noindex' => ( (int) $post->robots_noindex ) === 0 ? false : true,
592
- 'noarchive' => ( (int) $post->robots_noarchive ) === 0 ? false : true,
593
- 'nosnippet' => ( (int) $post->robots_nosnippet ) === 0 ? false : true,
594
- 'nofollow' => ( (int) $post->robots_nofollow ) === 0 ? false : true,
595
- 'noimageindex' => ( (int) $post->robots_noimageindex ) === 0 ? false : true,
596
- 'noodp' => ( (int) $post->robots_noodp ) === 0 ? false : true,
597
- 'notranslate' => ( (int) $post->robots_notranslate ) === 0 ? false : true,
598
- 'maxSnippet' => null === $post->robots_max_snippet ? -1 : (int) $post->robots_max_snippet,
599
- 'maxVideoPreview' => null === $post->robots_max_videopreview ? -1 : (int) $post->robots_max_videopreview,
600
- 'maxImagePreview' => $post->robots_max_imagepreview,
601
- 'modalOpen' => false,
602
- 'tabs' => ( ! empty( $post->tabs ) )
603
- ? json_decode( $post->tabs )
604
- : json_decode( Models\Post::getDefaultTabsOptions() ),
605
- 'generalMobilePrev' => false,
606
- 'socialMobilePreview' => false,
607
- 'og_object_type' => ! empty( $post->og_object_type ) ? $post->og_object_type : 'default',
608
- 'og_title' => $post->og_title,
609
- 'og_description' => $post->og_description,
610
- 'og_image_custom_url' => $post->og_image_custom_url,
611
- 'og_image_custom_fields' => $post->og_image_custom_fields,
612
- 'og_image_type' => ! empty( $post->og_image_type ) ? $post->og_image_type : 'default',
613
- 'og_video' => ! empty( $post->og_video ) ? $post->og_video : '',
614
- 'og_article_section' => ! empty( $post->og_article_section ) ? $post->og_article_section : '',
615
- 'og_article_tags' => ! empty( $post->og_article_tags ) ? $post->og_article_tags : wp_json_encode( [] ),
616
- 'twitter_use_og' => ( (int) $post->twitter_use_og ) === 0 ? false : true,
617
- 'twitter_card' => $post->twitter_card,
618
- 'twitter_image_custom_url' => $post->twitter_image_custom_url,
619
- 'twitter_image_custom_fields' => $post->twitter_image_custom_fields,
620
- 'twitter_image_type' => $post->twitter_image_type,
621
- 'twitter_title' => $post->twitter_title,
622
- 'twitter_description' => $post->twitter_description,
623
- 'schema_type' => ( ! empty( $post->schema_type ) ) ? $post->schema_type : 'default',
624
- 'schema_type_options' => ( ! empty( $post->schema_type_options ) )
625
- ? json_decode( Models\Post::getDefaultSchemaOptions( $post->schema_type_options ) )
626
- : json_decode( Models\Post::getDefaultSchemaOptions() ),
627
- 'local_seo' => ( ! empty( $post->local_seo ) )
628
- ? Models\Post::getDefaultLocalSeoOptions( $post->local_seo )
629
- : json_decode( Models\Post::getDefaultLocalSeoOptions() ),
630
- 'metaDefaults' => [
631
- 'title' => aioseo()->meta->title->getPostTypeTitle( $postTypeObj->name ),
632
- 'description' => aioseo()->meta->description->getPostTypeDescription( $postTypeObj->name )
633
- ]
634
- ];
635
-
636
- if ( ! $post->exists() ) {
637
- $oldPostMeta = aioseo()->migration->meta->getMigratedPostMeta( $postId );
638
- foreach ( $oldPostMeta as $k => $v ) {
639
- if ( preg_match( '#robots_.*#', $k ) ) {
640
- $oldPostMeta[ preg_replace( '#robots_#', '', $k ) ] = $v;
641
- continue;
642
- }
643
- if ( 'canonical_url' === $k ) {
644
- $oldPostMeta['canonicalUrl'] = $v;
645
- }
646
- }
647
- $data['currentPost'] = array_merge( $data['currentPost'], $oldPostMeta );
648
- }
649
- }
650
-
651
- if ( 'sitemaps' === $page ) {
652
- try {
653
- if ( as_next_scheduled_action( 'aioseo_static_sitemap_regeneration' ) ) {
654
- $data['scheduledActions']['sitemap'][] = 'staticSitemapRegeneration';
655
- }
656
- } catch ( \Exception $e ) {
657
- // Do nothing.
658
- }
659
- }
660
-
661
- if ( 'setup-wizard' === $page ) {
662
- $data['users'] = $this->getSiteUsers( [ 'administrator', 'editor', 'author' ] );
663
- $data['importers'] = aioseo()->importExport->plugins();
664
- }
665
-
666
- if ( 'search-appearance' === $page ) {
667
- $data['users'] = $this->getSiteUsers( [ 'administrator', 'editor', 'author' ] );
668
- $data['data'] += [
669
- 'staticHomePageTitle' => $isStaticHomePage ? aioseo()->meta->title->getTitle( $staticHomePage ) : '',
670
- 'staticHomePageDescription' => $isStaticHomePage ? aioseo()->meta->description->getDescription( $staticHomePage ) : '',
671
- ];
672
- }
673
-
674
- if ( 'social-networks' === $page ) {
675
- $data['data'] += [
676
- 'staticHomePageOgTitle' => $isStaticHomePage ? aioseo()->social->facebook->getTitle( $staticHomePage ) : '',
677
- 'staticHomePageOgDescription' => $isStaticHomePage ? aioseo()->social->facebook->getDescription( $staticHomePage ) : '',
678
- 'staticHomePageTwitterTitle' => $isStaticHomePage ? aioseo()->social->twitter->getTitle( $staticHomePage ) : '',
679
- 'staticHomePageTwitterDescription' => $isStaticHomePage ? aioseo()->social->twitter->getDescription( $staticHomePage ) : '',
680
- ];
681
- }
682
-
683
- if ( 'tools' === $page ) {
684
- $data['backups'] = array_reverse( aioseo()->backup->all() );
685
- $data['importers'] = aioseo()->importExport->plugins();
686
- $data['data']['server'] = [
687
- 'apache' => $this->isApache(),
688
- 'nginx' => $this->isNginx()
689
- ];
690
- $data['data']['robots'] = [
691
- 'defaultRules' => $page ? aioseo()->robotsTxt->getDefaultRules() : [],
692
- 'hasPhysicalRobots' => aioseo()->robotsTxt->hasPhysicalRobotsTxt(),
693
- 'rewriteExists' => aioseo()->robotsTxt->rewriteRulesExist(),
694
- 'sitemapUrls' => array_merge( aioseo()->sitemap->helpers->getSitemapUrls(), $this->extractSitemapUrlsFromRobotsTxt() )
695
- ];
696
- $data['data']['logSizes'] = [
697
- 'badBotBlockerLog' => $this->convertFileSize( aioseo()->badBotBlocker->getLogSize() )
698
- ];
699
- $data['data']['status'] = Tools\SystemStatus::getSystemStatusInfo();
700
- $data['data']['htaccess'] = aioseo()->htaccess->getContents();
701
- }
702
-
703
- if ( 'settings' === $page ) {
704
- $data['breadcrumbs']['defaultTemplate'] = aioseo()->helpers->encodeOutputHtml( aioseo()->breadcrumbs->frontend->getDefaultTemplate() );
705
- }
706
-
707
- $loadedAddons = aioseo()->addons->getLoadedAddons();
708
- if ( ! empty( $loadedAddons ) ) {
709
- foreach ( $loadedAddons as $addon ) {
710
- if ( isset( $addon->helpers ) && method_exists( $addon->helpers, 'getVueData' ) ) {
711
- $data = $addon->helpers->getVueData( $data, $page );
712
- }
713
- }
714
- }
715
-
716
- return $data;
717
- }
718
-
719
- /**
720
- * Returns user roles in the current WP install.
721
- *
722
- * @since 4.0.0
723
- *
724
- * @return array An array of user roles.
725
- */
726
- public function getUserRoles() {
727
- global $wp_roles;
728
- if ( ! isset( $wp_roles ) ) {
729
- $wp_roles = new \WP_Roles();
730
- }
731
- $roleNames = $wp_roles->get_names();
732
- asort( $roleNames );
733
-
734
- return $roleNames;
735
- }
736
-
737
- /**
738
- * Returns the custom roles in the current WP install.
739
- *
740
- * @since 4.1.3
741
- *
742
- * @return array An array of custom roles.
743
- */
744
- public function getCustomRoles() {
745
- $allRoles = $this->getUserRoles();
746
- $customRoles = [];
747
-
748
- $toSkip = array_merge(
749
- // Default WordPress roles.
750
- [ 'superadmin', 'administrator', 'editor', 'author', 'contributor', 'subscriber' ],
751
- // Default AIOSEO roles.
752
- [ 'aioseo_manager', 'aioseo_editor' ]
753
- );
754
-
755
- foreach ( $allRoles as $roleName => $role ) {
756
- // Skip default roles.
757
- if ( in_array( $roleName, $toSkip, true ) ) {
758
- continue;
759
- }
760
-
761
- $customRoles[ $roleName ] = $role;
762
- }
763
-
764
- return $customRoles;
765
- }
766
-
767
- /**
768
- * Returns an array of plugins with the active status.
769
- *
770
- * @since 4.0.0
771
- *
772
- * @return array An array of plugins with active status.
773
- */
774
- public function getPluginData() {
775
- $pluginUpgrader = new PluginUpgraderSilentAjax();
776
- $installedPlugins = array_keys( get_plugins() );
777
-
778
- $plugins = [];
779
- foreach ( $pluginUpgrader->pluginSlugs as $key => $slug ) {
780
- $plugins[ $key ] = [
781
- 'basename' => $slug,
782
- 'installed' => in_array( $slug, $installedPlugins, true ),
783
- 'activated' => is_plugin_active( $slug ),
784
- 'adminUrl' => admin_url( $pluginUpgrader->pluginAdminUrls[ $key ] ),
785
- 'canInstall' => aioseo()->addons->canInstall(),
786
- 'canActivate' => aioseo()->addons->canActivate(),
787
- 'wpLink' => ! empty( $pluginUpgrader->wpPluginLinks[ $key ] ) ? $pluginUpgrader->wpPluginLinks[ $key ] : null
788
- ];
789
- }
790
-
791
- return $plugins;
792
- }
793
-
794
- /**
795
- * Retrieve a list of public post types with slugs/icons.
796
- *
797
- * @since 4.0.0
798
- *
799
- * @param boolean $namesOnly Whether only the names should be returned.
800
- * @param boolean $hasArchivesOnly Whether or not to only include post types which have archives.
801
- * @param boolean $rewriteType Whether or not to rewrite the type slugs.
802
- * @return array An array of public post types.
803
- */
804
- public function getPublicPostTypes( $namesOnly = false, $hasArchivesOnly = false, $rewriteType = false ) {
805
- $postTypes = [];
806
- $postObjects = get_post_types( [ 'public' => true ], 'objects' );
807
- $woocommerce = class_exists( 'woocommerce' );
808
- foreach ( $postObjects as $postObject ) {
809
- if ( empty( $postObject->label ) ) {
810
- continue;
811
- }
812
-
813
- // We don't want to include archives for the WooCommerce shop page.
814
- if (
815
- $hasArchivesOnly &&
816
- (
817
- ! $postObject->has_archive ||
818
- ( 'product' === $postObject->name && $woocommerce )
819
- )
820
- ) {
821
- continue;
822
- }
823
-
824
- if ( $namesOnly ) {
825
- $postTypes[] = $postObject->name;
826
- continue;
827
- }
828
-
829
- if ( 'attachment' === $postObject->name ) {
830
- $postObject->label = __( 'Attachments', 'all-in-one-seo-pack' );
831
- }
832
-
833
- if ( 'product' === $postObject->name && $woocommerce ) {
834
- $postObject->menu_icon = 'dashicons-products';
835
- }
836
-
837
- $name = $postObject->name;
838
- if ( 'type' === $postObject->name && $rewriteType ) {
839
- $name = '_aioseo_type';
840
- }
841
-
842
- $postTypes[] = [
843
- 'name' => $name,
844
- 'label' => ucwords( $postObject->label ),
845
- 'singular' => ucwords( $postObject->labels->singular_name ),
846
- 'icon' => $postObject->menu_icon,
847
- 'hasExcerpt' => post_type_supports( $postObject->name, 'excerpt' ),
848
- 'hasArchive' => $postObject->has_archive,
849
- 'hierarchical' => $postObject->hierarchical,
850
- 'taxonomies' => get_object_taxonomies( $name ),
851
- 'slug' => isset( $postObject->rewrite['slug'] ) ? $postObject->rewrite['slug'] : $name
852
- ];
853
- }
854
-
855
- return $postTypes;
856
- }
857
-
858
- /**
859
- * Retrieve a list of public taxonomies with slugs/icons.
860
- *
861
- * @since 4.0.0
862
- *
863
- * @param boolean $namesOnly Whether only the names should be returned.
864
- * @param boolean $rewriteType Whether or not to rewrite the type slugs.
865
- * @return array An array of public taxonomies.
866
- */
867
- public function getPublicTaxonomies( $namesOnly = false, $rewriteType = false ) {
868
- $taxonomies = [];
869
- if ( count( $taxonomies ) ) {
870
- return $taxonomies;
871
- }
872
-
873
- $taxObjects = get_taxonomies( [ 'public' => true ], 'objects' );
874
- foreach ( $taxObjects as $taxObject ) {
875
- if ( empty( $taxObject->label ) ) {
876
- continue;
877
- }
878
-
879
- if ( in_array( $taxObject->name, [
880
- 'product_shipping_class',
881
- 'post_format'
882
- ], true ) ) {
883
- continue;
884
- }
885
-
886
- // We need to exclude product attributes from this list as well.
887
- if (
888
- 'pa_' === substr( $taxObject->name, 0, 3 ) &&
889
- 'manage_product_terms' === $taxObject->cap->manage_terms &&
890
- ! apply_filters( 'aioseo_woocommerce_product_attributes', false )
891
- ) {
892
- continue;
893
- }
894
-
895
- if ( $namesOnly ) {
896
- $taxonomies[] = $taxObject->name;
897
- continue;
898
- }
899
-
900
- $name = $taxObject->name;
901
- if ( 'type' === $taxObject->name && $rewriteType ) {
902
- $name = '_aioseo_type';
903
- }
904
-
905
- $taxonomies[] = [
906
- 'name' => $name,
907
- 'label' => ucwords( $taxObject->label ),
908
- 'singular' => ucwords( $taxObject->labels->singular_name ),
909
- 'icon' => strpos( $taxObject->label, 'categor' ) !== false ? 'dashicons-category' : 'dashicons-tag',
910
- 'hierarchical' => $taxObject->hierarchical,
911
- 'slug' => isset( $taxObject->rewrite['slug'] ) ? $taxObject->rewrite['slug'] : ''
912
- ];
913
- }
914
-
915
- return $taxonomies;
916
- }
917
-
918
- /**
919
- * Returns noindexed post types.
920
- *
921
- * @since 4.0.0
922
- *
923
- * @return array A list of noindexed post types.
924
- */
925
- public function getNoindexedPostTypes() {
926
- return $this->getNoindexedObjects( 'postTypes' );
927
- }
928
-
929
- /**
930
- * Checks whether a given post type is noindexed.
931
- *
932
- * @since 4.0.0
933
- *
934
- * @param string $postType The post type.
935
- * @return bool Whether the post type is noindexed.
936
- */
937
- public function isPostTypeNoindexed( $postType ) {
938
- $noindexedPostTypes = $this->getNoindexedPostTypes();
939
- return in_array( $postType, $noindexedPostTypes, true );
940
- }
941
-
942
- /**
943
- * Normalize Post Type or Taxonomy names to work properly with AIOSEO.
944
- *
945
- * @since 4.1.3
946
- *
947
- * @param array $items Array of items to normalize.
948
- * @return array Array of items normalized.
949
- */
950
- public function normalizePostTypeTaxonomyNames( $items ) {
951
- foreach ( $items as &$item ) {
952
- if ( 'type' === $item['name'] ) {
953
- $item['name'] = '_aioseo_type';
954
- }
955
- }
956
-
957
- return $items;
958
- }
959
-
960
- /**
961
- * Returns noindexed taxonomies.
962
- *
963
- * @since 4.0.0
964
- *
965
- * @return array A list of noindexed taxonomies.
966
- */
967
- public function getNoindexedTaxonomies() {
968
- return $this->getNoindexedObjects( 'taxonomies' );
969
- }
970
-
971
- /**
972
- * Checks whether a given post type is noindexed.
973
- *
974
- * @since 4.0.0
975
- *
976
- * @param string $taxonomy The taxonomy.
977
- * @return bool Whether the taxonomy is noindexed.
978
- */
979
- public function isTaxonomyNoindexed( $taxonomy ) {
980
- $noindexedTaxonomies = $this->getNoindexedTaxonomies();
981
- return in_array( $taxonomy, $noindexedTaxonomies, true );
982
- }
983
-
984
- /**
985
- * Returns noindexed object types of a given parent type.
986
- *
987
- * @since 4.0.0
988
- *
989
- * @param string $type The parent object type ("postTypes" or "taxonomies").
990
- * @return array A list of noindexed objects types.
991
- */
992
- private function getNoindexedObjects( $type ) {
993
- $noindexed = [];
994
- foreach ( aioseo()->options->searchAppearance->dynamic->$type->all() as $name => $object ) {
995
- if (
996
- ! $object['show'] ||
997
- ( $object['advanced']['robotsMeta'] && ! $object['advanced']['robotsMeta']['default'] && $object['advanced']['robotsMeta']['noindex'] )
998
- ) {
999
- $noindexed[] = $name;
1000
- }
1001
- }
1002
- return $noindexed;
1003
- }
1004
-
1005
- /**
1006
- * Retrieve a list of users that match passed in roles.
1007
- *
1008
- * @since 4.0.0
1009
- *
1010
- * @return array An array of user data.
1011
- */
1012
- public function getSiteUsers( $roles ) {
1013
- static $users = [];
1014
-
1015
- if ( ! empty( $users ) ) {
1016
- return $users;
1017
- }
1018
-
1019
- $rolesWhere = [];
1020
- foreach ( $roles as $role ) {
1021
- $rolesWhere[] = '(um.meta_key = \'' . aioseo()->db->db->prefix . 'capabilities\' AND um.meta_value LIKE \'%\"' . $role . '\"%\')';
1022
- }
1023
- $dbUsers = aioseo()->db->start( 'users as u' )
1024
- ->select( 'u.ID, u.display_name, u.user_nicename, u.user_email' )
1025
- ->join( 'usermeta as um', 'u.ID = um.user_id' )
1026
- ->whereRaw( '(' . implode( ' OR ', $rolesWhere ) . ')' )
1027
- ->orderBy( 'u.user_nicename' )
1028
- ->run()
1029
- ->result();
1030
-
1031
- foreach ( $dbUsers as $dbUser ) {
1032
- $users[] = [
1033
- 'id' => intval( $dbUser->ID ),
1034
- 'displayName' => $dbUser->display_name,
1035
- 'niceName' => $dbUser->user_nicename,
1036
- 'email' => $dbUser->user_email,
1037
- 'gravatar' => get_avatar_url( $dbUser->user_email )
1038
- ];
1039
- }
1040
-
1041
- return $users;
1042
- }
1043
-
1044
- /**
1045
- * Strips punctuation from a given string.
1046
- *
1047
- * @since 4.0.0
1048
- *
1049
- * @param string $string The string.
1050
- * @return string The string without punctuation.
1051
- */
1052
- public function stripPunctuation( $string ) {
1053
- $string = preg_replace( '#\p{P}#u', '', $string );
1054
- // Trim both internal and external whitespace.
1055
- return preg_replace( '/\s\s+/u', ' ', trim( $string ) );
1056
- }
1057
-
1058
- /*
1059
- * Sanitize Domain
1060
- *
1061
- * @since 4.0.0
1062
- *
1063
- * @param string $domain The domain to sanitize.
1064
- * @return mixed|string The sanitized domain.
1065
- */
1066
- public function sanitizeDomain( $domain ) {
1067
- $domain = trim( $domain );
1068
- $domain = strtolower( $domain );
1069
- if ( 0 === strpos( $domain, 'http://' ) ) {
1070
- $domain = substr( $domain, 7 );
1071
- } elseif ( 0 === strpos( $domain, 'https://' ) ) {
1072
- $domain = substr( $domain, 8 );
1073
- }
1074
- $domain = untrailingslashit( $domain );
1075
-
1076
- return $domain;
1077
- }
1078
-
1079
- /**
1080
- * Get's the site domain.
1081
- *
1082
- * @since 4.0.0
1083
- *
1084
- * @return string The site's domain.
1085
- */
1086
- public function getSiteDomain() {
1087
- return wp_parse_url( home_url(), PHP_URL_HOST );
1088
- }
1089
-
1090
- /**
1091
- * Get's the site URL.
1092
- * NOTE: For multisites inside a sub-directory, this returns the URL for the main site.
1093
- * This is intentional.
1094
- *
1095
- * @since 4.0.0
1096
- *
1097
- * @return string The site's domain.
1098
- */
1099
- public function getSiteUrl() {
1100
- return wp_parse_url( home_url(), PHP_URL_SCHEME ) . '://' . wp_parse_url( home_url(), PHP_URL_HOST );
1101
- }
1102
-
1103
- /**
1104
- * Returns the current URL.
1105
- *
1106
- * @since 4.0.0
1107
- *
1108
- * @param boolean $canonical Whether or not to get the canonical URL.
1109
- * @return string The URL.
1110
- */
1111
- public function getUrl( $canonical = false ) {
1112
- if ( is_singular() ) {
1113
- $object = get_queried_object_id();
1114
- return $canonical ? wp_get_canonical_url( $object ) : get_permalink( $object );
1115
- }
1116
-
1117
- global $wp;
1118
- return trailingslashit( home_url( $wp->request ) );
1119
- }
1120
-
1121
- /**
1122
- * Gets the canonical URL for the current page/post.
1123
- *
1124
- * @since 4.0.0
1125
- *
1126
- * @return string $url The canonical URL.
1127
- */
1128
- public function canonicalUrl() {
1129
- static $canonicalUrl = '';
1130
- if ( $canonicalUrl ) {
1131
- return $canonicalUrl;
1132
- }
1133
-
1134
- $metaData = [];
1135
- $post = $this->getPost();
1136
- if ( $post ) {
1137
- $metaData = aioseo()->meta->metaData->getMetaData( $post );
1138
- }
1139
-
1140
- if ( is_category() || is_tag() || is_tax() ) {
1141
- $metaData = aioseo()->meta->metaData->getMetaData( get_queried_object() );
1142
- }
1143
-
1144
- if ( $metaData && ! empty( $metaData->canonical_url ) ) {
1145
- return $metaData->canonical_url;
1146
- }
1147
-
1148
- $url = $this->getUrl( true );
1149
- if ( aioseo()->options->searchAppearance->advanced->noPaginationForCanonical && 1 < $this->getPageNumber() ) {
1150
- $url = preg_replace( '#(\d+\/|(?<=\/)page\/\d+\/)$#', '', $url );
1151
- }
1152
-
1153
- $url = $this->maybeRemoveTrailingSlash( $url );
1154
-
1155
- // Get rid of /amp at the end of the URL.
1156
- if ( ! apply_filters( 'aioseo_disable_canonical_url_amp', false ) ) {
1157
- $url = preg_replace( '/\/amp$/', '', $url );
1158
- $url = preg_replace( '/\/amp\/$/', '/', $url );
1159
- }
1160
-
1161
- $searchTerm = get_query_var( 's' );
1162
- if ( is_search() && ! empty( $searchTerm ) ) {
1163
- $url = add_query_arg( 's', $searchTerm, $url );
1164
- }
1165
-
1166
- return apply_filters( 'aioseo_canonical_url', $url );
1167
- }
1168
-
1169
- /**
1170
- * Remove trailing slashes if not set in the permalink structure.
1171
- *
1172
- * @since 4.0.0
1173
- *
1174
- * @param string $url The original URL.
1175
- * @return string The adjusted URL.
1176
- */
1177
- public function maybeRemoveTrailingSlash( $url ) {
1178
- $permalinks = get_option( 'permalink_structure' );
1179
- if ( $permalinks && ( ! is_home() || ! is_front_page() ) ) {
1180
- $trailing = substr( $permalinks, -1 );
1181
- if ( '/' !== $trailing ) {
1182
- $url = untrailingslashit( $url );
1183
- }
1184
- }
1185
-
1186
- // Don't slash urls with query args.
1187
- if ( false !== strpos( $url, '?' ) ) {
1188
- $url = untrailingslashit( $url );
1189
- }
1190
-
1191
- return $url;
1192
- }
1193
-
1194
- /**
1195
- * Returns the page number of the current page.
1196
- *
1197
- * @since 4.0.0
1198
- *
1199
- * @return int The page number.
1200
- */
1201
- public function getPageNumber() {
1202
- $page = get_query_var( 'page' );
1203
- $paged = get_query_var( 'paged' );
1204
- return ! empty( $page )
1205
- ? $page
1206
- : (
1207
- ! empty( $paged )
1208
- ? $paged
1209
- : 1
1210
- );
1211
- }
1212
-
1213
- /**
1214
- * Request the remote URL via wp_remote_post and return a json decoded response.
1215
- *
1216
- * @since 4.0.0
1217
- *
1218
- * @param array $body The content to retrieve from the remote URL.
1219
- * @param array $headers The headers to send to the remote URL.
1220
- *
1221
- * @return string|bool Json decoded response on success, false on failure.
1222
- */
1223
- public function sendRequest( $url, $body = [], $headers = [] ) {
1224
- $body = wp_json_encode( $body );
1225
-
1226
- // Build the headers of the request.
1227
- $headers = wp_parse_args(
1228
- $headers,
1229
- [
1230
- 'Content-Type' => 'application/json'
1231
- ]
1232
- );
1233
-
1234
- // Setup variable for wp_remote_post.
1235
- $post = [
1236
- 'headers' => $headers,
1237
- 'body' => $body,
1238
- 'sslverify' => $this->isDev() ? false : true,
1239
- 'timeout' => 20
1240
- ];
1241
-
1242
- // Perform the query and retrieve the response.
1243
- $response = wp_remote_post( $url, $post );
1244
- $responseBody = wp_remote_retrieve_body( $response );
1245
-
1246
- // Bail out early if there are any errors.
1247
- if ( is_wp_error( $responseBody ) ) {
1248
- return false;
1249
- }
1250
-
1251
- // Return the json decoded content.
1252
- return json_decode( $responseBody );
1253
- }
1254
-
1255
- /**
1256
- * Get the class name for the Score button.
1257
- * Depending on the score the button should have different color.
1258
- *
1259
- * @since 4.0.0
1260
- *
1261
- * @param int $score The content to retrieve from the remote URL.
1262
- *
1263
- * @return string The class name for Score button.
1264
- */
1265
- public function getScoreClass( $score ) {
1266
- $scoreClass = 50 < $score ? 'score-orange' : 'score-red';
1267
- if ( 0 === $score ) {
1268
- $scoreClass = 'score-none';
1269
- }
1270
- if ( $score >= 80 ) {
1271
- $scoreClass = 'score-green';
1272
- }
1273
- return $scoreClass;
1274
- }
1275
-
1276
- /**
1277
- * Returns the ID of the site logo if it exists.
1278
- *
1279
- * @since 4.0.0
1280
- *
1281
- * @return int
1282
- */
1283
- public function getSiteLogoId() {
1284
- if ( ! get_theme_support( 'custom-logo' ) ) {
1285
- return false;
1286
- }
1287
- return get_theme_mod( 'custom_logo' );
1288
- }
1289
-
1290
- /**
1291
- * Returns the URL of the site logo if it exists.
1292
- *
1293
- * @since 4.0.0
1294
- *
1295
- * @return string
1296
- */
1297
- public function getSiteLogoUrl() {
1298
- $id = $this->getSiteLogoId();
1299
- if ( ! $id ) {
1300
- return false;
1301
- }
1302
-
1303
- $image = wp_get_attachment_image_src( $id, 'full' );
1304
- if ( empty( $image ) ) {
1305
- return false;
1306
- }
1307
- return $image[0];
1308
- }
1309
-
1310
- /**
1311
- * Compares two (multidimensional) arrays to see if they're different.
1312
- *
1313
- * @since 4.0.0
1314
- *
1315
- * @param array $array1 The first array.
1316
- * @param array $array2 The second array.
1317
- * @return boolean Whether the arrays are different.
1318
- */
1319
- public function arraysDifferent( $array1, $array2 ) {
1320
- foreach ( $array1 as $key => $value ) {
1321
- // Check for non-existing values.
1322
- if ( ! isset( $array2[ $key ] ) ) {
1323
- return true;
1324
- }
1325
- if ( is_array( $value ) ) {
1326
- if ( $this->arraysDifferent( $value, $array2[ $key ] ) ) {
1327
- return true;
1328
- };
1329
- } else {
1330
- if ( $value !== $array2[ $key ] ) {
1331
- return true;
1332
- }
1333
- }
1334
- }
1335
- return false;
1336
- }
1337
-
1338
- /**
1339
- * Returns the filesystem object if we have access to it.
1340
- *
1341
- * @since 4.0.0
1342
- *
1343
- * @param array $args The connection args.
1344
- * @return WP_Filesystem The filesystem object.
1345
- */
1346
- public function wpfs( $args = [] ) {
1347
- require_once( ABSPATH . 'wp-admin/includes/file.php' );
1348
- WP_Filesystem( $args );
1349
-
1350
- global $wp_filesystem;
1351
- if ( is_object( $wp_filesystem ) ) {
1352
- return $wp_filesystem;
1353
- }
1354
- return false;
1355
- }
1356
-
1357
- /**
1358
- * Internationalize.
1359
- *
1360
- * @since 4.0.0
1361
- *
1362
- * @param $in
1363
- * @return mixed|void
1364
- */
1365
- public function internationalize( $in ) {
1366
- if ( function_exists( 'langswitch_filter_langs_with_message' ) ) {
1367
- $in = langswitch_filter_langs_with_message( $in );
1368
- }
1369
-
1370
- if ( function_exists( 'polyglot_filter' ) ) {
1371
- $in = polyglot_filter( $in );
1372
- }
1373
-
1374
- if ( function_exists( 'qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage' ) ) {
1375
- $in = qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage( $in );
1376
- } elseif ( function_exists( 'ppqtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage' ) ) {
1377
- $in = ppqtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage( $in );
1378
- } elseif ( function_exists( 'qtranxf_useCurrentLanguageIfNotFoundUseDefaultLanguage' ) ) {
1379
- $in = qtranxf_useCurrentLanguageIfNotFoundUseDefaultLanguage( $in );
1380
- }
1381
-
1382
- return apply_filters( 'localization', $in );
1383
- }
1384
-
1385
- /**
1386
- * Truncates a given string.
1387
- *
1388
- * @since 4.0.0
1389
- *
1390
- * @param string $string The string.
1391
- * @param int $maxCharacters The max. amount of characters.
1392
- * @param boolean $shouldHaveEllipsis Whether the string should have a trailing ellipsis (defaults to true).
1393
- * @return string $string The string.
1394
- */
1395
- public function truncate( $string, $maxCharacters, $shouldHaveEllipsis = true ) {
1396
- $length = strlen( $string );
1397
- $excessLength = $length - $maxCharacters;
1398
- if ( 0 < $excessLength ) {
1399
- // If the string is longer than 65535 characters, we first need to shorten it due to the character limit of the regex pattern quantifier.
1400
- if ( 65535 < $length ) {
1401
- $string = substr( $string, 0, 65534 );
1402
- }
1403
- $string = preg_replace( "#[^\pZ\pP]*.{{$excessLength}}$#", '', $string );
1404
- if ( $shouldHaveEllipsis ) {
1405
- $string = $string . ' ...';
1406
- }
1407
- }
1408
- return $string;
1409
- }
1410
-
1411
- /**
1412
- * Removes image dimensions from the slug of a URL.
1413
- *
1414
- * @since 4.0.0
1415
- *
1416
- * @param string $url The image URL.
1417
- * @return string The formatted image URL.
1418
- */
1419
- public function removeImageDimensions( $url ) {
1420
- return $this->isValidAttachment( $url ) ? preg_replace( '#(-[0-9]*x[0-9]*)#', '', $url ) : $url;
1421
- }
1422
-
1423
- /**
1424
- * Returns the URLs of the pages that WooCommerce noindexes on its own.
1425
- *
1426
- * @since 4.0.0
1427
- *
1428
- * @return array The URLs of the noindexed pages.
1429
- */
1430
- public function getNoindexedWooCommercePages() {
1431
- if ( ! $this->isWooCommerceActive() ) {
1432
- return [];
1433
- }
1434
- return [
1435
- wc_get_cart_url(),
1436
- wc_get_checkout_url(),
1437
- wc_get_page_permalink( 'myaccount' )
1438
- ];
1439
- }
1440
-
1441
- /**
1442
- * Checks if the server is running on Apache.
1443
- *
1444
- * @since 4.0.0
1445
- *
1446
- * @return boolean Whether or not it is on apache.
1447
- */
1448
- public function isApache() {
1449
- if ( ! isset( $_SERVER['SERVER_SOFTWARE'] ) ) {
1450
- return false;
1451
- }
1452
-
1453
- return stripos( sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ), 'apache' ) !== false;
1454
- }
1455
-
1456
- /**
1457
- * Checks if the server is running on nginx.
1458
- *
1459
- * @since 4.0.0
1460
- *
1461
- * @return boolean Whether or not it is on apache.
1462
- */
1463
- public function isNginx() {
1464
- if ( ! isset( $_SERVER['SERVER_SOFTWARE'] ) ) {
1465
- return false;
1466
- }
1467
-
1468
- $server = sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) );
1469
-
1470
- if (
1471
- stripos( $server, 'Flywheel' ) !== false ||
1472
- stripos( $server, 'nginx' ) !== false
1473
- ) {
1474
- return true;
1475
- }
1476
-
1477
- return false;
1478
- }
1479
-
1480
- /**
1481
- * Get Network ID
1482
- *
1483
- * @since 4.0.0
1484
- *
1485
- * @return int The integer of the blog/site id.
1486
- */
1487
- public function getNetworkId() {
1488
- if ( is_multisite() ) {
1489
- return get_network()->site_id;
1490
- }
1491
- return get_current_blog_id();
1492
- }
1493
-
1494
- /**
1495
- * Validate IP addresses.
1496
- *
1497
- * @since 4.0.0
1498
- *
1499
- * @param string $ip The IP address to validate.
1500
- * @return boolean If the IP address is valid or not.
1501
- */
1502
- public function validateIp( $ip ) {
1503
- if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) {
1504
- // Valid IPV4.
1505
- return true;
1506
- }
1507
-
1508
- if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 ) ) {
1509
- // Valid IPV6.
1510
- return true;
1511
- }
1512
-
1513
- // Doesn't seem to be a valid IP.
1514
- return false;
1515
- }
1516
-
1517
- /**
1518
- * Convert bytes to readable format.
1519
- *
1520
- * @since 4.0.0
1521
- *
1522
- * @param integer $bytes The size of the file.
1523
- * @return string The size as a string.
1524
- */
1525
- public function convertFileSize( $bytes ) {
1526
- if ( empty( $bytes ) ) {
1527
- return [
1528
- 'original' => 0,
1529
- 'readable' => '0 B'
1530
- ];
1531
- }
1532
- $i = floor( log( $bytes ) / log( 1024 ) );
1533
- $sizes = [ 'B', 'KB', 'MB', 'GB', 'TB' ];
1534
- return [
1535
- 'original' => $bytes,
1536
- 'readable' => sprintf( '%.02F', $bytes / pow( 1024, $i ) ) * 1 . ' ' . $sizes[ $i ]
1537
- ];
1538
- }
1539
-
1540
- /**
1541
- * Get timezone offset.
1542
- * We use the code from `wp_timezone_string()`
1543
- * which became available in WP 5.3+
1544
- *
1545
- * @since 4.0.0
1546
- *
1547
- * @return string
1548
- */
1549
- public function getTimeZoneOffset() {
1550
- // The code below is basically a copy-paste from that function.
1551
- $timezoneString = get_option( 'timezone_string' );
1552
-
1553
- if ( $timezoneString ) {
1554
- return $timezoneString;
1555
- }
1556
-
1557
- $offset = (float) get_option( 'gmt_offset' );
1558
- $hours = (int) $offset;
1559
- $minutes = ( $offset - $hours );
1560
- $sign = ( $offset < 0 ) ? '-' : '+';
1561
- $absHour = abs( $hours );
1562
- $absMins = abs( $minutes * 60 );
1563
- $tzOffset = sprintf( '%s%02d:%02d', $sign, $absHour, $absMins );
1564
-
1565
- return $tzOffset;
1566
- }
1567
-
1568
- /**
1569
- * Returns the current post object.
1570
- *
1571
- * @since 4.0.0
1572
- *
1573
- * @param int $postId The post ID.
1574
- * @return WP_Post The post object.
1575
- */
1576
- public function getPost( $postId = false ) {
1577
- static $showOnFront = null;
1578
- static $pageOnFront = null;
1579
- static $pageForPosts = null;
1580
-
1581
- $postId = is_a( $postId, 'WP_Post' ) ? $postId->ID : $postId;
1582
-
1583
- if ( aioseo()->helpers->isWooCommerceShopPage( $postId ) ) {
1584
- return get_post( wc_get_page_id( 'shop' ) );
1585
- }
1586
-
1587
- if ( is_front_page() || is_home() ) {
1588
- $showOnFront = $showOnFront ? $showOnFront : 'page' === get_option( 'show_on_front' );
1589
- if ( $showOnFront ) {
1590
- if ( is_front_page() ) {
1591
- $pageOnFront = $pageOnFront ? $pageOnFront : (int) get_option( 'page_on_front' );
1592
- return get_post( $pageOnFront );
1593
- } elseif ( is_home() ) {
1594
- $pageForPosts = $pageForPosts ? $pageForPosts : (int) get_option( 'page_for_posts' );
1595
- return get_post( $pageForPosts );
1596
- }
1597
- }
1598
-
1599
- return get_post();
1600
- }
1601
-
1602
- if (
1603
- $this->isScreenBase( 'post' ) ||
1604
- $postId ||
1605
- is_singular()
1606
- ) {
1607
- return get_post( $postId );
1608
- }
1609
- }
1610
-
1611
- /**
1612
- * Get Queried Object.
1613
- *
1614
- * @since 4.0.0
1615
- *
1616
- * @return null|\WP_Post Current WP object queried.
1617
- */
1618
- public function getQueriedObject() {
1619
- global $wp_query, $post;
1620
-
1621
- if ( is_object( $post ) ) {
1622
- return $post;
1623
- } else {
1624
- if ( ! $wp_query ) {
1625
- return null;
1626
- }
1627
- return $wp_query->get_queried_object();
1628
- }
1629
- }
1630
-
1631
- /**
1632
- * Returns the page content.
1633
- *
1634
- * @since 4.0.0
1635
- *
1636
- * @param WP_Post|int $post The post.
1637
- * @return string The content.
1638
- */
1639
- public function getContent( $post = null ) {
1640
- $post = ( $post && is_object( $post ) ) ? $post : $post = $this->getPost( $post );
1641
-
1642
- static $content = [];
1643
- if ( isset( $content[ $post->ID ] ) ) {
1644
- return $content[ $post->ID ];
1645
- }
1646
-
1647
- if ( empty( $post->post_content ) ) {
1648
- return $post->post_content;
1649
- }
1650
-
1651
- $postContent = $post->post_content;
1652
- if (
1653
- ! in_array( 'runShortcodesInDescription', aioseo()->internalOptions->deprecatedOptions, true ) ||
1654
- aioseo()->options->deprecated->searchAppearance->advanced->runShortcodesInDescription
1655
- ) {
1656
- $postContent = $this->doShortcodes( $postContent );
1657
- }
1658
-
1659
- $postContent = wp_trim_words( $postContent, 55, apply_filters( 'excerpt_more', ' ' . '[&hellip;]' ) );
1660
- $postContent = str_replace( ']]>', ']]&gt;', $postContent );
1661
- $postContent = preg_replace( '#(<figure.*\/figure>|<img.*\/>)#', '', $postContent );
1662
- $content[ $post->ID ] = trim( wp_strip_all_tags( strip_shortcodes( $postContent ) ) );
1663
- return $content[ $post->ID ];
1664
- }
1665
-
1666
- /**
1667
- * Returns custom fields as a string.
1668
- *
1669
- * @since 4.0.6
1670
- *
1671
- * @param WP_Post|int $post The post.
1672
- * @param array $keys The post meta_keys to check for values.
1673
- * @return string The custom field content.
1674
- */
1675
- public function getCustomFieldsContent( $post = null, $keys = [] ) {
1676
- $post = ( $post && is_object( $post ) ) ? $post : $this->getPost( $post );
1677
-
1678
- $customFieldContent = '';
1679
-
1680
- $acfFields = $this->getAcfContent( $post );
1681
- $acfFieldsKeys = [];
1682
-
1683
- if ( ! empty( $acfFields ) ) {
1684
- foreach ( $acfFields as $acfField => $acfValue ) {
1685
- if ( in_array( $acfField, $keys, true ) ) {
1686
- $customFieldContent .= "{$acfValue} ";
1687
- $acfFieldsKeys[] = $acfField;
1688
- }
1689
- }
1690
- }
1691
-
1692
- foreach ( $keys as $key ) {
1693
- if ( in_array( $key, $acfFieldsKeys, true ) ) {
1694
- continue;
1695
- }
1696
-
1697
- $value = get_post_meta( $post->ID, $key, true );
1698
-
1699
- if ( $value ) {
1700
- $customFieldContent .= "{$value} ";
1701
- }
1702
- }
1703
-
1704
- return $customFieldContent;
1705
- }
1706
-
1707
- /**
1708
- * Returns acf fields as an array of meta keys and values.
1709
- *
1710
- * @since 4.0.6
1711
- *
1712
- * @param WP_Post|int $post The post.
1713
- * @param array $allowedTypes A whitelist of ACF field types.
1714
- * @return array An array of meta keys and values.
1715
- */
1716
- public function getAcfContent( $post = null, $types = [] ) {
1717
- $post = ( $post && is_object( $post ) ) ? $post : $this->getPost( $post );
1718
-
1719
- if ( ! class_exists( 'ACF' ) || ! function_exists( 'get_field_objects' ) ) {
1720
- return [];
1721
- }
1722
-
1723
- if ( defined( 'ACF_VERSION' ) && version_compare( ACF_VERSION, '5.7.0', '<' ) ) {
1724
- return [];
1725
- }
1726
-
1727
- // Set defaults.
1728
- $allowedTypes = [
1729
- 'text',
1730
- 'textarea',
1731
- 'email',
1732
- 'url',
1733
- 'wysiwyg',
1734
- 'image',
1735
- 'gallery',
1736
- // 'link',
1737
- // 'taxonomy',
1738
- ];
1739
-
1740
- $types = wp_parse_args( $types, $allowedTypes );
1741
- $acfFields = [];
1742
-
1743
- $fieldObjects = get_field_objects( $post->ID );
1744
- if ( ! empty( $fieldObjects ) ) {
1745
- foreach ( $fieldObjects as $field ) {
1746
- if ( empty( $field['value'] ) ) {
1747
- continue;
1748
- }
1749
-
1750
- if ( ! in_array( $field['type'], $types, true ) ) {
1751
- continue;
1752
- }
1753
-
1754
- if ( 'url' === $field['type'] ) {
1755
- // Url field
1756
- $value = "<a href='{$field['value']}'>{$field['value']}</a>";
1757
- } elseif ( 'image' === $field['type'] ) {
1758
- // Image field
1759
- $value = "<img src='{$field['value']['url']}'>";
1760
- } elseif ( 'gallery' === $field['type'] ) {
1761
- // Image field
1762
- $value = "<img src='{$field['value'][0]['url']}'>";
1763
- } else {
1764
- // Other fields
1765
- $value = $field['value'];
1766
- }
1767
-
1768
- if ( $value ) {
1769
- $acfFields[ $field['name'] ] = $value;
1770
- }
1771
- }
1772
- }
1773
-
1774
- return $acfFields;
1775
- }
1776
-
1777
- /**
1778
- * Returns the posts custom fields.
1779
- *
1780
- * @since 4.0.6
1781
- *
1782
- * @param WP_Post|int $post The post.
1783
- * @return string The custom field content.
1784
- */
1785
- public function getAnalysisContent( $post = null ) {
1786
- $post = ( $post && is_object( $post ) ) ? $post : $this->getPost( $post );
1787
- $customFieldKeys = aioseo()->options->searchAppearance->dynamic->postTypes->{$post->post_type}->customFields;
1788
-
1789
- if ( empty( $customFieldKeys ) ) {
1790
- return get_post_field( 'post_content', $post->ID );
1791
- }
1792
-
1793
- $customFieldKeys = explode( ' ', sanitize_text_field( $customFieldKeys ) );
1794
- $customFieldContent = $this->getCustomFieldsContent( $post->ID, $customFieldKeys );
1795
- $analysisContent = $post->post_content . apply_filters( 'aioseo_analysis_content', $customFieldContent );
1796
-
1797
- return sanitize_post_field( 'post_content', $analysisContent, $post->ID, 'display' );
1798
  }
1799
 
1800
  /**
1801
- * Returns the string after it is encoded with htmlspecialchars().
1802
  *
1803
- * @since 4.0.0
1804
  *
1805
- * @param string $string The string to encode.
1806
- * @return string The encoded string.
1807
  */
1808
- public function encodeOutputHtml( $string ) {
1809
- return htmlspecialchars( $string, ENT_COMPAT | ENT_HTML401, get_option( 'blog_charset' ), false );
1810
  }
1811
 
1812
  /**
1813
- * Returns the string after all HTML entities have been decoded.
1814
  *
1815
  * @since 4.0.0
1816
  *
1817
- * @param string $string The string to decode.
1818
- * @return string The decoded string.
 
 
1819
  */
1820
- public function decodeHtmlEntities( $string ) {
1821
- return html_entity_decode( (string) $string, ENT_QUOTES );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1822
  }
1823
 
1824
  /**
1825
- * Returns if the page is a special type one (WooCommerce pages, Privacy page).
1826
  *
1827
  * @since 4.0.0
1828
  *
1829
- * @param int $postId The post ID.
1830
- * @return boolean If the page is special or not.
1831
  */
1832
- public function isSpecialPage( $postId = false ) {
1833
- if (
1834
- (int) get_option( 'page_for_posts' ) === (int) $postId ||
1835
- (int) get_option( 'wp_page_for_privacy_policy' ) === (int) $postId ||
1836
- $this->isBuddyPressPage( $postId ) ||
1837
- $this->isWooCommercePage( $postId )
1838
- ) {
1839
- return true;
1840
  }
1841
 
1842
- return false;
1843
  }
1844
 
1845
  /**
1846
- * Returns if the page is a WooCommerce page (Cart, Checkout, ...).
1847
  *
1848
  * @since 4.0.0
1849
  *
1850
- * @param int $postId The post ID.
1851
- * @return boolean If the page is a WooCommerce page or not.
1852
  */
1853
- public function isWooCommercePage( $postId = false ) {
1854
- if ( ! $this->isWooCommerceActive() ) {
1855
  return false;
1856
  }
1857
 
1858
- static $cartPageId;
1859
- if ( ! $cartPageId ) {
1860
- $cartPageId = (int) get_option( 'woocommerce_cart_page_id' );
1861
- }
1862
- static $checkoutPageId;
1863
- if ( ! $checkoutPageId ) {
1864
- $checkoutPageId = (int) get_option( 'woocommerce_checkout_page_id' );
1865
- }
1866
- static $myAccountPageId;
1867
- if ( ! $myAccountPageId ) {
1868
- $myAccountPageId = (int) get_option( 'woocommerce_myaccount_page_id' );
1869
- }
1870
- static $termsPageId;
1871
- if ( ! $termsPageId ) {
1872
- $termsPageId = (int) get_option( 'woocommerce_terms_page_id' );
1873
- }
1874
  if (
1875
- $cartPageId === (int) $postId ||
1876
- $checkoutPageId === (int) $postId ||
1877
- $myAccountPageId === (int) $postId ||
1878
- $termsPageId === (int) $postId
1879
  ) {
1880
  return true;
1881
  }
@@ -1884,41 +158,47 @@ class Helpers {
1884
  }
1885
 
1886
  /**
1887
- * Returns if the page is a BuddyPress page (Activity, Members, Groups).
1888
  *
1889
  * @since 4.0.0
1890
  *
1891
- * @param int $postId The post ID.
1892
- * @return boolean If the page is a BuddyPress page or not.
1893
  */
1894
- public function isBuddyPressPage( $postId = false ) {
1895
- $bpPages = get_option( 'bp-pages' );
1896
-
1897
- if ( empty( $bpPages ) ) {
1898
- return false;
1899
  }
1900
 
1901
- foreach ( $bpPages as $page ) {
1902
- if ( (int) $page === (int) $postId ) {
1903
- return true;
1904
- }
1905
  }
1906
 
 
1907
  return false;
1908
  }
1909
 
1910
  /**
1911
- * Get's the estimated reading time for a string.
1912
  *
1913
  * @since 4.0.0
1914
  *
1915
- * @param string $string The string to count.
1916
- * @return integer The estimated reading time as an integer.
1917
  */
1918
- public function getReadingTime( $string ) {
1919
- $wpm = 250;
1920
- $word = str_word_count( wp_strip_all_tags( $string ) );
1921
- return round( $word / $wpm );
 
 
 
 
 
 
 
 
 
1922
  }
1923
 
1924
  /**
@@ -1953,287 +233,6 @@ class Helpers {
1953
  }
1954
  }
1955
 
1956
- /**
1957
- * Checks if WPML is active.
1958
- *
1959
- * @since 4.0.0
1960
- *
1961
- * @return bool True if it is, false if not.
1962
- */
1963
- public function isWpmlActive() {
1964
- return class_exists( 'SitePress' );
1965
- }
1966
-
1967
- /**
1968
- * Check if the post passed in is a valid post, not a revision or autosave.
1969
- *
1970
- * @since 4.0.5
1971
- *
1972
- * @param WP_Post $post The Post object to check.
1973
- * @return bool True if valid, false if not.
1974
- */
1975
- public function isValidPost( $post ) {
1976
- if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
1977
- return false;
1978
- }
1979
-
1980
- if ( ! is_object( $post ) ) {
1981
- $post = get_post( $post );
1982
- }
1983
-
1984
- // In order to prevent recursion, we are skipping scheduled-action posts.
1985
- if (
1986
- empty( $post ) ||
1987
- 'scheduled-action' === $post->post_type ||
1988
- 'revision' === $post->post_type ||
1989
- 'publish' !== $post->post_status
1990
- ) {
1991
- return false;
1992
- }
1993
-
1994
- return true;
1995
- }
1996
-
1997
- /**
1998
- * Returns the URL for the WP content folder.
1999
- *
2000
- * @since 4.0.5
2001
- *
2002
- * @return string The URL.
2003
- */
2004
- public function getWpContentUrl() {
2005
- $info = wp_get_upload_dir();
2006
- return isset( $info['baseurl'] ) ? $info['baseurl'] : '';
2007
- }
2008
-
2009
- /**
2010
- * Checks whether the given URL is a valid attachment.
2011
- *
2012
- * @since 4.0.13
2013
- *
2014
- * @param string $url The URL.
2015
- * @return boolean Whether the URL is a valid attachment.
2016
- */
2017
- public function isValidAttachment( $url ) {
2018
- $uploadDirUrl = aioseo()->helpers->escapeRegex( $this->getWpContentUrl() );
2019
- return preg_match( "/$uploadDirUrl.*/", $url );
2020
- }
2021
-
2022
- /**
2023
- * Escapes special regex characters.
2024
- *
2025
- * @since 4.0.5
2026
- *
2027
- * @param string $string The string.
2028
- * @return string The escaped string.
2029
- */
2030
- public function escapeRegex( $string ) {
2031
- return preg_quote( $string, '/' );
2032
- }
2033
-
2034
- /**
2035
- * Escapes special regex characters inside the replacement string.
2036
- *
2037
- * @since 4.0.7
2038
- *
2039
- * @param string $string The string.
2040
- * @return string The escaped string.
2041
- */
2042
- public function escapeRegexReplacement( $string ) {
2043
- return str_replace( '$', '\$', $string );
2044
- }
2045
-
2046
- /**
2047
- * preg_replace but with the replacement escaped.
2048
- *
2049
- * @since 4.0.10
2050
- *
2051
- * @param string $pattern The pattern to search for.
2052
- * @param string $replacement The replacement string.
2053
- * @param string $subject The subject to search in.
2054
- * @return string The subject with matches replaced.
2055
- */
2056
- public function pregReplace( $pattern, $replacement, $subject ) {
2057
- $replacement = $this->escapeRegexReplacement( $replacement );
2058
- return preg_replace( $pattern, $replacement, $subject );
2059
- }
2060
-
2061
- /**
2062
- * Checks whether we're on the given screen.
2063
- *
2064
- * @since 4.0.7
2065
- *
2066
- * @param string $screenName The screen name.
2067
- * @return boolean Whether we're on the given screen.
2068
- */
2069
- public function isScreenBase( $screenName ) {
2070
- $screen = $this->getCurrentScreen();
2071
- if ( ! $screen || ! isset( $screen->base ) ) {
2072
- return false;
2073
- }
2074
- return $screen->base === $screenName;
2075
- }
2076
-
2077
- /**
2078
- * Returns if current screen is of a post type
2079
- *
2080
- * @since 4.0.17
2081
- *
2082
- * @param string $postType Post type slug
2083
- *
2084
- * @return bool
2085
- */
2086
- public function isScreenPostType( $postType ) {
2087
- $screen = $this->getCurrentScreen();
2088
- if ( ! $screen || ! isset( $screen->post_type ) ) {
2089
- return false;
2090
- }
2091
- return $screen->post_type === $postType;
2092
- }
2093
-
2094
- /**
2095
- * Gets current admin screen
2096
- *
2097
- * @since 4.0.17
2098
- *
2099
- * @return false|\WP_Screen|null
2100
- */
2101
- public function getCurrentScreen() {
2102
- if ( ! is_admin() || ! function_exists( 'get_current_screen' ) ) {
2103
- return false;
2104
- }
2105
-
2106
- return get_current_screen();
2107
- }
2108
-
2109
- /**
2110
- * Extracts existing sitemap URLs from the robots.txt file.
2111
- *
2112
- * We need this in case users have existing sitemap directives added to their robots.txt file.
2113
- *
2114
- * @since 4.0.10
2115
- *
2116
- * @return array An array with robots.txt sitemap directives.
2117
- */
2118
- private function extractSitemapUrlsFromRobotsTxt() {
2119
- // First, we need to remove our filter, so that it doesn't run unintentionally.
2120
- remove_filter( 'robots_txt', [ aioseo()->robotsTxt, 'buildRules' ], 10000 );
2121
- $robotsTxt = apply_filters( 'robots_txt', '', true );
2122
- add_filter( 'robots_txt', [ aioseo()->robotsTxt, 'buildRules' ], 10000, 2 );
2123
-
2124
- if ( ! $robotsTxt ) {
2125
- return [];
2126
- }
2127
-
2128
- $lines = explode( "\n", $robotsTxt );
2129
- if ( ! is_array( $lines ) || ! count( $lines ) ) {
2130
- return [];
2131
- }
2132
-
2133
- return aioseo()->robotsTxt->extractSitemapUrls( explode( "\n", $robotsTxt ) );
2134
- }
2135
-
2136
- /**
2137
- * Tries to convert an attachment URL into a post ID.
2138
- *
2139
- * This our own optimized version of attachment_url_to_postid().
2140
- *
2141
- * @since 4.0.13
2142
- *
2143
- * @param string $url The attachment URL.
2144
- * @return int|boolean The attachment ID or false if no attachment could be found.
2145
- */
2146
- public function attachmentUrlToPostId( $url ) {
2147
- $cacheName = "aioseo_attachment_url_to_post_id_$url";
2148
-
2149
- $cachedId = wp_cache_get( $cacheName, 'aioseo' );
2150
- if ( $cachedId ) {
2151
- return 'none' !== $cachedId && is_numeric( $cachedId ) ? (int) $cachedId : false;
2152
- }
2153
-
2154
- $path = $url;
2155
- $uploadDirInfo = wp_get_upload_dir();
2156
-
2157
- $siteUrl = wp_parse_url( $uploadDirInfo['url'] );
2158
- $imagePath = wp_parse_url( $path );
2159
-
2160
- // Force the protocols to match if needed.
2161
- if ( isset( $imagePath['scheme'] ) && ( $imagePath['scheme'] !== $siteUrl['scheme'] ) ) {
2162
- $path = str_replace( $imagePath['scheme'], $siteUrl['scheme'], $path );
2163
- }
2164
-
2165
- if ( ! $this->isValidAttachment( $path ) ) {
2166
- wp_cache_set( $cacheName, 'none', 'aioseo', DAY_IN_SECONDS );
2167
- return false;
2168
- }
2169
-
2170
- if ( 0 === strpos( $path, $uploadDirInfo['baseurl'] . '/' ) ) {
2171
- $path = substr( $path, strlen( $uploadDirInfo['baseurl'] . '/' ) );
2172
- }
2173
-
2174
- $results = aioseo()->db->start( 'postmeta' )
2175
- ->select( 'post_id' )
2176
- ->where( 'meta_key', '_wp_attached_file' )
2177
- ->where( 'meta_value', $path )
2178
- ->limit( 1 )
2179
- ->run()
2180
- ->result();
2181
-
2182
- if ( empty( $results[0]->post_id ) ) {
2183
- wp_cache_set( $cacheName, 'none', 'aioseo', DAY_IN_SECONDS );
2184
- return false;
2185
- }
2186
-
2187
- wp_cache_set( $cacheName, $results[0]->post_id, 'aioseo', DAY_IN_SECONDS );
2188
- return $results[0]->post_id;
2189
- }
2190
-
2191
- /**
2192
- * Checks if we are in a dev environment or not.
2193
- *
2194
- * @since 4.1.0
2195
- *
2196
- * @return boolean True if we are, false if not.
2197
- */
2198
- public function isDev() {
2199
- return defined( 'AIOSEO_DEV_VERSION' ) || isset( $_REQUEST['aioseo-dev'] ); // phpcs:ignore HM.Security.NonceVerification.Recommended
2200
- }
2201
-
2202
- /**
2203
- * Returns the given JSON formatted data tags as a comma separated list with their values instead.
2204
- *
2205
- * @since 4.1.0
2206
- *
2207
- * @param string $tags The JSON formatted data tags.
2208
- * @return string The comma separated values.
2209
- */
2210
- public function jsonTagsToCommaSeparatedList( $tags ) {
2211
- $tags = json_decode( $tags );
2212
-
2213
- $values = [];
2214
- foreach ( $tags as $k => $tag ) {
2215
- $values[ $k ] = $tag->value;
2216
- }
2217
- return implode( ',', $values );
2218
- }
2219
-
2220
- /**
2221
- * Encodes a number of exceptions before we strip tags.
2222
- * We need this function to allow certain character (combinations) in the title/description.
2223
- *
2224
- * @since 4.1.1
2225
- *
2226
- * @param string $string The string.
2227
- * @return string $string The string with exceptions encoded.
2228
- */
2229
- public function encodeExceptions( $string ) {
2230
- $exceptions = [ '<3' ];
2231
- foreach ( $exceptions as $exception ) {
2232
- $string = preg_replace( "/$exception/", $this->encodeOutputHtml( $exception ), $string );
2233
- }
2234
- return $string;
2235
- }
2236
-
2237
  /**
2238
  * Checks if the given string is serialized, and if so, unserializes it.
2239
  * If the serialized string contains an object, we abort to prevent PHP object injection.
@@ -2257,48 +256,4 @@ class Helpers {
2257
  }
2258
  return $string;
2259
  }
2260
-
2261
- /**
2262
- * Validates a URL.
2263
- *
2264
- * @since 4.1.2
2265
- *
2266
- * @param string $url The url.
2267
- * @return bool Is it a valid/safe url.
2268
- */
2269
- public function isUrl( $url ) {
2270
- return esc_url_raw( $url ) === $url;
2271
- }
2272
-
2273
- /**
2274
- * Returns true if the request is a non-legacy REST API request.
2275
- * This function was copied from WooCommerce and improved.
2276
- *
2277
- * @since 4.1.2
2278
- *
2279
- * @return bool True if this is a REST API request.
2280
- */
2281
- public function isRestApiRequest() {
2282
- if ( empty( $_SERVER['REQUEST_URI'] ) ) {
2283
- return false;
2284
- }
2285
-
2286
- $restUrl = wp_parse_url( get_rest_url() );
2287
- $restUrl = $restUrl['path'] . ( ! empty( $restUrl['query'] ) ? '?' . $restUrl['query'] : '' );
2288
-
2289
- $isRestApiRequest = ( 0 === strpos( $_SERVER['REQUEST_URI'], $restUrl ) );
2290
-
2291
- return apply_filters( 'aioseo_is_rest_api_request', $isRestApiRequest );
2292
- }
2293
-
2294
- /**
2295
- * Checks whether the current request is an AJAX, CRON or REST request.
2296
- *
2297
- * @since 4.1.3
2298
- *
2299
- * @return bool Wether the request is an AJAX, CRON or REST request.
2300
- */
2301
- public function isAjaxCronRest() {
2302
- return wp_doing_ajax() || wp_doing_cron() || $this->isRestApiRequest();
2303
- }
2304
  }
6
  exit;
7
  }
8
 
 
 
9
  use AIOSEO\Plugin\Common\Traits\Helpers as TraitHelpers;
10
 
11
  /**
15
  */
16
  class Helpers {
17
  use TraitHelpers\ActionScheduler;
18
+ use TraitHelpers\Arrays;
19
  use TraitHelpers\Constants;
20
  use TraitHelpers\DateTime;
21
+ use TraitHelpers\Language;
22
  use TraitHelpers\Shortcodes;
23
  use TraitHelpers\Strings;
24
+ use TraitHelpers\Svg;
25
+ use TraitHelpers\ThirdParty;
26
+ use TraitHelpers\Vue;
27
+ use TraitHelpers\Wp;
28
+ use TraitHelpers\WpContext;
29
+ use TraitHelpers\WpUri;
 
 
 
30
 
31
  /**
32
  * Generate a UTM URL from the url and medium/content passed in.
62
 
63
  // Return the new URL.
64
  $url = add_query_arg( $args, $url );
65
+ return $esc ? esc_url( $url ) : $url;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  }
67
 
68
  /**
69
+ * Checks if we are in a dev environment or not.
70
  *
71
+ * @since 4.1.0
72
  *
73
+ * @return boolean True if we are, false if not.
 
74
  */
75
+ public function isDev() {
76
+ return defined( 'AIOSEO_DEV_VERSION' ) || isset( $_REQUEST['aioseo-dev'] ); // phpcs:ignore HM.Security.NonceVerification.Recommended
77
  }
78
 
79
  /**
80
+ * Request the remote URL via wp_remote_post and return a json decoded response.
81
  *
82
  * @since 4.0.0
83
  *
84
+ * @param array $body The content to retrieve from the remote URL.
85
+ * @param array $headers The headers to send to the remote URL.
86
+ *
87
+ * @return string|bool Json decoded response on success, false on failure.
88
  */
89
+ public function sendRequest( $url, $body = [], $headers = [] ) {
90
+ $body = wp_json_encode( $body );
91
+
92
+ // Build the headers of the request.
93
+ $headers = wp_parse_args(
94
+ $headers,
95
+ [
96
+ 'Content-Type' => 'application/json'
97
+ ]
98
+ );
99
+
100
+ // Setup variable for wp_remote_post.
101
+ $post = [
102
+ 'headers' => $headers,
103
+ 'body' => $body,
104
+ 'sslverify' => $this->isDev() ? false : true,
105
+ 'timeout' => 20
106
+ ];
107
+
108
+ // Perform the query and retrieve the response.
109
+ $response = wp_remote_post( $url, $post );
110
+ $responseBody = wp_remote_retrieve_body( $response );
111
+
112
+ // Bail out early if there are any errors.
113
+ if ( is_wp_error( $responseBody ) ) {
114
+ return false;
115
+ }
116
+
117
+ // Return the json decoded content.
118
+ return json_decode( $responseBody );
119
  }
120
 
121
  /**
122
+ * Checks if the server is running on Apache.
123
  *
124
  * @since 4.0.0
125
  *
126
+ * @return boolean Whether or not it is on apache.
 
127
  */
128
+ public function isApache() {
129
+ if ( ! isset( $_SERVER['SERVER_SOFTWARE'] ) ) {
130
+ return false;
 
 
 
 
 
131
  }
132
 
133
+ return stripos( sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ), 'apache' ) !== false;
134
  }
135
 
136
  /**
137
+ * Checks if the server is running on nginx.
138
  *
139
  * @since 4.0.0
140
  *
141
+ * @return boolean Whether or not it is on apache.
 
142
  */
143
+ public function isNginx() {
144
+ if ( ! isset( $_SERVER['SERVER_SOFTWARE'] ) ) {
145
  return false;
146
  }
147
 
148
+ $server = sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) );
149
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
  if (
151
+ stripos( $server, 'Flywheel' ) !== false ||
152
+ stripos( $server, 'nginx' ) !== false
 
 
153
  ) {
154
  return true;
155
  }
158
  }
159
 
160
  /**
161
+ * Validate IP addresses.
162
  *
163
  * @since 4.0.0
164
  *
165
+ * @param string $ip The IP address to validate.
166
+ * @return boolean If the IP address is valid or not.
167
  */
168
+ public function validateIp( $ip ) {
169
+ if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) {
170
+ return true;
 
 
171
  }
172
 
173
+ if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 ) ) {
174
+ return true;
 
 
175
  }
176
 
177
+ // Doesn't seem to be a valid IP.
178
  return false;
179
  }
180
 
181
  /**
182
+ * Convert bytes to readable format.
183
  *
184
  * @since 4.0.0
185
  *
186
+ * @param integer $bytes The size of the file.
187
+ * @return string The size as a string.
188
  */
189
+ public function convertFileSize( $bytes ) {
190
+ if ( empty( $bytes ) ) {
191
+ return [
192
+ 'original' => 0,
193
+ 'readable' => '0 B'
194
+ ];
195
+ }
196
+ $i = floor( log( $bytes ) / log( 1024 ) );
197
+ $sizes = [ 'B', 'KB', 'MB', 'GB', 'TB' ];
198
+ return [
199
+ 'original' => $bytes,
200
+ 'readable' => sprintf( '%.02F', $bytes / pow( 1024, $i ) ) * 1 . ' ' . $sizes[ $i ]
201
+ ];
202
  }
203
 
204
  /**
233
  }
234
  }
235
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
236
  /**
237
  * Checks if the given string is serialized, and if so, unserializes it.
238
  * If the serialized string contains an object, we abort to prevent PHP object injection.
256
  }
257
  return $string;
258
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
259
  }
app/Common/Utils/VueSettings.php CHANGED
@@ -92,6 +92,8 @@ class VueSettings {
92
  'localBusinessOpeningHours' => true,
93
  'locationsSettings' => true,
94
  'advancedLocationsSettings' => true,
 
 
95
  'robotsEditor' => true,
96
  'badBotBlocker' => true,
97
  'databaseTools' => true,
92
  'localBusinessOpeningHours' => true,
93
  'locationsSettings' => true,
94
  'advancedLocationsSettings' => true,
95
+ 'localBusinessMapsApiKey' => true,
96
+ 'localBusinessMapsSettings' => true,
97
  'robotsEditor' => true,
98
  'badBotBlocker' => true,
99
  'databaseTools' => true,
app/Common/Views/main/meta.php CHANGED
@@ -20,10 +20,10 @@ $canonical = aioseo()->helpers->canonicalUrl();
20
  $links = $this->links->getLinks();
21
  ?>
22
  <?php if ( $description ) : ?>
23
- <meta name="description" content="<?php echo esc_attr( $description ); ?>"/>
24
  <?php endif; ?>
25
  <?php if ( $robots ) : ?>
26
- <meta name="robots" content="<?php echo esc_html( $robots ); ?>"/>
27
  <?php endif; ?>
28
  <?php
29
  // Adds the site verification meta for webmaster tools.
20
  $links = $this->links->getLinks();
21
  ?>
22
  <?php if ( $description ) : ?>
23
+ <meta name="description" content="<?php echo esc_attr( $description ); ?>" />
24
  <?php endif; ?>
25
  <?php if ( $robots ) : ?>
26
+ <meta name="robots" content="<?php echo esc_html( $robots ); ?>" />
27
  <?php endif; ?>
28
  <?php
29
  // Adds the site verification meta for webmaster tools.
app/Common/Views/sitemap/html/widget-options.php CHANGED
@@ -76,7 +76,7 @@
76
  <input
77
  type="checkbox"
78
  name="<?php echo esc_attr( $this->get_field_name( 'post_types' ) ); ?>[]"
79
- id="<?php echo esc_attr( $this->get_field_id( 'post_types' ) ); ?>"
80
  <?php checked( in_array( $postTypeObject['name'], $instance['post_types'], true ) ); ?>
81
  value="<?php echo esc_html( $i ); ?>"
82
  />
@@ -99,7 +99,7 @@
99
  <input
100
  type="checkbox"
101
  name="<?php echo esc_attr( $this->get_field_name( 'taxonomies' ) ); ?>[]"
102
- id="<?php echo esc_attr( $this->get_field_id( 'taxonomies' ) ); ?>"
103
  <?php checked( in_array( $taxonomyObject['name'], $instance['taxonomies'], true ) ); ?>
104
  value="<?php echo esc_html( $i ); ?>"
105
  />
76
  <input
77
  type="checkbox"
78
  name="<?php echo esc_attr( $this->get_field_name( 'post_types' ) ); ?>[]"
79
+ id="<?php echo esc_attr( $this->get_field_id( 'post_types' . $i ) ); ?>"
80
  <?php checked( in_array( $postTypeObject['name'], $instance['post_types'], true ) ); ?>
81
  value="<?php echo esc_html( $i ); ?>"
82
  />
99
  <input
100
  type="checkbox"
101
  name="<?php echo esc_attr( $this->get_field_name( 'taxonomies' ) ); ?>[]"
102
+ id="<?php echo esc_attr( $this->get_field_id( 'taxonomies' . $i ) ); ?>"
103
  <?php checked( in_array( $taxonomyObject['name'], $instance['taxonomies'], true ) ); ?>
104
  value="<?php echo esc_html( $i ); ?>"
105
  />
app/Lite/Admin/Connect.php CHANGED
@@ -331,6 +331,9 @@ class Connect {
331
  'v' => 1,
332
  ], defined( 'AIOSEO_UPGRADE_URL' ) ? AIOSEO_UPGRADE_URL : 'https://upgrade.aioseo.com' );
333
 
 
 
 
334
  return [
335
  'url' => $url,
336
  ];
@@ -410,6 +413,8 @@ class Connect {
410
  if ( ! is_wp_error( $active ) ) {
411
  aioseo()->internalOptions->internal->connect->reset();
412
 
 
 
413
  deactivate_plugins( plugin_basename( AIOSEO_FILE ), false, $network );
414
 
415
  wp_send_json_success( $success );
@@ -454,8 +459,35 @@ class Connect {
454
 
455
  aioseo()->internalOptions->internal->connect->reset();
456
 
 
 
457
  deactivate_plugins( plugin_basename( AIOSEO_FILE ), false, $network );
458
 
459
  wp_send_json_success( $success );
460
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
461
  }
331
  'v' => 1,
332
  ], defined( 'AIOSEO_UPGRADE_URL' ) ? AIOSEO_UPGRADE_URL : 'https://upgrade.aioseo.com' );
333
 
334
+ // We're storing the ID of the user who is installing Pro so that we can add capabilties for him after upgrading.
335
+ aioseo()->transients->update( 'connect_active_user', get_current_user_id(), 15 * MINUTE_IN_SECONDS );
336
+
337
  return [
338
  'url' => $url,
339
  ];
413
  if ( ! is_wp_error( $active ) ) {
414
  aioseo()->internalOptions->internal->connect->reset();
415
 
416
+ $this->addCapabilitiesOnUpgrade();
417
+
418
  deactivate_plugins( plugin_basename( AIOSEO_FILE ), false, $network );
419
 
420
  wp_send_json_success( $success );
459
 
460
  aioseo()->internalOptions->internal->connect->reset();
461
 
462
+ $this->addCapabilitiesOnUpgrade();
463
+
464
  deactivate_plugins( plugin_basename( AIOSEO_FILE ), false, $network );
465
 
466
  wp_send_json_success( $success );
467
  }
468
+
469
+ /**
470
+ * Adds our capabilities to all roles on the next request and the installing user on the current request after upgrading to Pro.
471
+ * See #2267 and #2288 for context.
472
+ *
473
+ * @since 4.1.4.4
474
+ *
475
+ * @return void
476
+ */
477
+ private function addCapabilitiesOnUpgrade() {
478
+ // We need to set this transient here because the regular activation hooks won't run and Pro otherwise won't clear the cache and add the required capabilities.
479
+ aioseo()->transients->update( 'pro_just_deactivated_lite', true );
480
+
481
+ // Doing the above isn't sufficient because the logged in user will be lacking the capabilities on the first request and see an error. Therefore, we add them manually just for him.
482
+ $userId = aioseo()->transients->get( 'connect_active_user' );
483
+ $user = get_userdata( $userId );
484
+ if ( is_object( $user ) ) {
485
+ $capabilities = aioseo()->access->getCapabilityList();
486
+ foreach ( $capabilities as $capability ) {
487
+ $user->add_cap( $capability );
488
+ }
489
+ }
490
+
491
+ aioseo()->transients->delete( 'connect_active_user' );
492
+ }
493
  }
app/Lite/Options/InternalOptions.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Lite\Options;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ use AIOSEO\Plugin\Common\Options as CommonOptions;
10
+ use AIOSEO\Plugin\Lite\Traits;
11
+
12
+ /**
13
+ * Class that holds all internal options for AIOSEO.
14
+ *
15
+ * @since 4.0.0
16
+ */
17
+ class InternalOptions extends CommonOptions\InternalOptions {
18
+ use Traits\Options;
19
+
20
+ /**
21
+ * Defaults options for Lite.
22
+ *
23
+ * @since 4.0.0
24
+ *
25
+ * @var array
26
+ */
27
+ private $liteDefaults = [
28
+ // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
29
+ 'internal' => [
30
+ 'activated' => [ 'type' => 'number', 'default' => 0 ],
31
+ 'firstActivated' => [ 'type' => 'number', 'default' => 0 ],
32
+ 'installed' => [ 'type' => 'number', 'default' => 0 ],
33
+ 'connect' => [
34
+ 'key' => [ 'type' => 'string' ],
35
+ 'time' => [ 'type' => 'number', 'default' => 0 ],
36
+ 'network' => [ 'type' => 'boolean', 'default' => false ],
37
+ 'token' => [ 'type' => 'string' ]
38
+ ]
39
+ ]
40
+ // phpcs:enable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
41
+ ];
42
+ }
app/Lite/Options/Options.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Lite\Options;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ use AIOSEO\Plugin\Common\Options as CommonOptions;
10
+ use AIOSEO\Plugin\Lite\Traits;
11
+
12
+ /**
13
+ * Class that holds all options for AIOSEO.
14
+ *
15
+ * @since 4.0.0
16
+ */
17
+ class Options extends CommonOptions\Options {
18
+ use Traits\Options;
19
+
20
+ /**
21
+ * Defaults options for Lite.
22
+ *
23
+ * @since 4.0.0
24
+ *
25
+ * @var array
26
+ */
27
+ private $liteDefaults = [
28
+ // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
29
+ 'advanced' => [
30
+ 'usageTracking' => [ 'type' => 'boolean', 'default' => false ]
31
+ ]
32
+ // phpcs:enable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
33
+ ];
34
+ }
app/Lite/Traits/Options.php ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace AIOSEO\Plugin\Lite\Traits;
3
+
4
+ // Exit if accessed directly.
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit;
7
+ }
8
+
9
+ /**
10
+ * Options trait.
11
+ *
12
+ * @since 4.0.0
13
+ */
14
+ trait Options {
15
+ /**
16
+ * Initialize the options.
17
+ *
18
+ * @since 4.1.4
19
+ *
20
+ * @return void
21
+ */
22
+ protected function init() {
23
+ parent::init();
24
+
25
+ $dbOptions = $this->getDbOptions( $this->optionsName . '_lite' );
26
+
27
+ // Refactor options.
28
+ $this->defaultsMerged = array_replace_recursive( $this->defaults, $this->liteDefaults );
29
+
30
+ $mergedDefaults = array_replace_recursive(
31
+ $this->liteDefaults,
32
+ $this->addValueToValuesArray( $this->liteDefaults, $dbOptions )
33
+ );
34
+
35
+ $cachedOptions = aioseo()->optionsCache->getOptions( $this->optionsName );
36
+ $dbOptions = array_replace_recursive(
37
+ $cachedOptions,
38
+ $mergedDefaults
39
+ );
40
+
41
+ aioseo()->optionsCache->setOptions( $this->optionsName, $dbOptions );
42
+ }
43
+
44
+ /**
45
+ * Merge defaults with liteDefaults.
46
+ *
47
+ * @since 4.1.4
48
+ *
49
+ * @return array An array of dafults.
50
+ */
51
+ public function getDefaults() {
52
+ return array_replace_recursive( parent::getDefaults(), $this->liteDefaults );
53
+ }
54
+
55
+ /**
56
+ * Updates the options in the database.
57
+ *
58
+ * @since 4.1.4
59
+ *
60
+ * @param string $optionsName An optional option name to update.
61
+ * @param string $defaults The defaults to filter the options by.
62
+ * @param array|null $options An optional options array.
63
+ * @return void
64
+ */
65
+ public function update( $optionsName = null, $defaults = null, $options = null ) {
66
+ $optionsName = empty( $optionsName ) ? $this->optionsName . '_lite' : $optionsName;
67
+ $defaults = empty( $defaults ) ? $this->liteDefaults : $defaults;
68
+
69
+ // We're creating a new array here because it was setting it by reference.
70
+ $cachedOptions = aioseo()->optionsCache->getOptions( $this->optionsName );
71
+ $optionsBefore = json_decode( wp_json_encode( $cachedOptions ), true );
72
+
73
+ parent::update( $this->optionsName, $options );
74
+ parent::update( $optionsName, $defaults, $optionsBefore );
75
+ }
76
+
77
+ /**
78
+ * Updates the options in the database.
79
+ *
80
+ * @since 4.1.4
81
+ *
82
+ * @param boolean $force Whether or not to force an immediate save.
83
+ * @param string $optionsName An optional option name to update.
84
+ * @param string $defaults The defaults to filter the options by.
85
+ * @return void
86
+ */
87
+ public function save( $force = false, $optionsName = null, $defaults = null ) {
88
+ if ( ! $this->shouldSave && ! $force ) {
89
+ return;
90
+ }
91
+
92
+ $optionsName = empty( $optionsName ) ? $this->optionsName . '_lite' : $optionsName;
93
+ $defaults = empty( $defaults ) ? $this->liteDefaults : $defaults;
94
+
95
+ parent::save( $force, $this->optionsName );
96
+ parent::save( $force, $optionsName, $defaults );
97
+ }
98
+ }
app/Lite/Utils/InternalOptions.php DELETED
@@ -1,102 +0,0 @@
1
- <?php
2
- namespace AIOSEO\Plugin\Lite\Utils;
3
-
4
- // Exit if accessed directly.
5
- if ( ! defined( 'ABSPATH' ) ) {
6
- exit;
7
- }
8
-
9
- use AIOSEO\Plugin\Common\Utils as CommonUtils;
10
-
11
- /**
12
- * Class that holds all internal options for AIOSEO.
13
- *
14
- * @since 4.0.0
15
- */
16
- class InternalOptions extends CommonUtils\InternalOptions {
17
- /**
18
- * Defaults options for Lite.
19
- *
20
- * @since 4.0.0
21
- *
22
- * @var array
23
- */
24
- private $liteDefaults = [
25
- // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
26
- 'internal' => [
27
- 'activated' => [ 'type' => 'number', 'default' => 0 ],
28
- 'firstActivated' => [ 'type' => 'number', 'default' => 0 ],
29
- 'installed' => [ 'type' => 'number', 'default' => 0 ],
30
- 'connect' => [
31
- 'key' => [ 'type' => 'string' ],
32
- 'time' => [ 'type' => 'number', 'default' => 0 ],
33
- 'network' => [ 'type' => 'boolean', 'default' => false ],
34
- 'token' => [ 'type' => 'string' ]
35
- ]
36
- ]
37
- // phpcs:enable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
38
- ];
39
-
40
- /**
41
- * Class constructor
42
- *
43
- * @since 4.0.0
44
- */
45
- public function __construct( $optionsName = 'aioseo_options_internal' ) {
46
- parent::__construct( $optionsName );
47
-
48
- $this->init();
49
- }
50
-
51
- /**
52
- * Initializes the options.
53
- *
54
- * @since 4.0.0
55
- *
56
- * @return void
57
- */
58
- protected function init() {
59
- parent::init();
60
-
61
- $dbOptions = json_decode( get_option( $this->optionsName . '_lite' ), true );
62
- if ( empty( $dbOptions ) ) {
63
- $dbOptions = [];
64
- }
65
-
66
- // Refactor options.
67
- $this->defaultsMerged = array_replace_recursive( $this->defaults, $this->liteDefaults );
68
-
69
- $options = array_replace_recursive(
70
- $this->options,
71
- $this->addValueToValuesArray( $this->options, $dbOptions )
72
- );
73
-
74
- $this->options = apply_filters( 'aioseo_get_options_internal_lite', $options );
75
- }
76
-
77
- /**
78
- * Updates the options in the database.
79
- *
80
- * @since 4.0.0
81
- *
82
- * @param array|null $options An optional options array.
83
- * @return void
84
- */
85
- public function update( $options = null ) {
86
- $optionsBefore = $this->options;
87
- parent::update( $options );
88
- $this->options = $optionsBefore;
89
-
90
- // First, we need to filter our options.
91
- $options = $this->filterOptions( $this->liteDefaults );
92
-
93
- // Refactor options.
94
- $refactored = $this->convertOptionsToValues( $options );
95
-
96
- $this->resetGroups();
97
-
98
- update_option( $this->optionsName . '_lite', wp_json_encode( $refactored ) );
99
-
100
- $this->init();
101
- }
102
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/Lite/Utils/Options.php DELETED
@@ -1,107 +0,0 @@
1
- <?php
2
- namespace AIOSEO\Plugin\Lite\Utils;
3
-
4
- // Exit if accessed directly.
5
- if ( ! defined( 'ABSPATH' ) ) {
6
- exit;
7
- }
8
-
9
- use AIOSEO\Plugin\Common\Utils as CommonUtils;
10
-
11
- /**
12
- * Class that holds all options for AIOSEO.
13
- *
14
- * @since 4.0.0
15
- */
16
- class Options extends CommonUtils\Options {
17
- /**
18
- * Defaults options for Lite.
19
- *
20
- * @since 4.0.0
21
- *
22
- * @var array
23
- */
24
- private $liteDefaults = [
25
- // phpcs:disable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
26
- 'advanced' => [
27
- 'usageTracking' => [ 'type' => 'boolean', 'default' => false ]
28
- ]
29
- // phpcs:enable WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
30
- ];
31
-
32
- /**
33
- * Class constructor
34
- *
35
- * @since 4.0.0
36
- */
37
- public function __construct( $optionsName = 'aioseo_options' ) {
38
- parent::__construct( $optionsName );
39
-
40
- $this->init();
41
- }
42
-
43
- /**
44
- * Initializes the options.
45
- *
46
- * @since 4.0.0
47
- *
48
- * @param boolean $resetKeys Whether or not to reset keys after init.
49
- * @return void
50
- */
51
- protected function init( $resetKeys = false ) {
52
- if ( $resetKeys ) {
53
- $originalGroupKey = $this->groupKey;
54
- $originalSubGroups = $this->subGroups;
55
- }
56
-
57
- parent::init();
58
-
59
- $dbOptions = json_decode( get_option( $this->optionsName . '_lite' ), true );
60
- if ( empty( $dbOptions ) ) {
61
- $dbOptions = [];
62
- }
63
-
64
- // Refactor options.
65
- $this->defaultsMerged = array_replace_recursive( $this->defaults, $this->liteDefaults );
66
-
67
- $options = array_replace_recursive(
68
- $this->options,
69
- $this->addValueToValuesArray( $this->options, $dbOptions )
70
- );
71
-
72
- $this->options = apply_filters( 'aioseo_get_options_lite', $options );
73
-
74
- if ( $resetKeys ) {
75
- $this->groupKey = $originalGroupKey;
76
- $this->subGroups = $originalSubGroups;
77
- }
78
- }
79
-
80
- /**
81
- * Updates the options in the database.
82
- *
83
- * @since 4.0.0
84
- *
85
- * @param array|null $options An optional options array.
86
- * @return void
87
- */
88
- public function update( $options = null ) {
89
- $optionsBefore = $this->options;
90
- parent::update( $options );
91
- $this->options = $optionsBefore;
92
-
93
- // First, we need to filter our options.
94
- $options = $this->filterOptions( $this->liteDefaults );
95
-
96
- // Refactor options.
97
- $refactored = $this->convertOptionsToValues( $options );
98
-
99
- $this->resetGroups();
100
-
101
- update_option( $this->optionsName . '_lite', wp_json_encode( $refactored ) );
102
-
103
- if ( ! $this->needsUpdate ) {
104
- $this->init();
105
- }
106
- }
107
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dist/Lite/assets/css/aioseo-admin-bar.css CHANGED
@@ -1,3 +1,3 @@
1
- /*! ! built on Friday, August 13th 2021, 4:37:42 pm */
2
  #wpadminbar #wp-admin-bar-aioseo-main .aioseo-logo.svg{float:left;width:26px;height:30px;background-repeat:no-repeat;background-position:0 6px;background-size:20px;background-image:url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iI2ZmZiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBjbGFzcz0iYWlvc2VvLWdlYXIiPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS45ODU0MiAxOS45NzA4QzE1LjUwMDIgMTkuOTcwOCAxOS45NzA4IDE1LjUwMDIgMTkuOTcwOCA5Ljk4NTQyQzE5Ljk3MDggNC40NzA2MyAxNS41MDAyIDAgOS45ODU0MiAwQzQuNDcwNjMgMCAwIDQuNDcwNjMgMCA5Ljk4NTQyQzAgMTUuNTAwMiA0LjQ3MDYzIDE5Ljk3MDggOS45ODU0MiAxOS45NzA4Wk04LjM5NTQxIDMuNjU0NjRDOC4yNjAxNiAzLjQ0ODUgOC4wMDk2IDMuMzUyMTEgNy43Nzk4NSAzLjQzMzI3QzcuNTE4MTYgMy41MjU3MiA3LjI2MjE4IDMuNjM0NDUgNy4wMTM0OSAzLjc1ODhDNi43OTUxOSAzLjg2Nzk2IDYuNjg1NjYgNC4xMTczMSA2LjczMzcyIDQuMzYwNDlMNi45MDQ5MyA1LjIyNjk0QzYuOTQ5IDUuNDQ5OTYgNi44NTggNS42NzYzIDYuNjg1MjIgNS44MjAwOUM2LjQxMjE2IDYuMDQ3MzQgNi4xNjAwNyA2LjMwNDI2IDUuOTM0MjEgNi41ODg2NEM1Ljc5MzgzIDYuNzY1MzkgNS41NzIzMyA2Ljg1OTA3IDUuMzUzNjEgNi44MTQ4OUw0LjUwNDI0IDYuNjQzM0M0LjI2NTY0IDYuNTk1MSA0LjAyMTU3IDYuNzA3ODggMy45MTU0NCA2LjkzMTIxQzMuODU1NDkgNy4wNTczOCAzLjc5ODg5IDcuMTg2MiAzLjc0NTgzIDcuMzE3NThDMy42OTI3NiA3LjQ0ODk2IDMuNjQzOTcgNy41ODEwNSAzLjU5OTM4IDcuNzEzNjlDMy41MjA0OCA3Ljk0ODQ3IDMuNjE1NzkgOC4yMDM5OCAzLjgxODM5IDguMzQxMzNMNC41Mzk1OCA4LjgzMDI3QzQuNzI1MjkgOC45NTYxNyA0LjgxNzc4IDkuMTgxOSA0Ljc5NTM0IDkuNDA4MjZDNC43NTkyNSA5Ljc3MjQ0IDQuNzYwNzIgMTAuMTM2IDQuNzk3NTYgMTAuNDkzNkM0LjgyMDg3IDEwLjcxOTggNC43MjkxNSAxMC45NDU5IDQuNTQzODggMTEuMDcyNEwzLjgyNDA4IDExLjU2NDJDMy42MjIwNSAxMS43MDIyIDMuNTI3NTkgMTEuOTU3OSAzLjYwNzEzIDEyLjE5MjNDMy42OTc3NCAxMi40NTkzIDMuODA0MyAxMi43MjA1IDMuOTI2MTUgMTIuOTc0M0M0LjAzMzEzIDEzLjE5NzEgNC4yNzc0OSAxMy4zMDg4IDQuNTE1ODEgMTMuMjU5OEw1LjM2NDk1IDEzLjA4NTFDNS41ODM1IDEzLjA0MDEgNS44MDUzMyAxMy4xMzMgNS45NDYyMyAxMy4zMDkzQzYuMTY4OTMgMTMuNTg3OSA2LjQyMDcxIDEzLjg0NTEgNi42OTk0IDE0LjA3NTZDNi44NzI2MSAxNC4yMTg4IDYuOTY0NDIgMTQuNDQ0OCA2LjkyMTEyIDE0LjY2OEw2Ljc1Mjk2IDE1LjUzNDhDNi43MDU3MiAxNS43NzgyIDYuODE2MjUgMTYuMDI3MyA3LjAzNTExIDE2LjEzNTZDNy4xNTg3NiAxNi4xOTY3IDcuMjg1IDE2LjI1NDUgNy40MTM3NSAxNi4zMDg2QzcuNTQyNTEgMTYuMzYyOCA3LjY3MTk2IDE2LjQxMjYgNy44MDE5NSAxNi40NTgxQzguMTgyMjQgMTYuNTkxMiA4LjcxNDQ5IDE2LjExNDcgOS4xMDggMTUuNzYyNUM5LjMwMjA1IDE1LjU4ODggOS40MjE3NCAxNS4zNDMgOS40MjMwMSAxNS4wNzk4QzkuNDIzMDEgMTUuMDc4NCA5LjQyMzAyIDE1LjA3NyA5LjQyMzAyIDE1LjA3NTZMOS40MjMwMSAxMy42MjYzQzkuNDIzMDEgMTMuNjEwOSA5LjQyMzYgMTMuNTk1NyA5LjQyNDc2IDEzLjU4MDZDOC4yNjI0OCAxMy4yOTcxIDcuMzk4MzggMTIuMjMwMSA3LjM5ODM4IDEwLjk1NzJWOS40MTgyM0M3LjM5ODM4IDkuMzAxMjUgNy40OTEzMSA5LjIwNjQyIDcuNjA1OTYgOS4yMDY0Mkg4LjMyNTg0VjcuNjkyMkM4LjMyNTg0IDcuNDgzMTIgOC40OTE5MyA3LjMxMzY0IDguNjk2ODMgNy4zMTM2NEM4LjkwMTcxIDcuMzEzNjQgOS4wNjc4MSA3LjQ4MzEyIDkuMDY3ODEgNy42OTIyVjkuMjA2NDJIMTEuMDE1NVY3LjY5MjJDMTEuMDE1NSA3LjQ4MzEyIDExLjE4MTYgNy4zMTM2NCAxMS4zODY1IDcuMzEzNjRDMTEuNTkxNCA3LjMxMzY0IDExLjc1NzUgNy40ODMxMiAxMS43NTc1IDcuNjkyMlY5LjIwNjQySDEyLjQ3NzNDMTIuNTkyIDkuMjA2NDIgMTIuNjg0OSA5LjMwMTI1IDEyLjY4NDkgOS40MTgyM1YxMC45NTcyQzEyLjY4NDkgMTIuMjcwNCAxMS43NjUzIDEzLjM2NDMgMTAuNTQ3NCAxMy42MDUxQzEwLjU0NzcgMTMuNjEyMSAxMC41NDc4IDEzLjYxOTIgMTAuNTQ3OCAxMy42MjYzTDEwLjU0NzggMTUuMDY5NEMxMC41NDc4IDE1LjMzNzcgMTAuNjcxMSAxNS41ODc5IDEwLjg3MSAxNS43NjIyQzExLjI3MTUgMTYuMTExNSAxMS44MTI5IDE2LjU4MzcgMTIuMTkxIDE2LjQ1MDJDMTIuNDUyNyAxNi4zNTc3IDEyLjcwODYgMTYuMjQ5IDEyLjk1NzMgMTYuMTI0NkMxMy4xNzU2IDE2LjAxNTUgMTMuMjg1MiAxNS43NjYxIDEzLjIzNzEgMTUuNTIyOUwxMy4wNjU5IDE0LjY1NjVDMTMuMDIxOCAxNC40MzM0IDEzLjExMjggMTQuMjA3MSAxMy4yODU2IDE0LjA2MzNDMTMuNTU4NyAxMy44MzYxIDEzLjgxMDcgMTMuNTc5MiAxNC4wMzY2IDEzLjI5NDhDMTQuMTc3IDEzLjExOCAxNC4zOTg1IDEzLjAyNDQgMTQuNjE3MiAxMy4wNjg1TDE1LjQ2NjYgMTMuMjQwMUMxNS43MDUyIDEzLjI4ODMgMTUuOTQ5MyAxMy4xNzU2IDE2LjA1NTQgMTIuOTUyMkMxNi4xMTUzIDEyLjgyNjEgMTYuMTcxOSAxMi42OTcyIDE2LjIyNSAxMi41NjU5QzE2LjI3ODEgMTIuNDM0NSAxNi4zMjY5IDEyLjMwMjQgMTYuMzcxNCAxMi4xNjk4QzE2LjQ1MDMgMTEuOTM1IDE2LjM1NSAxMS42Nzk1IDE2LjE1MjQgMTEuNTQyMUwxNS40MzEyIDExLjA1MzJDMTUuMjQ1NSAxMC45MjczIDE1LjE1MyAxMC43MDE1IDE1LjE3NTUgMTAuNDc1MkMxNS4yMTE2IDEwLjExMSAxNS4yMTAxIDkuNzQ3NDQgMTUuMTczMyA5LjM4OTg2QzE1LjE0OTkgOS4xNjM2MSAxNS4yNDE3IDguOTM3NTcgMTUuNDI2OSA4LjgxMUwxNi4xNDY3IDguMzE5MjdDMTYuMzQ4OCA4LjE4MTI2IDE2LjQ0MzIgNy45MjU1OCAxNi4zNjM3IDcuNjkxMTVDMTYuMjczMSA3LjQyNDExIDE2LjE2NjUgNy4xNjI5MiAxNi4wNDQ3IDYuOTA5MTVDMTUuOTM3NyA2LjY4NjM4IDE1LjY5MzMgNi41NzQ2MiAxNS40NTUgNi42MjM2NkwxNC42MDU5IDYuNzk4MzdDMTQuMzg3MyA2Ljg0MzM0IDE0LjE2NTUgNi43NTA0OCAxNC4wMjQ2IDYuNTc0MThDMTMuODAxOSA2LjI5NTU0IDEzLjU1MDEgNi4wMzgzMiAxMy4yNzE0IDUuODA3ODRDMTMuMDk4MiA1LjY2NDYgMTMuMDA2NCA1LjQzODU4IDEzLjA0OTcgNS4yMTU0TDEzLjIxNzkgNC4zNDg2OEMxMy4yNjUxIDQuMTA1MjEgMTMuMTU0NiAzLjg1NjE2IDEyLjkzNTcgMy43NDc4N0MxMi44MTIxIDMuNjg2NjkgMTIuNjg1OCAzLjYyODk1IDEyLjU1NzEgMy41NzQ4QzEyLjQyODMgMy41MjA2NSAxMi4yOTg5IDMuNDcwODYgMTIuMTY4OSAzLjQyNTM3QzExLjkzODggMy4zNDQ4NSAxMS42ODg0IDMuNDQyMTEgMTEuNTUzOCAzLjY0ODg0TDExLjA3NDYgNC4zODQ3NUMxMC45NTEzIDQuNTc0MjUgMTAuNzMgNC42Njg2MiAxMC41MDgyIDQuNjQ1NzNDMTAuMTUxMyA0LjYwODkgOS43OTUwMiA0LjYxMDM5IDkuNDQ0NTkgNC42NDc5OUM5LjIyMjg2IDQuNjcxNzcgOS4wMDEzNCA0LjU3ODE4IDguODc3MzEgNC4zODkxM0w4LjM5NTQxIDMuNjU0NjRaIiBmaWxsPSIjZmZmIiAvPjwvc3ZnPg==") !important}#wpadminbar #wp-admin-bar-aioseo-main.new-notifications>.ab-item{background:#2c3338;color:#72aee6}#wpadminbar #wp-admin-bar-aioseo-pro-upgrade a{background-color:#1DA867;padding-bottom:5px}#wpadminbar #wp-admin-bar-aioseo-pro-upgrade a span{font-weight:600}#wpadminbar #wp-admin-bar-aioseo-pro-license a{background-color:#DF2A4A;padding-bottom:5px}#wpadminbar #wp-admin-bar-aioseo-pro-license a span{font-weight:600}#wpadminbar .aioseo-menu-notification-counter{display:inline-flex;vertical-align:top;box-sizing:border-box;margin:7px 0 0 5px;padding:0;min-width:18px;height:18px;border-radius:9px;background-color:#ca4a1f;color:#fff;font-size:11px;line-height:1.6;text-align:center;justify-content:center}#wpadminbar .aioseo-menu-notification-counter span{line-height:1;font-size:11px}#wpadminbar .aioseo-menu-notification-indicator{float:right;margin:10px 0 0;width:8px;height:8px;border-radius:50%;background-color:#ca4a1f;line-height:1.6;animation:aioseo-menu-notification-indicator-pulse 1.5s infinite}#toplevel_page_aioseo .aioseo-menu-notification-indicator{float:right;margin:6px 0 0;width:8px;height:8px;border-radius:50%;background-color:#ca4a1f;line-height:1.6;animation:aioseo-menu-notification-indicator-pulse 1.5s infinite}@keyframes aioseo-menu-notification-indicator-pulse{0%{box-shadow:0 0 0 0px rgba(202,74,31,0.5)}100%{box-shadow:0 0 0 10px rgba(202,74,31,0)}}@media screen and (max-width: 782px){#wpadminbar #wp-admin-bar-aioseo-main{display:block;position:static}#wpadminbar #wp-admin-bar-aioseo-main .ab-item .text{display:none}#wpadminbar #wp-admin-bar-aioseo-main .aioseo-logo.svg{width:52px;height:46px;background-position:50% 8px;background-size:30px}}
3
 
1
+ /*! ! built on Tuesday, September 21st 2021, 9:50:25 pm */
2
  #wpadminbar #wp-admin-bar-aioseo-main .aioseo-logo.svg{float:left;width:26px;height:30px;background-repeat:no-repeat;background-position:0 6px;background-size:20px;background-image:url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iI2ZmZiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBjbGFzcz0iYWlvc2VvLWdlYXIiPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS45ODU0MiAxOS45NzA4QzE1LjUwMDIgMTkuOTcwOCAxOS45NzA4IDE1LjUwMDIgMTkuOTcwOCA5Ljk4NTQyQzE5Ljk3MDggNC40NzA2MyAxNS41MDAyIDAgOS45ODU0MiAwQzQuNDcwNjMgMCAwIDQuNDcwNjMgMCA5Ljk4NTQyQzAgMTUuNTAwMiA0LjQ3MDYzIDE5Ljk3MDggOS45ODU0MiAxOS45NzA4Wk04LjM5NTQxIDMuNjU0NjRDOC4yNjAxNiAzLjQ0ODUgOC4wMDk2IDMuMzUyMTEgNy43Nzk4NSAzLjQzMzI3QzcuNTE4MTYgMy41MjU3MiA3LjI2MjE4IDMuNjM0NDUgNy4wMTM0OSAzLjc1ODhDNi43OTUxOSAzLjg2Nzk2IDYuNjg1NjYgNC4xMTczMSA2LjczMzcyIDQuMzYwNDlMNi45MDQ5MyA1LjIyNjk0QzYuOTQ5IDUuNDQ5OTYgNi44NTggNS42NzYzIDYuNjg1MjIgNS44MjAwOUM2LjQxMjE2IDYuMDQ3MzQgNi4xNjAwNyA2LjMwNDI2IDUuOTM0MjEgNi41ODg2NEM1Ljc5MzgzIDYuNzY1MzkgNS41NzIzMyA2Ljg1OTA3IDUuMzUzNjEgNi44MTQ4OUw0LjUwNDI0IDYuNjQzM0M0LjI2NTY0IDYuNTk1MSA0LjAyMTU3IDYuNzA3ODggMy45MTU0NCA2LjkzMTIxQzMuODU1NDkgNy4wNTczOCAzLjc5ODg5IDcuMTg2MiAzLjc0NTgzIDcuMzE3NThDMy42OTI3NiA3LjQ0ODk2IDMuNjQzOTcgNy41ODEwNSAzLjU5OTM4IDcuNzEzNjlDMy41MjA0OCA3Ljk0ODQ3IDMuNjE1NzkgOC4yMDM5OCAzLjgxODM5IDguMzQxMzNMNC41Mzk1OCA4LjgzMDI3QzQuNzI1MjkgOC45NTYxNyA0LjgxNzc4IDkuMTgxOSA0Ljc5NTM0IDkuNDA4MjZDNC43NTkyNSA5Ljc3MjQ0IDQuNzYwNzIgMTAuMTM2IDQuNzk3NTYgMTAuNDkzNkM0LjgyMDg3IDEwLjcxOTggNC43MjkxNSAxMC45NDU5IDQuNTQzODggMTEuMDcyNEwzLjgyNDA4IDExLjU2NDJDMy42MjIwNSAxMS43MDIyIDMuNTI3NTkgMTEuOTU3OSAzLjYwNzEzIDEyLjE5MjNDMy42OTc3NCAxMi40NTkzIDMuODA0MyAxMi43MjA1IDMuOTI2MTUgMTIuOTc0M0M0LjAzMzEzIDEzLjE5NzEgNC4yNzc0OSAxMy4zMDg4IDQuNTE1ODEgMTMuMjU5OEw1LjM2NDk1IDEzLjA4NTFDNS41ODM1IDEzLjA0MDEgNS44MDUzMyAxMy4xMzMgNS45NDYyMyAxMy4zMDkzQzYuMTY4OTMgMTMuNTg3OSA2LjQyMDcxIDEzLjg0NTEgNi42OTk0IDE0LjA3NTZDNi44NzI2MSAxNC4yMTg4IDYuOTY0NDIgMTQuNDQ0OCA2LjkyMTEyIDE0LjY2OEw2Ljc1Mjk2IDE1LjUzNDhDNi43MDU3MiAxNS43NzgyIDYuODE2MjUgMTYuMDI3MyA3LjAzNTExIDE2LjEzNTZDNy4xNTg3NiAxNi4xOTY3IDcuMjg1IDE2LjI1NDUgNy40MTM3NSAxNi4zMDg2QzcuNTQyNTEgMTYuMzYyOCA3LjY3MTk2IDE2LjQxMjYgNy44MDE5NSAxNi40NTgxQzguMTgyMjQgMTYuNTkxMiA4LjcxNDQ5IDE2LjExNDcgOS4xMDggMTUuNzYyNUM5LjMwMjA1IDE1LjU4ODggOS40MjE3NCAxNS4zNDMgOS40MjMwMSAxNS4wNzk4QzkuNDIzMDEgMTUuMDc4NCA5LjQyMzAyIDE1LjA3NyA5LjQyMzAyIDE1LjA3NTZMOS40MjMwMSAxMy42MjYzQzkuNDIzMDEgMTMuNjEwOSA5LjQyMzYgMTMuNTk1NyA5LjQyNDc2IDEzLjU4MDZDOC4yNjI0OCAxMy4yOTcxIDcuMzk4MzggMTIuMjMwMSA3LjM5ODM4IDEwLjk1NzJWOS40MTgyM0M3LjM5ODM4IDkuMzAxMjUgNy40OTEzMSA5LjIwNjQyIDcuNjA1OTYgOS4yMDY0Mkg4LjMyNTg0VjcuNjkyMkM4LjMyNTg0IDcuNDgzMTIgOC40OTE5MyA3LjMxMzY0IDguNjk2ODMgNy4zMTM2NEM4LjkwMTcxIDcuMzEzNjQgOS4wNjc4MSA3LjQ4MzEyIDkuMDY3ODEgNy42OTIyVjkuMjA2NDJIMTEuMDE1NVY3LjY5MjJDMTEuMDE1NSA3LjQ4MzEyIDExLjE4MTYgNy4zMTM2NCAxMS4zODY1IDcuMzEzNjRDMTEuNTkxNCA3LjMxMzY0IDExLjc1NzUgNy40ODMxMiAxMS43NTc1IDcuNjkyMlY5LjIwNjQySDEyLjQ3NzNDMTIuNTkyIDkuMjA2NDIgMTIuNjg0OSA5LjMwMTI1IDEyLjY4NDkgOS40MTgyM1YxMC45NTcyQzEyLjY4NDkgMTIuMjcwNCAxMS43NjUzIDEzLjM2NDMgMTAuNTQ3NCAxMy42MDUxQzEwLjU0NzcgMTMuNjEyMSAxMC41NDc4IDEzLjYxOTIgMTAuNTQ3OCAxMy42MjYzTDEwLjU0NzggMTUuMDY5NEMxMC41NDc4IDE1LjMzNzcgMTAuNjcxMSAxNS41ODc5IDEwLjg3MSAxNS43NjIyQzExLjI3MTUgMTYuMTExNSAxMS44MTI5IDE2LjU4MzcgMTIuMTkxIDE2LjQ1MDJDMTIuNDUyNyAxNi4zNTc3IDEyLjcwODYgMTYuMjQ5IDEyLjk1NzMgMTYuMTI0NkMxMy4xNzU2IDE2LjAxNTUgMTMuMjg1MiAxNS43NjYxIDEzLjIzNzEgMTUuNTIyOUwxMy4wNjU5IDE0LjY1NjVDMTMuMDIxOCAxNC40MzM0IDEzLjExMjggMTQuMjA3MSAxMy4yODU2IDE0LjA2MzNDMTMuNTU4NyAxMy44MzYxIDEzLjgxMDcgMTMuNTc5MiAxNC4wMzY2IDEzLjI5NDhDMTQuMTc3IDEzLjExOCAxNC4zOTg1IDEzLjAyNDQgMTQuNjE3MiAxMy4wNjg1TDE1LjQ2NjYgMTMuMjQwMUMxNS43MDUyIDEzLjI4ODMgMTUuOTQ5MyAxMy4xNzU2IDE2LjA1NTQgMTIuOTUyMkMxNi4xMTUzIDEyLjgyNjEgMTYuMTcxOSAxMi42OTcyIDE2LjIyNSAxMi41NjU5QzE2LjI3ODEgMTIuNDM0NSAxNi4zMjY5IDEyLjMwMjQgMTYuMzcxNCAxMi4xNjk4QzE2LjQ1MDMgMTEuOTM1IDE2LjM1NSAxMS42Nzk1IDE2LjE1MjQgMTEuNTQyMUwxNS40MzEyIDExLjA1MzJDMTUuMjQ1NSAxMC45MjczIDE1LjE1MyAxMC43MDE1IDE1LjE3NTUgMTAuNDc1MkMxNS4yMTE2IDEwLjExMSAxNS4yMTAxIDkuNzQ3NDQgMTUuMTczMyA5LjM4OTg2QzE1LjE0OTkgOS4xNjM2MSAxNS4yNDE3IDguOTM3NTcgMTUuNDI2OSA4LjgxMUwxNi4xNDY3IDguMzE5MjdDMTYuMzQ4OCA4LjE4MTI2IDE2LjQ0MzIgNy45MjU1OCAxNi4zNjM3IDcuNjkxMTVDMTYuMjczMSA3LjQyNDExIDE2LjE2NjUgNy4xNjI5MiAxNi4wNDQ3IDYuOTA5MTVDMTUuOTM3NyA2LjY4NjM4IDE1LjY5MzMgNi41NzQ2MiAxNS40NTUgNi42MjM2NkwxNC42MDU5IDYuNzk4MzdDMTQuMzg3MyA2Ljg0MzM0IDE0LjE2NTUgNi43NTA0OCAxNC4wMjQ2IDYuNTc0MThDMTMuODAxOSA2LjI5NTU0IDEzLjU1MDEgNi4wMzgzMiAxMy4yNzE0IDUuODA3ODRDMTMuMDk4MiA1LjY2NDYgMTMuMDA2NCA1LjQzODU4IDEzLjA0OTcgNS4yMTU0TDEzLjIxNzkgNC4zNDg2OEMxMy4yNjUxIDQuMTA1MjEgMTMuMTU0NiAzLjg1NjE2IDEyLjkzNTcgMy43NDc4N0MxMi44MTIxIDMuNjg2NjkgMTIuNjg1OCAzLjYyODk1IDEyLjU1NzEgMy41NzQ4QzEyLjQyODMgMy41MjA2NSAxMi4yOTg5IDMuNDcwODYgMTIuMTY4OSAzLjQyNTM3QzExLjkzODggMy4zNDQ4NSAxMS42ODg0IDMuNDQyMTEgMTEuNTUzOCAzLjY0ODg0TDExLjA3NDYgNC4zODQ3NUMxMC45NTEzIDQuNTc0MjUgMTAuNzMgNC42Njg2MiAxMC41MDgyIDQuNjQ1NzNDMTAuMTUxMyA0LjYwODkgOS43OTUwMiA0LjYxMDM5IDkuNDQ0NTkgNC42NDc5OUM5LjIyMjg2IDQuNjcxNzcgOS4wMDEzNCA0LjU3ODE4IDguODc3MzEgNC4zODkxM0w4LjM5NTQxIDMuNjU0NjRaIiBmaWxsPSIjZmZmIiAvPjwvc3ZnPg==") !important}#wpadminbar #wp-admin-bar-aioseo-main.new-notifications>.ab-item{background:#2c3338;color:#72aee6}#wpadminbar #wp-admin-bar-aioseo-pro-upgrade a{background-color:#1DA867;padding-bottom:5px}#wpadminbar #wp-admin-bar-aioseo-pro-upgrade a span{font-weight:600}#wpadminbar #wp-admin-bar-aioseo-pro-license a{background-color:#DF2A4A;padding-bottom:5px}#wpadminbar #wp-admin-bar-aioseo-pro-license a span{font-weight:600}#wpadminbar .aioseo-menu-notification-counter{display:inline-flex;vertical-align:top;box-sizing:border-box;margin:7px 0 0 5px;padding:0;min-width:18px;height:18px;border-radius:9px;background-color:#ca4a1f;color:#fff;font-size:11px;line-height:1.6;text-align:center;justify-content:center}#wpadminbar .aioseo-menu-notification-counter span{line-height:1;font-size:11px}#wpadminbar .aioseo-menu-notification-indicator{float:right;margin:10px 0 0;width:8px;height:8px;border-radius:50%;background-color:#ca4a1f;line-height:1.6;animation:aioseo-menu-notification-indicator-pulse 1.5s infinite}#toplevel_page_aioseo .aioseo-menu-notification-indicator{float:right;margin:6px 0 0;width:8px;height:8px;border-radius:50%;background-color:#ca4a1f;line-height:1.6;animation:aioseo-menu-notification-indicator-pulse 1.5s infinite}@keyframes aioseo-menu-notification-indicator-pulse{0%{box-shadow:0 0 0 0px rgba(202,74,31,0.5)}100%{box-shadow:0 0 0 10px rgba(202,74,31,0)}}@media screen and (max-width: 782px){#wpadminbar #wp-admin-bar-aioseo-main{display:block;position:static}#wpadminbar #wp-admin-bar-aioseo-main .ab-item .text{display:none}#wpadminbar #wp-admin-bar-aioseo-main .aioseo-logo.svg{width:52px;height:46px;background-position:50% 8px;background-size:30px}}
3
 
dist/Lite/assets/css/aioseo-admin-bar.css.gz CHANGED
Binary file
dist/Lite/assets/css/chunk-common.css CHANGED
@@ -1 +1 @@
1
- .aioseo-app .aioseo-cta{margin-top:30px;background:#fff;width:100%;padding:40px;box-shadow:0 2px 5px rgba(0,0,0,.05);border:1px solid #e8e8eb}.aioseo-app .aioseo-cta.floating{margin-top:0;position:absolute;max-width:850px;left:50%;top:50%;transform:translateX(-50%) translateY(-50%);box-shadow:0 5px 20px rgba(0,0,0,.1);border-radius:3px}.aioseo-app .aioseo-cta .header-text{line-height:1.4;font-weight:600;font-size:24px;text-align:center;color:#141b38}.aioseo-app .aioseo-cta .header-text span.large{line-height:1.4;font-size:32px}.aioseo-app .aioseo-cta .description{margin:30px 0 50px;width:100%;max-width:600px;text-align:center;font-size:16px;color:#141b38;line-height:1.4}.aioseo-app .aioseo-cta .description .aioseo-alert{margin-bottom:30px;text-align:left}.aioseo-app .aioseo-cta .feature-list{color:#141b38;font-size:16px;width:100%;max-width:500px;margin-bottom:50px}.aioseo-app .aioseo-cta .feature-list .aioseo-col{display:flex;align-items:flex-start}.aioseo-app .aioseo-cta .feature-list .aioseo-col svg.aioseo-circle-check{color:#00aa63;width:18px;min-width:18px;min-height:18px;margin-right:10px}.aioseo-app .aioseo-cta a.learn-more{margin-top:20px;color:#8c8f9a;font-size:14px}.aioseo-app .aioseo-cta .type-1{display:flex;flex-direction:column;align-items:center}.aioseo-app .aioseo-cta .type-2{margin:30px 0 30px 50px;display:flex}.aioseo-app .aioseo-cta .type-2 .description,.aioseo-app .aioseo-cta .type-2 .header-text{text-align:left}.aioseo-app .aioseo-cta .type-2 .description,.aioseo-app .aioseo-cta .type-2 .feature-list{margin:30px 0}.aioseo-app .aioseo-cta .type-2>div{margin-right:20px;flex:0 0 50%}.aioseo-app .aioseo-cta .type-2 .featured-image{max-height:540px;border:1px solid #e8e8eb;flex:1;overflow:hidden;margin-right:-41px;margin-bottom:-71px;border-radius:5px 0 0}.aioseo-app .aioseo-cta .type-2 .featured-image img{max-height:600px}@media only screen and (max-width:912px){.aioseo-app .aioseo-cta .type-2{flex-direction:column;align-items:center}.aioseo-app .aioseo-cta .type-2 .description,.aioseo-app .aioseo-cta .type-2 .header-text{text-align:center}.aioseo-app .aioseo-cta .type-2>div{text-align:center;margin-right:0;margin-bottom:30px;flex:1 0 100%;width:100%}.aioseo-app .aioseo-cta .type-2 .featured-image{margin:0 -10px -41px;border-radius:5px 5px 0 0;max-height:300px}}.aioseo-app .aioseo-cta .type-3 .sub-header{line-height:1.4;font-size:16px;font-weight:600;color:#005ae0;margin-bottom:5px}.aioseo-app .aioseo-cta .type-3 .header-text{text-align:left}.aioseo-app .aioseo-cta .type-3 .feature-list{margin:30px 0}.aioseo-app .aioseo-cta .type-3 .feature-list .aioseo-col svg.aioseo-circle-check{color:#00aa63;width:21px;min-width:21px;min-height:21px;margin-right:5px}.aioseo-app .aioseo-cta .type-3 .aioseo-button{margin-right:12px}.aioseo-box-toggle .aioseo-row .aioseo-col{max-width:calc(200px + 1em)}@media only screen and (max-width:48em){.aioseo-box-toggle .aioseo-row .aioseo-col{max-width:100%}}.aioseo-box-toggle input{position:absolute!important;clip:rect(0,0,0,0);height:1px;width:1px;border:0;overflow:hidden}.aioseo-box-toggle input:checked+label{background-color:#fff;box-shadow:0 5px 10px rgba(0,90,224,.1);border:2px solid #005ae0;font-weight:600}.aioseo-box-toggle label{background-color:#f9f9fa;color:#141b38;font-size:16px;line-height:1;display:flex;align-items:center;justify-content:center;flex-direction:column;border:1px solid #f9f9fa;transition:all .1s ease-in-out;border-radius:3px;height:165px;position:relative}.aioseo-box-toggle label p{position:absolute;bottom:15px;margin:0}.aioseo-box-toggle label:hover{cursor:pointer}.aioseo-button{flex-shrink:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:600;padding:0 24px;border-radius:4px;-webkit-appearance:none;cursor:pointer;height:48px;transition:background-color .2s ease;position:relative;overflow:hidden;text-decoration:none;color:#141b38;white-space:nowrap}.aioseo-button.small{height:30px;font-size:14px;padding:0 12px}.aioseo-button.small .loading-spinner{width:25px;height:25px}.aioseo-button.medium{height:40px;font-size:14px;padding:0 18px}.aioseo-button.medium .loading-spinner{width:35px;height:35px}.aioseo-button.xl{height:66px;border-radius:4px;font-size:18px;padding:0 48px}.aioseo-button.gray{border:1px solid #dcdde1;background-color:#f3f4f5}.aioseo-button.gray:hover{background-color:#fff;color:#141b38}.aioseo-button.gray:active{background-color:#f3f4f5}.aioseo-button.green{border:none;background-color:#00aa63;color:#fff}.aioseo-button.green:hover{background-color:#07c575}.aioseo-button.green:active{background-color:#15955f}.aioseo-button.blue{border:none;background-color:#005ae0;color:#fff}.aioseo-button.blue:hover{background-color:#1a82ea}.aioseo-button.blue:active{background-color:#004f9d}.aioseo-button.wp-blue{border:1px solid #005ae0;background-color:#f3f5f6;color:#005ae0}.aioseo-button.wp-blue:hover{background-color:#1a82ea;border-color:#1a82ea;color:#fff}.aioseo-button.wp-blue:active{background-color:#004f9d;border-color:#004f9d;color:#fff}.aioseo-button.black{border:none;background-color:#434960;color:#fff}.aioseo-button.black:hover{background-color:#2c324c}.aioseo-button.black:active{background-color:#141b38}.aioseo-button.red{border:1px solid #df2a4a;background-color:#fff;color:#df2a4a}.aioseo-button.red:hover{background-color:#df2a4a;color:#fff}.aioseo-button.red:active{background-color:#ab2039}.aioseo-button.loading.blue,.aioseo-button.loading.blue:hover{background-color:#004f9d;color:#004f9d}.aioseo-button.loading.green,.aioseo-button.loading.green:hover{background-color:#15955f;color:#15955f}.aioseo-button.loading.gray,.aioseo-button.loading.gray:hover{background-color:#f3f4f5;color:#f3f4f5}.aioseo-button.loading.black,.aioseo-button.loading.black:hover{background-color:#141b38;color:#141b38}.aioseo-button:disabled{border:1px solid #dcdde1;color:#8c8f9a;background-color:#f3f4f5;cursor:default}.aioseo-button:disabled.gray:hover{color:#8c8f9a}.aioseo-button:disabled.wp-blue{border-color:#ddd;background-color:#f7f7f7}.aioseo-button:disabled.wp-blue:hover{border-color:#ddd;color:#8c8f9a}.aioseo-button:disabled:hover{background-color:#f3f4f5}.aioseo-checkbox{display:inline-flex;align-items:center}.aioseo-checkbox.disabled,.aioseo-checkbox.disabled .form-checkbox .fancy-checkbox,.aioseo-checkbox.no-clicks,.aioseo-checkbox.no-clicks .form-checkbox .fancy-checkbox{cursor:default}.aioseo-checkbox .form-checkbox-wrapper{margin-right:10px;display:flex}.aioseo-checkbox.medium .form-checkbox{width:20px;height:20px}.aioseo-checkbox.medium .form-checkbox .fancy-checkbox svg{width:12px;height:12px}.aioseo-checkbox.medium .form-checkbox span:before{height:18px;width:18px;line-height:20px}.aioseo-checkbox.round .form-checkbox span,.aioseo-checkbox.round .form-checkbox span:before{border-radius:50%}.aioseo-checkbox .form-checkbox{position:relative;display:inline-block;width:28px;height:28px;color:#fff;vertical-align:bottom;text-align:center}.aioseo-checkbox .form-checkbox input{display:none}.aioseo-checkbox .form-checkbox input:checked+.fancy-checkbox.blue{background:#005ae0}.aioseo-checkbox .form-checkbox input:checked+.fancy-checkbox.green{background:#00aa63}.aioseo-checkbox .form-checkbox input:checked+.fancy-checkbox:before{background:transparent}.aioseo-checkbox .form-checkbox input:disabled+.fancy-checkbox{background:#e8e8eb!important;border:1px solid #d0d1d7;cursor:default}.aioseo-checkbox .form-checkbox input:disabled+.fancy-checkbox svg{color:#8c8f9a}.aioseo-checkbox .form-checkbox input:not(:checked):disabled+.fancy-checkbox:before{left:0;bottom:0;background:#e8e8eb}.aioseo-checkbox .form-checkbox .fancy-checkbox svg{color:#fff;width:16px;height:16px}.aioseo-checkbox .form-checkbox span{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#d0d1d7;transition:.2s;border-radius:3px;display:flex;align-items:center;justify-content:center}.aioseo-checkbox .form-checkbox span:before{position:absolute;content:"";height:26px;width:26px;left:1px;bottom:1px;background-color:#fff;transition:.2s;font-size:18px;line-height:28px;border-radius:2px}.aioseo-date-picker.vue-daterange-picker{width:100%}.aioseo-date-picker.vue-daterange-picker .form-control{display:flex;align-items:center;color:#141b38;font-size:16px;height:48px;border-radius:3px;border:1px solid #d0d1d7;position:relative}.aioseo-date-picker.vue-daterange-picker .form-control svg.aioseo-circle-close{position:absolute;right:10px;color:#434960;width:15px;height:15px}.aioseo-date-picker.vue-daterange-picker.small .form-control{height:30px}.aioseo-date-picker.vue-daterange-picker.medium .form-control{height:40px}body[class*=all-in-one-seo_page] .daterangepicker .yearselect{width:75px}.aioseo-editor{position:relative}.aioseo-editor .aioseo-editor-description .ql-editor{min-height:100px}.aioseo-editor .aioseo-editor-line-numbers .ql-editor{padding:15px 15px 15px 45px}.aioseo-editor .aioseo-editor-single .ql-editor{padding:8px 10px}.aioseo-editor .aioseo-editor-single.aioseo-editor-line-numbers .ql-editor{padding:8px 10px 8px 45px}.aioseo-editor .aioseo-editor-monospace .ql-editor{font-family:monospace}.aioseo-editor .aioseo-line-numbers{background:#f7f6f7;position:absolute;text-align:right;top:1px;width:29px;left:1px;border-radius:3px 0 0 3px;padding:15px 9px 0 0;display:flex;height:calc(100% - 2px);flex-direction:column;overflow:hidden}.aioseo-editor .aioseo-line-numbers div{min-height:25px;color:#8c8f9a;font-size:12px;line-height:1.9}.aioseo-editor .ql-disabled{pointer-events:none;background-color:#f9f9fa}.aioseo-editor .ql-editor{padding:15px;border-radius:3px;font-size:16px;color:#141b38;border:1px solid #d0d1d7}.aioseo-editor .ql-editor:focus{border:1px solid #005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-editor .ql-editor .mention .ql-mention-denotation-char{display:none}.aioseo-editor .ql-editor .mention .aioseo-tag{height:25px;margin:0 1px;color:#434960;font-weight:600;font-size:14px;padding:3px 25px 3px 10px;background-color:#f3f4f5;border-radius:3px;cursor:pointer;position:relative;display:inline-flex;align-items:center}.aioseo-editor .ql-editor .mention .aioseo-tag .tag-toggle{display:inline-flex;align-items:center;background-color:#e8e8eb;position:absolute;top:0;right:0;bottom:0;border-radius:0 3px 3px 0}.aioseo-editor .ql-editor .mention .aioseo-tag .tag-toggle svg.aioseo-caret{width:18px;height:18px;transition:transform .3s}.aioseo-editor .ql-editor .mention .aioseo-tag .tag-toggle svg.aioseo-caret.rotated{transform:rotate(180deg)}.aioseo-editor .ql-mention-list-container{color:#141b38;background-color:#fff;max-width:250px;width:100%;margin-top:3px;border:1px solid #d0d1d7;border-radius:3px;box-shadow:0 3px 15px rgba(0,0,0,.1);z-index:9001}.aioseo-editor .ql-mention-list-container .aioseo-tag-custom,.aioseo-editor .ql-mention-list-container .aioseo-tag-search{padding:12px;border-bottom:1px solid #e8e8eb}.aioseo-editor .ql-mention-list-container .aioseo-tag-custom{display:none}.aioseo-editor .ql-mention-list-container .ql-mention-list{list-style:none;margin:0;padding:0;max-height:210px;overflow:auto}.aioseo-editor .ql-mention-list-container .ql-mention-list li{color:#141b38;margin:0;background-color:transparent;border-bottom:1px solid #e8e8eb;padding:15px;cursor:pointer;font-size:14px}.aioseo-editor .ql-mention-list-container .ql-mention-list li:last-child{border-bottom:0}.aioseo-editor .ql-mention-list-container .ql-mention-list li.selected,.aioseo-editor .ql-mention-list-container .ql-mention-list li:hover{color:#005ae0;background-color:#f2f7fd}.aioseo-editor .ql-mention-list-container .ql-mention-list li.selected .aioseo-tag-description,.aioseo-editor .ql-mention-list-container .ql-mention-list li:hover .aioseo-tag-description{color:initial}.aioseo-editor .ql-mention-list-container .ql-mention-list li .aioseo-tag-item{display:flex}.aioseo-editor .ql-mention-list-container .ql-mention-list li .aioseo-tag-item>div:first-child{margin-right:10px}.aioseo-editor .ql-mention-list-container .ql-mention-list li .aioseo-tag-item .aioseo-tag-title{font-weight:600}.aioseo-editor .ql-mention-list-container .ql-mention-list li svg.aioseo-plus{width:10px;height:10px;color:#005ae0}.aioseo-editor .ql-mention-list-container .ql-mention-list li.aioseo-tag-no-match{cursor:default;padding:12px;font-size:16px;font-weight:600}.aioseo-editor .ql-mention-list-container .ql-mention-list li.aioseo-tag-no-match.highlight,.aioseo-editor .ql-mention-list-container .ql-mention-list li.aioseo-tag-no-match:hover{color:initial;background-color:transparent}.aioseo-editor .ql-toolbar{display:none}.aioseo-editor .ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.aioseo-editor .ql-snow .ql-hidden{display:none}.aioseo-editor .ql-container.ql-snow{border:none}.aioseo-editor .ql-container p{font-size:16px;margin:0;line-height:25px}.aioseo-highlight-toggle{border:1px solid #e8e8eb;border-radius:3px;min-height:48px;display:flex;align-items:center;padding:5px 10px;cursor:pointer}.aioseo-highlight-toggle>*{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.aioseo-highlight-toggle.active{border-color:#005ae0;box-shadow:0 5px 10px rgba(0,90,224,.1)}.aioseo-highlight-toggle.medium{min-height:40px}.aioseo-highlight-toggle .icon{display:flex;align-items:center;margin-right:5px}.aioseo-input[data-v-20c03142]{position:relative;width:100%}.aioseo-input.file[data-v-20c03142],.aioseo-input.file input[type=file][data-v-20c03142]{position:absolute;top:0;right:0;left:0;bottom:0;margin:0;padding:0}.aioseo-input.file input[type=file][data-v-20c03142]{cursor:pointer;opacity:0}.aioseo-input.file input[type=file][data-v-20c03142]::-webkit-file-upload-button{visibility:hidden}.aioseo-input.file input[type=file][data-v-20c03142]:focus{box-shadow:none}.aioseo-input input[data-v-20c03142]{height:48px;width:100%;background-color:#fff;border:1px solid #d0d1d7;border-radius:3px;padding:15px;font-size:18px;position:relative;overflow:hidden;margin:0}.aioseo-input input[data-v-20c03142]:disabled{background:#f9f9fa}.aioseo-input input[data-v-20c03142]:focus{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-input input[data-v-20c03142]::-moz-placeholder{color:#8c8f9a}.aioseo-input input[data-v-20c03142]:-ms-input-placeholder{color:#8c8f9a}.aioseo-input input[data-v-20c03142]::placeholder{color:#8c8f9a}.aioseo-input input.prepend[data-v-20c03142]{padding-left:50px}.aioseo-input input.append[data-v-20c03142]{padding-right:50px}.aioseo-input input.small[data-v-20c03142]{height:30px;padding:10px;font-size:14px}.aioseo-input input.small.prepend[data-v-20c03142]{padding-left:30px}.aioseo-input input.small.append[data-v-20c03142]{padding-right:30px}.aioseo-input input.medium[data-v-20c03142]{height:40px;padding:12px;font-size:16px}.aioseo-input input.medium.prepend[data-v-20c03142]{padding-left:35px}.aioseo-input input.medium.append[data-v-20c03142]{padding-right:35px}.aioseo-input.aioseo-active input[data-v-20c03142]{border-color:#00aa63}.aioseo-input.aioseo-active input[data-v-20c03142]:active,.aioseo-input.aioseo-active input[data-v-20c03142]:focus{box-shadow:0 0 0 1px #00aa63}.aioseo-input.aioseo-active .append-icon[data-v-20c03142],.aioseo-input.aioseo-active .prepend-icon[data-v-20c03142]{color:#00aa63}.aioseo-input.aioseo-error input[data-v-20c03142]{border-color:#df2a4a}.aioseo-input.aioseo-error input[data-v-20c03142]:active,.aioseo-input.aioseo-error input[data-v-20c03142]:focus{box-shadow:0 0 0 1px #df2a4a}.aioseo-input.aioseo-error .append-icon[data-v-20c03142],.aioseo-input.aioseo-error .prepend-icon[data-v-20c03142]{color:#df2a4a}.aioseo-input.aioseo-warning input[data-v-20c03142]{border-color:#f18200}.aioseo-input.aioseo-warning input[data-v-20c03142]:active,.aioseo-input.aioseo-warning input[data-v-20c03142]:focus{box-shadow:0 0 0 1px #f18200}.aioseo-input.aioseo-warning .append-icon[data-v-20c03142],.aioseo-input.aioseo-warning .prepend-icon[data-v-20c03142]{color:#f18200}.aioseo-input .prepend-icon[data-v-20c03142]{position:absolute;top:0;left:10px;width:30px;height:100%;color:#d0d1d7;display:flex;align-items:center;z-index:1}.aioseo-input .prepend-icon svg[data-v-20c03142]{width:30px;height:30px}.aioseo-input .prepend-icon.small[data-v-20c03142]{width:20px}.aioseo-input .prepend-icon.small svg[data-v-20c03142]{width:10px;height:10px}.aioseo-input .prepend-icon.medium[data-v-20c03142]{width:15px}.aioseo-input .prepend-icon.medium svg[data-v-20c03142]{width:15px;height:15px}.aioseo-input .append-icon[data-v-20c03142]{position:absolute;top:0;right:10px;width:30px;height:100%;color:#d0d1d7;display:flex;align-items:center;z-index:1}.aioseo-input .append-icon svg[data-v-20c03142]{width:30px;height:30px}.aioseo-input .append-icon.small[data-v-20c03142]{width:10px}.aioseo-input .append-icon.medium[data-v-20c03142]{width:15px}.aioseo-input .append-icon.clickable[data-v-20c03142]{cursor:pointer;padding:0 5px;background:#f3f4f5;border:1px solid #d0d1d7;color:#434960;right:0;width:30px;border-radius:0 3px 3px 0}.aioseo-input .append-icon.clickable.small[data-v-20c03142]{width:15px}.aioseo-input .append-icon.clickable.medium[data-v-20c03142]{padding:0 10px;width:40px}.aioseo-phone-number{max-width:600px}.aioseo-phone-number label{display:none}.aioseo-phone-number .maz-input__input{height:40px;min-height:40px;padding-top:0!important;border:1px solid #d0d1d7}.aioseo-phone-number .maz-input__input:focus{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-phone-number .country-selector{flex:0 0 140px;width:140px;min-width:140px;max-width:140px}.aioseo-phone-number .country-selector:hover{z-index:1}.aioseo-phone-number .country-selector>div.maz-base-component.maz-input.has-value.has-1-right-icon.maz-input--primary>input{padding-left:50px!important}.aioseo-phone-number .country-selector .maz-input.is-focused{border-color:#005ae0}.aioseo-phone-number .country-selector .maz-select__options-list__item.selected.keyboard-selected{background-color:#005ae0}.aioseo-phone-number .maz-phone-number-input__country-flag{left:20px;bottom:12px;z-index:auto}.aioseo-phone-number .maz-input__icon{z-index:auto}.aioseo-phone-number .maz-select__options-list input{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-phone-number .maz-input__input{border-radius:3px}.aioseo-phone-number.invalidNumber div.maz-flex-1>div>input{border-color:red}.aioseo-phone-number.invalidNumber div.maz-flex-1>div>input:focus{border-color:#df2a4a;box-shadow:0 0 0 1px #df2a4a}.aioseo-phone-number.validNumber div.maz-flex-1>div>input:focus{border-color:#00aa63;box-shadow:0 0 0 1px #00aa63}.aioseo-radio{display:inline-flex;align-items:center}.aioseo-radio .form-radio-wrapper{margin-right:10px;display:flex}.aioseo-radio.medium .form-radio{width:20px;height:20px}.aioseo-radio.medium .form-radio .fancy-radio svg{width:12px;height:12px}.aioseo-radio.medium.type-1 .form-radio span:before{height:18px;width:18px;line-height:20px}.aioseo-radio.medium.type-2 .form-radio span:before{height:16px;width:16px;line-height:20px}.aioseo-radio.medium.type-2 .form-radio span:after{height:6px;width:6px;left:6px;bottom:6px}.aioseo-radio .form-radio{position:relative;display:inline-block;width:28px;height:28px;color:#fff;vertical-align:bottom;text-align:center}.aioseo-radio .form-radio input{opacity:0}.aioseo-radio .form-radio input:checked+.fancy-radio{background:#005ae0;border-color:#005ae0}.aioseo-radio .form-radio input:checked+.fancy-radio:before{background:transparent}.aioseo-radio .form-radio input:checked+.fancy-radio:after{display:block}.aioseo-radio .form-radio input:disabled+.fancy-radio{cursor:default}.aioseo-radio .form-radio input:focus+.fancy-radio{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-radio .form-radio .fancy-radio{border-radius:50%}.aioseo-radio .form-radio .fancy-radio svg{color:#fff;width:16px;height:16px}.aioseo-radio .form-radio span{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;transition:.2s;border-radius:50%;display:flex;align-items:center;justify-content:center}.aioseo-radio .form-radio span:before{position:absolute;content:"";height:26px;width:26px;left:1px;bottom:1px;transition:.2s;font-size:18px;line-height:28px;border-radius:50%}.aioseo-radio.type-1 .form-radio span,.aioseo-radio.type-1 .form-radio span:before{background-color:#f3f4f5}.aioseo-radio.type-2 .form-radio span{border:1px solid #d0d1d7;background-color:#fff}.aioseo-radio.type-2 .form-radio span:before{background-color:#fff}.aioseo-radio.type-2 .form-radio span:after{display:none;position:absolute;content:"";height:10px;width:10px;left:8px;bottom:8px;background-color:#fff;transition:.2s;border-radius:50%}.aioseo-radio.disabled{cursor:default}.aioseo-radio.disabled.type-2 .form-radio input:checked+.fancy-radio{background-color:#e8e8eb;border-color:#d0d1d7}.aioseo-radio.disabled.type-2 .form-radio span,.aioseo-radio.disabled.type-2 .form-radio span:before{background-color:#e8e8eb}.aioseo-radio.disabled.type-2 .form-radio span:after{background-color:#8c8f9a}.aioseo-radio-toggle{display:flex;align-items:center;height:40px}.aioseo-radio-toggle div{height:100%}.aioseo-radio-toggle.inline{display:inline-flex}.aioseo-radio-toggle div:first-child{overflow:hidden;border-radius:3px 0 0 3px}.aioseo-radio-toggle div:first-child label{border-radius:3px 0 0 3px}.aioseo-radio-toggle div:last-child{overflow:hidden;border-radius:0 3px 3px 0}.aioseo-radio-toggle div:last-child label{border-radius:0 3px 3px 0}.aioseo-radio-toggle input{position:absolute!important;clip:rect(0,0,0,0);height:1px;width:1px;border:0;overflow:hidden}.aioseo-radio-toggle input:checked+label{background-color:#005ae0;color:#fff}.aioseo-radio-toggle input:checked+label.dark{background-color:#434960;color:#fff}.aioseo-radio-toggle label{height:100%;background-color:#e8e8eb;color:#141b38;font-size:14px;line-height:1;display:flex;align-items:center;justify-content:center;flex-direction:column;transition:all .1s ease-in-out;position:relative;padding:11px 20px;font-weight:600}.aioseo-radio-toggle label.disabled{cursor:default;pointer-events:none;opacity:.5}.aioseo-radio-toggle label:hover{background-color:#dadadf;cursor:pointer}.aioseo-radio-toggle label p{position:absolute;bottom:15px;margin:0}.aioseo-radio-toggle.circle label{background:#fff;color:#8c8f9a}.aioseo-radio-toggle.circle input+label{border-radius:50%;width:36px;height:36px;padding:8px}.aioseo-radio-toggle.circle input:checked+label{background:#e8e8eb;color:#2c324c}.aioseo-select{height:48px}.aioseo-select.multiselect--disabled .multiselect__select{background:none}.aioseo-select .multiselect__select{display:flex;align-items:center;justify-content:center;min-height:46px}.aioseo-select .multiselect__select:before{display:none}.aioseo-select .multiselect__select svg.aioseo-caret{color:#141b38;width:18px;height:18px;transition:transform .3s}.aioseo-select .multiselect__tags{height:100%;border:1px solid #d0d1d7;border-radius:3px;display:flex;justify-content:center;flex-direction:column;padding:16px 40px 16px 16px}.aioseo-select .multiselect__tags .multiselect__spinner{height:calc(100% - 2px);border:2px solid transparent}.aioseo-select .multiselect__tags .multiselect__spinner:after,.aioseo-select .multiselect__tags .multiselect__spinner:before{border-top-color:#434960}.aioseo-select .multiselect__tags .multiselect__single{display:inline-flex;margin:0;padding:0;color:#141b38;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.aioseo-select .multiselect__tags .multiselect__placeholder{color:#8c8f9a;font-size:16px;line-height:20px;margin:0;padding:0}.aioseo-select .multiselect__tags .multiselect__input{padding:0;margin:0 10px 0 0;border-radius:0;border:none;color:#141b38;min-height:auto;line-height:20px}.aioseo-select .multiselect__tags .multiselect__input:focus{outline:0;box-shadow:none;border:none}.aioseo-select .multiselect__tags .multiselect__input::-moz-placeholder{color:#8c8f9a}.aioseo-select .multiselect__tags .multiselect__input:-ms-input-placeholder{color:#8c8f9a}.aioseo-select .multiselect__tags .multiselect__input::placeholder{color:#8c8f9a}.aioseo-select .multiselect__tags .multiselect__tags-wrap{display:flex;align-items:center;flex-wrap:wrap}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag{padding:0;display:inline-flex;align-items:center;font-size:14px;font-weight:600;color:#434960;margin:0 3px 0 0;height:24px;background-color:#f3f4f5;flex-shrink:0}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-value{padding:0 5px 0 10px}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove{padding:0 10px;height:100%;cursor:pointer;background-color:#f3f4f5;display:flex;align-items:center}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove:hover{background-color:#434960;color:#fff}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove:hover svg.aioseo-close{color:#fff}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove svg.aioseo-close{color:#434960;width:10px;height:10px}.aioseo-select.multiselect--active .multiselect__tags-wrap{margin-bottom:7px}.aioseo-select.small{height:30px;min-height:30px}.aioseo-select.small .multiselect__tags{min-height:30px;padding:8px 38px 8px 8px}.aioseo-select.small .multiselect__tags .multiselect__placeholder{font-size:14px}.aioseo-select.small .multiselect__select{height:28px;min-height:28px}.aioseo-select.small .multiselect__input{font-size:14px}.aioseo-select.small .multiselect__content-wrapper li.multiselect__element .multiselect__option{font-size:14px;padding:8px;min-height:30px}.aioseo-select.medium{height:40px}.aioseo-select.medium .multiselect__tags{padding:7px 40px 7px 7px}.aioseo-select.medium .multiselect__select{min-height:38px}.aioseo-select.multiple{min-height:48px;height:auto}.aioseo-select.multiple.small{min-height:30px}.aioseo-select.multiple.medium{min-height:40px}.aioseo-select.multiselect--above .multiselect__content-wrapper{border-top:1px solid #d0d1d7;border-bottom:none}.aioseo-select .multiselect__content-wrapper{border:1px solid #d0d1d7;border-top:none;border-bottom-left-radius:3px;border-bottom-right-radius:3px;z-index:50;-webkit-overflow-scrolling:touch}.aioseo-select .multiselect__content-wrapper .multiselect__content{max-width:100%}.aioseo-select .multiselect__content-wrapper li.multiselect__element{margin:0;border-bottom:1px solid #e8e8eb}.aioseo-select .multiselect__content-wrapper li.multiselect__element.last{border-bottom:none}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option{color:#141b38;font-weight:700;font-size:16px;white-space:normal;line-height:1.4}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--highlight{background-color:#f2f7fd}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--highlight:after{background-color:#005ae0;color:#fff}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--selected{background-color:#f2f7fd}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--disabled{font-weight:400;background-color:#fff!important;color:#8c8f9a}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option .docLink{font-size:13px;float:right}.aioseo-textarea-autosize{width:100%;background-color:#fff;border:1px solid #d0d1d7;border-radius:4px;font-size:16px;padding:12px}.aioseo-toggle{display:inline-flex}.aioseo-toggle:active,.aioseo-toggle:focus{outline:2px solid transparent}.aioseo-toggle.disabled{pointer-events:none}.aioseo-toggle.disabled .toggle-content{opacity:.5}.aioseo-toggle .toggle-content{position:relative;display:inline-block;width:36px;height:20px;margin-right:10px}.aioseo-toggle .toggle-content input{display:none}.aioseo-toggle .toggle-content input:checked+.toggle-switch{border:1px solid #005ae0;background-color:#005ae0}.aioseo-toggle .toggle-content input:checked+.toggle-switch:focus{outline:2px solid transparent}.aioseo-toggle .toggle-content input:checked+.toggle-switch:before{background-color:#fff;transform:translateX(15px)}.aioseo-toggle .toggle-content input:focus+.toggle-switch{box-shadow:0 0 1px #005ae0;outline:2px solid transparent}.aioseo-toggle .toggle-content .toggle-switch{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#fff;border:1px solid #d0d1d7;border-radius:15px;transition:.2s}.aioseo-toggle .toggle-content .toggle-switch:before{position:absolute;content:"";height:14px;width:14px;left:3px;bottom:2px;background-color:#d0d1d7;border-radius:50%;transition:.2s}.aioseo-wp-table input[type=search],.aioseo-wp-table select{border-color:#d0d1d7}.aioseo-wp-table select:focus{border-color:#005ae0;color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-wp-table select:hover{color:#005ae0}.aioseo-wp-table input.button,.aioseo-wp-table input.button:hover{color:#005ae0;border-color:#005ae0}.aioseo-wp-table .header .subsubsub{color:#555d66;font-size:13px;font-weight:600}.aioseo-wp-table .header .subsubsub>span{display:inline-flex}.aioseo-wp-table .header .subsubsub .separator{margin:0 5px}.aioseo-wp-table .header .subsubsub .active{font-weight:700;color:#141b38}.aioseo-wp-table .header .subsubsub a{text-decoration:none}.aioseo-wp-table .header .subsubsub a:hover{text-decoration:underline}.aioseo-wp-table .header .search{display:flex;justify-content:flex-end}.aioseo-wp-table .header .search .aioseo-input{width:100%;max-width:215px;margin-right:6px}.aioseo-wp-table .header .pagination{color:#555d66}.aioseo-wp-table .header .pagination .button,.aioseo-wp-table .header .pagination input{margin-left:6px}.aioseo-wp-table .tablenav-pages .current-page{padding:0 0 0 8px}.aioseo-wp-table .wp-table{width:100%;position:relative}.aioseo-wp-table .wp-table .loader-overlay{position:absolute;top:46px;right:0;bottom:36px;left:0;background:rgba(0,0,0,.3);z-index:1;display:flex;align-items:center;justify-content:center}.aioseo-wp-table .wp-table .no-results{color:#8c8f9a;min-height:200px;display:flex;align-items:center;justify-content:center;font-weight:400;font-size:24px}.aioseo-wp-table .wp-table tr.even{background-color:#f9f9fa}.aioseo-wp-table .wp-table tr.enabled td,.aioseo-wp-table .wp-table tr.enabled td strong a{color:#141b38}.aioseo-wp-table .wp-table tr:not(.enabled):not(.edit-row) td,.aioseo-wp-table .wp-table tr:not(.enabled):not(.edit-row) td a.edit-link{color:#8c8f9a}.aioseo-wp-table .wp-table tr.edit-row th{padding:0 0 0 3px}.aioseo-wp-table .wp-table tr.edit-row td{padding:0 30px 0 10px}.aioseo-wp-table .wp-table tr td strong a{font-weight:400}.aioseo-wp-table .wp-table tr td .row-actions .edit a,.aioseo-wp-table .wp-table tr td strong a:hover{color:#005ae0}.aioseo-wp-table .wp-table tr td .row-actions .edit .trash a{color:#df2a4a}.aioseo-wp-table .wp-table tr td.edit-row-content .wrapper .border{padding:8px 0;border-top:1px solid #e8e8eb}.custom-rules[data-v-06a772d2]{width:100%}.custom-rules .rule-table[data-v-06a772d2]{margin-top:5px;border:1px solid #d0d1d7;border-radius:3px;width:100%;font-family:Helvetica;font-size:14px;font-style:normal;font-weight:400;line-height:21px;letter-spacing:0;text-align:left}.custom-rules .rule-table .rule[data-v-06a772d2]{padding:13px;background:#f9f9fa}.custom-rules .rule-table .rule.even[data-v-06a772d2]{background-color:#fff}.custom-rules .rule[data-v-06a772d2]{display:flex;flex-direction:row;align-items:center;padding-top:10px}.custom-rules .rule[data-v-06a772d2]:first-child{border-radius:3px 3px 0 0}.custom-rules .rule[data-v-06a772d2]:last-child{border-radius:0 0 3px 3px}.custom-rules .rule .rule-settings>.aioseo-select[data-v-06a772d2]:first-child{width:250px;min-width:250px}.custom-rules .rule .rule-settings[data-v-06a772d2]{display:flex;flex-direction:row;align-items:center;flex:1}.custom-rules .rule .rule-settings>[data-v-06a772d2]{margin:0 6px 0 0}.custom-rules .rule .rule-settings>.aioseo-toggle[data-v-06a772d2]{margin:0 10px 0 4px}.custom-rules .rule .actions[data-v-06a772d2],.custom-rules .rule .logical[data-v-06a772d2]{flex:0}.custom-rules svg[data-v-06a772d2]{width:14px;height:14px;cursor:pointer}.custom-rules svg.aioseo-trash[data-v-06a772d2]{color:#dadada}.custom-rules svg.aioseo-trash[data-v-06a772d2]:hover{color:#df2a4a}.custom-rules .aioseo-tooltip[data-v-06a772d2]{margin:0;display:flex}.custom-rules .aioseo-button svg[data-v-06a772d2]{color:#fff}.custom-rules .add-rule[data-v-06a772d2]{margin-top:10px}.custom-rules .add-rule svg[data-v-06a772d2]{margin-right:6px}.aioseo-add-redirection.edit-url{margin-bottom:30px}.aioseo-add-redirection.edit-url .urls{align-items:flex-start}.aioseo-add-redirection.edit-url .urls .url-arrow{margin:-8px 30px 0}.aioseo-add-redirection.edit-url .advanced-settings-link{text-decoration:underline;margin-top:21px}.aioseo-add-redirection.log-404 .urls .source{min-height:103px;align-items:flex-start}.aioseo-add-redirection .generic-error{margin-bottom:20px}.aioseo-add-redirection .aioseo-settings-row .settings-name .name{font-size:14px}.aioseo-add-redirection .urls{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap}.aioseo-add-redirection .urls .break{flex-basis:100%;height:0}.aioseo-add-redirection .urls .url-arrow{width:36px;margin:-15px 30px 0;display:flex;align-items:center;justify-content:center}.aioseo-add-redirection .urls .url-arrow svg{height:103px;color:#005ae0}.aioseo-add-redirection .urls .source,.aioseo-add-redirection .urls .target{flex:1;display:flex;align-items:center}.aioseo-add-redirection .urls .source>*,.aioseo-add-redirection .urls .target>*{flex:1}.aioseo-add-redirection .urls .source .aioseo-input,.aioseo-add-redirection .urls .target .aioseo-input{margin-bottom:10px}.aioseo-add-redirection .urls .target .aioseo-description{height:30px}.aioseo-add-redirection .urls .target .append-icon{width:60px;justify-content:flex-end}.aioseo-add-redirection .urls .target .append-icon svg{max-width:16px;margin-right:5px}.aioseo-add-redirection .urls .target .append-icon svg:last-of-type{margin-right:0}.aioseo-add-redirection .urls .target .append-icon svg.aioseo-circle-check{color:#00aa63}.aioseo-add-redirection .urls .target .append-icon svg.aioseo-circle-close{color:#df2a4a}.aioseo-add-redirection .urls .target .target-url-error,.aioseo-add-redirection .urls .target .target-url-warning{margin-bottom:10px}.aioseo-add-redirection .settings{display:flex;flex-direction:column;align-items:center;margin-top:30px}.aioseo-add-redirection .settings .all-settings{width:100%}.aioseo-add-redirection .settings .all-settings .all-settings-content{display:flex;align-items:center;flex-wrap:wrap}.aioseo-add-redirection .settings .all-settings .all-settings-content .advanced-settings-link{margin:16px 0 0 16px;color:#8c8f9a}@media (max-width:767px){.aioseo-add-redirection .settings .all-settings .all-settings-content{align-items:start}}.aioseo-add-redirection .settings>.actions{align-self:flex-end;margin-top:-50px}.aioseo-add-redirection .settings>.actions.advanced{margin-top:-40px}.aioseo-add-redirection .settings .query-params,.aioseo-add-redirection .settings .redirect-type{margin-bottom:10px;flex:0 1 auto}.aioseo-add-redirection .settings .query-params .aioseo-select,.aioseo-add-redirection .settings .redirect-type .aioseo-select{margin-top:5px}.aioseo-add-redirection .settings .query-params{width:340px}.aioseo-add-redirection .settings .redirect-type{width:300px;margin-right:24px}.aioseo-add-redirection .settings .aioseo-button{align-self:flex-end}.aioseo-add-redirection .settings .cancel-edit-row{margin-left:10px}.aioseo-add-redirection-target-url,.aioseo-redirect-source-url{position:relative}.aioseo-redirect-source-url .aioseo-input input{padding-right:76px}.aioseo-redirect-source-url .aioseo-input .append-icon{width:60px;justify-content:flex-end}.aioseo-redirect-source-url .aioseo-input .append-icon svg{max-width:16px;margin-right:5px}.aioseo-redirect-source-url .aioseo-input .append-icon svg:last-of-type{margin-right:0}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-gear{color:#8c8f9a;cursor:pointer}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-gear.active,.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-gear:hover{color:#005ae0}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-circle-check{color:#00aa63}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-circle-close{color:#df2a4a}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-trash{color:#8c8f9a;cursor:pointer}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-trash.active,.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-trash:hover{color:#df2a4a}.aioseo-redirect-source-url .source-url-error,.aioseo-redirect-source-url .source-url-warning{margin-bottom:10px}.aioseo-redirect-source-url .source-url-options>div{padding-bottom:5px}.aioseo-redirect-source-url .source-url-options>div>div{margin-bottom:5px}.aioseo-add-redirection-url-results{display:flex;position:absolute;background:#fff;width:100%;max-height:300px;overflow:auto;border:1px solid #d0d1d7;border-radius:3px;z-index:50;left:1px;margin-top:-9px}.aioseo-add-redirection-url-results ul{display:inline-block;max-width:100%;list-style:none;padding:0;margin:0;min-width:100%;vertical-align:top}.aioseo-add-redirection-url-results ul li{margin:0;border-bottom:1px solid #e8e8eb;display:block}.aioseo-add-redirection-url-results ul li:last-of-type{border-bottom:none}.aioseo-add-redirection-url-results ul li>span{color:#141b38;font-weight:700;font-size:16px;white-space:normal;line-height:1.4;display:flex;padding:12px;min-height:40px;text-decoration:none;text-transform:none;vertical-align:middle;position:relative;cursor:pointer}.aioseo-add-redirection-url-results ul li>span:hover{background-color:#f2f7fd}.aioseo-add-redirection-url-results ul li>span:hover .option-title{color:#005ae0}.aioseo-add-redirection-url-results .option{flex:1}.aioseo-add-redirection-url-results .option .option-title{font-weight:500;display:flex;font-size:16px;color:#141b38}.aioseo-add-redirection-url-results .option .option-title>div{margin-right:5px}.aioseo-add-redirection-url-results .option .option-title>div:first-of-type{display:inline-block}.aioseo-add-redirection-url-results .option .option-title .search-term{font-weight:700}.aioseo-add-redirection-url-results .option .option-details{display:flex;align-items:center;font-size:14px;color:#8c8f9a}.aioseo-add-redirection-url-results .option .option-details span{margin-right:15px}.aioseo-add-redirection-url-results .option-permalink{display:flex;align-items:center}.aioseo-add-redirection-url-results .option-permalink svg.aioseo-external{width:15px;height:15px;color:#434960}.aioseo-add-template-tag{border-radius:3px;padding:5px 10px;color:#141b38;font-size:14px;border:1px solid #e8e8eb;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-weight:600}.aioseo-add-template-tag:hover{background-color:#f3f4f5}.aioseo-add-template-tag svg.aioseo-plus{width:10px;height:10px;color:#005ae0}.aioseo-additional-pages .additional-pages-table{border:1px solid #d0d1d7;border-radius:3px;margin-bottom:20px}.aioseo-additional-pages .additional-pages-table .page-priority{max-width:110px}.aioseo-additional-pages .additional-pages-table .page-frequency{max-width:166px}.aioseo-additional-pages .additional-pages-table .page-last-modified{max-width:155px}.aioseo-additional-pages .additional-pages-table .page-actions{max-width:20px}.aioseo-additional-pages .additional-pages-table .page-actions .aioseo-tooltip{display:inline-block;margin:0}.aioseo-additional-pages .additional-pages-table .pages-header{height:50px;display:flex;font-size:14px;padding:0 30px;align-items:center;border-bottom:1px solid #d0d1d7}.aioseo-additional-pages .additional-pages-table .pages-header>div{flex:1 0 auto}.aioseo-additional-pages .additional-pages-table .pages-rows{font-size:14px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row{background-color:#fff;height:70px;display:flex;align-items:center;padding:0 30px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row:last-of-type{border-radius:0 0 3px 3px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row.even{background-color:#f9f9fa}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row>div{flex:1 0 auto;padding-right:30px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row>div:last-child{padding-right:0}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row .page-actions svg.aioseo-trash{width:20px;height:20px;color:#8c8f9a;cursor:pointer;transition:color .1s ease}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row .page-actions svg.aioseo-trash:hover{color:#df2a4a}.aioseo-additional-pages svg.aioseo-circle-plus{width:14px;height:14px;margin-right:10px}.aioseo-alert{position:relative;border-radius:3px;padding:24px;font-size:16px;color:#141b38;line-height:1.4}.aioseo-alert.small{padding:8px;font-size:13px}.aioseo-alert .aioseo-alert-close{cursor:pointer;position:absolute;top:-9px;right:-9px;width:18px;height:18px;border-radius:50%;padding:5px;display:inline-flex;justify-content:center;align-content:center}.aioseo-alert .aioseo-alert-close svg{width:100%;height:100%}.aioseo-alert.blue{border:1px solid #005ae0;background-color:#f2f7fd}.aioseo-alert.blue .aioseo-alert-close{background-color:#005ae0;color:#fff}.aioseo-alert.green{border:1px solid #00aa63;background-color:#f2fdf8}.aioseo-alert.green .aioseo-alert-close{background-color:#00aa63;color:#fff}.aioseo-alert.red{border:1px solid #df2a4a;background-color:#fbe9ec}.aioseo-alert.red .aioseo-alert-close{background-color:#df2a4a;color:#fff}.aioseo-alert.yellow{border:1px solid #f18200;background-color:#fcfae8}.aioseo-alert.yellow .aioseo-alert-close{background-color:#f18200;color:#fff}.aioseo-alert.no-border{border-width:0}.aioseo-alert.text-center{text-align:center}.aioseo-analyze-competitor-site-score{border:1px solid #00aa63;border-radius:3px;color:#00aa63;font-size:14px;padding:0 8px;height:24px;display:inline-flex;align-items:center;justify-content:center;margin-right:14px}.aioseo-analyze-competitor-site-score.red{color:#df2a4a;border-color:#df2a4a}.aioseo-analyze-competitor-site-score.orange{color:#f18200;border-color:#f18200}.aioseo-animated-dannie{display:flex;align-content:center;align-items:center;justify-content:center}.aioseo-animated-dannie svg{max-width:250px}.aioseo-api-bar{height:40px;background-color:#df2a4a;color:#fff;font-size:13px;padding:0 14px 0 40px}.aioseo-api-bar,.aioseo-api-bar .upgrade-text{display:flex;align-items:center;justify-content:center}.aioseo-api-bar .upgrade-text{flex:1}.aioseo-api-bar strong{font-weight:600}.aioseo-api-bar svg.aioseo-logo-gear{width:20px;height:20px;min-width:20px;margin-right:14px}.aioseo-api-bar svg.aioseo-close{cursor:pointer;width:12px;height:12px}.aioseo-api-bar a{color:#fff;text-decoration:underline}.aioseo-api-bar a:hover{text-decoration:none}@media screen and (max-width:782px){.aioseo-api-bar{padding:0 10px;height:60px}}.aioseo-attributes ul.aioseo-attributes-list[data-v-02af7dd2]{list-style:inside;list-style-type:disc;margin:20px 0 0}.aioseo-attributes ul.aioseo-attributes-list li[data-v-02af7dd2]{display:flex;margin-bottom:8px;align-items:flex-start}.aioseo-attributes ul.aioseo-attributes-list li div[data-v-02af7dd2]:first-of-type{flex:0 0 140px}.aioseo-blur{filter:blur(3px);pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.aioseo-card{color:#141b38;background-color:#fff;border:1px solid #e8e8eb;box-shadow:0 2px 5px rgba(0,0,0,.05);margin:30px 0}.aioseo-card.disabled .content{background:#f9f9fa;font-size:16px;line-height:24px}@media only screen and (max-width:782px){.aioseo-card{margin:20px 0}}.aioseo-card svg.aioseo-circle-question-mark{width:17px;height:17px;color:#8c8f99;transition:background-color .2s ease}.aioseo-card svg.aioseo-circle-question-mark:hover{color:#5a5c65}.aioseo-card .header{display:flex;align-items:center;height:70px;padding:0 30px;font-weight:600;font-size:18px;border-bottom:1px solid #e8e8eb}.aioseo-card .header .header-icon{display:flex}.aioseo-card .header .header-icon svg{width:24px;height:24px;margin-right:16px}.aioseo-card .header .text{flex:1 0 auto;display:flex;align-items:center}.aioseo-card .header .text svg.aioseo-circle-question-mark{cursor:pointer;width:17px;height:17px}.aioseo-card .header .text .aioseo-pro-badge{margin-left:10px}.aioseo-card .header .text .card-score{display:flex;flex:1;align-items:center;justify-content:flex-end;padding-right:18px;font-size:13px}.aioseo-card .header .text .card-score.green{color:#00aa63}.aioseo-card .header .text .card-score.orange{color:#f18200}.aioseo-card .header .text .card-score.red{color:#df2a4a}.aioseo-card .header .text .card-score svg{margin-right:7px}.aioseo-card .header svg.aioseo-caret{width:24px;height:24px;cursor:pointer;transform:rotate(-180deg);transition:transform .3s}.aioseo-card .header svg.aioseo-caret.rotated{transform:rotate(-90deg)}.aioseo-card .header svg.aioseo-close{width:14px;height:14px;cursor:pointer}.aioseo-card .content{padding:30px;position:relative}.aioseo-card div.aioseo-settings-row:last-child{margin-bottom:0;border-bottom:none;padding-bottom:0}.aioseo-copy-block{display:inline-flex}.aioseo-copy-block .message{background-color:#fff;min-height:56px;display:flex;align-items:center;border:1px solid #dcdde1;border-radius:3px 0 0 3px;padding:10px 24px;font-weight:600}.aioseo-copy-block .copy-tooltip{display:flex}.aioseo-copy-block .copy{background-color:#fff;min-height:56px;display:flex;align-items:center;border:1px solid #dcdde1;border-left-width:0;border-radius:0 3px 3px 0;padding:10px 16px;font-weight:600;cursor:pointer}.aioseo-copy-block .copy:hover svg.aioseo-copy{color:#a7a7a7}.aioseo-copy-block .copy svg.aioseo-copy{width:20px;height:20px;color:#dadada}.aioseo-copy-block .copy svg.aioseo-circle-check-solid{width:20px;height:20px;color:#00aa63}.aioseo-display-info .aioseo-box-toggle svg{margin-top:-15px;color:#434960}.aioseo-display-info svg.aioseo-new-page,.aioseo-display-info svg.aioseo-shortcode,.aioseo-display-info svg.aioseo-widget{width:100%;height:auto;max-width:60px}.aioseo-display-info svg.aioseo-gutenberg-block{width:59px;height:54px}.aioseo-display-info svg.aioseo-gutenberg-block rect{width:100%;width:56px;height:51px}.aioseo-display-info svg.aioseo-php{width:110px}.aioseo-display-info .copy-box,.aioseo-display-info .extra-box{margin-top:10px;padding:30px;border-radius:3px;background-color:#f9f9fa}.aioseo-display-info .copy-box .aioseo-description,.aioseo-display-info .extra-box .aioseo-description{margin:0}.aioseo-display-info .copy-box .aioseo-copy-block,.aioseo-display-info .extra-box .aioseo-copy-block{margin:20px 0 0}.aioseo-display-info .copy-box .advanced-settings-link,.aioseo-display-info .extra-box .advanced-settings-link{display:inline-block;padding-top:5px;margin:16px 0 0 16px;color:#8c8f9a;text-decoration:underline;font-size:13px}.aioseo-display-info .copy-box .advanced-settings-link:hover,.aioseo-display-info .extra-box .advanced-settings-link:hover{text-decoration:none}.aioseo-display-info .copy-box .advanced-settings,.aioseo-display-info .extra-box .advanced-settings{padding-top:20px}.aioseo-display-info .advanced-settings.advanced-settings-hidden{display:none}.aioseo-display-info .aioseo-tooltip{margin-left:0}.aioseo-exclude-posts{display:flex}.aioseo-facebook-preview{background-color:#f0f2f5;padding:30px;display:flex;align-items:center;justify-content:center}.aioseo-facebook-preview .facebook-post{width:100%;max-width:525px;border-radius:10px;box-shadow:0 2px 5px rgba(0,0,0,.1);background-color:#fff}.aioseo-facebook-preview .facebook-post .facebook-header{height:65px;padding:0 18px;display:flex;align-items:center}.aioseo-facebook-preview .facebook-post .facebook-header .profile-photo{overflow:hidden;width:40px;height:40px;border:1px solid #e8e8eb;border-radius:50%}.aioseo-facebook-preview .facebook-post .facebook-header .profile-photo img{height:100%;width:100%}.aioseo-facebook-preview .facebook-post .facebook-header .poster{margin-left:10px;flex:1 0 auto}.aioseo-facebook-preview .facebook-post .facebook-header .poster .poster-name{font-size:15px;color:#050505;font-weight:500}.aioseo-facebook-preview .facebook-post .facebook-header .poster .poster-date{color:#65676b;font-size:13px}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis{display:inline-flex;align-items:center}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis div{background-color:#5e666f;width:4px;height:4px;border-radius:50%;margin:0 2px}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis div:first-child{margin-left:0}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis div:last-child{margin-right:0}.aioseo-facebook-preview .facebook-post .facebook-content{display:flex;flex-direction:column}.aioseo-facebook-preview .facebook-post .facebook-content img{width:100%;height:auto}.aioseo-facebook-preview .facebook-post .facebook-content.vertical{flex-direction:row}.aioseo-facebook-preview .facebook-post .facebook-content.vertical img{max-width:158px;max-height:158px;width:auto;height:auto}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description{flex:1;background-color:#f2f3f5;padding:9px 13px;color:#606770}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description .site-domain{font-size:13px;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description .site-title{color:#1d2129;font-size:17px;font-weight:600;margin:5px 0}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description .site-description{font-size:14px}.aioseo-facebook-preview .facebook-post .facebook-footer{height:24px}.aioseo-feature-card{height:100%;border:1px solid #e8e8eb;background:#fff;box-shadow:0 2px 5px rgba(0,0,0,.05);color:#141b38;display:flex;flex-direction:column}.aioseo-feature-card .feature-card-body{padding:30px 30px 20px;flex:1}.aioseo-feature-card .feature-card-body.static{padding:30px}.aioseo-feature-card .feature-card-body .feature-card-header{display:flex;align-items:center;font-size:18px;font-weight:600;margin-bottom:16px}.aioseo-feature-card .feature-card-body .feature-card-header img,.aioseo-feature-card .feature-card-body .feature-card-header svg{width:28px;height:28px;margin-right:10px}.aioseo-feature-card .feature-card-body .feature-card-description{color:#434960;font-size:15px}.aioseo-feature-card .feature-card-body .feature-card-description .learn-more{margin-top:10px}.aioseo-feature-card .feature-card-footer{padding:15px}.aioseo-feature-card .feature-card-footer:not(.upgrade-required){border:2px solid #fff;background-color:#f9f9fa;padding:12px;min-height:43px}.aioseo-feature-card .feature-card-footer .feature-card-install-activate{display:flex;align-items:center;justify-content:flex-end;height:30px;position:relative}.aioseo-feature-card .feature-card-footer .feature-card-install-activate .aioseo-loading-spinner{position:absolute;left:0}.aioseo-feature-card .feature-card-footer .feature-card-install-activate .status{font-weight:600;font-size:14px}.aioseo-feature-card .feature-card-footer .feature-card-install-activate .aioseo-toggle .toggle-content{margin-right:0;margin-left:10px}.aioseo-feature-card .feature-card-footer .feature-card-upgrade-cta{display:flex;align-items:center;justify-content:flex-end}.aioseo-feature-card .feature-card-footer.installed .feature-card-install-activate .status{color:#8c8f9a}.aioseo-setup-wizard-container{margin-top:30px;margin-bottom:50px;padding:30px;color:#fff;position:relative;background-color:#005ae0}@media only screen and (max-width:782px){.aioseo-setup-wizard-container{margin-top:20px}}.aioseo-setup-wizard-container p{color:#fff}.aioseo-setup-wizard-container .getting-started-wrapper{display:flex}.aioseo-setup-wizard-container .getting-started-wrapper .video{flex:0 0 533px;margin:20px 20px 0}.aioseo-setup-wizard-container .getting-started-wrapper .video .wrapper{padding-bottom:56.25%;margin-bottom:-60px;position:relative;height:0}.aioseo-setup-wizard-container .getting-started-wrapper .video .wrapper iframe{width:100%;height:100%;position:absolute;top:0;left:0}@media only screen and (max-width:1350px){.aioseo-setup-wizard-container .getting-started-wrapper .video{flex:0 0 593px;margin:20px;align-self:center}.aioseo-setup-wizard-container .getting-started-wrapper .video .wrapper{margin-bottom:0}.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions .aioseo-col{flex-basis:100%;max-width:100%;justify-content:center}}@media only screen and (max-width:1300px){.aioseo-setup-wizard-container .getting-started-wrapper{flex-direction:row;flex-wrap:wrap}.aioseo-setup-wizard-container .getting-started-wrapper .video{margin:20px 0 -60px}.aioseo-setup-wizard-container .getting-started-wrapper .text,.aioseo-setup-wizard-container .getting-started-wrapper .video{flex-basis:100%;width:100%}.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions{justify-content:center}.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions .aioseo-col{flex-basis:inherit;max-width:inherit;justify-content:center}}@media only screen and (max-width:782px){.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions .aioseo-col{flex-basis:100%;max-width:100%;justify-content:center}}.aioseo-setup-wizard-container .aioseo-row{position:relative;z-index:1}.aioseo-setup-wizard-container .wizard-actions .aioseo-col{display:flex;align-items:center}.aioseo-setup-wizard-container .wizard-actions .aioseo-button svg{width:16px;height:16px;margin-right:10px}.aioseo-setup-wizard-container .setup-wizard-bg{width:100%;height:100%;overflow:hidden;z-index:0;position:absolute;top:0;left:0}.aioseo-setup-wizard-container .setup-wizard-bg svg.aioseo-setup-wizard-bg,.aioseo-setup-wizard-container .setup-wizard-bg svg.aioseo-setup-wizard-bg rect{width:auto;height:100%}.aioseo-setup-wizard-container .close-wizard{color:#fff;width:20px;height:20px;position:absolute;right:20px;top:20px;z-index:1;display:flex;align-items:center;justify-content:center}.aioseo-setup-wizard-container .close-wizard:hover{color:#ccc}.aioseo-setup-wizard-container .close-wizard svg.aioseo-close{width:12px;height:12px;cursor:pointer;color:#fff}.aioseo-setup-wizard-container .close-wizard svg.aioseo-close:hover{color:#dadada}.aioseo-setup-wizard-container p.how-to-get-started{margin:0}.aioseo-setup-wizard-container p.welcome-text{line-height:1.6}.aioseo-setup-wizard-container h2{color:#fff;line-height:1.4}.aioseo-setup-wizard-container a{color:#fff}.aioseo-setup-wizard-container svg.aioseo-book{width:20px;height:20px;margin:0 10px 0 0}.aioseo-setup-wizard-container .getting-started-video{padding-right:20px;margin-bottom:-60px;position:relative;height:0;padding-bottom:56.25%}.aioseo-setup-wizard-container .getting-started-video iframe{width:100%;height:100%;position:absolute;top:0;left:0}.aioseo-google-search-preview{padding:32px 30px;border:1px solid #e8e8eb}.aioseo-google-search-preview .domain{font-size:14px;line-height:1.3;color:#3c4043;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.aioseo-google-search-preview .site-title{font-size:20px;line-height:1.3;color:#1a0dab;margin:3px 0}.aioseo-google-search-preview .meta-description{max-width:600px;font-size:14px;line-height:1.4;color:#52565a}.edit-post-sidebar .domain{font-size:13px}.edit-post-sidebar .site-title{font-size:16px}.edit-post-sidebar .meta-description{font-size:12px}.aioseo-modal-content .domain,.aioseo-modal-content .meta-description{font-size:14px}.aioseo-modal-content .site-title{font-size:20px}html:not([data-scroll="0"]) .aioseo-header{box-shadow:0 2px 5px rgba(0,0,0,.05);transition:box-shadow .6s}.aioseo-header{position:fixed;z-index:1051;top:0;right:0;left:0;background-color:#fff;height:72px;color:#141b38}.aioseo-header .mascot{width:35px;height:auto;margin-right:10px}.aioseo-header .aioseo-header-content{padding:0;display:flex;height:72px;align-items:center}.aioseo-header .aioseo-header-content a:focus{box-shadow:none}.aioseo-header .aioseo-header-content svg.aioseo-logo{height:26px;margin-right:10px}.aioseo-header .aioseo-header-content .spacer{display:inline-flex;width:26.25px;height:0;border:1px solid #d0d1d7;transform:rotate(-72.26deg)}.aioseo-header .aioseo-header-content .page-name{display:inline-flex;margin-left:10px;font-size:18px;font-weight:400;flex:1 0 auto}.aioseo-header .aioseo-header-content .header-actions{display:flex}.aioseo-header .aioseo-header-content .header-actions .round{position:relative;background-color:#f3f4f5;border-radius:50%;width:40px;height:40px;display:flex;align-items:center;justify-content:center;margin-left:10px;cursor:pointer;transition:background-color .2s ease}.aioseo-header .aioseo-header-content .header-actions .round svg{width:20px;height:20px}.aioseo-header .aioseo-header-content .header-actions .round:hover{background-color:#e5e7e9}.aioseo-header .aioseo-header-content .header-actions .number{position:absolute;background-color:#df2a4a;width:16px;height:16px;font-weight:600;font-size:10px;color:#fff;top:-8px;left:50%;transform:translateX(-50%);margin:0;-webkit-animation:bounce 2s 5;animation:bounce 2s 5}.aioseo-header .aioseo-header-content .header-actions .number:hover{background-color:#df2a4a}@-webkit-keyframes bounce{0%,25%,50%,75%,to{transform:translateX(-50%) translateY(0)}40%{transform:translateX(-50%) translateY(-8px)}60%{transform:translateX(-50%) translateY(-4px)}}@keyframes bounce{0%,25%,50%,75%,to{transform:translateX(-50%) translateY(0)}40%{transform:translateX(-50%) translateY(-8px)}60%{transform:translateX(-50%) translateY(-4px)}}body.modal-open{overflow:hidden}.aioseo-help{display:block;position:fixed;top:0;bottom:0;left:0;right:0;height:100%;width:100vw;background-color:#fff;color:#8c8f9a;opacity:0;max-height:100vh;overflow-y:auto;transition:opacity .3s ease-in 0s;z-index:-999}.aioseo-help.visible{opacity:1;z-index:100000}.aioseo-help .aioseo-help-header{background:#fff;width:100%;height:60px;z-index:1;padding:20px;display:flex}.aioseo-help .aioseo-help-header>.logo{flex:1}.aioseo-help .aioseo-help-docs{margin-bottom:25px;display:none}.aioseo-help .aioseo-help-docs li{padding:0 0 14px 4px;margin:0}.aioseo-help .aioseo-help-docs .aioseo-help-docs-viewall{margin:10px 0 0}.aioseo-help .aioseo-help-docs .aioseo-help-additional-docs{display:none}.aioseo-help .aioseo-help-docs .aioseo-help-additional-docs.opened{display:block}.aioseo-help .aioseo-help-docs .icon .aioseo-description{width:20px;margin-top:0;position:relative;top:5px;left:-5px;color:#8c8f9a}.aioseo-help .help-content{background-color:#fff;width:100%;max-width:740px;margin:0 auto 50px;padding:0 20px;box-sizing:border-box;z-index:1}.aioseo-help .help-content .aioseo-help-category{border-top:1px solid #e8e8eb;margin:0}.aioseo-help .help-content .aioseo-help-category:last-child{border-bottom:1px solid #e8e8eb}.aioseo-help .help-content .aioseo-help-category header{display:block;position:relative;cursor:pointer;width:100%;height:68px}.aioseo-help .help-content .aioseo-help-category header .title{display:block;font-size:16px;color:#8c8f9a;font-weight:600;padding:23px 11px 23px 30px}.aioseo-help .help-content .aioseo-help-category .folder-open{position:absolute;top:24px;width:20px;height:20px;color:#8c8f9a}.aioseo-help .help-content .aioseo-help-category .dashicons-arrow-right-alt2{position:absolute;top:20px;right:0;transition:transform .3s ease-out}.aioseo-help .help-content .aioseo-help-category.opened .aioseo-help-docs{display:block}.aioseo-help .help-content .aioseo-help-category.opened .dashicons-arrow-right-alt2{transform:rotate(90deg)}.aioseo-help .help-content #aioseo-help-search{position:relative;background-color:#fff;text-align:center;top:0;padding:20px 0 50px}.aioseo-help .help-content #aioseo-help-result .aioseo-help-docs{display:block}.aioseo-help .help-content #aioseo-help-footer{display:flex;flex-wrap:nowrap;justify-content:space-between;align-items:center;margin:50px 0 0}@media screen and (max-width:750px){.aioseo-help .help-content #aioseo-help-footer{display:block}}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block{box-sizing:border-box;max-width:325px;border:1px solid #8c8f9a;border-radius:6px;text-align:center}@media screen and (max-width:750px){.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block{max-width:100%}}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block:first-child{margin-right:20px}@media screen and (max-width:750px){.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block:first-child{margin:0 0 20px}}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a{display:block;padding:25px;text-decoration:none;color:#8c8f9a}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a h3{color:#8c8f9a}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a span{font-size:16px;color:#005ae0;text-decoration:underline}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a:hover span{text-decoration:none}.aioseo-help .help-content #aioseo-help-footer .aioseo-description,.aioseo-help .help-content #aioseo-help-footer .aioseo-support{width:48px;margin-top:0;color:#8c8f9a}#aioseo-help-logo{width:132px;height:26px;z-index:2}#aioseo-help-close{width:20px;height:20px;cursor:pointer;opacity:.7;transition:all .05s;z-index:2}@media screen and (max-width:750px){#aioseo-help-close{top:20px;right:20px}}.aioseo-html-tags-editor .no-access{margin-bottom:20px}.aioseo-html-tags-editor .aioseo-description.tags-description{margin:0 0 20px}.aioseo-html-tags-editor .add-tags{display:flex;align-items:center;margin-bottom:20px}.aioseo-html-tags-editor .add-tags div{margin-right:10px}.aioseo-html-tags-editor .add-tags a{font-size:14px}.aioseo-html-tags-editor .add-tags a.no-underline{padding-left:10px}.aioseo-loading-spinner{width:35px;height:35px;position:absolute}.aioseo-loading-spinner .double-bounce1,.aioseo-loading-spinner .double-bounce2{width:100%;height:100%;border-radius:50%;background-color:#fff;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:sk-bounce 1.3s ease-in-out infinite;animation:sk-bounce 1.3s ease-in-out infinite}.aioseo-loading-spinner.dark .double-bounce1,.aioseo-loading-spinner.dark .double-bounce2{background-color:#8c8f9a}.aioseo-loading-spinner .double-bounce2{-webkit-animation-delay:-.65s;animation-delay:-.65s}@-webkit-keyframes sk-bounce{0%,to{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,to{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}body.vue-build{margin:0}body.vue-build .aioseo-app{min-height:calc(100vh - 88px)}body.vue-build .aioseo-app .aioseo-main{padding-bottom:30px}body.aioseo-setup-wizard{margin:0;padding:0}body.aioseo-setup-wizard .aioseo-app{min-height:100vh;width:100%}body[class*=page_aioseo] .aioseo-header,body[class*=page_aioseo] .aioseo-notifications .overlay{left:160px}body[class*=page_aioseo].folded .aioseo-header,body[class*=page_aioseo].folded .aioseo-notifications .overlay{left:36px}body[class*=page_aioseo] #wpcontent{padding:0;background-color:#f3f4f5}body[class*=page_aioseo] .update-nag{display:none}body[class*=page_aioseo].admin-bar .aioseo-app{min-height:calc(100vh - 185px)}body[class*=page_aioseo].admin-bar.aioseo-has-bar .aioseo-app{min-height:calc(100vh - 225px)}body[class*=page_aioseo].admin-bar .aioseo-header,body[class*=page_aioseo].admin-bar .aioseo-notifications .notification-menu,body[class*=page_aioseo].admin-bar .aioseo-notifications .overlay{top:32px}body[class*=page_aioseo] .aioseo-app{min-height:calc(100vh - 153px)}body[class*=page_aioseo].aioseo-has-bar .aioseo-app{min-height:calc(100vh - 193px)}body[class*=page_aioseo].aioseo-has-bar .aioseo-header{height:112px}@media screen and (max-width:782px){body[class*=page_aioseo].aioseo-has-bar .aioseo-header{height:132px}}@media screen and (max-width:960px){body[class*=page_aioseo].auto-fold .aioseo-header,body[class*=page_aioseo].auto-fold .aioseo-notifications .overlay{left:36px}}@media screen and (max-width:782px){body[class*=page_aioseo] #wpbody-content{padding-bottom:20px}body[class*=page_aioseo].admin-bar .aioseo-app{min-height:calc(100vh - 199px)}body[class*=page_aioseo].admin-bar .aioseo-header,body[class*=page_aioseo].admin-bar .aioseo-notifications .notification-menu,body[class*=page_aioseo].admin-bar .aioseo-notifications .overlay{top:46px}body[class*=page_aioseo] .aioseo-header,body[class*=page_aioseo] .aioseo-notifications .overlay,body[class*=page_aioseo].auto-fold .aioseo-header,body[class*=page_aioseo].auto-fold .aioseo-notifications .overlay{left:0}}@media screen and (max-width:600px){body[class*=page_aioseo].admin-bar .aioseo-header,body[class*=page_aioseo].admin-bar .aioseo-notifications .menu,body[class*=page_aioseo].admin-bar .aioseo-notifications .overlay{position:absolute;top:46px}}body.aioseo-has-bar .aioseo-app .aioseo-main>.aioseo-container{margin-top:128px}@media screen and (max-width:782px){body.aioseo-has-bar .aioseo-app .aioseo-main>.aioseo-container{margin-top:148px}}.aioseo-app{box-sizing:border-box;background-color:#f3f4f5}.aioseo-app .route-fade-enter-active,.aioseo-app .route-fade-leave-active{transition:all .2s}.aioseo-app .route-fade-enter,.aioseo-app .route-fade-leave-active{opacity:0}.aioseo-app .route-fade-enter{transform:translateX(30px)}.aioseo-app .route-fade-leave-active{transform:translateX(-30px)}.aioseo-app *,.aioseo-app :after,.aioseo-app :before{box-sizing:inherit}.aioseo-app * :not(.aioseo-button):not(.aioseo-input),.aioseo-app :after :not(.aioseo-button):not(.aioseo-input),.aioseo-app :before :not(.aioseo-button):not(.aioseo-input){line-height:1.4}.aioseo-app p{font-size:16px}.aioseo-app a:not(.aioseo-button){color:#005ae0}.aioseo-app a:not(.aioseo-button).text-white{color:#fff}.aioseo-app a:not(.aioseo-button).no-underline,.aioseo-app a:not(.aioseo-button):hover{text-decoration:none}.aioseo-app h2{font-size:32px;margin:0}.aioseo-app .aioseo-main{height:100%}.aioseo-app .aioseo-main>.aioseo-container{margin-top:88px}.aioseo-app .aioseo-main .save-changes{display:flex;justify-content:flex-end}.aioseo-app .d-flex{display:flex}.aioseo-app .aioseo-section-description{font-size:16px;color:#141b38;line-height:1.8;padding-bottom:30px}.aioseo-app .aioseo-description-text{font-size:14px;line-height:1.8;color:#141b38}.aioseo-app .aioseo-description-text.aioseo-error{color:#df2a4a}.aioseo-app .aioseo-description{font-size:14px;line-height:1.8;margin:8px 0 0;color:#141b38}.aioseo-app .aioseo-description.no-margin{margin:0}.aioseo-app .aioseo-description.aioseo-error{color:#df2a4a}.aioseo-app .max-recommended-count{color:#434960;text-align:right;margin-top:10px;font-size:14px}.aioseo-app .max-recommended-count strong.error{color:#df2a4a}.aioseo-app .popper{text-align:left;font-size:12px;padding:20px;background-color:#fff;border:none;border-radius:3px;box-shadow:0 3px 4.8px 0 rgba(32,71,102,.27);z-index:9999;max-width:350px;line-height:1.4}.aioseo-app .popper.action{padding:8px 12px;background-color:#141b38;color:#fff}.aioseo-app .popper.action .popper__arrow{border-top-color:#141b38}.aioseo-app .popper[x-placement^=bottom]{box-shadow:0 -2px 4.8px 0 rgba(32,71,102,.27)}.aioseo-app .popper .aioseo-description{margin:0}.aioseo-app .aioseo-row-highlight{-webkit-animation-name:color;animation-name:color;-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-iteration-count:2;animation-iteration-count:2}@-webkit-keyframes color{0%{background-color:#fff}50%{background-color:#00aa63}to{background-color:#fff}}@keyframes color{0%{background-color:#fff}50%{background-color:#00aa63}to{background-color:#fff}}.column-aioseo-details{position:relative}.aioseo-seo-site-score .aioseo-blur{display:flex;align-items:center}.aioseo-seo-site-score .aioseo-seo-site-score-cta{position:absolute;left:50%;top:50%;transform:translateX(-50%) translateY(-50%);background-color:#fff;padding:24px 30px;border:1px solid #e8e8eb;box-shadow:0 2px 10px rgba(0,90,224,.2);color:#141b38;font-size:16px;font-weight:600;width:82%;max-width:500px;text-align:center}.aioseo-app .aioseo-upgrade-bar{height:40px;background-color:#00aa63;display:flex;align-items:center;justify-content:center;color:#fff;font-size:13px;padding:0 14px 0 40px}.aioseo-app .aioseo-upgrade-bar .upgrade-text{display:flex;align-items:center;flex:1;justify-content:center}.aioseo-app .aioseo-upgrade-bar .upgrade-arrow{font-size:15px;text-decoration:none}.aioseo-app .aioseo-upgrade-bar .upgrade-arrow:hover{text-decoration:none}.aioseo-app .aioseo-upgrade-bar strong{font-weight:600}.aioseo-app .aioseo-upgrade-bar svg.aioseo-logo-gear{width:20px;height:20px;min-width:20px;margin-right:14px}.aioseo-app .aioseo-upgrade-bar svg.aioseo-close{cursor:pointer;width:12px;height:12px}.aioseo-app .aioseo-upgrade-bar a{color:#fff;text-decoration:underline}.aioseo-app .aioseo-upgrade-bar a:hover{text-decoration:none}@media screen and (max-width:782px){.aioseo-app .aioseo-upgrade-bar{padding:0 10px;height:60px}}.field-description[data-v-2bfc1de2]{display:inline-block;margin-top:10px;font-size:14px}.aioseo-address-wrapper[data-v-4bc9bbe6]{display:flex;max-width:500px}.field-description[data-v-4bc9bbe6]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-4bc9bbe6]{margin-top:8px}.field-description[data-v-a0a894b8]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-a0a894b8]{margin-top:8px}.field-description[data-v-4fb4e044]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-4fb4e044]{margin-top:8px}.field-description[data-v-85733554]{display:inline-block;margin-top:10px;font-size:14px}.field-description[data-v-515336a2]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-515336a2]{margin-top:8px}.field-description[data-v-78337de7]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-78337de7]{margin-top:8px}.aioseo-general-settings .more-tooltip-text strong{color:#00aa63}.aioseo-general-settings .license-cta-box{border-radius:3px;background-color:#f2f7fd;padding:20px;max-width:630px;margin:10px 0 30px}.aioseo-general-settings .license-cta-box a{color:#00aa63}.aioseo-general-settings .license-cta-box div{font-weight:600}.aioseo-general-settings .license-cta-box span{font-size:14px;font-style:italic}.aioseo-general-settings .license-key{margin-top:10px;display:flex;max-width:560px}.aioseo-general-settings .license-key .aioseo-input{margin-right:10px}.aioseo-app .aioseo-tabs.internal{margin-bottom:0}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation{margin-top:5px}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation .md-button{height:60px}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple{padding:0 25px}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple .md-ripple-wave{display:none}.aioseo-app .aioseo-tabs.skinny .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple{padding:0 16px}.aioseo-app .md-tabs{display:flex;flex-direction:column}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation{margin-top:2px;background:transparent;display:flex;position:relative;justify-content:flex-start}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation.md-elevation-0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button{color:#141b38;max-width:264px;min-width:72px;height:60px;margin:0;border-radius:0;font-size:15px;font-weight:500;padding:0;display:inline-block;position:relative;overflow:hidden;outline:none;background:transparent;border:0;transition:.4s cubic-bezier(.4,0,.2,1);font-family:inherit;line-height:normal;text-decoration:none;vertical-align:top;white-space:nowrap}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:before{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;transition:.4s cubic-bezier(.4,0,.2,1);will-change:background-color,opacity;content:" "}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple{padding:0 18px;display:flex;justify-content:center;align-items:center;width:100%;height:100%;position:relative;overflow:hidden;-webkit-mask-image:radial-gradient(circle,#fff 100%,#000 0);mask-image:radial-gradient(circle,#fff 100%,#000 0)}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple .md-button-content{position:static;z-index:2}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:not([disabled]){cursor:pointer}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:not([disabled]):active:before,.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:not([disabled]):hover:before{background-color:currentColor;opacity:.12}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button.md-active{color:#005ae0}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button.md-active:focus{outline:none;box-shadow:none}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-tabs-indicator{height:2px;background-color:#005ae0;bottom:-2px;position:absolute;left:0;transform:translateZ(0);will-change:left,right}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-tabs-indicator.md-tabs-indicator-left{transition:left .3s cubic-bezier(.4,0,.2,1),right .35s cubic-bezier(.4,0,.2,1)}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-tabs-indicator.md-tabs-indicator-right{transition:right .3s cubic-bezier(.4,0,.2,1),left .35s cubic-bezier(.4,0,.2,.1)}.aioseo-app .aioseo-tabs{display:flex;border-bottom:2px solid #e8e8eb;position:relative;margin-bottom:38px}.aioseo-app .aioseo-tabs .save-changes{position:absolute;right:0;bottom:10px}.aioseo-app .aioseo-tabs .tab-score{display:inline-flex;align-items:center;justify-content:flex-end;font-size:11px;font-weight:700;padding-left:12px}.aioseo-app .aioseo-tabs .tab-score.green{color:#00aa63}.aioseo-app .aioseo-tabs .tab-score.orange{color:#f18200}.aioseo-app .aioseo-tabs .tab-score.red{color:#df2a4a}.aioseo-app .aioseo-tabs .tab-score svg{display:inline;margin-right:7px}.aioseo-app .aioseo-mobile-tabs{position:relative;height:40px;margin-top:20px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.aioseo-app .aioseo-mobile-tabs .active-tab{color:#005ae0;padding-left:18px;min-height:100%;display:flex;align-items:center;cursor:pointer}.aioseo-app .aioseo-mobile-tabs .active-tab div{position:relative}.aioseo-app .aioseo-mobile-tabs .active-tab div span{height:2px;background-color:#005ae0;bottom:-7px;position:absolute;left:-18px;right:-18px;z-index:10}.aioseo-app .aioseo-mobile-tabs .active-tab svg.aioseo-caret{width:24px;height:24px;position:relative;top:6px;cursor:pointer;transition:transform .3s}.aioseo-app .aioseo-mobile-tabs .active-tab svg.aioseo-caret.rotated{transform:rotate(180deg)}.aioseo-app .aioseo-mobile-tabs .tab-dropdown{border:1px solid #e8e8eb;border-top:none}.aioseo-app .aioseo-mobile-tabs .tab-links{background:#fff;position:relative;z-index:3;padding:8px;width:100%;max-width:300px}@media screen and (max-width:782px){.aioseo-app .aioseo-mobile-tabs .tab-links{max-width:100%}}.aioseo-app .aioseo-mobile-tabs .tab-links a{padding:10px;display:block;color:#141b38;text-decoration:none}.aioseo-app .aioseo-mobile-tabs .tab-links a:hover{color:#005ae0}.md-tooltip{background-color:#141b38!important;color:#fff!important;border-radius:2px;padding:6px 12px;font-size:14px}.md-tooltip:after{content:"";position:absolute;top:100%;left:50%;margin-left:-5px;border:5px solid transparent;border-top-color:#141b38}.modal-mask{position:fixed;z-index:9998;top:0;left:0;width:100%;height:100%;background-color:rgba(20,27,56,.3);display:table;transition:opacity .3s ease}@media screen and (max-width:520px){.modal-mask{display:block;top:46px}}.modal-mask .modal-wrapper{display:table-cell;vertical-align:middle}@media screen and (max-width:520px){.modal-mask .modal-wrapper{display:block;height:100%}}.modal-mask .modal-wrapper .modal-container{width:100%;max-width:750px;max-height:90vh;overflow-y:hidden;overflow-x:hidden;margin:0 auto;background-color:#fff;box-shadow:0 10px 30px rgba(0,0,0,.15);transition:all .3s ease}@media screen and (max-width:520px){.modal-mask .modal-wrapper .modal-container{width:100%;max-width:100%;max-height:calc(100vh - 46px);height:100%}}.modal-mask .modal-wrapper .modal-container .modal-header{color:#141b38;position:sticky;top:0;z-index:15;padding:0 0 0 40px;height:70px;font-size:20px;font-weight:700;line-height:1.4;border-bottom:1px solid #e8e8eb;background-color:#fff;display:flex;align-items:center}@media screen and (max-width:520px){.modal-mask .modal-wrapper .modal-container .modal-header{padding:15px 0 0 20px}}.modal-mask .modal-wrapper .modal-container .modal-header button.close{position:absolute;right:11px;top:11px;width:24px;height:24px;background-color:#fff;border:none;display:flex;align-items:center}.modal-mask .modal-wrapper .modal-container .modal-header button.close svg.aioseo-close{cursor:pointer;width:14px;height:14px}.modal-mask .modal-wrapper .modal-container .modal-body .aioseo-post-general,.modal-mask .modal-wrapper .modal-container .modal-body .aioseo-post-social{height:calc(90vh - 120px);max-height:600px;overflow-y:auto;overflow-x:hidden}.modal-mask .modal-wrapper .modal-container .modal-body .aioseo-modal-content.has-padding{padding:40px}@media screen and (max-width:520px){.modal-mask .modal-wrapper .modal-container .aioseo-modal-content,.modal-mask .modal-wrapper .modal-container .aioseo-modal-content>.component-wrapper,.modal-mask .modal-wrapper .modal-container .modal-body,.modal-mask .modal-wrapper .modal-container .modal-body>div{height:100%}.modal-mask .modal-wrapper .modal-container .aioseo-modal-content>.component-wrapper{display:flex;align-items:flex-end}.modal-mask .modal-wrapper .modal-container .aioseo-post-general,.modal-mask .modal-wrapper .modal-container .aioseo-post-social{height:100%!important;max-height:100%!important;padding:20px!important}.modal-mask .modal-wrapper .modal-container .aioseo-post-general .mobile-radio-buttons,.modal-mask .modal-wrapper .modal-container .aioseo-post-social .mobile-radio-buttons{margin-bottom:0}.modal-mask .modal-wrapper .modal-container .aioseo-add-template-tag{display:none}.modal-mask .modal-wrapper .modal-container .tab-facebook .aioseo-settings-row:last-of-type,.modal-mask .modal-wrapper .modal-container .tab-twitter .aioseo-settings-row:last-of-type{margin-bottom:64px!important;padding-bottom:32px!important}}.modal-enter,.modal-leave-active{opacity:0}.modal-enter .modal-container,.modal-leave-active .modal-container{transform:scale(1.1)}.aioseo-notification>div .body .title .date{font-weight:400;color:#8c8f9a;font-size:12px}.aioseo-notification-cards .aioseo-notification:last-child>div{border-bottom:none;margin-bottom:none}.aioseo-notification-cards .no-notifications{display:flex;align-items:center;flex-direction:column;padding-top:100px;font-size:16px;color:#8c8f9a}.aioseo-notification-cards .no-notifications img{width:30%;height:auto}.aioseo-notification-cards .no-notifications .great-scott{margin:20px 0 10px;font-size:24px;font-weight:600;color:#434960}.aioseo-notification-cards .no-notifications .no-new-notifications{margin-bottom:10px}body.aioseo-show-notifications .aioseo-main{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.aioseo-notifications a.dismiss{color:#8c8f9a;font-size:14px}.aioseo-notifications .notification-menu{height:100%;width:100%;max-width:570px;position:fixed;z-index:1053;top:0;right:0;bottom:0;background-color:#fff;overflow-x:hidden;transition:.5s}.aioseo-notifications .notification-menu .notification-header{height:70px;display:flex;align-items:center;padding:0 30px;color:#fff;background-color:#005ae0}.aioseo-notifications .notification-menu .notification-header .new-notifications{font-size:18px;font-weight:600}.aioseo-notifications .notification-menu .notification-header .dismissed-notifications{margin-left:25px;flex:1 1 auto}.aioseo-notifications .notification-menu .notification-header .dismissed-notifications a{font-size:14px;color:#fff}.aioseo-notifications .notification-menu .notification-header svg.aioseo-close{width:14px;height:14px;cursor:pointer}.aioseo-notifications .notification-menu .notification-header svg.aioseo-close:hover{color:#ccc}.aioseo-notifications .notification-menu .notification-cards{padding:30px;height:calc(100% - 192px);overflow:auto}.aioseo-notifications .notification-menu .notification-footer{height:90px;padding:30px;display:flex;align-items:center}.aioseo-notifications .notification-menu .notification-footer div.pagination{flex:1;display:flex;align-items:center}.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number{font-size:13px;color:#141b38;background:#e8e8eb;height:30px;width:30px;display:flex;align-items:center;justify-content:center;border-radius:2px;margin-right:4px;cursor:pointer}.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number:last-child{margin-right:0}.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number.active,.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number:hover{color:#fff;background-color:#005ae0}.aioseo-notifications .overlay{position:fixed;z-index:1052;top:0;right:0;bottom:0;left:160px;background-color:#141b38;opacity:.5;transition:.5s}.aioseo-notifications .notifications-fade-enter-active,.aioseo-notifications .notifications-fade-leave-active{transition:opacity .5s}.aioseo-notifications .notifications-fade-enter,.aioseo-notifications .notifications-fade-leave-to{opacity:0}.aioseo-notifications .notifications-slide-enter-active,.aioseo-notifications .notifications-slide-leave-active{transition:all .5s ease-in-out}.aioseo-notifications .notifications-slide-enter,.aioseo-notifications .notifications-slide-leave-to{right:-570px}.aioseo-post-type-options-toggle{margin-top:20px}.aioseo-priority-score{max-width:350px}.aioseo-priority-score .header-row{font-size:14px}.aioseo-pro-badge{height:24px;border-radius:3px;background:#e8e8eb;color:#434960;font-size:14px;font-weight:600;display:inline-flex;padding:0 8px;align-items:center}.aioseo-score-settings{display:flex;align-items:center;padding-bottom:14px}.aioseo-score-settings svg{margin-right:7px}.aioseo-score-settings span{margin-right:12px}.aioseo-score-button{display:inline-block;padding:5px 8px;font-size:14px;font-weight:700;color:#a1a1a1;border:1px solid #a1a1a1;border-radius:3px}.aioseo-score-button.score-none,.aioseo-score-button.score-red{border-color:#df2a4a;color:#df2a4a!important}.aioseo-score-button.score-orange{border-color:#f18200;color:#f18200!important}.aioseo-score-button.score-green{border-color:#00aa63;color:#00aa63!important}.aioseo-score-button.classic-editor{background:#fff!important;display:inline-block!important;height:auto!important}.aioseo-score-button.classic-editor span{margin-right:0}.aioseo-seo-site-analysis-result{border:1px solid #dcdde1;margin-top:10px}.aioseo-seo-site-analysis-result .result-header{height:66px;padding:0 20px;display:flex;align-items:center}.aioseo-seo-site-analysis-result .result-header .result-icon{display:flex;align-items:center;margin-right:16px}.aioseo-seo-site-analysis-result .result-header .result-icon svg{width:24px;height:24px;color:#8c8f9a}.aioseo-seo-site-analysis-result .result-header .result-icon svg.passed{color:#00aa63}.aioseo-seo-site-analysis-result .result-header .result-icon svg.error{color:#df2a4a}.aioseo-seo-site-analysis-result .result-header .result-icon svg.warning{color:#005ae0}.aioseo-seo-site-analysis-result .result-header .result-content{font-size:16px;font-weight:600;flex:1}.aioseo-seo-site-analysis-result .result-header .result-toggle{width:30px;height:26px;border:1px solid #dcdde1;border-radius:3px;display:flex;align-items:center;justify-content:center;cursor:pointer}.aioseo-seo-site-analysis-result .result-header .result-toggle.active,.aioseo-seo-site-analysis-result .result-header .result-toggle:hover{background-color:#434960}.aioseo-seo-site-analysis-result .result-header .result-toggle.active svg,.aioseo-seo-site-analysis-result .result-header .result-toggle:hover svg{color:#fff}.aioseo-seo-site-analysis-result .result-header .result-toggle.active svg{transform:rotate(-180deg)}.aioseo-seo-site-analysis-result .result-header .result-toggle svg{width:100%;max-width:20px;height:auto;color:#8c8f9a;transform:rotate(-90deg);transition:transform .3s}.aioseo-seo-site-analysis-result .result-body{padding:0 60px 24px}.aioseo-seo-site-analysis-result .result-body .result-message{color:#434960;font-size:16px}.aioseo-seo-site-analysis-result .result-body .result-code-alt pre,.aioseo-seo-site-analysis-result .result-body .result-code pre{background:#f3f4f5;border-radius:3px;max-width:100%;padding:10px;overflow:auto}.aioseo-seo-site-analysis-result .result-body .result-code-alt pre code,.aioseo-seo-site-analysis-result .result-body .result-code pre code{padding:0;background:transparent}.aioseo-seo-site-analysis-result .result-body .result-code pre{white-space:pre-wrap}.aioseo-seo-site-analysis-result .result-body .result-action{margin-top:20px}.aioseo-seo-site-analysis-results .group-header{font-size:16px;font-weight:600}.aioseo-seo-site-analysis-results .group-header:not(:first-child){margin-top:30px}.aioseo-seo-site-analysis-results .group-keywords{display:flex;margin-top:5px;flex-wrap:wrap;align-items:center}.aioseo-seo-site-analysis-results .group-keywords .keyword{font-size:14px;color:#434960;font-weight:600;background:#f3f4f5;padding:9px 10px;border-radius:3px;margin:0 10px 5px 0}.aioseo-seo-site-analysis-results .group-keywords .keyword:first-child{font-size:20px}.aioseo-settings-row{margin-bottom:22px;padding-bottom:16px;border-bottom:1px solid #e8e8eb}.aioseo-settings-row.no-margin{margin-bottom:0}.aioseo-settings-row.small-padding{padding-bottom:5px}.aioseo-settings-row.medium-margin{margin-bottom:15px}.aioseo-settings-row.no-border{border:none}.aioseo-settings-row.no-side-margin{margin-left:0!important;margin-right:0!important}.aioseo-settings-row .settings-name{color:#141b38}.aioseo-settings-row .settings-name .name{font-weight:600;font-size:16px;display:flex;align-items:center}.aioseo-settings-row .settings-name .name.small-margin{margin-bottom:5px}.aioseo-settings-row .settings-name .name.align{line-height:40px}.aioseo-settings-row .settings-name .name.align-small{line-height:30px}.aioseo-settings-row .settings-name .name .aioseo-pro-badge{margin-left:10px}.aioseo-settings-row .settings-name .aioseo-description{margin-top:20px}.aioseo-settings-row .settings-content{font-size:16px}.aioseo-settings-row p.description{font-size:14px}.aioseo-separators{margin-top:-.5rem}.aioseo-separators .aioseo-col .separator{background-color:#f3f4f5;display:flex;align-items:center;justify-content:center;min-height:51px;font-weight:600;font-size:25px;border:1px solid #dcdde1;border-radius:3px;cursor:pointer}.aioseo-separators .aioseo-col .separator:hover{background-color:#e5e7e9}.aioseo-separators .aioseo-col .separator.active{background-color:#005ae0;border-color:#005ae0;color:#fff}.aioseo-separators .aioseo-col .separator.active:hover{background-color:#005ae0}.aioseo-separators .aioseo-col .show-more{height:100%;display:flex;align-items:center}.aioseo-separators .aioseo-col .show-more a{color:#8c8f9a}.aioseo-separators .aioseo-col .custom-separator{margin:20px 0;display:flex;align-items:center}.aioseo-separators .aioseo-col .custom-separator .aioseo-input{margin-left:10px;max-width:100px}.aioseo-sidebar-card .header{height:46px}.aioseo-sidebar-card .header:hover{cursor:pointer}.aioseo-sidebar-card .content{padding-bottom:8px!important}.aioseo-sidebar-card ul{margin-bottom:0}.aioseo-sidebar-card ul li{margin-bottom:16px;padding-left:25px}.aioseo-sidebar-card ul .description{margin:0}.aioseo-robots-meta .global-robots-settings{margin:0;padding-top:24px}.aioseo-robots-meta .global-robots-settings>.settings{padding:8px 0 16px}.aioseo-robots-meta .global-robots-settings-options{display:flex}.aioseo-robots-meta .global-robots-settings-options .max-snippet{margin-right:30px}.aioseo-robots-meta .global-robots-settings-options .max-snippet .aioseo-input{max-width:90px}.aioseo-robots-meta .global-robots-settings-options .max-video-preview{margin-right:30px}.aioseo-robots-meta .global-robots-settings-options .max-video-preview .aioseo-input{max-width:90px}.aioseo-robots-meta .global-robots-settings-options .max-image-preview .aioseo-select{min-width:155px}.aioseo-robots-meta .global-robots-settings-options>span{display:inline-block;margin-bottom:4px}@media screen and (max-width:782px){.aioseo-robots-meta .global-robots-settings-options{display:block}.aioseo-robots-meta .global-robots-settings-options .max-snippet,.aioseo-robots-meta .global-robots-settings-options .max-video-preview{margin-right:0;margin-bottom:20px}.aioseo-robots-meta .global-robots-settings-options>div .aioseo-input,.aioseo-robots-meta .global-robots-settings-options>div .aioseo-select{min-width:100%}}.edit-post-sidebar .global-robots-settings{padding-top:12px}.edit-post-sidebar .global-robots-settings>.settings{padding:4px 0 12px}.edit-post-sidebar .global-robots-settings>.settings label{font-size:16px}.edit-post-sidebar .global-robots-settings .robots-meta-title{padding-top:4px;display:inline-block}.edit-post-sidebar .global-robots-settings-options{flex-wrap:wrap}.edit-post-sidebar .max-snippet{margin-right:30px!important}.edit-post-sidebar .max-video-preview{margin-right:0!important}.edit-post-sidebar .max-image-preview{margin-top:20px!important}.aioseo-score-amount-wrapper{position:absolute;left:0;top:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;flex-direction:column;color:#141b38;margin:20px}.aioseo-score-amount-wrapper .aioseo-score-amount .score{font-size:64px;font-weight:600}.aioseo-score-amount-wrapper .aioseo-score-amount .total{font-size:18px;color:#8c8f9a;padding-left:3px}.aioseo-score-amount-wrapper .score-description{max-width:80%;text-align:center;font-size:17px;font-weight:600;line-height:1.1}.aioseo-score-amount-wrapper .score-analyzing{margin-top:20px;font-size:30px}.aioseo-site-score-analyze{position:relative;display:flex;align-items:center;justify-content:center;flex:1}.aioseo-site-score-analyze .analyze-errors{text-align:center;margin-bottom:1em}.aioseo-site-score-analyze .aioseo-seo-site-score-score{position:relative;min-width:175px;max-width:217px;margin-right:5em}.aioseo-site-score-analyze .aioseo-seo-site-score-score svg{width:100%;height:auto}.aioseo-site-score-analyze .aioseo-seo-site-score-description h2{line-height:1.4}.aioseo-site-score-analyze .aioseo-seo-site-score-description svg.aioseo-book{width:20px;height:20px;margin:0 10px 0 0;color:#005ae0}.aioseo-site-score-analyze .aioseo-seo-site-score-description>div{font-size:16px;color:#141b38;margin-bottom:10px}.aioseo-site-score-analyze .aioseo-seo-site-score-description .links{margin-top:30px;font-size:14px;font-weight:600}.aioseo-site-score-analyze .aioseo-seo-site-score-description .links .no-underline{padding-left:5px}.aioseo-site-score-competitor{position:relative;display:flex;align-items:center;justify-content:center;flex-direction:column}.aioseo-site-score-competitor .aioseo-seo-site-score-score{position:relative;min-width:175px;max-width:217px;margin-right:1em}.aioseo-site-score-competitor .aioseo-seo-site-score-score svg{width:100%;height:auto}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations{margin:20px 0}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links){display:flex;align-items:center;font-size:14px;color:#141b38;font-weight:600;margin-bottom:10px}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round{position:relative;border-radius:50%;width:24px;min-width:24px;max-width:24px;height:24px;display:flex;align-items:center;justify-content:center;margin-right:10px;font-size:12px;color:#fff;font-weight:600}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.red{background-color:#df2a4a}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.blue{background-color:#005ae0}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.orange{background-color:#f18200}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.green{background-color:#00aa63}.aioseo-site-score-competitor .refresh-results .aioseo-refresh{width:14px;height:14px;margin-right:10px}.aioseo-site-score-competitor .mobile-snapshot{margin-top:60px;max-width:250px}.aioseo-site-score-competitor .mobile-snapshot div{font-weight:600;font-size:16px;margin-bottom:10px}.aioseo-site-score-competitor .mobile-snapshot img{width:100%;height:auto}.aioseo-site-score-dashboard{position:relative;display:flex;align-items:center;justify-content:center}.aioseo-site-score-dashboard .analyze-errors{text-align:center;margin-bottom:1em}.aioseo-site-score-dashboard .aioseo-seo-site-score-score{position:relative;min-width:175px;max-width:217px;margin-right:1em}.aioseo-site-score-dashboard .aioseo-seo-site-score-score svg{width:100%;height:auto}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links){display:flex;align-items:center;font-size:14px;color:#141b38;font-weight:600;margin-bottom:10px}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round{position:relative;border-radius:50%;width:24px;min-width:24px;max-width:24px;height:24px;display:flex;align-items:center;justify-content:center;margin-right:10px;font-size:12px;color:#fff;font-weight:600}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.red{background-color:#df2a4a}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.blue{background-color:#005ae0}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.orange{background-color:#f18200}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.green{background-color:#00aa63}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations .links{margin-top:30px;font-size:14px;font-weight:600}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations .links .no-underline{padding-left:5px}.aioseo-social-profiles .same-username .use-same{padding:30px;background:#f9f9fa}.aioseo-social-profiles .same-username .use-same .aioseo-checkbox{font-size:16px}.aioseo-social-profiles .aioseo-social-profile-list,.aioseo-social-profiles .same-username .use-same .aioseo-settings-row,.aioseo-social-profiles .same-username .use-same .profiles{margin-top:20px}.aioseo-social-profiles .aioseo-social-profile-list .social-profile{margin-bottom:0;padding-bottom:0;border-bottom:none}.aioseo-social-profiles .aioseo-social-profile-list .social-profile .profile-error{margin-top:10px}.aioseo-social-profiles .aioseo-social-profile-list .social-profile .name{margin-bottom:0}.aioseo-social-profiles .aioseo-social-profile-list .social-profile img{height:16px;width:auto;margin-right:10px}.aioseo-tooltip{margin-left:14px;display:inline-flex}.aioseo-tooltip,.aioseo-twitter-preview{align-items:center;justify-content:center}.aioseo-twitter-preview{background-color:#f0f2f5;padding:30px;display:flex}.aioseo-twitter-preview .twitter-post{width:100%;max-width:500px;border-radius:5px;border:1px solid #e1e8ed;background-color:#fff}.aioseo-twitter-preview .twitter-post .twitter-header{height:65px;padding:0 18px;display:flex;align-items:center}.aioseo-twitter-preview .twitter-post .twitter-header .profile-photo{overflow:hidden;width:40px;height:40px;border:1px solid #e8e8eb;border-radius:50%}.aioseo-twitter-preview .twitter-post .twitter-header .profile-photo img{height:100%;width:100%}.aioseo-twitter-preview .twitter-post .twitter-header .poster{margin-left:10px;flex:1 0 auto}.aioseo-twitter-preview .twitter-post .twitter-header .poster .poster-name{font-size:15px;color:#1c2022;font-weight:600}.aioseo-twitter-preview .twitter-post .twitter-header .poster .poster-username{color:#697882;font-weight:500;font-size:13px}.aioseo-twitter-preview .twitter-post .twitter-container{padding:0 20px 20px}.aioseo-twitter-preview .twitter-post .twitter-container.summary .twitter-content{flex-direction:row}.aioseo-twitter-preview .twitter-post .twitter-container.summary .twitter-content .twitter-image-preview{display:flex;align-items:center;justify-content:center;background-color:#e1e8ed;min-width:125px;min-height:125px;background-size:cover;background-repeat:no-repeat;background-position:50%}.aioseo-twitter-preview .twitter-post .twitter-container.summary .twitter-content .twitter-image-preview svg.aioseo-book{width:50px;height:50px;color:#8999a5}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content{border-radius:10px;overflow:hidden;display:flex;flex-direction:column;border:1px solid #e1e8ed}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content img{width:100%;height:auto}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description{padding:18px;color:#1c2022}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description .site-domain{font-size:14px;color:#8899a6;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description .site-title{font-size:15px;font-weight:600}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description .site-description{font-size:14px;margin:5px 0}.aioseo-col .reverse{flex-direction:column-reverse}.aioseo-col.col-xs,.aioseo-col.col-xs-1,.aioseo-col.col-xs-2,.aioseo-col.col-xs-3,.aioseo-col.col-xs-4,.aioseo-col.col-xs-5,.aioseo-col.col-xs-6,.aioseo-col.col-xs-7,.aioseo-col.col-xs-8,.aioseo-col.col-xs-9,.aioseo-col.col-xs-10,.aioseo-col.col-xs-11,.aioseo-col.col-xs-12,.aioseo-col.col-xs-offset-0,.aioseo-col.col-xs-offset-1,.aioseo-col.col-xs-offset-2,.aioseo-col.col-xs-offset-3,.aioseo-col.col-xs-offset-4,.aioseo-col.col-xs-offset-5,.aioseo-col.col-xs-offset-6,.aioseo-col.col-xs-offset-7,.aioseo-col.col-xs-offset-8,.aioseo-col.col-xs-offset-9,.aioseo-col.col-xs-offset-10,.aioseo-col.col-xs-offset-11,.aioseo-col.col-xs-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-xs{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-xs-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-xs-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-xs-3{flex-basis:25%;max-width:25%}.aioseo-col.col-xs-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-xs-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-xs-6{flex-basis:50%;max-width:50%}.aioseo-col.col-xs-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-xs-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-xs-9{flex-basis:75%;max-width:75%}.aioseo-col.col-xs-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-xs-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-xs-12{flex-basis:100%;max-width:100%}.aioseo-col.col-xs-offset-0{margin-left:0}.aioseo-col.col-xs-offset-1{margin-left:8.33333333%}.aioseo-col.col-xs-offset-2{margin-left:16.66666667%}.aioseo-col.col-xs-offset-3{margin-left:25%}.aioseo-col.col-xs-offset-4{margin-left:33.33333333%}.aioseo-col.col-xs-offset-5{margin-left:41.66666667%}.aioseo-col.col-xs-offset-6{margin-left:50%}.aioseo-col.col-xs-offset-7{margin-left:58.33333333%}.aioseo-col.col-xs-offset-8{margin-left:66.66666667%}.aioseo-col.col-xs-offset-9{margin-left:75%}.aioseo-col.col-xs-offset-10{margin-left:83.33333333%}.aioseo-col.col-xs-offset-11{margin-left:91.66666667%}.aioseo-col.first-xs{order:-1}.aioseo-col.last-xs{order:1}.aioseo-col.text-xs-left{text-align:left!important;justify-content:flex-start}.aioseo-col.text-xs-center{text-align:center!important;justify-content:center}.aioseo-col.text-xs-right{text-align:right!important;justify-content:flex-end}.aioseo-col.p-0{padding:0!important}.aioseo-col.pt-0,.aioseo-col.py-0{padding-top:0!important}.aioseo-col.pr-0,.aioseo-col.px-0{padding-right:0!important}.aioseo-col.pb-0,.aioseo-col.py-0{padding-bottom:0!important}.aioseo-col.pl-0,.aioseo-col.px-0{padding-left:0!important}.aioseo-col.p-1{padding:.25rem!important}.aioseo-col.pt-1,.aioseo-col.py-1{padding-top:.25rem!important}.aioseo-col.pr-1,.aioseo-col.px-1{padding-right:.25rem!important}.aioseo-col.pb-1,.aioseo-col.py-1{padding-bottom:.25rem!important}.aioseo-col.pl-1,.aioseo-col.px-1{padding-left:.25rem!important}.aioseo-col.p-2{padding:.5rem!important}.aioseo-col.pt-2,.aioseo-col.py-2{padding-top:.5rem!important}.aioseo-col.pr-2,.aioseo-col.px-2{padding-right:.5rem!important}.aioseo-col.pb-2,.aioseo-col.py-2{padding-bottom:.5rem!important}.aioseo-col.pl-2,.aioseo-col.px-2{padding-left:.5rem!important}.aioseo-col.p-3{padding:1rem!important}.aioseo-col.pt-3,.aioseo-col.py-3{padding-top:1rem!important}.aioseo-col.pr-3,.aioseo-col.px-3{padding-right:1rem!important}.aioseo-col.pb-3,.aioseo-col.py-3{padding-bottom:1rem!important}.aioseo-col.pl-3,.aioseo-col.px-3{padding-left:1rem!important}.aioseo-col.p-4{padding:1.5rem!important}.aioseo-col.pt-4,.aioseo-col.py-4{padding-top:1.5rem!important}.aioseo-col.pr-4,.aioseo-col.px-4{padding-right:1.5rem!important}.aioseo-col.pb-4,.aioseo-col.py-4{padding-bottom:1.5rem!important}.aioseo-col.pl-4,.aioseo-col.px-4{padding-left:1.5rem!important}.aioseo-col.p-5{padding:3rem!important}.aioseo-col.pt-5,.aioseo-col.py-5{padding-top:3rem!important}.aioseo-col.pr-5,.aioseo-col.px-5{padding-right:3rem!important}.aioseo-col.pb-5,.aioseo-col.py-5{padding-bottom:3rem!important}.aioseo-col.pl-5,.aioseo-col.px-5{padding-left:3rem!important}@media only screen and (min-width:782px){.aioseo-col.col-sm,.aioseo-col.col-sm-1,.aioseo-col.col-sm-2,.aioseo-col.col-sm-3,.aioseo-col.col-sm-4,.aioseo-col.col-sm-5,.aioseo-col.col-sm-6,.aioseo-col.col-sm-7,.aioseo-col.col-sm-8,.aioseo-col.col-sm-9,.aioseo-col.col-sm-10,.aioseo-col.col-sm-11,.aioseo-col.col-sm-12,.aioseo-col.col-sm-offset-0,.aioseo-col.col-sm-offset-1,.aioseo-col.col-sm-offset-2,.aioseo-col.col-sm-offset-3,.aioseo-col.col-sm-offset-4,.aioseo-col.col-sm-offset-5,.aioseo-col.col-sm-offset-6,.aioseo-col.col-sm-offset-7,.aioseo-col.col-sm-offset-8,.aioseo-col.col-sm-offset-9,.aioseo-col.col-sm-offset-10,.aioseo-col.col-sm-offset-11,.aioseo-col.col-sm-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-sm{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-sm-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-sm-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-sm-3{flex-basis:25%;max-width:25%}.aioseo-col.col-sm-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-sm-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-sm-6{flex-basis:50%;max-width:50%}.aioseo-col.col-sm-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-sm-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-sm-9{flex-basis:75%;max-width:75%}.aioseo-col.col-sm-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-sm-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-sm-12{flex-basis:100%;max-width:100%}.aioseo-col.col-sm-offset-0{margin-left:0}.aioseo-col.col-sm-offset-1{margin-left:8.33333333%}.aioseo-col.col-sm-offset-2{margin-left:16.66666667%}.aioseo-col.col-sm-offset-3{margin-left:25%}.aioseo-col.col-sm-offset-4{margin-left:33.33333333%}.aioseo-col.col-sm-offset-5{margin-left:41.66666667%}.aioseo-col.col-sm-offset-6{margin-left:50%}.aioseo-col.col-sm-offset-7{margin-left:58.33333333%}.aioseo-col.col-sm-offset-8{margin-left:66.66666667%}.aioseo-col.col-sm-offset-9{margin-left:75%}.aioseo-col.col-sm-offset-10{margin-left:83.33333333%}.aioseo-col.col-sm-offset-11{margin-left:91.66666667%}.aioseo-col.first-sm{order:-1}.aioseo-col.last-sm{order:1}.aioseo-col.text-sm-left{text-align:left!important;justify-content:flex-start}.aioseo-col.text-sm-center{text-align:center!important;justify-content:center}.aioseo-col.text-sm-right{text-align:right!important;justify-content:flex-end}}@media only screen and (min-width:912px){.aioseo-col.col-md,.aioseo-col.col-md-1,.aioseo-col.col-md-2,.aioseo-col.col-md-3,.aioseo-col.col-md-4,.aioseo-col.col-md-5,.aioseo-col.col-md-6,.aioseo-col.col-md-7,.aioseo-col.col-md-8,.aioseo-col.col-md-9,.aioseo-col.col-md-10,.aioseo-col.col-md-11,.aioseo-col.col-md-12,.aioseo-col.col-md-offset-0,.aioseo-col.col-md-offset-1,.aioseo-col.col-md-offset-2,.aioseo-col.col-md-offset-3,.aioseo-col.col-md-offset-4,.aioseo-col.col-md-offset-5,.aioseo-col.col-md-offset-6,.aioseo-col.col-md-offset-7,.aioseo-col.col-md-offset-8,.aioseo-col.col-md-offset-9,.aioseo-col.col-md-offset-10,.aioseo-col.col-md-offset-11,.aioseo-col.col-md-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-md{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-md-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-md-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-md-3{flex-basis:25%;max-width:25%}.aioseo-col.col-md-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-md-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-md-6{flex-basis:50%;max-width:50%}.aioseo-col.col-md-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-md-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-md-9{flex-basis:75%;max-width:75%}.aioseo-col.col-md-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-md-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-md-12{flex-basis:100%;max-width:100%}.aioseo-col.col-md-offset-0{margin-left:0}.aioseo-col.col-md-offset-1{margin-left:8.33333333%}.aioseo-col.col-md-offset-2{margin-left:16.66666667%}.aioseo-col.col-md-offset-3{margin-left:25%}.aioseo-col.col-md-offset-4{margin-left:33.33333333%}.aioseo-col.col-md-offset-5{margin-left:41.66666667%}.aioseo-col.col-md-offset-6{margin-left:50%}.aioseo-col.col-md-offset-7{margin-left:58.33333333%}.aioseo-col.col-md-offset-8{margin-left:66.66666667%}.aioseo-col.col-md-offset-9{margin-left:75%}.aioseo-col.col-md-offset-10{margin-left:83.33333333%}.aioseo-col.col-md-offset-11{margin-left:91.66666667%}.aioseo-col.first-md{order:-1}.aioseo-col.last-md{order:1}.aioseo-col.text-md-left{text-align:left!important;justify-content:flex-start}.aioseo-col.text-md-center{text-align:center!important;justify-content:center}.aioseo-col.text-md-right{text-align:right!important;justify-content:flex-end}}@media only screen and (min-width:1042px){.aioseo-col.col-lg,.aioseo-col.col-lg-1,.aioseo-col.col-lg-2,.aioseo-col.col-lg-3,.aioseo-col.col-lg-4,.aioseo-col.col-lg-5,.aioseo-col.col-lg-6,.aioseo-col.col-lg-7,.aioseo-col.col-lg-8,.aioseo-col.col-lg-9,.aioseo-col.col-lg-10,.aioseo-col.col-lg-11,.aioseo-col.col-lg-12,.aioseo-col.col-lg-offset-0,.aioseo-col.col-lg-offset-1,.aioseo-col.col-lg-offset-2,.aioseo-col.col-lg-offset-3,.aioseo-col.col-lg-offset-4,.aioseo-col.col-lg-offset-5,.aioseo-col.col-lg-offset-6,.aioseo-col.col-lg-offset-7,.aioseo-col.col-lg-offset-8,.aioseo-col.col-lg-offset-9,.aioseo-col.col-lg-offset-10,.aioseo-col.col-lg-offset-11,.aioseo-col.col-lg-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-lg{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-lg-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-lg-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-lg-3{flex-basis:25%;max-width:25%}.aioseo-col.col-lg-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-lg-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-lg-6{flex-basis:50%;max-width:50%}.aioseo-col.col-lg-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-lg-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-lg-9{flex-basis:75%;max-width:75%}.aioseo-col.col-lg-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-lg-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-lg-12{flex-basis:100%;max-width:100%}.aioseo-col.col-lg-offset-0{margin-left:0}.aioseo-col.col-lg-offset-1{margin-left:8.33333333%}.aioseo-col.col-lg-offset-2{margin-left:16.66666667%}.aioseo-col.col-lg-offset-3{margin-left:25%}.aioseo-col.col-lg-offset-4{margin-left:33.33333333%}.aioseo-col.col-lg-offset-5{margin-left:41.66666667%}.aioseo-col.col-lg-offset-6{margin-left:50%}.aioseo-col.col-lg-offset-7{margin-left:58.33333333%}.aioseo-col.col-lg-offset-8{margin-left:66.66666667%}.aioseo-col.col-lg-offset-9{margin-left:75%}.aioseo-col.col-lg-offset-10{margin-left:83.33333333%}.aioseo-col.col-lg-offset-11{margin-left:91.66666667%}.aioseo-col.first-lg{order:-1}.aioseo-col.last-lg{order:1}.aioseo-col.text-lg-left{text-align:left!important;justify-content:flex-start}.aioseo-col.text-lg-center{text-align:center!important;justify-content:center}.aioseo-col.text-lg-right{text-align:right!important;justify-content:flex-end}}@media only screen and (min-width:1140px){.aioseo-col.col-xl,.aioseo-col.col-xl-1,.aioseo-col.col-xl-2,.aioseo-col.col-xl-3,.aioseo-col.col-xl-4,.aioseo-col.col-xl-5,.aioseo-col.col-xl-6,.aioseo-col.col-xl-7,.aioseo-col.col-xl-8,.aioseo-col.col-xl-9,.aioseo-col.col-xl-10,.aioseo-col.col-xl-11,.aioseo-col.col-xl-12,.aioseo-col.col-xl-offset-0,.aioseo-col.col-xl-offset-1,.aioseo-col.col-xl-offset-2,.aioseo-col.col-xl-offset-3,.aioseo-col.col-xl-offset-4,.aioseo-col.col-xl-offset-5,.aioseo-col.col-xl-offset-6,.aioseo-col.col-xl-offset-7,.aioseo-col.col-xl-offset-8,.aioseo-col.col-xl-offset-9,.aioseo-col.col-xl-offset-10,.aioseo-col.col-xl-offset-11,.aioseo-col.col-xl-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-xl{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-xl-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-xl-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-xl-3{flex-basis:25%;max-width:25%}.aioseo-col.col-xl-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-xl-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-xl-6{flex-basis:50%;max-width:50%}.aioseo-col.col-xl-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-xl-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-xl-9{flex-basis:75%;max-width:75%}.aioseo-col.col-xl-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-xl-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-xl-12{flex-basis:100%;max-width:100%}.aioseo-col.col-xl-offset-0{margin-left:0}.aioseo-col.col-xl-offset-1{margin-left:8.33333333%}.aioseo-col.col-xl-offset-2{margin-left:16.66666667%}.aioseo-col.col-xl-offset-3{margin-left:25%}.aioseo-col.col-xl-offset-4{margin-left:33.33333333%}.aioseo-col.col-xl-offset-5{margin-left:41.66666667%}.aioseo-col.col-xl-offset-6{margin-left:50%}.aioseo-col.col-xl-offset-7{margin-left:58.33333333%}.aioseo-col.col-xl-offset-8{margin-left:66.66666667%}.aioseo-col.col-xl-offset-9{margin-left:75%}.aioseo-col.col-xl-offset-10{margin-left:83.33333333%}.aioseo-col.col-xl-offset-11{margin-left:91.66666667%}.aioseo-col.first-xl{order:-1}.aioseo-col.last-xl{order:1}.aioseo-col.text-xl-left{text-align:left!important;justify-content:flex-start}.aioseo-col.text-xl-center{text-align:center!important;justify-content:center}.aioseo-col.text-xl-right{text-align:right!important;justify-content:flex-end}}.aioseo-container,.aioseo-container-fluid{margin-right:auto;margin-left:auto}.aioseo-container{padding:0 20px}.aioseo-container-fluid.hero,.aioseo-container.hero{min-height:100vh;display:flex;justify-content:center;align-items:center}.aioseo-container-fluid{padding-right:2rem;padding-left:2rem}@media only screen and (min-width:782px){.aioseo-container{padding:0 30px}}@media only screen and (min-width:1042px){.aioseo-container{max-width:80rem}.aioseo-container.full-width{max-width:100%}.aioseo-container.small{max-width:810px}}.aioseo-masonry{-moz-column-count:0;column-count:0;-moz-column-gap:20px;column-gap:20px;counter-reset:brick-counter}.aioseo-masonry>*{box-sizing:border-box;-moz-column-break-inside:avoid;break-inside:avoid;counter-increment:brick-counter;margin-bottom:20px}@media only screen and (min-width:782px){.aioseo-masonry{-moz-column-count:1;column-count:1}}@media only screen and (min-width:912px){.aioseo-masonry{-moz-column-count:2;column-count:2}}@media only screen and (min-width:1042px){.aioseo-masonry{-moz-column-count:3;column-count:3}}.aioseo-row{box-sizing:border-box;display:flex;flex:0 1 auto;flex-direction:row;flex-wrap:wrap;margin-right:-.5rem;margin-left:-.5rem}.aioseo-row.reverse{flex-direction:row-reverse}.aioseo-row.start-xs{justify-content:flex-start;text-align:start}.aioseo-row.center-xs{justify-content:center;text-align:center}.aioseo-row.end-xs{justify-content:flex-end;text-align:end}.aioseo-row.top-xs{align-items:flex-start}.aioseo-row.middle-xs{align-items:center}.aioseo-row.bottom-xs{align-items:flex-end}.aioseo-row.around-xs{justify-content:space-around}.aioseo-row.between-xs{justify-content:space-between}@media only screen and (min-width:782px){.aioseo-row.start-sm{justify-content:flex-start;text-align:start}.aioseo-row.center-sm{justify-content:center;text-align:center}.aioseo-row.end-sm{justify-content:flex-end;text-align:end}.aioseo-row.top-sm{align-items:flex-start}.aioseo-row.middle-sm{align-items:center}.aioseo-row.bottom-sm{align-items:flex-end}.aioseo-row.around-sm{justify-content:space-around}.aioseo-row.between-sm{justify-content:space-between}}@media only screen and (min-width:912px){.aioseo-row.start-md{justify-content:flex-start;text-align:start}.aioseo-row.center-md{justify-content:center;text-align:center}.aioseo-row.end-md{justify-content:flex-end;text-align:end}.aioseo-row.top-md{align-items:flex-start}.aioseo-row.middle-md{align-items:center}.aioseo-row.bottom-md{align-items:flex-end}.aioseo-row.around-md{justify-content:space-around}.aioseo-row.between-md{justify-content:space-between}}@media only screen and (min-width:1042px){.aioseo-row.start-lg{justify-content:flex-start;text-align:start}.aioseo-row.center-lg{justify-content:center;text-align:center}.aioseo-row.end-lg{justify-content:flex-end;text-align:end}.aioseo-row.top-lg{align-items:flex-start}.aioseo-row.middle-lg{align-items:center}.aioseo-row.bottom-lg{align-items:flex-end}.aioseo-row.around-lg{justify-content:space-around}.aioseo-row.between-lg{justify-content:space-between}}.aioseo-display-info svg.aioseo-new-page{width:100%;height:auto;max-width:45px}.aioseo-display-info .new-page .aioseo-row{margin:0}.aioseo-display-info .new-page svg.aioseo-external{width:14px;height:14px;margin-right:10px}.aioseo-display-info .new-page .aioseo-description{color:#434960}.aioseo-display-info .new-page button.aioseo-html-sitemaps-disabled-button{border:1px solid #dcdde1;color:#8c8f9a;background-color:#f3f4f5;cursor:default}.aioseo-display-info .new-page .aioseo-alert{width:100%;margin:8px 8px 0}.aioseo-exclude-posts{display:block}.aioseo-exclude-posts .aioseo-select{max-width:600px;display:inline-block;margin-right:10px}.aioseo-exclude-posts .aioseo-select button{display:none}.aioseo-exclude-posts .aioseo-select .multiselect__option{display:flex}.aioseo-exclude-posts .aioseo-select .multiselect__option--highlight .option-title{color:#005ae0}.aioseo-exclude-posts .aioseo-button.gray{margin-top:10px}.aioseo-exclude-posts .option{flex:1 0 auto}.aioseo-exclude-posts .option .option-title{font-weight:500;font-size:16px;color:#141b38}.aioseo-exclude-posts .option .option-title .search-term{font-weight:700}.aioseo-exclude-posts .option .option-details{display:flex;align-items:center;font-size:14px;color:#8c8f9a}.aioseo-exclude-posts .option .option-details span{margin-right:15px}.aioseo-exclude-posts .option-permalink{display:flex;align-items:center}.aioseo-exclude-posts .option-permalink svg.aioseo-external{width:15px;height:15px;color:#434960}.aioseo-exclude-posts .multiselect-toggle{padding:10px 13px;width:40px;position:absolute;height:36px;right:2px;top:2px;text-align:center;z-index:1}.aioseo-exclude-posts .multiselect-toggle svg.aioseo-add-plus{width:14px;height:14px;color:#000}.aioseo-sidebar-row .aioseo-included-objects-toggle{margin-top:5px}.aioseo-sidebar-row .aioseo-included-objects-toggle .aioseo-included-list{margin-top:8px}.aioseo-notification{margin-bottom:20px}.aioseo-notification>div{display:flex;align-items:flex-start;padding-bottom:10px;border-bottom:1px solid #e8e8eb}.aioseo-notification>div .icon{margin-right:20px}.aioseo-notification>div .icon svg{width:20px;height:20px;color:#00aa63}.aioseo-notification>div .icon svg.warning{color:#f18200}.aioseo-notification>div .icon svg.info{color:#005ae0}.aioseo-notification>div .icon svg.success{color:#00aa63}.aioseo-notification>div .icon svg.error{color:#df2a4a}.aioseo-notification>div .body{margin-right:20px;flex:1}.aioseo-notification>div .body .title{font-size:16px;font-weight:600;color:#141b38;margin-bottom:7px;display:flex;align-items:center}.aioseo-notification>div .body .title div:first-child{flex:1;margin-right:5px;line-height:1.4}.aioseo-notification>div .body .notification-content{margin-bottom:10px;max-width:400px}.aioseo-notification>div .body .actions{flex-wrap:wrap;display:flex;align-items:center}.aioseo-notification>div .body .actions>*{margin-bottom:10px}.aioseo-notification>div .body .actions .aioseo-button{margin-right:20px}.aioseo-notification>div .body .actions .dismiss{color:#8c8f9a;font-size:14px}.aioseo-seo-site-score__circle{animation:aioseo-seo-site-score-fill 1s reverse;transform:rotate(-180deg);transform-origin:center;stroke:#00aa63}.aioseo-seo-site-score__circle.fast{-webkit-animation-duration:.5s;animation-duration:.5s;stroke:#df2a4a}.aioseo-seo-site-score__circle.medium{-webkit-animation-duration:.75s;animation-duration:.75s;stroke:#f18200}.aioseo-seo-site-score__background{stroke:#e8e8eb}@-webkit-keyframes aioseo-seo-site-score-fill{to{stroke-dasharray:0 100}}@keyframes aioseo-seo-site-score-fill{to{stroke-dasharray:0 100}}.aioseo-seo-site-score-svg-loading{-webkit-animation:aioseo-seo-site-score-svg-animation 2s linear infinite;animation:aioseo-seo-site-score-svg-animation 2s linear infinite}.aioseo-seo-site-score-loading__circle{-webkit-animation:aioseo-seo-site-score-fill-loading 2s ease-in-out infinite both;animation:aioseo-seo-site-score-fill-loading 2s ease-in-out infinite both;transform:rotate(-180deg);transform-origin:center;stroke:#005ae0}@-webkit-keyframes aioseo-seo-site-score-svg-animation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes aioseo-seo-site-score-svg-animation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@-webkit-keyframes aioseo-seo-site-score-fill-loading{0%,25%{stroke-dashoffset:90;transform:rotate(0)}50%,75%{stroke-dashoffset:10;transform:rotate(45deg)}to{stroke-dashoffset:90;transform:rotate(1turn)}}@keyframes aioseo-seo-site-score-fill-loading{0%,25%{stroke-dashoffset:90;transform:rotate(0)}50%,75%{stroke-dashoffset:10;transform:rotate(45deg)}to{stroke-dashoffset:90;transform:rotate(1turn)}}.aioseo-table-column{display:flex;flex-direction:column;flex-basis:100%;flex:1;padding:5px;justify-content:center}.aioseo-table-row{display:flex;flex-direction:row;flex-wrap:wrap;width:100%}.aioseo-wizard-body{background-color:#fff;max-width:900px;box-shadow:0 2px 5px rgba(0,0,0,.05)}.aioseo-wizard-body .body-content{padding:80px 140px}@media screen and (max-width:782px){.aioseo-wizard-body .body-content{padding:40px}}.aioseo-wizard-body .body-content .header{line-height:1.4}.aioseo-wizard-body .body-footer{border-top:1px solid #e8e8eb;padding:30px;display:flex;align-items:center}.aioseo-wizard-body .body-footer>*{margin-right:10px}.aioseo-wizard-body .body-footer>:last-child{margin-right:0}.aioseo-wizard-body .body-footer .spacer{flex:1 0 auto}.aioseo-wizard-close-and-exit{margin:96px 0;min-height:96px;text-align:center;font-size:14px}.aioseo-wizard-close-and-exit a{color:#8c8f9a!important}.aioseo-wizard-container{margin:40px auto;max-width:900px}@media screen and (max-width:782px){.aioseo-wizard-container{margin:0 20px}}.aioseo-wizard-header{display:flex;align-items:center;justify-content:center;flex-direction:column}.aioseo-wizard-header svg.aioseo-logo{width:100%;max-width:140px;height:auto;margin:60px 10px 40px 0}.aioseo-wizard-progress{display:flex;align-items:center;justify-content:center}@media screen and (max-width:782px){.aioseo-wizard-progress{display:none}}.aioseo-wizard-progress .circle{background-color:#dcdde1;width:16px;height:16px;border-radius:50%}.aioseo-wizard-progress .circle.active{background-color:#005ae0}.aioseo-wizard-progress .spacer{width:59px;border:1px solid #dcdde1;margin:0 12px}.aioseo-wizard-progress .spacer.active{border-color:#005ae0}.aioseo-wizard-steps{color:#8c8f9a;font-size:14px;margin-bottom:20px}.block-editor-block-card{align-items:center}.block-editor-block-card__title.block-editor-block-card__title{margin:0}.aioseo-sidebar-row{margin-bottom:16px}.aioseo-sidebar-row .aioseo-sidebar-title{font-weight:500}.aioseo-localseo-info .aioseo-input,.aioseo-localseo-info .aioseo-multiselect,.aioseo-localseo-info .aioseo-select{max-width:480px}.aioseo-localseo-info .field-description{font-size:14px}.aioseo-localseo-info .info-businessaddress-row .columns{display:flex;flex:0 1 auto;flex-direction:row;flex-wrap:wrap}.aioseo-localseo-opening .field-description{display:inline-block;margin:10px 0;font-size:14px}.aioseo-localseo-opening .field-description.mt-8{margin-top:8px}.aioseo-localseo-opening .aioseo-input,.aioseo-localseo-opening .aioseo-multiselect,.aioseo-localseo-opening .aioseo-select{max-width:480px}.aioseo-localseo-opening .aioseo-col-flex{display:flex;align-items:center;padding:12px 0;border-bottom:1px solid #e8e8eb}.aioseo-localseo-opening .aioseo-col-flex:first-of-type{padding-top:0}.aioseo-localseo-opening .aioseo-col-flex:last-of-type{padding-bottom:0;border:none}.aioseo-localseo-opening .aioseo-col-flex .aioseo-col-day{flex:1}.aioseo-localseo-opening .aioseo-col-flex .aioseo-col-alwaysopen,.aioseo-localseo-opening .aioseo-col-flex .aioseo-col-hours{flex:2}.aioseo-localseo-opening .aioseo-col-flex span.separator{margin:0 5px}.aioseo-localseo-opening .aioseo-col-flex .aioseo-select{display:inline-block;max-width:120px;margin-bottom:5px}.aioseo-localseo-opening .aioseo-col-flex .multiselect--disabled .multiselect__single,.aioseo-localseo-opening .aioseo-col-flex .multiselect--disabled .multiselect__tags{background:#f3f4f5}.aioseo-localseo-opening .aioseo-col-alwaysopen .aioseo-checkbox{padding:0 10px}.sidebar-row{margin-bottom:16px}.sidebar-row .title{font-weight:700}
1
+ .aioseo-app .aioseo-cta{margin-top:30px;background:#fff;width:100%;padding:40px;box-shadow:0 2px 5px rgba(0,0,0,.05);border:1px solid #e8e8eb}.aioseo-app .aioseo-cta.floating{margin-top:0;position:absolute;max-width:850px;left:50%;top:50%;transform:translateX(-50%) translateY(-50%);box-shadow:0 5px 20px rgba(0,0,0,.1);border-radius:3px}.aioseo-app .aioseo-cta .header-text{line-height:1.4;font-weight:600;font-size:24px;text-align:center;color:#141b38}.aioseo-app .aioseo-cta .header-text span.large{line-height:1.4;font-size:32px}.aioseo-app .aioseo-cta .description{margin:30px 0 50px;width:100%;max-width:600px;text-align:center;font-size:16px;color:#141b38;line-height:1.4}.aioseo-app .aioseo-cta .description .aioseo-alert{margin-bottom:30px;text-align:left}.aioseo-app .aioseo-cta .feature-list{color:#141b38;font-size:16px;width:100%;max-width:500px;margin-bottom:50px}.aioseo-app .aioseo-cta .feature-list .aioseo-col{display:flex;align-items:flex-start}.aioseo-app .aioseo-cta .feature-list .aioseo-col svg.aioseo-circle-check{color:#00aa63;width:18px;min-width:18px;min-height:18px;margin-right:10px}.aioseo-app .aioseo-cta a.learn-more{margin-top:20px;color:#8c8f9a;font-size:14px}.aioseo-app .aioseo-cta .type-1{display:flex;flex-direction:column;align-items:center}.aioseo-app .aioseo-cta .type-2{margin:30px 0 30px 50px;display:flex}.aioseo-app .aioseo-cta .type-2 .description,.aioseo-app .aioseo-cta .type-2 .header-text{text-align:left}.aioseo-app .aioseo-cta .type-2 .description,.aioseo-app .aioseo-cta .type-2 .feature-list{margin:30px 0}.aioseo-app .aioseo-cta .type-2>div{margin-right:20px;flex:0 0 50%}.aioseo-app .aioseo-cta .type-2 .featured-image{max-height:540px;border:1px solid #e8e8eb;flex:1;overflow:hidden;margin-right:-41px;margin-bottom:-71px;border-radius:5px 0 0}.aioseo-app .aioseo-cta .type-2 .featured-image img{max-height:600px}@media only screen and (max-width:912px){.aioseo-app .aioseo-cta .type-2{flex-direction:column;align-items:center}.aioseo-app .aioseo-cta .type-2 .description,.aioseo-app .aioseo-cta .type-2 .header-text{text-align:center}.aioseo-app .aioseo-cta .type-2>div{text-align:center;margin-right:0;margin-bottom:30px;flex:1 0 100%;width:100%}.aioseo-app .aioseo-cta .type-2 .featured-image{margin:0 -10px -41px;border-radius:5px 5px 0 0;max-height:300px}}.aioseo-app .aioseo-cta .type-3 .sub-header{line-height:1.4;font-size:16px;font-weight:600;color:#005ae0;margin-bottom:5px}.aioseo-app .aioseo-cta .type-3 .header-text{text-align:left}.aioseo-app .aioseo-cta .type-3 .feature-list{margin:30px 0}.aioseo-app .aioseo-cta .type-3 .feature-list .aioseo-col svg.aioseo-circle-check{color:#00aa63;width:21px;min-width:21px;min-height:21px;margin-right:5px}.aioseo-app .aioseo-cta .type-3 .aioseo-button{margin-right:12px}.aioseo-box-toggle .aioseo-row .aioseo-col{max-width:calc(200px + 1em)}@media only screen and (max-width:48em){.aioseo-box-toggle .aioseo-row .aioseo-col{max-width:100%}}.aioseo-box-toggle input{position:absolute!important;clip:rect(0,0,0,0);height:1px;width:1px;border:0;overflow:hidden}.aioseo-box-toggle input:checked+label{background-color:#fff;box-shadow:0 5px 10px rgba(0,90,224,.1);border:2px solid #005ae0;font-weight:600}.aioseo-box-toggle label{background-color:#f9f9fa;color:#141b38;font-size:16px;line-height:1;display:flex;align-items:center;justify-content:center;flex-direction:column;border:1px solid #f9f9fa;transition:all .1s ease-in-out;border-radius:3px;height:165px;position:relative}.aioseo-box-toggle label p{position:absolute;bottom:15px;margin:0}.aioseo-box-toggle label:hover{cursor:pointer}.aioseo-button{flex-shrink:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:600;padding:0 24px;border-radius:4px;-webkit-appearance:none;cursor:pointer;height:48px;transition:background-color .2s ease;position:relative;overflow:hidden;text-decoration:none;color:#141b38;white-space:nowrap}.aioseo-button.small,.aioseo-button.small-table{height:30px;font-size:14px;padding:0 12px}.aioseo-button.small-table .loading-spinner,.aioseo-button.small .loading-spinner{width:25px;height:25px}.aioseo-button.small-table{font-size:12px;border-radius:3px}.aioseo-button.medium{height:40px;font-size:14px;padding:0 18px}.aioseo-button.medium .loading-spinner{width:35px;height:35px}.aioseo-button.xl{height:66px;border-radius:4px;font-size:18px;padding:0 48px}.aioseo-button.gray{border:1px solid #dcdde1;background-color:#f3f4f5}.aioseo-button.gray:hover{background-color:#fff;color:#141b38}.aioseo-button.gray:active{background-color:#f3f4f5}.aioseo-button.green{border:none;background-color:#00aa63;color:#fff}.aioseo-button.green:hover{background-color:#07c575}.aioseo-button.green:active{background-color:#15955f}.aioseo-button.blue{border:none;background-color:#005ae0;color:#fff}.aioseo-button.blue:hover{background-color:#1a82ea}.aioseo-button.blue:active{background-color:#004f9d}.aioseo-button.wp-blue{border:1px solid #005ae0;background-color:#f3f5f6;color:#005ae0}.aioseo-button.wp-blue:hover{background-color:#1a82ea;border-color:#1a82ea;color:#fff}.aioseo-button.wp-blue:active{background-color:#004f9d;border-color:#004f9d;color:#fff}.aioseo-button.black{border:none;background-color:#434960;color:#fff}.aioseo-button.black:hover{background-color:#2c324c}.aioseo-button.black:active{background-color:#141b38}.aioseo-button.red{border:1px solid #df2a4a;background-color:#fff;color:#df2a4a}.aioseo-button.red:hover{background-color:#df2a4a;color:#fff}.aioseo-button.red:active{background-color:#ab2039}.aioseo-button.loading.blue,.aioseo-button.loading.blue:hover{background-color:#004f9d;color:#004f9d}.aioseo-button.loading.green,.aioseo-button.loading.green:hover{background-color:#15955f;color:#15955f}.aioseo-button.loading.gray,.aioseo-button.loading.gray:hover{background-color:#f3f4f5;color:#f3f4f5}.aioseo-button.loading.black,.aioseo-button.loading.black:hover{background-color:#141b38;color:#141b38}.aioseo-button:disabled{border:1px solid #dcdde1;color:#8c8f9a;background-color:#f3f4f5;cursor:default}.aioseo-button:disabled.gray:hover{color:#8c8f9a}.aioseo-button:disabled.wp-blue{border-color:#ddd;background-color:#f7f7f7}.aioseo-button:disabled.wp-blue:hover{border-color:#ddd;color:#8c8f9a}.aioseo-button:disabled:hover{background-color:#f3f4f5}.aioseo-checkbox{display:inline-flex;align-items:center}.aioseo-checkbox.disabled,.aioseo-checkbox.disabled .form-checkbox .fancy-checkbox,.aioseo-checkbox.no-clicks,.aioseo-checkbox.no-clicks .form-checkbox .fancy-checkbox{cursor:default}.aioseo-checkbox .form-checkbox-wrapper{margin-right:10px;display:flex}.aioseo-checkbox.medium .form-checkbox{width:20px;height:20px}.aioseo-checkbox.medium .form-checkbox .fancy-checkbox svg{width:12px;height:12px}.aioseo-checkbox.medium .form-checkbox span:before{height:18px;width:18px;line-height:20px}.aioseo-checkbox.round .form-checkbox span,.aioseo-checkbox.round .form-checkbox span:before{border-radius:50%}.aioseo-checkbox .form-checkbox{position:relative;display:inline-block;width:28px;height:28px;color:#fff;vertical-align:bottom;text-align:center}.aioseo-checkbox .form-checkbox input{display:none}.aioseo-checkbox .form-checkbox input:checked+.fancy-checkbox.blue{background:#005ae0}.aioseo-checkbox .form-checkbox input:checked+.fancy-checkbox.green{background:#00aa63}.aioseo-checkbox .form-checkbox input:checked+.fancy-checkbox:before{background:transparent}.aioseo-checkbox .form-checkbox input:disabled+.fancy-checkbox{background:#e8e8eb!important;border:1px solid #d0d1d7;cursor:default}.aioseo-checkbox .form-checkbox input:disabled+.fancy-checkbox svg{color:#8c8f9a}.aioseo-checkbox .form-checkbox input:not(:checked):disabled+.fancy-checkbox:before{left:0;bottom:0;background:#e8e8eb}.aioseo-checkbox .form-checkbox .fancy-checkbox svg{color:#fff;width:16px;height:16px}.aioseo-checkbox .form-checkbox span{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#d0d1d7;transition:.2s;border-radius:3px;display:flex;align-items:center;justify-content:center}.aioseo-checkbox .form-checkbox span:before{position:absolute;content:"";height:26px;width:26px;left:1px;bottom:1px;background-color:#fff;transition:.2s;font-size:18px;line-height:28px;border-radius:2px}.aioseo-date-picker.vue-daterange-picker{width:100%}.aioseo-date-picker.vue-daterange-picker .form-control{display:flex;align-items:center;color:#141b38;font-size:16px;height:48px;border-radius:3px;border:1px solid #d0d1d7;position:relative}.aioseo-date-picker.vue-daterange-picker .form-control svg.aioseo-circle-close{position:absolute;right:10px;color:#434960;width:15px;height:15px}.aioseo-date-picker.vue-daterange-picker.small .form-control{height:30px}.aioseo-date-picker.vue-daterange-picker.medium .form-control{height:40px}body[class*=all-in-one-seo_page] .daterangepicker .yearselect{width:75px}.aioseo-editor{position:relative}.aioseo-editor .aioseo-editor-description .ql-editor{min-height:100px}.aioseo-editor .aioseo-editor-line-numbers .ql-editor{padding:15px 15px 15px 45px}.aioseo-editor .aioseo-editor-single .ql-editor{padding:8px 10px}.aioseo-editor .aioseo-editor-single.aioseo-editor-line-numbers .ql-editor{padding:8px 10px 8px 45px}.aioseo-editor .aioseo-editor-monospace .ql-editor{font-family:monospace}.aioseo-editor .aioseo-line-numbers{background:#f7f6f7;position:absolute;text-align:right;top:1px;width:29px;left:1px;border-radius:3px 0 0 3px;padding:15px 9px 0 0;display:flex;height:calc(100% - 2px);flex-direction:column;overflow:hidden}.aioseo-editor .aioseo-line-numbers div{min-height:25px;color:#8c8f9a;font-size:12px;line-height:1.9}.aioseo-editor .ql-disabled{pointer-events:none;background-color:#f9f9fa}.aioseo-editor .ql-editor{padding:15px;border-radius:3px;font-size:16px;color:#141b38;border:1px solid #d0d1d7}.aioseo-editor .ql-editor:focus{border:1px solid #005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-editor .ql-editor .mention .ql-mention-denotation-char{display:none}.aioseo-editor .ql-editor .mention .aioseo-tag{height:25px;margin:0 1px;color:#434960;font-weight:600;font-size:14px;padding:3px 25px 3px 10px;background-color:#f3f4f5;border-radius:3px;cursor:pointer;position:relative;display:inline-flex;align-items:center}.aioseo-editor .ql-editor .mention .aioseo-tag .tag-toggle{display:inline-flex;align-items:center;background-color:#e8e8eb;position:absolute;top:0;right:0;bottom:0;border-radius:0 3px 3px 0}.aioseo-editor .ql-editor .mention .aioseo-tag .tag-toggle svg.aioseo-caret{width:18px;height:18px;transition:transform .3s}.aioseo-editor .ql-editor .mention .aioseo-tag .tag-toggle svg.aioseo-caret.rotated{transform:rotate(180deg)}.aioseo-editor .ql-mention-list-container{color:#141b38;background-color:#fff;max-width:250px;width:100%;margin-top:3px;border:1px solid #d0d1d7;border-radius:3px;box-shadow:0 3px 15px rgba(0,0,0,.1);z-index:9001}.aioseo-editor .ql-mention-list-container .aioseo-tag-custom,.aioseo-editor .ql-mention-list-container .aioseo-tag-search{padding:12px;border-bottom:1px solid #e8e8eb}.aioseo-editor .ql-mention-list-container .aioseo-tag-custom{display:none}.aioseo-editor .ql-mention-list-container .ql-mention-list{list-style:none;margin:0;padding:0;max-height:210px;overflow:auto}.aioseo-editor .ql-mention-list-container .ql-mention-list li{color:#141b38;margin:0;background-color:transparent;border-bottom:1px solid #e8e8eb;padding:15px;cursor:pointer;font-size:14px}.aioseo-editor .ql-mention-list-container .ql-mention-list li:last-child{border-bottom:0}.aioseo-editor .ql-mention-list-container .ql-mention-list li.selected,.aioseo-editor .ql-mention-list-container .ql-mention-list li:hover{color:#005ae0;background-color:#f2f7fd}.aioseo-editor .ql-mention-list-container .ql-mention-list li.selected .aioseo-tag-description,.aioseo-editor .ql-mention-list-container .ql-mention-list li:hover .aioseo-tag-description{color:initial}.aioseo-editor .ql-mention-list-container .ql-mention-list li .aioseo-tag-item{display:flex}.aioseo-editor .ql-mention-list-container .ql-mention-list li .aioseo-tag-item>div:first-child{margin-right:10px}.aioseo-editor .ql-mention-list-container .ql-mention-list li .aioseo-tag-item .aioseo-tag-title{font-weight:600}.aioseo-editor .ql-mention-list-container .ql-mention-list li svg.aioseo-plus{width:10px;height:10px;color:#005ae0}.aioseo-editor .ql-mention-list-container .ql-mention-list li.aioseo-tag-no-match{cursor:default;padding:12px;font-size:16px;font-weight:600}.aioseo-editor .ql-mention-list-container .ql-mention-list li.aioseo-tag-no-match.highlight,.aioseo-editor .ql-mention-list-container .ql-mention-list li.aioseo-tag-no-match:hover{color:initial;background-color:transparent}.aioseo-editor .ql-toolbar{display:none}.aioseo-editor .ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.aioseo-editor .ql-snow .ql-hidden{display:none}.aioseo-editor .ql-container.ql-snow{border:none}.aioseo-editor .ql-container p{font-size:16px;margin:0;line-height:25px}.aioseo-highlight-toggle{border:1px solid #e8e8eb;border-radius:3px;min-height:48px;display:flex;align-items:center;padding:5px 10px;cursor:pointer}.aioseo-highlight-toggle>*{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.aioseo-highlight-toggle.active{border-color:#005ae0;box-shadow:0 5px 10px rgba(0,90,224,.1)}.aioseo-highlight-toggle.medium{min-height:40px}.aioseo-highlight-toggle .icon{display:flex;align-items:center;margin-right:5px}.aioseo-input[data-v-3f0a80a7]{position:relative;width:100%}.aioseo-input.file[data-v-3f0a80a7],.aioseo-input.file input[type=file][data-v-3f0a80a7]{position:absolute;top:0;right:0;left:0;bottom:0;margin:0;padding:0}.aioseo-input.file input[type=file][data-v-3f0a80a7]{cursor:pointer;opacity:0}.aioseo-input.file input[type=file][data-v-3f0a80a7]::-webkit-file-upload-button{visibility:hidden}.aioseo-input.file input[type=file][data-v-3f0a80a7]:focus{box-shadow:none}.aioseo-input input[data-v-3f0a80a7]{height:48px;width:100%;background-color:#fff;border:1px solid #d0d1d7;border-radius:3px;padding:15px;font-size:18px;position:relative;overflow:hidden;margin:0}.aioseo-input input[data-v-3f0a80a7]:disabled{background:#f9f9fa}.aioseo-input input[data-v-3f0a80a7]:focus{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-input input[data-v-3f0a80a7]::-moz-placeholder{color:#8c8f9a}.aioseo-input input[data-v-3f0a80a7]:-ms-input-placeholder{color:#8c8f9a}.aioseo-input input[data-v-3f0a80a7]::placeholder{color:#8c8f9a}.aioseo-input input.prepend[data-v-3f0a80a7]{padding-left:50px}.aioseo-input input.append[data-v-3f0a80a7]{padding-right:50px}.aioseo-input input.small[data-v-3f0a80a7]{height:30px;padding:10px;font-size:14px}.aioseo-input input.small.prepend[data-v-3f0a80a7]{padding-left:30px}.aioseo-input input.small.append[data-v-3f0a80a7]{padding-right:30px}.aioseo-input input.medium[data-v-3f0a80a7]{height:40px;padding:12px;font-size:16px}.aioseo-input input.medium.prepend[data-v-3f0a80a7]{padding-left:35px}.aioseo-input input.medium.append[data-v-3f0a80a7]{padding-right:35px}.aioseo-input.aioseo-active input[data-v-3f0a80a7]{border-color:#00aa63}.aioseo-input.aioseo-active input[data-v-3f0a80a7]:active,.aioseo-input.aioseo-active input[data-v-3f0a80a7]:focus{box-shadow:0 0 0 1px #00aa63}.aioseo-input.aioseo-active .append-icon[data-v-3f0a80a7],.aioseo-input.aioseo-active .prepend-icon[data-v-3f0a80a7]{color:#00aa63}.aioseo-input.aioseo-error input[data-v-3f0a80a7]{border-color:#df2a4a}.aioseo-input.aioseo-error input[data-v-3f0a80a7]:active,.aioseo-input.aioseo-error input[data-v-3f0a80a7]:focus{box-shadow:0 0 0 1px #df2a4a}.aioseo-input.aioseo-error .append-icon[data-v-3f0a80a7],.aioseo-input.aioseo-error .prepend-icon[data-v-3f0a80a7]{color:#df2a4a}.aioseo-input.aioseo-warning input[data-v-3f0a80a7]{border-color:#f18200}.aioseo-input.aioseo-warning input[data-v-3f0a80a7]:active,.aioseo-input.aioseo-warning input[data-v-3f0a80a7]:focus{box-shadow:0 0 0 1px #f18200}.aioseo-input.aioseo-warning .append-icon[data-v-3f0a80a7],.aioseo-input.aioseo-warning .prepend-icon[data-v-3f0a80a7]{color:#f18200}.aioseo-input .prepend-icon[data-v-3f0a80a7]{position:absolute;top:0;left:10px;width:30px;height:100%;color:#d0d1d7;display:flex;align-items:center;z-index:1}.aioseo-input .prepend-icon svg[data-v-3f0a80a7]{width:30px;height:30px}.aioseo-input .prepend-icon.small[data-v-3f0a80a7]{width:20px}.aioseo-input .prepend-icon.small svg[data-v-3f0a80a7]{width:10px;height:10px}.aioseo-input .prepend-icon.medium[data-v-3f0a80a7]{width:15px}.aioseo-input .prepend-icon.medium svg[data-v-3f0a80a7]{width:15px;height:15px}.aioseo-input .append-icon[data-v-3f0a80a7]{position:absolute;top:0;right:10px;width:30px;height:100%;color:#d0d1d7;display:flex;align-items:center;z-index:1}.aioseo-input .append-icon svg[data-v-3f0a80a7]{width:30px;height:30px}.aioseo-input .append-icon.small[data-v-3f0a80a7]{width:10px}.aioseo-input .append-icon.medium[data-v-3f0a80a7]{width:15px}.aioseo-input .append-icon.clickable[data-v-3f0a80a7]{cursor:pointer;padding:0 5px;background:#f3f4f5;border:1px solid #d0d1d7;color:#434960;right:0;width:30px;border-radius:0 3px 3px 0}.aioseo-input .append-icon.clickable.small[data-v-3f0a80a7]{width:15px}.aioseo-input .append-icon.clickable.medium[data-v-3f0a80a7]{padding:0 10px;width:40px}.aioseo-phone-number{max-width:600px}.aioseo-phone-number label{display:none}.aioseo-phone-number .maz-input__input{height:40px;min-height:40px;padding-top:0!important;border:1px solid #d0d1d7}.aioseo-phone-number .maz-input__input:focus{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-phone-number .country-selector{flex:0 0 140px;width:140px;min-width:140px;max-width:140px}.aioseo-phone-number .country-selector:hover{z-index:1}.aioseo-phone-number .country-selector>div.maz-base-component.maz-input.has-value.has-1-right-icon.maz-input--primary>input{padding-left:50px!important}.aioseo-phone-number .country-selector .maz-input.is-focused{border-color:#005ae0}.aioseo-phone-number .country-selector .maz-select__options-list__item.selected.keyboard-selected{background-color:#005ae0}.aioseo-phone-number .maz-phone-number-input__country-flag{left:20px;bottom:12px;z-index:auto}.aioseo-phone-number .maz-input__icon{z-index:auto}.aioseo-phone-number .maz-select__options-list input{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-phone-number .maz-input__input{border-radius:3px}.aioseo-phone-number.invalidNumber div.maz-flex-1>div>input{border-color:red}.aioseo-phone-number.invalidNumber div.maz-flex-1>div>input:focus{border-color:#df2a4a;box-shadow:0 0 0 1px #df2a4a}.aioseo-phone-number.validNumber div.maz-flex-1>div>input:focus{border-color:#00aa63;box-shadow:0 0 0 1px #00aa63}.aioseo-radio{display:inline-flex;align-items:center}.aioseo-radio .form-radio-wrapper{margin-right:10px;display:flex}.aioseo-radio.medium .form-radio{width:20px;height:20px}.aioseo-radio.medium .form-radio .fancy-radio svg{width:12px;height:12px}.aioseo-radio.medium.type-1 .form-radio span:before{height:18px;width:18px;line-height:20px}.aioseo-radio.medium.type-2 .form-radio span:before{height:16px;width:16px;line-height:20px}.aioseo-radio.medium.type-2 .form-radio span:after{height:6px;width:6px;left:6px;bottom:6px}.aioseo-radio .form-radio{position:relative;display:inline-block;width:28px;height:28px;color:#fff;vertical-align:bottom;text-align:center}.aioseo-radio .form-radio input{opacity:0}.aioseo-radio .form-radio input:checked+.fancy-radio{background:#005ae0;border-color:#005ae0}.aioseo-radio .form-radio input:checked+.fancy-radio:before{background:transparent}.aioseo-radio .form-radio input:checked+.fancy-radio:after{display:block}.aioseo-radio .form-radio input:disabled+.fancy-radio{cursor:default}.aioseo-radio .form-radio input:focus+.fancy-radio{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-radio .form-radio .fancy-radio{border-radius:50%}.aioseo-radio .form-radio .fancy-radio svg{color:#fff;width:16px;height:16px}.aioseo-radio .form-radio span{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;transition:.2s;border-radius:50%;display:flex;align-items:center;justify-content:center}.aioseo-radio .form-radio span:before{position:absolute;content:"";height:26px;width:26px;left:1px;bottom:1px;transition:.2s;font-size:18px;line-height:28px;border-radius:50%}.aioseo-radio.type-1 .form-radio span,.aioseo-radio.type-1 .form-radio span:before{background-color:#f3f4f5}.aioseo-radio.type-2 .form-radio span{border:1px solid #d0d1d7;background-color:#fff}.aioseo-radio.type-2 .form-radio span:before{background-color:#fff}.aioseo-radio.type-2 .form-radio span:after{display:none;position:absolute;content:"";height:10px;width:10px;left:8px;bottom:8px;background-color:#fff;transition:.2s;border-radius:50%}.aioseo-radio.disabled{cursor:default}.aioseo-radio.disabled.type-2 .form-radio input:checked+.fancy-radio{background-color:#e8e8eb;border-color:#d0d1d7}.aioseo-radio.disabled.type-2 .form-radio span,.aioseo-radio.disabled.type-2 .form-radio span:before{background-color:#e8e8eb}.aioseo-radio.disabled.type-2 .form-radio span:after{background-color:#8c8f9a}.aioseo-radio-toggle{display:flex;align-items:center;height:40px}.aioseo-radio-toggle div{height:100%}.aioseo-radio-toggle.inline{display:inline-flex}.aioseo-radio-toggle div:first-child{overflow:hidden;border-radius:3px 0 0 3px}.aioseo-radio-toggle div:first-child label{border-radius:3px 0 0 3px}.aioseo-radio-toggle div:last-child{overflow:hidden;border-radius:0 3px 3px 0}.aioseo-radio-toggle div:last-child label{border-radius:0 3px 3px 0}.aioseo-radio-toggle input{position:absolute!important;clip:rect(0,0,0,0);height:1px;width:1px;border:0;overflow:hidden}.aioseo-radio-toggle input:checked+label{background-color:#005ae0;color:#fff}.aioseo-radio-toggle input:checked+label.dark{background-color:#434960;color:#fff}.aioseo-radio-toggle label{height:100%;background-color:#e8e8eb;color:#141b38;font-size:14px;line-height:1;display:flex;align-items:center;justify-content:center;flex-direction:column;transition:all .1s ease-in-out;position:relative;padding:11px 20px;font-weight:600}.aioseo-radio-toggle label.disabled{cursor:default;pointer-events:none;opacity:.5}.aioseo-radio-toggle label:hover{background-color:#dadadf;cursor:pointer}.aioseo-radio-toggle label p{position:absolute;bottom:15px;margin:0}.aioseo-radio-toggle.circle label{background:#fff;color:#8c8f9a}.aioseo-radio-toggle.circle input+label{border-radius:50%;width:36px;height:36px;padding:8px}.aioseo-radio-toggle.circle input:checked+label{background:#e8e8eb;color:#2c324c}.aioseo-select{height:48px}.aioseo-select.multiselect--disabled .multiselect__select{background:none}.aioseo-select .multiselect__select{display:flex;align-items:center;justify-content:center;min-height:46px}.aioseo-select .multiselect__select:before{display:none}.aioseo-select .multiselect__select svg.aioseo-caret{color:#141b38;width:18px;height:18px;transition:transform .3s}.aioseo-select .multiselect__tags{height:100%;border:1px solid #d0d1d7;border-radius:3px;display:flex;justify-content:center;flex-direction:column;padding:16px 40px 16px 16px}.aioseo-select .multiselect__tags .multiselect__spinner{height:calc(100% - 2px);border:2px solid transparent}.aioseo-select .multiselect__tags .multiselect__spinner:after,.aioseo-select .multiselect__tags .multiselect__spinner:before{border-top-color:#434960}.aioseo-select .multiselect__tags .multiselect__single{display:inline-flex;margin:0;padding:0;color:#141b38;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.aioseo-select .multiselect__tags .multiselect__placeholder{color:#8c8f9a;font-size:16px;line-height:20px;margin:0;padding:0}.aioseo-select .multiselect__tags .multiselect__input{padding:0;margin:0 10px 0 0;border-radius:0;border:none;color:#141b38;min-height:auto;line-height:20px}.aioseo-select .multiselect__tags .multiselect__input:focus{outline:0;box-shadow:none;border:none}.aioseo-select .multiselect__tags .multiselect__input::-moz-placeholder{color:#8c8f9a}.aioseo-select .multiselect__tags .multiselect__input:-ms-input-placeholder{color:#8c8f9a}.aioseo-select .multiselect__tags .multiselect__input::placeholder{color:#8c8f9a}.aioseo-select .multiselect__tags .multiselect__tags-wrap{display:flex;align-items:center;flex-wrap:wrap}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag{padding:0;display:inline-flex;align-items:center;font-size:14px;font-weight:600;color:#434960;margin:0 3px 0 0;height:24px;background-color:#f3f4f5;flex-shrink:0}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-value{padding:0 5px 0 10px}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove{padding:0 10px;height:100%;cursor:pointer;background-color:#f3f4f5;display:flex;align-items:center}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove:hover{background-color:#434960;color:#fff}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove:hover svg.aioseo-close{color:#fff}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove svg.aioseo-close{color:#434960;width:10px;height:10px}.aioseo-select.multiselect--active .multiselect__tags-wrap{margin-bottom:7px}.aioseo-select.small{height:30px;min-height:30px}.aioseo-select.small .multiselect__tags{min-height:30px;padding:8px 38px 8px 8px}.aioseo-select.small .multiselect__tags .multiselect__placeholder{font-size:14px}.aioseo-select.small .multiselect__select{height:28px;min-height:28px}.aioseo-select.small .multiselect__input{font-size:14px}.aioseo-select.small .multiselect__content-wrapper li.multiselect__element .multiselect__option{font-size:14px;padding:8px;min-height:30px}.aioseo-select.medium{height:40px}.aioseo-select.medium .multiselect__tags{padding:7px 40px 7px 7px}.aioseo-select.medium .multiselect__select{min-height:38px}.aioseo-select.multiple{min-height:48px;height:auto}.aioseo-select.multiple.small{min-height:30px}.aioseo-select.multiple.medium{min-height:40px}.aioseo-select.multiselect--above .multiselect__content-wrapper{border-top:1px solid #d0d1d7;border-bottom:none}.aioseo-select .multiselect__content-wrapper{border:1px solid #d0d1d7;border-top:none;border-bottom-left-radius:3px;border-bottom-right-radius:3px;z-index:50;-webkit-overflow-scrolling:touch}.aioseo-select .multiselect__content-wrapper .multiselect__content{max-width:100%}.aioseo-select .multiselect__content-wrapper li.multiselect__element{margin:0;border-bottom:1px solid #e8e8eb}.aioseo-select .multiselect__content-wrapper li.multiselect__element.last{border-bottom:none}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option{color:#141b38;font-weight:700;font-size:16px;white-space:normal;line-height:1.4}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--highlight{background-color:#f2f7fd}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--highlight:after{background-color:#005ae0;color:#fff}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--selected{background-color:#f2f7fd}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--disabled{font-weight:400;background-color:#fff!important;color:#8c8f9a}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option .docLink{font-size:13px;float:right}.aioseo-textarea-autosize{width:100%;background-color:#fff;border:1px solid #d0d1d7;border-radius:4px;font-size:16px;padding:12px}.aioseo-toggle{display:inline-flex}.aioseo-toggle:active,.aioseo-toggle:focus{outline:2px solid transparent}.aioseo-toggle.disabled{pointer-events:none}.aioseo-toggle.disabled .toggle-content{opacity:.5}.aioseo-toggle .toggle-content{position:relative;display:inline-block;width:36px;height:20px;margin-right:10px}.aioseo-toggle .toggle-content input{display:none}.aioseo-toggle .toggle-content input:checked+.toggle-switch{border:1px solid #005ae0;background-color:#005ae0}.aioseo-toggle .toggle-content input:checked+.toggle-switch:focus{outline:2px solid transparent}.aioseo-toggle .toggle-content input:checked+.toggle-switch:before{background-color:#fff;transform:translateX(15px)}.aioseo-toggle .toggle-content input:focus+.toggle-switch{box-shadow:0 0 1px #005ae0;outline:2px solid transparent}.aioseo-toggle .toggle-content .toggle-switch{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#fff;border:1px solid #d0d1d7;border-radius:15px;transition:.2s}.aioseo-toggle .toggle-content .toggle-switch:before{position:absolute;content:"";height:14px;width:14px;left:3px;bottom:2px;background-color:#d0d1d7;border-radius:50%;transition:.2s}.aioseo-wp-table input[type=search],.aioseo-wp-table select{border-color:#d0d1d7}.aioseo-wp-table select:focus{border-color:#005ae0;color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-wp-table select:hover{color:#005ae0}.aioseo-wp-table input.button,.aioseo-wp-table input.button:hover{color:#005ae0;border-color:#005ae0}.aioseo-wp-table .header .subsubsub{color:#555d66;font-size:13px;font-weight:600}.aioseo-wp-table .header .subsubsub>span{display:inline-flex}.aioseo-wp-table .header .subsubsub .separator{margin:0 5px}.aioseo-wp-table .header .subsubsub .active{font-weight:700;color:#141b38}.aioseo-wp-table .header .subsubsub a{text-decoration:none}.aioseo-wp-table .header .subsubsub a:hover{text-decoration:underline}.aioseo-wp-table .header .search{display:flex;justify-content:flex-end}.aioseo-wp-table .header .search .aioseo-input{width:100%;max-width:215px;margin-right:6px}.aioseo-wp-table .header .pagination{color:#555d66}.aioseo-wp-table .header .pagination .button,.aioseo-wp-table .header .pagination input{margin-left:6px}.aioseo-wp-table .tablenav-pages .current-page{padding:0 0 0 8px}.aioseo-wp-table .wp-table{width:100%;position:relative}.aioseo-wp-table .wp-table .loader-overlay{position:absolute;top:46px;right:0;bottom:36px;left:0;background:rgba(0,0,0,.3);z-index:1;display:flex;align-items:center;justify-content:center}.aioseo-wp-table .wp-table .no-results{color:#8c8f9a;min-height:200px;display:flex;align-items:center;justify-content:center;font-weight:400;font-size:24px}.aioseo-wp-table .wp-table tr.even{background-color:#f9f9fa}.aioseo-wp-table .wp-table tr.enabled td,.aioseo-wp-table .wp-table tr.enabled td strong a{color:#141b38}.aioseo-wp-table .wp-table tr:not(.enabled):not(.edit-row) td,.aioseo-wp-table .wp-table tr:not(.enabled):not(.edit-row) td a.edit-link{color:#8c8f9a}.aioseo-wp-table .wp-table tr.edit-row th{padding:0 0 0 3px}.aioseo-wp-table .wp-table tr.edit-row td{padding:0 30px 0 10px}.aioseo-wp-table .wp-table tr td strong a{font-weight:400}.aioseo-wp-table .wp-table tr td .row-actions .edit a,.aioseo-wp-table .wp-table tr td strong a:hover{color:#005ae0}.aioseo-wp-table .wp-table tr td .row-actions .edit .trash a{color:#df2a4a}.aioseo-wp-table .wp-table tr td.edit-row-content .wrapper .border{margin-top:7px;padding:19px 0 20px;border-top:1px solid #e8e8eb}.custom-rules[data-v-191c51fe]{width:100%;margin-top:14px}.custom-rules .rule .rule-settings[data-v-191c51fe]{display:flex;flex-direction:row;align-items:center;flex:1}.custom-rules .rule .rule-settings>.aioseo-select[data-v-191c51fe]:first-child{width:100%;max-width:250px}.custom-rules .rule .rule-settings>[data-v-191c51fe]{margin:0 16px 0 0}.custom-rules .rule .rule-settings>[data-v-191c51fe]:last-child{margin-right:0}.custom-rules .rule .rule-settings>.aioseo-toggle[data-v-191c51fe]{margin:0 10px 0 4px}.custom-rules .rule .actions[data-v-191c51fe],.custom-rules .rule .logical[data-v-191c51fe]{flex:0}.custom-rules svg[data-v-191c51fe]{width:14px;height:14px;cursor:pointer}.custom-rules svg.aioseo-trash[data-v-191c51fe]{color:#dadada}.custom-rules svg.aioseo-trash[data-v-191c51fe]:hover{color:#df2a4a}.custom-rules .aioseo-tooltip[data-v-191c51fe]{margin:0;display:flex}.custom-rules .aioseo-button svg[data-v-191c51fe]{color:#fff;margin-right:6px}.aioseo-add-redirection.edit-url{margin-bottom:30px}.aioseo-add-redirection.edit-url .urls{align-items:flex-start}.aioseo-add-redirection.edit-url .urls .url-arrow{margin:-8px 30px 0}.aioseo-add-redirection.edit-url .advanced-settings-link{margin-top:21px}.aioseo-add-redirection .advanced-settings-link{text-decoration:underline!important}.aioseo-add-redirection.log-404 .urls .source{min-height:103px;align-items:flex-start}.aioseo-add-redirection .generic-error{margin-bottom:20px}.aioseo-add-redirection .aioseo-settings-row .settings-name .name{font-size:14px}.aioseo-add-redirection .urls{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap}.aioseo-add-redirection .urls .break{flex-basis:100%;height:0}.aioseo-add-redirection .urls .url-arrow{width:36px;margin:-15px 30px 0;display:flex;align-items:center;justify-content:center}@media (min-width:1200px){.aioseo-add-redirection .urls .url-arrow{margin:-15px 50px 0}}.aioseo-add-redirection .urls .url-arrow svg{height:103px;color:#005ae0}.aioseo-add-redirection .urls .source,.aioseo-add-redirection .urls .target{flex:1;display:flex;align-items:center}.aioseo-add-redirection .urls .source>*,.aioseo-add-redirection .urls .target>*{flex:1}.aioseo-add-redirection .urls .source .aioseo-input,.aioseo-add-redirection .urls .target .aioseo-input{margin-bottom:12px}.aioseo-add-redirection .urls .target input{padding-right:30px}.aioseo-add-redirection .urls .target .append-icon{width:30px;justify-content:flex-end}.aioseo-add-redirection .urls .target .append-icon svg{max-width:16px;margin-right:5px}.aioseo-add-redirection .urls .target .append-icon svg:last-of-type{margin-right:0}.aioseo-add-redirection .urls .target .append-icon svg.aioseo-circle-check{color:#00aa63}.aioseo-add-redirection .urls .target .append-icon svg.aioseo-circle-close{color:#df2a4a}.aioseo-add-redirection .urls .target .aioseo-description{height:30px}.aioseo-add-redirection .urls .target .target-url-error,.aioseo-add-redirection .urls .target .target-url-warning{margin-bottom:10px}.aioseo-add-redirection .settings{display:flex;flex-direction:column;align-items:center;margin-top:24px}.aioseo-add-redirection .settings .all-settings{width:100%}.aioseo-add-redirection .settings .all-settings .all-settings-content{display:flex;align-items:center;flex-wrap:wrap}.aioseo-add-redirection .settings .all-settings .all-settings-content .advanced-settings-link{margin:16px 0 0 16px;color:#8c8f9a}@media (max-width:767px){.aioseo-add-redirection .settings .all-settings .all-settings-content{align-items:start}}.aioseo-add-redirection .settings>.actions{align-self:flex-end;margin-top:-50px}.aioseo-add-redirection .settings>.actions.advanced{margin-top:24px}.aioseo-add-redirection .settings .query-params,.aioseo-add-redirection .settings .redirect-type{margin-bottom:10px;flex:0 1 auto}.aioseo-add-redirection .settings .query-params .aioseo-select,.aioseo-add-redirection .settings .redirect-type .aioseo-select{margin-top:5px}.aioseo-add-redirection .settings .query-params{width:340px}.aioseo-add-redirection .settings .redirect-type{width:300px;margin-right:24px}.aioseo-add-redirection .settings .aioseo-button{align-self:flex-end}.aioseo-add-redirection .settings .cancel-edit-row{margin-left:10px}@media (min-width:1200px){.aioseo-add-redirection .settings .cancel-edit-row{margin-left:16px}}.aioseo-add-redirection-target-url,.aioseo-redirect-source-url{position:relative}.aioseo-redirect-source-url .aioseo-input input{padding-right:76px!important}.aioseo-redirect-source-url .aioseo-input .append-icon{width:60px;justify-content:flex-end}.aioseo-redirect-source-url .aioseo-input .append-icon svg{max-width:16px;margin-right:5px}.aioseo-redirect-source-url .aioseo-input .append-icon svg:last-of-type{margin-right:0}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-gear{color:#8c8f9a;cursor:pointer}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-gear.active,.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-gear:hover{color:#005ae0}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-circle-check{color:#00aa63}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-circle-close{color:#df2a4a}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-trash{color:#8c8f9a;cursor:pointer}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-trash.active,.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-trash:hover{color:#df2a4a}.aioseo-redirect-source-url .source-url-error,.aioseo-redirect-source-url .source-url-warning{margin-bottom:10px}.aioseo-redirect-source-url .source-url-options>div{padding-bottom:5px}.aioseo-redirect-source-url .source-url-options>div>div{margin-bottom:5px}.aioseo-add-redirection-url-results{display:flex;position:absolute;background:#fff;width:100%;max-height:300px;overflow:auto;border:1px solid #d0d1d7;border-radius:3px;z-index:50;left:1px;margin-top:-9px}.aioseo-add-redirection-url-results ul{display:inline-block;max-width:100%;list-style:none;padding:0;margin:0;min-width:100%;vertical-align:top}.aioseo-add-redirection-url-results ul li{margin:0;border-bottom:1px solid #e8e8eb;display:block}.aioseo-add-redirection-url-results ul li:last-of-type{border-bottom:none}.aioseo-add-redirection-url-results ul li>span{color:#141b38;font-weight:700;font-size:16px;white-space:normal;line-height:1.4;display:flex;padding:12px;min-height:40px;text-decoration:none;text-transform:none;vertical-align:middle;position:relative;cursor:pointer}.aioseo-add-redirection-url-results ul li>span:hover{background-color:#f2f7fd}.aioseo-add-redirection-url-results ul li>span:hover .option-title{color:#005ae0}.aioseo-add-redirection-url-results .option{flex:1}.aioseo-add-redirection-url-results .option .option-title{font-weight:500;display:flex;font-size:16px;color:#141b38}.aioseo-add-redirection-url-results .option .option-title>div{margin-right:5px}.aioseo-add-redirection-url-results .option .option-title>div:first-of-type{display:inline-block}.aioseo-add-redirection-url-results .option .option-title .search-term{font-weight:700}.aioseo-add-redirection-url-results .option .option-details{display:flex;align-items:center;font-size:14px;color:#8c8f9a}.aioseo-add-redirection-url-results .option .option-details span{margin-right:15px}.aioseo-add-redirection-url-results .option-permalink{display:flex;align-items:center}.aioseo-add-redirection-url-results .option-permalink svg.aioseo-external{width:15px;height:15px;color:#434960}.aioseo-add-template-tag{border-radius:3px;padding:5px 10px;color:#141b38;font-size:14px;border:1px solid #e8e8eb;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-weight:600}.aioseo-add-template-tag:hover{background-color:#f3f4f5}.aioseo-add-template-tag svg.aioseo-plus{width:10px;height:10px;color:#005ae0}.aioseo-additional-pages .additional-pages-table{border:1px solid #d0d1d7;border-radius:3px;margin-bottom:20px}.aioseo-additional-pages .additional-pages-table .page-priority{max-width:110px}.aioseo-additional-pages .additional-pages-table .page-frequency{max-width:166px}.aioseo-additional-pages .additional-pages-table .page-last-modified{max-width:155px}.aioseo-additional-pages .additional-pages-table .page-actions{max-width:20px}.aioseo-additional-pages .additional-pages-table .page-actions .aioseo-tooltip{display:inline-block;margin:0}.aioseo-additional-pages .additional-pages-table .pages-header{height:50px;display:flex;font-size:14px;padding:0 30px;align-items:center;border-bottom:1px solid #d0d1d7}.aioseo-additional-pages .additional-pages-table .pages-header>div{flex:1 0 auto}.aioseo-additional-pages .additional-pages-table .pages-rows{font-size:14px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row{background-color:#fff;height:70px;display:flex;align-items:center;padding:0 30px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row:last-of-type{border-radius:0 0 3px 3px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row.even{background-color:#f9f9fa}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row>div{flex:1 0 auto;padding-right:30px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row>div:last-child{padding-right:0}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row .page-actions svg.aioseo-trash{width:20px;height:20px;color:#8c8f9a;cursor:pointer;transition:color .1s ease}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row .page-actions svg.aioseo-trash:hover{color:#df2a4a}.aioseo-additional-pages svg.aioseo-circle-plus{width:14px;height:14px;margin-right:10px}.aioseo-alert{position:relative;border-radius:3px;padding:24px;font-size:16px;color:#141b38;line-height:1.4}.aioseo-alert.small{padding:8px;font-size:13px}.aioseo-alert .aioseo-alert-close{cursor:pointer;position:absolute;top:-9px;right:-9px;width:18px;height:18px;border-radius:50%;padding:5px;display:inline-flex;justify-content:center;align-content:center}.aioseo-alert .aioseo-alert-close svg{width:100%;height:100%}.aioseo-alert.blue{border:1px solid #005ae0;background-color:#f2f7fd}.aioseo-alert.blue .aioseo-alert-close{background-color:#005ae0;color:#fff}.aioseo-alert.green{border:1px solid #00aa63;background-color:#f2fdf8}.aioseo-alert.green .aioseo-alert-close{background-color:#00aa63;color:#fff}.aioseo-alert.red{border:1px solid #df2a4a;background-color:#fbe9ec}.aioseo-alert.red .aioseo-alert-close{background-color:#df2a4a;color:#fff}.aioseo-alert.yellow{border:1px solid #f18200;background-color:#fcfae8}.aioseo-alert.yellow .aioseo-alert-close{background-color:#f18200;color:#fff}.aioseo-alert.no-border{border-width:0}.aioseo-alert.text-center{text-align:center}.aioseo-analyze-competitor-site-score{border:1px solid #00aa63;border-radius:3px;color:#00aa63;font-size:14px;padding:0 8px;height:24px;display:inline-flex;align-items:center;justify-content:center;margin-right:14px}.aioseo-analyze-competitor-site-score.red{color:#df2a4a;border-color:#df2a4a}.aioseo-analyze-competitor-site-score.orange{color:#f18200;border-color:#f18200}.aioseo-animated-dannie{display:flex;align-content:center;align-items:center;justify-content:center}.aioseo-animated-dannie svg{max-width:250px}.aioseo-api-bar{height:40px;background-color:#df2a4a;color:#fff;font-size:13px;padding:0 14px 0 40px}.aioseo-api-bar,.aioseo-api-bar .upgrade-text{display:flex;align-items:center;justify-content:center}.aioseo-api-bar .upgrade-text{flex:1}.aioseo-api-bar strong{font-weight:600}.aioseo-api-bar svg.aioseo-logo-gear{width:20px;height:20px;min-width:20px;margin-right:14px}.aioseo-api-bar svg.aioseo-close{cursor:pointer;width:12px;height:12px}.aioseo-api-bar a{color:#fff;text-decoration:underline}.aioseo-api-bar a:hover{text-decoration:none}@media screen and (max-width:782px){.aioseo-api-bar{padding:0 10px;height:60px}}.aioseo-attributes ul.aioseo-attributes-list[data-v-02af7dd2]{list-style:inside;list-style-type:disc;margin:20px 0 0}.aioseo-attributes ul.aioseo-attributes-list li[data-v-02af7dd2]{display:flex;margin-bottom:8px;align-items:flex-start}.aioseo-attributes ul.aioseo-attributes-list li div[data-v-02af7dd2]:first-of-type{flex:0 0 140px}.aioseo-blur{filter:blur(3px);pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.aioseo-card{color:#141b38;background-color:#fff;border:1px solid #e8e8eb;box-shadow:0 2px 5px rgba(0,0,0,.05);margin:30px 0}.aioseo-card.disabled .content{background:#f9f9fa;font-size:16px;line-height:24px}@media only screen and (max-width:782px){.aioseo-card{margin:20px 0}}.aioseo-card svg.aioseo-circle-question-mark{width:17px;height:17px;color:#8c8f99;transition:background-color .2s ease}.aioseo-card svg.aioseo-circle-question-mark:hover{color:#5a5c65}.aioseo-card .header{display:flex;align-items:center;height:70px;padding:0 30px;font-weight:600;font-size:18px;border-bottom:1px solid #e8e8eb}.aioseo-card .header .header-icon{display:flex}.aioseo-card .header .header-icon svg{width:24px;height:24px;margin-right:16px}.aioseo-card .header .text{flex:1 0 auto;display:flex;align-items:center}.aioseo-card .header .text svg.aioseo-circle-question-mark{cursor:pointer;width:17px;height:17px}.aioseo-card .header .text .aioseo-pro-badge{margin-left:10px}.aioseo-card .header .text .card-score{display:flex;flex:1;align-items:center;justify-content:flex-end;padding-right:18px;font-size:13px}.aioseo-card .header .text .card-score.green{color:#00aa63}.aioseo-card .header .text .card-score.orange{color:#f18200}.aioseo-card .header .text .card-score.red{color:#df2a4a}.aioseo-card .header .text .card-score svg{margin-right:7px}.aioseo-card .header svg.aioseo-caret{width:24px;height:24px;cursor:pointer;transform:rotate(-180deg);transition:transform .3s}.aioseo-card .header svg.aioseo-caret.rotated{transform:rotate(-90deg)}.aioseo-card .header svg.aioseo-close{width:14px;height:14px;cursor:pointer}.aioseo-card .content{padding:30px;position:relative}.aioseo-card div.aioseo-settings-row:last-child{margin-bottom:0;border-bottom:none;padding-bottom:0}.aioseo-copy-block{display:inline-flex}.aioseo-copy-block .message{background-color:#fff;min-height:56px;display:flex;align-items:center;border:1px solid #dcdde1;border-radius:3px 0 0 3px;padding:10px 24px;font-weight:600}.aioseo-copy-block .copy-tooltip{display:flex}.aioseo-copy-block .copy{background-color:#fff;min-height:56px;display:flex;align-items:center;border:1px solid #dcdde1;border-left-width:0;border-radius:0 3px 3px 0;padding:10px 16px;font-weight:600;cursor:pointer}.aioseo-copy-block .copy:hover svg.aioseo-copy{color:#a7a7a7}.aioseo-copy-block .copy svg.aioseo-copy{width:20px;height:20px;color:#dadada}.aioseo-copy-block .copy svg.aioseo-circle-check-solid{width:20px;height:20px;color:#00aa63}.aioseo-display-info .aioseo-box-toggle svg{margin-top:-15px;color:#434960}.aioseo-display-info svg.aioseo-new-page,.aioseo-display-info svg.aioseo-shortcode,.aioseo-display-info svg.aioseo-widget{width:100%;height:auto;max-width:60px}.aioseo-display-info svg.aioseo-gutenberg-block{width:59px;height:54px}.aioseo-display-info svg.aioseo-gutenberg-block rect{width:100%;width:56px;height:51px}.aioseo-display-info svg.aioseo-php{width:110px}.aioseo-display-info .copy-box,.aioseo-display-info .extra-box{margin-top:10px;padding:30px;border-radius:3px;background-color:#f9f9fa}.aioseo-display-info .copy-box .aioseo-description,.aioseo-display-info .extra-box .aioseo-description{margin:0}.aioseo-display-info .copy-box .aioseo-copy-block,.aioseo-display-info .extra-box .aioseo-copy-block{margin:20px 0 0}.aioseo-display-info .copy-box .advanced-settings-link,.aioseo-display-info .extra-box .advanced-settings-link{display:inline-block;padding-top:5px;margin:16px 0 0 16px;color:#8c8f9a;text-decoration:underline;font-size:13px}.aioseo-display-info .copy-box .advanced-settings-link:hover,.aioseo-display-info .extra-box .advanced-settings-link:hover{text-decoration:none}.aioseo-display-info .copy-box .advanced-settings,.aioseo-display-info .extra-box .advanced-settings{padding-top:20px}.aioseo-display-info .advanced-settings.advanced-settings-hidden{display:none}.aioseo-display-info .aioseo-tooltip{margin-left:0}.aioseo-exclude-posts{display:flex}.aioseo-facebook-preview{background-color:#f0f2f5;padding:30px;display:flex;align-items:center;justify-content:center}.aioseo-facebook-preview .facebook-post{width:100%;max-width:525px;border-radius:10px;box-shadow:0 2px 5px rgba(0,0,0,.1);background-color:#fff}.aioseo-facebook-preview .facebook-post .facebook-header{height:65px;padding:0 18px;display:flex;align-items:center}.aioseo-facebook-preview .facebook-post .facebook-header .profile-photo{overflow:hidden;width:40px;height:40px;border:1px solid #e8e8eb;border-radius:50%}.aioseo-facebook-preview .facebook-post .facebook-header .profile-photo img{height:100%;width:100%}.aioseo-facebook-preview .facebook-post .facebook-header .poster{margin-left:10px;flex:1 0 auto}.aioseo-facebook-preview .facebook-post .facebook-header .poster .poster-name{font-size:15px;color:#050505;font-weight:500}.aioseo-facebook-preview .facebook-post .facebook-header .poster .poster-date{color:#65676b;font-size:13px}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis{display:inline-flex;align-items:center}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis div{background-color:#5e666f;width:4px;height:4px;border-radius:50%;margin:0 2px}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis div:first-child{margin-left:0}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis div:last-child{margin-right:0}.aioseo-facebook-preview .facebook-post .facebook-content{display:flex;flex-direction:column}.aioseo-facebook-preview .facebook-post .facebook-content img{width:100%;height:auto}.aioseo-facebook-preview .facebook-post .facebook-content.vertical{flex-direction:row}.aioseo-facebook-preview .facebook-post .facebook-content.vertical img{max-width:158px;max-height:158px;width:auto;height:auto}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description{flex:1;background-color:#f2f3f5;padding:9px 13px;color:#606770}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description .site-domain{font-size:13px;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description .site-title{color:#1d2129;font-size:17px;font-weight:600;margin:5px 0}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description .site-description{font-size:14px}.aioseo-facebook-preview .facebook-post .facebook-footer{height:24px}.aioseo-feature-card{height:100%;border:1px solid #e8e8eb;background:#fff;box-shadow:0 2px 5px rgba(0,0,0,.05);color:#141b38;display:flex;flex-direction:column}.aioseo-feature-card .feature-card-body{padding:30px 30px 20px;flex:1}.aioseo-feature-card .feature-card-body.static{padding:30px}.aioseo-feature-card .feature-card-body .feature-card-header{display:flex;align-items:center;font-size:18px;font-weight:600;margin-bottom:16px}.aioseo-feature-card .feature-card-body .feature-card-header img,.aioseo-feature-card .feature-card-body .feature-card-header svg{width:28px;height:28px;margin-right:10px}.aioseo-feature-card .feature-card-body .feature-card-description{color:#434960;font-size:15px}.aioseo-feature-card .feature-card-body .feature-card-description .learn-more{margin-top:10px}.aioseo-feature-card .feature-card-footer{padding:15px}.aioseo-feature-card .feature-card-footer:not(.upgrade-required){border:2px solid #fff;background-color:#f9f9fa;padding:12px;min-height:43px}.aioseo-feature-card .feature-card-footer .feature-card-install-activate{display:flex;align-items:center;justify-content:flex-end;height:30px;position:relative}.aioseo-feature-card .feature-card-footer .feature-card-install-activate .aioseo-loading-spinner{position:absolute;left:0}.aioseo-feature-card .feature-card-footer .feature-card-install-activate .status{font-weight:600;font-size:14px}.aioseo-feature-card .feature-card-footer .feature-card-install-activate .aioseo-toggle .toggle-content{margin-right:0;margin-left:10px}.aioseo-feature-card .feature-card-footer .feature-card-upgrade-cta{display:flex;align-items:center;justify-content:flex-end}.aioseo-feature-card .feature-card-footer.installed .feature-card-install-activate .status{color:#8c8f9a}.aioseo-setup-wizard-container{margin-top:30px;margin-bottom:50px;padding:30px;color:#fff;position:relative;background-color:#005ae0}@media only screen and (max-width:782px){.aioseo-setup-wizard-container{margin-top:20px}}.aioseo-setup-wizard-container p{color:#fff}.aioseo-setup-wizard-container .getting-started-wrapper{display:flex}.aioseo-setup-wizard-container .getting-started-wrapper .video{flex:0 0 533px;margin:20px 20px 0}.aioseo-setup-wizard-container .getting-started-wrapper .video .wrapper{padding-bottom:56.25%;margin-bottom:-60px;position:relative;height:0}.aioseo-setup-wizard-container .getting-started-wrapper .video .wrapper iframe{width:100%;height:100%;position:absolute;top:0;left:0}@media only screen and (max-width:1350px){.aioseo-setup-wizard-container .getting-started-wrapper .video{flex:0 0 593px;margin:20px;align-self:center}.aioseo-setup-wizard-container .getting-started-wrapper .video .wrapper{margin-bottom:0}.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions .aioseo-col{flex-basis:100%;max-width:100%;justify-content:center}}@media only screen and (max-width:1300px){.aioseo-setup-wizard-container .getting-started-wrapper{flex-direction:row;flex-wrap:wrap}.aioseo-setup-wizard-container .getting-started-wrapper .video{margin:20px 0 -60px}.aioseo-setup-wizard-container .getting-started-wrapper .text,.aioseo-setup-wizard-container .getting-started-wrapper .video{flex-basis:100%;width:100%}.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions{justify-content:center}.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions .aioseo-col{flex-basis:inherit;max-width:inherit;justify-content:center}}@media only screen and (max-width:782px){.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions .aioseo-col{flex-basis:100%;max-width:100%;justify-content:center}}.aioseo-setup-wizard-container .aioseo-row{position:relative;z-index:1}.aioseo-setup-wizard-container .wizard-actions .aioseo-col{display:flex;align-items:center}.aioseo-setup-wizard-container .wizard-actions .aioseo-button svg{width:16px;height:16px;margin-right:10px}.aioseo-setup-wizard-container .setup-wizard-bg{width:100%;height:100%;overflow:hidden;z-index:0;position:absolute;top:0;left:0}.aioseo-setup-wizard-container .setup-wizard-bg svg.aioseo-setup-wizard-bg,.aioseo-setup-wizard-container .setup-wizard-bg svg.aioseo-setup-wizard-bg rect{width:auto;height:100%}.aioseo-setup-wizard-container .close-wizard{color:#fff;width:20px;height:20px;position:absolute;right:20px;top:20px;z-index:1;display:flex;align-items:center;justify-content:center}.aioseo-setup-wizard-container .close-wizard:hover{color:#ccc}.aioseo-setup-wizard-container .close-wizard svg.aioseo-close{width:12px;height:12px;cursor:pointer;color:#fff}.aioseo-setup-wizard-container .close-wizard svg.aioseo-close:hover{color:#dadada}.aioseo-setup-wizard-container p.how-to-get-started{margin:0}.aioseo-setup-wizard-container p.welcome-text{line-height:1.6}.aioseo-setup-wizard-container h2{color:#fff;line-height:1.4}.aioseo-setup-wizard-container a{color:#fff}.aioseo-setup-wizard-container svg.aioseo-book{width:20px;height:20px;margin:0 10px 0 0}.aioseo-setup-wizard-container .getting-started-video{padding-right:20px;margin-bottom:-60px;position:relative;height:0;padding-bottom:56.25%}.aioseo-setup-wizard-container .getting-started-video iframe{width:100%;height:100%;position:absolute;top:0;left:0}.aioseo-google-search-preview{padding:32px 30px;border:1px solid #e8e8eb}.aioseo-google-search-preview .domain{font-size:14px;line-height:1.3;color:#3c4043;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.aioseo-google-search-preview .site-title{font-size:20px;line-height:1.3;color:#1a0dab;margin:3px 0}.aioseo-google-search-preview .meta-description{max-width:600px;font-size:14px;line-height:1.4;color:#52565a}.edit-post-sidebar .domain,.editor-post-publish-panel .domain{font-size:13px}.edit-post-sidebar .site-title,.editor-post-publish-panel .site-title{font-size:16px}.edit-post-sidebar .meta-description,.editor-post-publish-panel .meta-description{font-size:12px}.aioseo-modal-content .domain,.aioseo-modal-content .meta-description{font-size:14px}.aioseo-modal-content .site-title{font-size:20px}html:not([data-scroll="0"]) .aioseo-header{box-shadow:0 2px 5px rgba(0,0,0,.05);transition:box-shadow .6s}.aioseo-header{position:fixed;z-index:1051;top:0;right:0;left:0;background-color:#fff;height:72px;color:#141b38}.aioseo-header .mascot{width:35px;height:auto;margin-right:10px}.aioseo-header .aioseo-header-content{padding:0;display:flex;height:72px;align-items:center}.aioseo-header .aioseo-header-content a:focus{box-shadow:none}.aioseo-header .aioseo-header-content svg.aioseo-logo{height:26px;margin-right:10px}.aioseo-header .aioseo-header-content .spacer{display:inline-flex;width:26.25px;height:0;border:1px solid #d0d1d7;transform:rotate(-72.26deg)}.aioseo-header .aioseo-header-content .page-name{display:inline-flex;margin-left:10px;font-size:18px;font-weight:400;flex:1 0 auto}.aioseo-header .aioseo-header-content .header-actions{display:flex}.aioseo-header .aioseo-header-content .header-actions .round{position:relative;background-color:#f3f4f5;border-radius:50%;width:40px;height:40px;display:flex;align-items:center;justify-content:center;margin-left:10px;cursor:pointer;transition:background-color .2s ease}.aioseo-header .aioseo-header-content .header-actions .round svg{width:20px;height:20px}.aioseo-header .aioseo-header-content .header-actions .round:hover{background-color:#e5e7e9}.aioseo-header .aioseo-header-content .header-actions .number{position:absolute;background-color:#df2a4a;width:16px;height:16px;font-weight:600;font-size:10px;color:#fff;top:-8px;left:50%;transform:translateX(-50%);margin:0;-webkit-animation:bounce 2s 5;animation:bounce 2s 5}.aioseo-header .aioseo-header-content .header-actions .number:hover{background-color:#df2a4a}@-webkit-keyframes bounce{0%,25%,50%,75%,to{transform:translateX(-50%) translateY(0)}40%{transform:translateX(-50%) translateY(-8px)}60%{transform:translateX(-50%) translateY(-4px)}}@keyframes bounce{0%,25%,50%,75%,to{transform:translateX(-50%) translateY(0)}40%{transform:translateX(-50%) translateY(-8px)}60%{transform:translateX(-50%) translateY(-4px)}}body.modal-open{overflow:hidden}.aioseo-help{display:block;position:fixed;top:0;bottom:0;left:0;right:0;height:100%;width:100vw;background-color:#fff;color:#8c8f9a;opacity:0;max-height:100vh;overflow-y:auto;transition:opacity .3s ease-in 0s;z-index:-999}.aioseo-help.visible{opacity:1;z-index:100000}.aioseo-help .aioseo-help-header{background:#fff;width:100%;height:60px;z-index:1;padding:20px;display:flex}.aioseo-help .aioseo-help-header>.logo{flex:1}.aioseo-help .aioseo-help-docs{margin-bottom:25px;display:none}.aioseo-help .aioseo-help-docs li{padding:0 0 14px 4px;margin:0}.aioseo-help .aioseo-help-docs .aioseo-help-docs-viewall{margin:10px 0 0}.aioseo-help .aioseo-help-docs .aioseo-help-additional-docs{display:none}.aioseo-help .aioseo-help-docs .aioseo-help-additional-docs.opened{display:block}.aioseo-help .aioseo-help-docs .icon .aioseo-description{width:20px;margin-top:0;position:relative;top:5px;left:-5px;color:#8c8f9a}.aioseo-help .help-content{background-color:#fff;width:100%;max-width:740px;margin:0 auto 50px;padding:0 20px;box-sizing:border-box;z-index:1}.aioseo-help .help-content .aioseo-help-category{border-top:1px solid #e8e8eb;margin:0}.aioseo-help .help-content .aioseo-help-category:last-child{border-bottom:1px solid #e8e8eb}.aioseo-help .help-content .aioseo-help-category header{display:block;position:relative;cursor:pointer;width:100%;height:68px}.aioseo-help .help-content .aioseo-help-category header .title{display:block;font-size:16px;color:#8c8f9a;font-weight:600;padding:23px 11px 23px 30px}.aioseo-help .help-content .aioseo-help-category .folder-open{position:absolute;top:24px;width:20px;height:20px;color:#8c8f9a}.aioseo-help .help-content .aioseo-help-category .dashicons-arrow-right-alt2{position:absolute;top:20px;right:0;transition:transform .3s ease-out}.aioseo-help .help-content .aioseo-help-category.opened .aioseo-help-docs{display:block}.aioseo-help .help-content .aioseo-help-category.opened .dashicons-arrow-right-alt2{transform:rotate(90deg)}.aioseo-help .help-content #aioseo-help-search{position:relative;background-color:#fff;text-align:center;top:0;padding:20px 0 50px}.aioseo-help .help-content #aioseo-help-result .aioseo-help-docs{display:block}.aioseo-help .help-content #aioseo-help-footer{display:flex;flex-wrap:nowrap;justify-content:space-between;align-items:center;margin:50px 0 0}@media screen and (max-width:750px){.aioseo-help .help-content #aioseo-help-footer{display:block}}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block{box-sizing:border-box;max-width:325px;border:1px solid #8c8f9a;border-radius:6px;text-align:center}@media screen and (max-width:750px){.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block{max-width:100%}}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block:first-child{margin-right:20px}@media screen and (max-width:750px){.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block:first-child{margin:0 0 20px}}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a{display:block;padding:25px;text-decoration:none;color:#8c8f9a}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a h3{color:#8c8f9a}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a span{font-size:16px;color:#005ae0;text-decoration:underline}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a:hover span{text-decoration:none}.aioseo-help .help-content #aioseo-help-footer .aioseo-description,.aioseo-help .help-content #aioseo-help-footer .aioseo-support{width:48px;margin-top:0;color:#8c8f9a}#aioseo-help-logo{width:132px;height:26px;z-index:2}#aioseo-help-close{width:20px;height:20px;cursor:pointer;opacity:.7;transition:all .05s;z-index:2}@media screen and (max-width:750px){#aioseo-help-close{top:20px;right:20px}}.aioseo-html-tags-editor .no-access{margin-bottom:20px}.aioseo-html-tags-editor .aioseo-description.tags-description{margin:0 0 20px}.aioseo-html-tags-editor .add-tags{display:flex;align-items:center;margin-bottom:20px}.aioseo-html-tags-editor .add-tags div{margin-right:10px}.aioseo-html-tags-editor .add-tags a{font-size:14px}.aioseo-html-tags-editor .add-tags a.no-underline{padding-left:10px}.aioseo-loading-spinner{width:35px;height:35px;position:absolute}.aioseo-loading-spinner .double-bounce1,.aioseo-loading-spinner .double-bounce2{width:100%;height:100%;border-radius:50%;background-color:#fff;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:sk-bounce 1.3s ease-in-out infinite;animation:sk-bounce 1.3s ease-in-out infinite}.aioseo-loading-spinner.dark .double-bounce1,.aioseo-loading-spinner.dark .double-bounce2{background-color:#8c8f9a}.aioseo-loading-spinner .double-bounce2{-webkit-animation-delay:-.65s;animation-delay:-.65s}@-webkit-keyframes sk-bounce{0%,to{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,to{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}body.vue-build{margin:0}body.vue-build .aioseo-app{min-height:calc(100vh - 88px)}body.vue-build .aioseo-app .aioseo-main{padding-bottom:30px}body.aioseo-setup-wizard{margin:0;padding:0}body.aioseo-setup-wizard .aioseo-app{min-height:100vh;width:100%}body[class*=page_aioseo] .aioseo-header,body[class*=page_aioseo] .aioseo-notifications .overlay{left:160px}body[class*=page_aioseo].folded .aioseo-header,body[class*=page_aioseo].folded .aioseo-notifications .overlay{left:36px}body[class*=page_aioseo] #wpcontent{padding:0;background-color:#f3f4f5}body[class*=page_aioseo] .update-nag{display:none}body[class*=page_aioseo].admin-bar .aioseo-app{min-height:calc(100vh - 185px)}body[class*=page_aioseo].admin-bar.aioseo-has-bar .aioseo-app{min-height:calc(100vh - 225px)}body[class*=page_aioseo].admin-bar .aioseo-header,body[class*=page_aioseo].admin-bar .aioseo-notifications .notification-menu,body[class*=page_aioseo].admin-bar .aioseo-notifications .overlay{top:32px}body[class*=page_aioseo] .aioseo-app{min-height:calc(100vh - 153px)}body[class*=page_aioseo].aioseo-has-bar .aioseo-app{min-height:calc(100vh - 193px)}body[class*=page_aioseo].aioseo-has-bar .aioseo-header{height:112px}@media screen and (max-width:782px){body[class*=page_aioseo].aioseo-has-bar .aioseo-header{height:132px}}@media screen and (max-width:960px){body[class*=page_aioseo].auto-fold .aioseo-header,body[class*=page_aioseo].auto-fold .aioseo-notifications .overlay{left:36px}}@media screen and (max-width:782px){body[class*=page_aioseo] #wpbody-content{padding-bottom:20px}body[class*=page_aioseo].admin-bar .aioseo-app{min-height:calc(100vh - 199px)}body[class*=page_aioseo].admin-bar .aioseo-header,body[class*=page_aioseo].admin-bar .aioseo-notifications .notification-menu,body[class*=page_aioseo].admin-bar .aioseo-notifications .overlay{top:46px}body[class*=page_aioseo] .aioseo-header,body[class*=page_aioseo] .aioseo-notifications .overlay,body[class*=page_aioseo].auto-fold .aioseo-header,body[class*=page_aioseo].auto-fold .aioseo-notifications .overlay{left:0}}@media screen and (max-width:600px){body[class*=page_aioseo].admin-bar .aioseo-header,body[class*=page_aioseo].admin-bar .aioseo-notifications .menu,body[class*=page_aioseo].admin-bar .aioseo-notifications .overlay{position:absolute;top:46px}}body.aioseo-has-bar .aioseo-app .aioseo-main>.aioseo-container{margin-top:128px}@media screen and (max-width:782px){body.aioseo-has-bar .aioseo-app .aioseo-main>.aioseo-container{margin-top:148px}}.aioseo-app{box-sizing:border-box;background-color:#f3f4f5}.aioseo-app .route-fade-enter-active,.aioseo-app .route-fade-leave-active{transition:all .2s}.aioseo-app .route-fade-enter,.aioseo-app .route-fade-leave-active{opacity:0}.aioseo-app .route-fade-enter{transform:translateX(30px)}.aioseo-app .route-fade-leave-active{transform:translateX(-30px)}.aioseo-app *,.aioseo-app :after,.aioseo-app :before{box-sizing:inherit}.aioseo-app * :not(.aioseo-button):not(.aioseo-input),.aioseo-app :after :not(.aioseo-button):not(.aioseo-input),.aioseo-app :before :not(.aioseo-button):not(.aioseo-input){line-height:1.4}.aioseo-app p{font-size:16px}.aioseo-app a:not(.aioseo-button){color:#005ae0}.aioseo-app a:not(.aioseo-button).text-white{color:#fff}.aioseo-app a:not(.aioseo-button).no-underline,.aioseo-app a:not(.aioseo-button):hover{text-decoration:none}.aioseo-app h2{font-size:32px;margin:0}.aioseo-app .aioseo-main{height:100%}.aioseo-app .aioseo-main>.aioseo-container{margin-top:88px}.aioseo-app .aioseo-main .save-changes{display:flex;justify-content:flex-end}.aioseo-app .d-flex{display:flex}.aioseo-app .aioseo-section-description{font-size:16px;color:#141b38;line-height:1.8;padding-bottom:30px}.aioseo-app .aioseo-description-text{font-size:14px;line-height:1.8;color:#141b38}.aioseo-app .aioseo-description-text.aioseo-error{color:#df2a4a}.aioseo-app .aioseo-description{font-size:14px;line-height:1.8;margin:8px 0 0;color:#141b38}.aioseo-app .aioseo-description.no-margin{margin:0}.aioseo-app .aioseo-description.aioseo-error{color:#df2a4a}.aioseo-app .max-recommended-count{color:#434960;text-align:right;margin-top:10px;font-size:14px}.aioseo-app .max-recommended-count strong.error{color:#df2a4a}.aioseo-app .popper{text-align:left;font-size:12px;padding:20px;background-color:#fff;border:none;border-radius:3px;box-shadow:0 3px 4.8px 0 rgba(32,71,102,.27);z-index:9999;max-width:350px;line-height:1.4}.aioseo-app .popper.action{padding:8px 12px;background-color:#141b38;color:#fff}.aioseo-app .popper.action .popper__arrow{border-top-color:#141b38}.aioseo-app .popper[x-placement^=bottom]{box-shadow:0 -2px 4.8px 0 rgba(32,71,102,.27)}.aioseo-app .popper .aioseo-description{margin:0}.aioseo-app .aioseo-row-highlight{-webkit-animation-name:color;animation-name:color;-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-iteration-count:2;animation-iteration-count:2}@-webkit-keyframes color{0%{background-color:#fff}50%{background-color:#00aa63}to{background-color:#fff}}@keyframes color{0%{background-color:#fff}50%{background-color:#00aa63}to{background-color:#fff}}.column-aioseo-details{position:relative}.aioseo-seo-site-score .aioseo-blur{display:flex;align-items:center}.aioseo-seo-site-score .aioseo-seo-site-score-cta{position:absolute;left:50%;top:50%;transform:translateX(-50%) translateY(-50%);background-color:#fff;padding:24px 30px;border:1px solid #e8e8eb;box-shadow:0 2px 10px rgba(0,90,224,.2);color:#141b38;font-size:16px;font-weight:600;width:82%;max-width:500px;text-align:center}.aioseo-app .aioseo-upgrade-bar{height:40px;background-color:#00aa63;display:flex;align-items:center;justify-content:center;color:#fff;font-size:13px;padding:0 14px 0 40px}.aioseo-app .aioseo-upgrade-bar .upgrade-text{display:flex;align-items:center;flex:1;justify-content:center}.aioseo-app .aioseo-upgrade-bar .upgrade-arrow{font-size:15px;text-decoration:none}.aioseo-app .aioseo-upgrade-bar .upgrade-arrow:hover{text-decoration:none}.aioseo-app .aioseo-upgrade-bar strong{font-weight:600}.aioseo-app .aioseo-upgrade-bar svg.aioseo-logo-gear{width:20px;height:20px;min-width:20px;margin-right:14px}.aioseo-app .aioseo-upgrade-bar svg.aioseo-close{cursor:pointer;width:12px;height:12px}.aioseo-app .aioseo-upgrade-bar a{color:#fff;text-decoration:underline}.aioseo-app .aioseo-upgrade-bar a:hover{text-decoration:none}@media screen and (max-width:782px){.aioseo-app .aioseo-upgrade-bar{padding:0 10px;height:60px}}.field-description[data-v-2bfc1de2]{display:inline-block;margin-top:10px;font-size:14px}.aioseo-address-wrapper[data-v-4bc9bbe6]{display:flex;max-width:500px}.field-description[data-v-4bc9bbe6]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-4bc9bbe6]{margin-top:8px}.field-description[data-v-a0a894b8]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-a0a894b8]{margin-top:8px}.field-description[data-v-4fb4e044]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-4fb4e044]{margin-top:8px}.field-description[data-v-85733554]{display:inline-block;margin-top:10px;font-size:14px}.field-description[data-v-515336a2]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-515336a2]{margin-top:8px}.field-description[data-v-78337de7]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-78337de7]{margin-top:8px}.aioseo-general-settings .more-tooltip-text strong{color:#00aa63}.aioseo-general-settings .license-cta-box{border-radius:3px;background-color:#f2f7fd;padding:20px;max-width:630px;margin:10px 0 30px}.aioseo-general-settings .license-cta-box a{color:#00aa63}.aioseo-general-settings .license-cta-box div{font-weight:600}.aioseo-general-settings .license-cta-box span{font-size:14px;font-style:italic}.aioseo-general-settings .license-key{margin-top:10px;display:flex;max-width:560px}.aioseo-general-settings .license-key .aioseo-input{margin-right:10px}.aioseo-app .aioseo-tabs.internal{margin-bottom:0}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation{margin-top:5px}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation .md-button{height:60px}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple{padding:0 25px}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple .md-ripple-wave{display:none}.aioseo-app .aioseo-tabs.skinny .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple{padding:0 16px}.aioseo-app .md-tabs{display:flex;flex-direction:column}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation{margin-top:2px;background:transparent;display:flex;position:relative;justify-content:flex-start}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation.md-elevation-0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button{color:#141b38;max-width:264px;min-width:72px;height:60px;margin:0;border-radius:0;font-size:15px;font-weight:500;padding:0;display:inline-block;position:relative;overflow:hidden;outline:none;background:transparent;border:0;transition:.4s cubic-bezier(.4,0,.2,1);font-family:inherit;line-height:normal;text-decoration:none;vertical-align:top;white-space:nowrap}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:before{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;transition:.4s cubic-bezier(.4,0,.2,1);will-change:background-color,opacity;content:" "}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple{padding:0 18px;display:flex;justify-content:center;align-items:center;width:100%;height:100%;position:relative;overflow:hidden;-webkit-mask-image:radial-gradient(circle,#fff 100%,#000 0);mask-image:radial-gradient(circle,#fff 100%,#000 0)}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple .md-button-content{position:static;z-index:2}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:not([disabled]){cursor:pointer}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:not([disabled]):active:before,.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:not([disabled]):hover:before{background-color:currentColor;opacity:.12}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button.md-active{color:#005ae0}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button.md-active:focus{outline:none;box-shadow:none}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-tabs-indicator{height:2px;background-color:#005ae0;bottom:-2px;position:absolute;left:0;transform:translateZ(0);will-change:left,right}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-tabs-indicator.md-tabs-indicator-left{transition:left .3s cubic-bezier(.4,0,.2,1),right .35s cubic-bezier(.4,0,.2,1)}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-tabs-indicator.md-tabs-indicator-right{transition:right .3s cubic-bezier(.4,0,.2,1),left .35s cubic-bezier(.4,0,.2,.1)}.aioseo-app .aioseo-tabs{display:flex;border-bottom:2px solid #e8e8eb;position:relative;margin-bottom:38px}.aioseo-app .aioseo-tabs .save-changes{position:absolute;right:0;bottom:10px}.aioseo-app .aioseo-tabs .tab-score{display:inline-flex;align-items:center;justify-content:flex-end;font-size:11px;font-weight:700;padding-left:12px}.aioseo-app .aioseo-tabs .tab-score.green{color:#00aa63}.aioseo-app .aioseo-tabs .tab-score.orange{color:#f18200}.aioseo-app .aioseo-tabs .tab-score.red{color:#df2a4a}.aioseo-app .aioseo-tabs .tab-score svg{display:inline;margin-right:7px}.aioseo-app .aioseo-mobile-tabs{position:relative;height:40px;margin-top:20px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.aioseo-app .aioseo-mobile-tabs .active-tab{color:#005ae0;padding-left:18px;min-height:100%;display:flex;align-items:center;cursor:pointer}.aioseo-app .aioseo-mobile-tabs .active-tab div{position:relative}.aioseo-app .aioseo-mobile-tabs .active-tab div span{height:2px;background-color:#005ae0;bottom:-7px;position:absolute;left:-18px;right:-18px;z-index:10}.aioseo-app .aioseo-mobile-tabs .active-tab svg.aioseo-caret{width:24px;height:24px;position:relative;top:6px;cursor:pointer;transition:transform .3s}.aioseo-app .aioseo-mobile-tabs .active-tab svg.aioseo-caret.rotated{transform:rotate(180deg)}.aioseo-app .aioseo-mobile-tabs .tab-dropdown{border:1px solid #e8e8eb;border-top:none}.aioseo-app .aioseo-mobile-tabs .tab-links{background:#fff;position:relative;z-index:3;padding:8px;width:100%;max-width:300px}@media screen and (max-width:782px){.aioseo-app .aioseo-mobile-tabs .tab-links{max-width:100%}}.aioseo-app .aioseo-mobile-tabs .tab-links a{padding:10px;display:block;color:#141b38;text-decoration:none}.aioseo-app .aioseo-mobile-tabs .tab-links a:hover{color:#005ae0}.md-tooltip{background-color:#141b38!important;color:#fff!important;border-radius:2px;padding:6px 12px;font-size:14px}.md-tooltip:after{content:"";position:absolute;top:100%;left:50%;margin-left:-5px;border:5px solid transparent;border-top-color:#141b38}.modal-mask{position:fixed;z-index:9998;top:0;left:0;width:100%;height:100%;background-color:rgba(20,27,56,.3);display:table;transition:opacity .3s ease}@media screen and (max-width:520px){.modal-mask{display:block;top:46px}}.modal-mask .modal-wrapper{display:table-cell;vertical-align:middle}@media screen and (max-width:520px){.modal-mask .modal-wrapper{display:block;height:100%}}.modal-mask .modal-wrapper .modal-container{width:100%;max-width:750px;max-height:90vh;overflow-y:hidden;overflow-x:hidden;margin:0 auto;background-color:#fff;box-shadow:0 10px 30px rgba(0,0,0,.15);transition:all .3s ease}@media screen and (max-width:520px){.modal-mask .modal-wrapper .modal-container{width:100%;max-width:100%;max-height:calc(100vh - 46px);height:100%}}.modal-mask .modal-wrapper .modal-container .modal-header{color:#141b38;position:sticky;top:0;z-index:15;padding:0 0 0 40px;height:70px;font-size:20px;font-weight:700;line-height:1.4;border-bottom:1px solid #e8e8eb;background-color:#fff;display:flex;align-items:center}@media screen and (max-width:520px){.modal-mask .modal-wrapper .modal-container .modal-header{padding:15px 0 0 20px}}.modal-mask .modal-wrapper .modal-container .modal-header button.close{position:absolute;right:11px;top:11px;width:24px;height:24px;background-color:#fff;border:none;display:flex;align-items:center}.modal-mask .modal-wrapper .modal-container .modal-header button.close svg.aioseo-close{cursor:pointer;width:14px;height:14px}.modal-mask .modal-wrapper .modal-container .modal-body .aioseo-post-general,.modal-mask .modal-wrapper .modal-container .modal-body .aioseo-post-social{height:calc(90vh - 120px);max-height:600px;overflow-y:auto;overflow-x:hidden}.modal-mask .modal-wrapper .modal-container .modal-body .aioseo-modal-content.has-padding{padding:40px}@media screen and (max-width:520px){.modal-mask .modal-wrapper .modal-container .aioseo-modal-content,.modal-mask .modal-wrapper .modal-container .aioseo-modal-content>.component-wrapper,.modal-mask .modal-wrapper .modal-container .modal-body,.modal-mask .modal-wrapper .modal-container .modal-body>div{height:100%}.modal-mask .modal-wrapper .modal-container .aioseo-modal-content>.component-wrapper{display:flex;align-items:flex-end}.modal-mask .modal-wrapper .modal-container .aioseo-post-general,.modal-mask .modal-wrapper .modal-container .aioseo-post-social{height:100%!important;max-height:100%!important;padding:20px!important}.modal-mask .modal-wrapper .modal-container .aioseo-post-general .mobile-radio-buttons,.modal-mask .modal-wrapper .modal-container .aioseo-post-social .mobile-radio-buttons{margin-bottom:0}.modal-mask .modal-wrapper .modal-container .aioseo-add-template-tag{display:none}.modal-mask .modal-wrapper .modal-container .tab-facebook .aioseo-settings-row:last-of-type,.modal-mask .modal-wrapper .modal-container .tab-twitter .aioseo-settings-row:last-of-type{margin-bottom:64px!important;padding-bottom:32px!important}}.modal-enter,.modal-leave-active{opacity:0}.modal-enter .modal-container,.modal-leave-active .modal-container{transform:scale(1.1)}.aioseo-notification>div .body .title .date{font-weight:400;color:#8c8f9a;font-size:12px}.aioseo-notification-cards .aioseo-notification:last-child>div{border-bottom:none;margin-bottom:none}.aioseo-notification-cards .no-notifications{display:flex;align-items:center;flex-direction:column;padding-top:100px;font-size:16px;color:#8c8f9a}.aioseo-notification-cards .no-notifications img{width:30%;height:auto}.aioseo-notification-cards .no-notifications .great-scott{margin:20px 0 10px;font-size:24px;font-weight:600;color:#434960}.aioseo-notification-cards .no-notifications .no-new-notifications{margin-bottom:10px}body.aioseo-show-notifications .aioseo-main{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.aioseo-notifications a.dismiss{color:#8c8f9a;font-size:14px}.aioseo-notifications .notification-menu{height:100%;width:100%;max-width:570px;position:fixed;z-index:1053;top:0;right:0;bottom:0;background-color:#fff;overflow-x:hidden;transition:.5s}.aioseo-notifications .notification-menu .notification-header{height:70px;display:flex;align-items:center;padding:0 30px;color:#fff;background-color:#005ae0}.aioseo-notifications .notification-menu .notification-header .new-notifications{font-size:18px;font-weight:600}.aioseo-notifications .notification-menu .notification-header .dismissed-notifications{margin-left:25px;flex:1 1 auto}.aioseo-notifications .notification-menu .notification-header .dismissed-notifications a{font-size:14px;color:#fff}.aioseo-notifications .notification-menu .notification-header svg.aioseo-close{width:14px;height:14px;cursor:pointer}.aioseo-notifications .notification-menu .notification-header svg.aioseo-close:hover{color:#ccc}.aioseo-notifications .notification-menu .notification-cards{padding:30px;height:calc(100% - 192px);overflow:auto}.aioseo-notifications .notification-menu .notification-footer{height:90px;padding:30px;display:flex;align-items:center}.aioseo-notifications .notification-menu .notification-footer div.pagination{flex:1;display:flex;align-items:center}.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number{font-size:13px;color:#141b38;background:#e8e8eb;height:30px;width:30px;display:flex;align-items:center;justify-content:center;border-radius:2px;margin-right:4px;cursor:pointer}.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number:last-child{margin-right:0}.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number.active,.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number:hover{color:#fff;background-color:#005ae0}.aioseo-notifications .overlay{position:fixed;z-index:1052;top:0;right:0;bottom:0;left:160px;background-color:#141b38;opacity:.5;transition:.5s}.aioseo-notifications .notifications-fade-enter-active,.aioseo-notifications .notifications-fade-leave-active{transition:opacity .5s}.aioseo-notifications .notifications-fade-enter,.aioseo-notifications .notifications-fade-leave-to{opacity:0}.aioseo-notifications .notifications-slide-enter-active,.aioseo-notifications .notifications-slide-leave-active{transition:all .5s ease-in-out}.aioseo-notifications .notifications-slide-enter,.aioseo-notifications .notifications-slide-leave-to{right:-570px}.aioseo-post-type-options-toggle{margin-top:20px}.aioseo-priority-score{max-width:350px}.aioseo-priority-score .header-row{font-size:14px}.aioseo-pro-badge{height:24px;border-radius:3px;background:#e8e8eb;color:#434960;font-size:14px;font-weight:600;display:inline-flex;padding:0 8px;align-items:center}.aioseo-score-settings{display:flex;align-items:center;padding-bottom:14px}.aioseo-score-settings svg{margin-right:7px}.aioseo-score-settings span{margin-right:12px}.aioseo-score-button{display:inline-block;padding:5px 8px;font-size:14px;font-weight:700;color:#a1a1a1;border:1px solid #a1a1a1;border-radius:3px}.aioseo-score-button.score-none,.aioseo-score-button.score-red{border-color:#df2a4a;color:#df2a4a!important}.aioseo-score-button.score-orange{border-color:#f18200;color:#f18200!important}.aioseo-score-button.score-green{border-color:#00aa63;color:#00aa63!important}.aioseo-score-button.classic-editor{background:#fff!important;display:inline-block!important;height:auto!important}.aioseo-score-button.classic-editor span{margin-right:0}.aioseo-seo-site-analysis-result{border:1px solid #dcdde1;margin-top:10px}.aioseo-seo-site-analysis-result .result-header{height:66px;padding:0 20px;display:flex;align-items:center}.aioseo-seo-site-analysis-result .result-header .result-icon{display:flex;align-items:center;margin-right:16px}.aioseo-seo-site-analysis-result .result-header .result-icon svg{width:24px;height:24px;color:#8c8f9a}.aioseo-seo-site-analysis-result .result-header .result-icon svg.passed{color:#00aa63}.aioseo-seo-site-analysis-result .result-header .result-icon svg.error{color:#df2a4a}.aioseo-seo-site-analysis-result .result-header .result-icon svg.warning{color:#005ae0}.aioseo-seo-site-analysis-result .result-header .result-content{font-size:16px;font-weight:600;flex:1}.aioseo-seo-site-analysis-result .result-header .result-toggle{width:30px;height:26px;border:1px solid #dcdde1;border-radius:3px;display:flex;align-items:center;justify-content:center;cursor:pointer}.aioseo-seo-site-analysis-result .result-header .result-toggle.active,.aioseo-seo-site-analysis-result .result-header .result-toggle:hover{background-color:#434960}.aioseo-seo-site-analysis-result .result-header .result-toggle.active svg,.aioseo-seo-site-analysis-result .result-header .result-toggle:hover svg{color:#fff}.aioseo-seo-site-analysis-result .result-header .result-toggle.active svg{transform:rotate(-180deg)}.aioseo-seo-site-analysis-result .result-header .result-toggle svg{width:100%;max-width:20px;height:auto;color:#8c8f9a;transform:rotate(-90deg);transition:transform .3s}.aioseo-seo-site-analysis-result .result-body{padding:0 60px 24px}.aioseo-seo-site-analysis-result .result-body .result-message{color:#434960;font-size:16px}.aioseo-seo-site-analysis-result .result-body .result-code-alt pre,.aioseo-seo-site-analysis-result .result-body .result-code pre{background:#f3f4f5;border-radius:3px;max-width:100%;padding:10px;overflow:auto}.aioseo-seo-site-analysis-result .result-body .result-code-alt pre code,.aioseo-seo-site-analysis-result .result-body .result-code pre code{padding:0;background:transparent}.aioseo-seo-site-analysis-result .result-body .result-code pre{white-space:pre-wrap}.aioseo-seo-site-analysis-result .result-body .result-action{margin-top:20px}.aioseo-seo-site-analysis-results .group-header{font-size:16px;font-weight:600}.aioseo-seo-site-analysis-results .group-header:not(:first-child){margin-top:30px}.aioseo-seo-site-analysis-results .group-keywords{display:flex;margin-top:5px;flex-wrap:wrap;align-items:center}.aioseo-seo-site-analysis-results .group-keywords .keyword{font-size:14px;color:#434960;font-weight:600;background:#f3f4f5;padding:9px 10px;border-radius:3px;margin:0 10px 5px 0}.aioseo-seo-site-analysis-results .group-keywords .keyword:first-child{font-size:20px}.aioseo-settings-row{margin-bottom:22px;padding-bottom:16px;border-bottom:1px solid #e8e8eb}.aioseo-settings-row.no-margin{margin-bottom:0}.aioseo-settings-row.small-padding{padding-bottom:5px}.aioseo-settings-row.medium-margin{margin-bottom:15px}.aioseo-settings-row.no-border{border:none}.aioseo-settings-row.no-side-margin{margin-left:0!important;margin-right:0!important}.aioseo-settings-row .settings-name{color:#141b38}.aioseo-settings-row .settings-name .name{font-weight:600;font-size:16px;display:flex;align-items:center}.aioseo-settings-row .settings-name .name.small-margin{margin-bottom:5px}.aioseo-settings-row .settings-name .name.align{line-height:40px}.aioseo-settings-row .settings-name .name.align-small{line-height:30px}.aioseo-settings-row .settings-name .name .aioseo-pro-badge{margin-left:10px}.aioseo-settings-row .settings-name .aioseo-description{margin-top:20px}.aioseo-settings-row .settings-content{font-size:16px}.aioseo-settings-row p.description{font-size:14px}.aioseo-separators{margin-top:-.5rem}.aioseo-separators .aioseo-col .separator{background-color:#f3f4f5;display:flex;align-items:center;justify-content:center;min-height:51px;font-weight:600;font-size:25px;border:1px solid #dcdde1;border-radius:3px;cursor:pointer}.aioseo-separators .aioseo-col .separator:hover{background-color:#e5e7e9}.aioseo-separators .aioseo-col .separator.active{background-color:#005ae0;border-color:#005ae0;color:#fff}.aioseo-separators .aioseo-col .separator.active:hover{background-color:#005ae0}.aioseo-separators .aioseo-col .show-more{height:100%;display:flex;align-items:center}.aioseo-separators .aioseo-col .show-more a{color:#8c8f9a}.aioseo-separators .aioseo-col .custom-separator{margin:20px 0;display:flex;align-items:center}.aioseo-separators .aioseo-col .custom-separator .aioseo-input{margin-left:10px;max-width:100px}.aioseo-sidebar-card .header{height:46px}.aioseo-sidebar-card .header:hover{cursor:pointer}.aioseo-sidebar-card .content{padding-bottom:8px!important}.aioseo-sidebar-card ul{margin-bottom:0}.aioseo-sidebar-card ul li{margin-bottom:16px;padding-left:25px}.aioseo-sidebar-card ul .description{margin:0}.aioseo-robots-meta .global-robots-settings{margin:0;padding-top:24px}.aioseo-robots-meta .global-robots-settings>.settings{padding:8px 0 16px}.aioseo-robots-meta .global-robots-settings-options{display:flex}.aioseo-robots-meta .global-robots-settings-options .max-snippet{margin-right:30px}.aioseo-robots-meta .global-robots-settings-options .max-snippet .aioseo-input{max-width:90px}.aioseo-robots-meta .global-robots-settings-options .max-video-preview{margin-right:30px}.aioseo-robots-meta .global-robots-settings-options .max-video-preview .aioseo-input{max-width:90px}.aioseo-robots-meta .global-robots-settings-options .max-image-preview .aioseo-select{min-width:155px}.aioseo-robots-meta .global-robots-settings-options>span{display:inline-block;margin-bottom:4px}@media screen and (max-width:782px){.aioseo-robots-meta .global-robots-settings-options{display:block}.aioseo-robots-meta .global-robots-settings-options .max-snippet,.aioseo-robots-meta .global-robots-settings-options .max-video-preview{margin-right:0;margin-bottom:20px}.aioseo-robots-meta .global-robots-settings-options>div .aioseo-input,.aioseo-robots-meta .global-robots-settings-options>div .aioseo-select{min-width:100%}}.edit-post-sidebar .global-robots-settings{padding-top:12px}.edit-post-sidebar .global-robots-settings>.settings{padding:4px 0 12px}.edit-post-sidebar .global-robots-settings>.settings label{font-size:16px}.edit-post-sidebar .global-robots-settings .robots-meta-title{padding-top:4px;display:inline-block}.edit-post-sidebar .global-robots-settings-options{flex-wrap:wrap}.edit-post-sidebar .max-snippet{margin-right:30px!important}.edit-post-sidebar .max-video-preview{margin-right:0!important}.edit-post-sidebar .max-image-preview{margin-top:20px!important}.aioseo-score-amount-wrapper{position:absolute;left:0;top:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;flex-direction:column;color:#141b38;margin:20px}.aioseo-score-amount-wrapper .aioseo-score-amount .score{font-size:64px;font-weight:600}.aioseo-score-amount-wrapper .aioseo-score-amount .total{font-size:18px;color:#8c8f9a;padding-left:3px}.aioseo-score-amount-wrapper .score-description{max-width:80%;text-align:center;font-size:17px;font-weight:600;line-height:1.1}.aioseo-score-amount-wrapper .score-analyzing{margin-top:20px;font-size:30px}.aioseo-site-score-analyze{position:relative;display:flex;align-items:center;justify-content:center;flex:1}.aioseo-site-score-analyze .analyze-errors{text-align:center;margin-bottom:1em}.aioseo-site-score-analyze .aioseo-seo-site-score-score{position:relative;min-width:175px;max-width:217px;margin-right:5em}.aioseo-site-score-analyze .aioseo-seo-site-score-score svg{width:100%;height:auto}.aioseo-site-score-analyze .aioseo-seo-site-score-description h2{line-height:1.4}.aioseo-site-score-analyze .aioseo-seo-site-score-description svg.aioseo-book{width:20px;height:20px;margin:0 10px 0 0;color:#005ae0}.aioseo-site-score-analyze .aioseo-seo-site-score-description>div{font-size:16px;color:#141b38;margin-bottom:10px}.aioseo-site-score-analyze .aioseo-seo-site-score-description .links{margin-top:30px;font-size:14px;font-weight:600}.aioseo-site-score-analyze .aioseo-seo-site-score-description .links .no-underline{padding-left:5px}.aioseo-site-score-competitor{position:relative;display:flex;align-items:center;justify-content:center;flex-direction:column}.aioseo-site-score-competitor .aioseo-seo-site-score-score{position:relative;min-width:175px;max-width:217px;margin-right:1em}.aioseo-site-score-competitor .aioseo-seo-site-score-score svg{width:100%;height:auto}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations{margin:20px 0}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links){display:flex;align-items:center;font-size:14px;color:#141b38;font-weight:600;margin-bottom:10px}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round{position:relative;border-radius:50%;width:24px;min-width:24px;max-width:24px;height:24px;display:flex;align-items:center;justify-content:center;margin-right:10px;font-size:12px;color:#fff;font-weight:600}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.red{background-color:#df2a4a}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.blue{background-color:#005ae0}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.orange{background-color:#f18200}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.green{background-color:#00aa63}.aioseo-site-score-competitor .refresh-results .aioseo-refresh{width:14px;height:14px;margin-right:10px}.aioseo-site-score-competitor .mobile-snapshot{margin-top:60px;max-width:250px}.aioseo-site-score-competitor .mobile-snapshot div{font-weight:600;font-size:16px;margin-bottom:10px}.aioseo-site-score-competitor .mobile-snapshot img{width:100%;height:auto}.aioseo-site-score-dashboard{position:relative;display:flex;align-items:center;justify-content:center}.aioseo-site-score-dashboard .analyze-errors{text-align:center;margin-bottom:1em}.aioseo-site-score-dashboard .aioseo-seo-site-score-score{position:relative;min-width:175px;max-width:217px;margin-right:1em}.aioseo-site-score-dashboard .aioseo-seo-site-score-score svg{width:100%;height:auto}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links){display:flex;align-items:center;font-size:14px;color:#141b38;font-weight:600;margin-bottom:10px}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round{position:relative;border-radius:50%;width:24px;min-width:24px;max-width:24px;height:24px;display:flex;align-items:center;justify-content:center;margin-right:10px;font-size:12px;color:#fff;font-weight:600}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.red{background-color:#df2a4a}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.blue{background-color:#005ae0}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.orange{background-color:#f18200}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.green{background-color:#00aa63}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations .links{margin-top:30px;font-size:14px;font-weight:600}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations .links .no-underline{padding-left:5px}.aioseo-social-profiles .same-username .use-same{padding:30px;background:#f9f9fa}.aioseo-social-profiles .same-username .use-same .aioseo-checkbox{font-size:16px}.aioseo-social-profiles .aioseo-social-profile-list,.aioseo-social-profiles .same-username .use-same .aioseo-settings-row,.aioseo-social-profiles .same-username .use-same .profiles{margin-top:20px}.aioseo-social-profiles .aioseo-social-profile-list .social-profile{margin-bottom:0;padding-bottom:0;border-bottom:none}.aioseo-social-profiles .aioseo-social-profile-list .social-profile .logo-svg{margin-right:10px}.aioseo-social-profiles .aioseo-social-profile-list .social-profile .profile-error{margin-top:10px}.aioseo-social-profiles .aioseo-social-profile-list .social-profile .name{margin-bottom:0}.aioseo-tooltip{margin-left:14px;display:inline-flex}.aioseo-tooltip,.aioseo-twitter-preview{align-items:center;justify-content:center}.aioseo-twitter-preview{background-color:#f0f2f5;padding:30px;display:flex}.aioseo-twitter-preview .twitter-post{width:100%;max-width:500px;border-radius:5px;border:1px solid #e1e8ed;background-color:#fff}.aioseo-twitter-preview .twitter-post .twitter-header{height:65px;padding:0 18px;display:flex;align-items:center}.aioseo-twitter-preview .twitter-post .twitter-header .profile-photo{overflow:hidden;width:40px;height:40px;border:1px solid #e8e8eb;border-radius:50%}.aioseo-twitter-preview .twitter-post .twitter-header .profile-photo img{height:100%;width:100%}.aioseo-twitter-preview .twitter-post .twitter-header .poster{margin-left:10px;flex:1 0 auto}.aioseo-twitter-preview .twitter-post .twitter-header .poster .poster-name{font-size:15px;color:#1c2022;font-weight:600}.aioseo-twitter-preview .twitter-post .twitter-header .poster .poster-username{color:#697882;font-weight:500;font-size:13px}.aioseo-twitter-preview .twitter-post .twitter-container{padding:0 20px 20px}.aioseo-twitter-preview .twitter-post .twitter-container.summary .twitter-content{flex-direction:row}.aioseo-twitter-preview .twitter-post .twitter-container.summary .twitter-content .twitter-image-preview{display:flex;align-items:center;justify-content:center;background-color:#e1e8ed;min-width:125px;min-height:125px;background-size:cover;background-repeat:no-repeat;background-position:50%}.aioseo-twitter-preview .twitter-post .twitter-container.summary .twitter-content .twitter-image-preview svg.aioseo-book{width:50px;height:50px;color:#8999a5}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content{border-radius:10px;overflow:hidden;display:flex;flex-direction:column;border:1px solid #e1e8ed}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content img{width:100%;height:auto}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description{padding:18px;color:#1c2022}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description .site-domain{font-size:14px;color:#8899a6;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description .site-title{font-size:15px;font-weight:600}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description .site-description{font-size:14px;margin:5px 0}.aioseo-col .reverse{flex-direction:column-reverse}.aioseo-col.col-xs,.aioseo-col.col-xs-1,.aioseo-col.col-xs-2,.aioseo-col.col-xs-3,.aioseo-col.col-xs-4,.aioseo-col.col-xs-5,.aioseo-col.col-xs-6,.aioseo-col.col-xs-7,.aioseo-col.col-xs-8,.aioseo-col.col-xs-9,.aioseo-col.col-xs-10,.aioseo-col.col-xs-11,.aioseo-col.col-xs-12,.aioseo-col.col-xs-offset-0,.aioseo-col.col-xs-offset-1,.aioseo-col.col-xs-offset-2,.aioseo-col.col-xs-offset-3,.aioseo-col.col-xs-offset-4,.aioseo-col.col-xs-offset-5,.aioseo-col.col-xs-offset-6,.aioseo-col.col-xs-offset-7,.aioseo-col.col-xs-offset-8,.aioseo-col.col-xs-offset-9,.aioseo-col.col-xs-offset-10,.aioseo-col.col-xs-offset-11,.aioseo-col.col-xs-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-xs{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-xs-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-xs-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-xs-3{flex-basis:25%;max-width:25%}.aioseo-col.col-xs-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-xs-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-xs-6{flex-basis:50%;max-width:50%}.aioseo-col.col-xs-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-xs-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-xs-9{flex-basis:75%;max-width:75%}.aioseo-col.col-xs-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-xs-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-xs-12{flex-basis:100%;max-width:100%}.aioseo-col.col-xs-offset-0{margin-left:0}.aioseo-col.col-xs-offset-1{margin-left:8.33333333%}.aioseo-col.col-xs-offset-2{margin-left:16.66666667%}.aioseo-col.col-xs-offset-3{margin-left:25%}.aioseo-col.col-xs-offset-4{margin-left:33.33333333%}.aioseo-col.col-xs-offset-5{margin-left:41.66666667%}.aioseo-col.col-xs-offset-6{margin-left:50%}.aioseo-col.col-xs-offset-7{margin-left:58.33333333%}.aioseo-col.col-xs-offset-8{margin-left:66.66666667%}.aioseo-col.col-xs-offset-9{margin-left:75%}.aioseo-col.col-xs-offset-10{margin-left:83.33333333%}.aioseo-col.col-xs-offset-11{margin-left:91.66666667%}.aioseo-col.first-xs{order:-1}.aioseo-col.last-xs{order:1}.aioseo-col.text-xs-left{text-align:left!important;justify-content:flex-start}.aioseo-col.text-xs-center{text-align:center!important;justify-content:center}.aioseo-col.text-xs-right{text-align:right!important;justify-content:flex-end}.aioseo-col.p-0{padding:0!important}.aioseo-col.pt-0,.aioseo-col.py-0{padding-top:0!important}.aioseo-col.pr-0,.aioseo-col.px-0{padding-right:0!important}.aioseo-col.pb-0,.aioseo-col.py-0{padding-bottom:0!important}.aioseo-col.pl-0,.aioseo-col.px-0{padding-left:0!important}.aioseo-col.p-1{padding:.25rem!important}.aioseo-col.pt-1,.aioseo-col.py-1{padding-top:.25rem!important}.aioseo-col.pr-1,.aioseo-col.px-1{padding-right:.25rem!important}.aioseo-col.pb-1,.aioseo-col.py-1{padding-bottom:.25rem!important}.aioseo-col.pl-1,.aioseo-col.px-1{padding-left:.25rem!important}.aioseo-col.p-2{padding:.5rem!important}.aioseo-col.pt-2,.aioseo-col.py-2{padding-top:.5rem!important}.aioseo-col.pr-2,.aioseo-col.px-2{padding-right:.5rem!important}.aioseo-col.pb-2,.aioseo-col.py-2{padding-bottom:.5rem!important}.aioseo-col.pl-2,.aioseo-col.px-2{padding-left:.5rem!important}.aioseo-col.p-3{padding:1rem!important}.aioseo-col.pt-3,.aioseo-col.py-3{padding-top:1rem!important}.aioseo-col.pr-3,.aioseo-col.px-3{padding-right:1rem!important}.aioseo-col.pb-3,.aioseo-col.py-3{padding-bottom:1rem!important}.aioseo-col.pl-3,.aioseo-col.px-3{padding-left:1rem!important}.aioseo-col.p-4{padding:1.5rem!important}.aioseo-col.pt-4,.aioseo-col.py-4{padding-top:1.5rem!important}.aioseo-col.pr-4,.aioseo-col.px-4{padding-right:1.5rem!important}.aioseo-col.pb-4,.aioseo-col.py-4{padding-bottom:1.5rem!important}.aioseo-col.pl-4,.aioseo-col.px-4{padding-left:1.5rem!important}.aioseo-col.p-5{padding:3rem!important}.aioseo-col.pt-5,.aioseo-col.py-5{padding-top:3rem!important}.aioseo-col.pr-5,.aioseo-col.px-5{padding-right:3rem!important}.aioseo-col.pb-5,.aioseo-col.py-5{padding-bottom:3rem!important}.aioseo-col.pl-5,.aioseo-col.px-5{padding-left:3rem!important}@media only screen and (min-width:782px){.aioseo-col.col-sm,.aioseo-col.col-sm-1,.aioseo-col.col-sm-2,.aioseo-col.col-sm-3,.aioseo-col.col-sm-4,.aioseo-col.col-sm-5,.aioseo-col.col-sm-6,.aioseo-col.col-sm-7,.aioseo-col.col-sm-8,.aioseo-col.col-sm-9,.aioseo-col.col-sm-10,.aioseo-col.col-sm-11,.aioseo-col.col-sm-12,.aioseo-col.col-sm-offset-0,.aioseo-col.col-sm-offset-1,.aioseo-col.col-sm-offset-2,.aioseo-col.col-sm-offset-3,.aioseo-col.col-sm-offset-4,.aioseo-col.col-sm-offset-5,.aioseo-col.col-sm-offset-6,.aioseo-col.col-sm-offset-7,.aioseo-col.col-sm-offset-8,.aioseo-col.col-sm-offset-9,.aioseo-col.col-sm-offset-10,.aioseo-col.col-sm-offset-11,.aioseo-col.col-sm-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-sm{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-sm-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-sm-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-sm-3{flex-basis:25%;max-width:25%}.aioseo-col.col-sm-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-sm-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-sm-6{flex-basis:50%;max-width:50%}.aioseo-col.col-sm-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-sm-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-sm-9{flex-basis:75%;max-width:75%}.aioseo-col.col-sm-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-sm-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-sm-12{flex-basis:100%;max-width:100%}.aioseo-col.col-sm-offset-0{margin-left:0}.aioseo-col.col-sm-offset-1{margin-left:8.33333333%}.aioseo-col.col-sm-offset-2{margin-left:16.66666667%}.aioseo-col.col-sm-offset-3{margin-left:25%}.aioseo-col.col-sm-offset-4{margin-left:33.33333333%}.aioseo-col.col-sm-offset-5{margin-left:41.66666667%}.aioseo-col.col-sm-offset-6{margin-left:50%}.aioseo-col.col-sm-offset-7{margin-left:58.33333333%}.aioseo-col.col-sm-offset-8{margin-left:66.66666667%}.aioseo-col.col-sm-offset-9{margin-left:75%}.aioseo-col.col-sm-offset-10{margin-left:83.33333333%}.aioseo-col.col-sm-offset-11{margin-left:91.66666667%}.aioseo-col.first-sm{order:-1}.aioseo-col.last-sm{order:1}.aioseo-col.text-sm-left{text-align:left!important;justify-content:flex-start}.aioseo-col.text-sm-center{text-align:center!important;justify-content:center}.aioseo-col.text-sm-right{text-align:right!important;justify-content:flex-end}}@media only screen and (min-width:912px){.aioseo-col.col-md,.aioseo-col.col-md-1,.aioseo-col.col-md-2,.aioseo-col.col-md-3,.aioseo-col.col-md-4,.aioseo-col.col-md-5,.aioseo-col.col-md-6,.aioseo-col.col-md-7,.aioseo-col.col-md-8,.aioseo-col.col-md-9,.aioseo-col.col-md-10,.aioseo-col.col-md-11,.aioseo-col.col-md-12,.aioseo-col.col-md-offset-0,.aioseo-col.col-md-offset-1,.aioseo-col.col-md-offset-2,.aioseo-col.col-md-offset-3,.aioseo-col.col-md-offset-4,.aioseo-col.col-md-offset-5,.aioseo-col.col-md-offset-6,.aioseo-col.col-md-offset-7,.aioseo-col.col-md-offset-8,.aioseo-col.col-md-offset-9,.aioseo-col.col-md-offset-10,.aioseo-col.col-md-offset-11,.aioseo-col.col-md-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-md{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-md-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-md-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-md-3{flex-basis:25%;max-width:25%}.aioseo-col.col-md-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-md-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-md-6{flex-basis:50%;max-width:50%}.aioseo-col.col-md-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-md-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-md-9{flex-basis:75%;max-width:75%}.aioseo-col.col-md-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-md-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-md-12{flex-basis:100%;max-width:100%}.aioseo-col.col-md-offset-0{margin-left:0}.aioseo-col.col-md-offset-1{margin-left:8.33333333%}.aioseo-col.col-md-offset-2{margin-left:16.66666667%}.aioseo-col.col-md-offset-3{margin-left:25%}.aioseo-col.col-md-offset-4{margin-left:33.33333333%}.aioseo-col.col-md-offset-5{margin-left:41.66666667%}.aioseo-col.col-md-offset-6{margin-left:50%}.aioseo-col.col-md-offset-7{margin-left:58.33333333%}.aioseo-col.col-md-offset-8{margin-left:66.66666667%}.aioseo-col.col-md-offset-9{margin-left:75%}.aioseo-col.col-md-offset-10{margin-left:83.33333333%}.aioseo-col.col-md-offset-11{margin-left:91.66666667%}.aioseo-col.first-md{order:-1}.aioseo-col.last-md{order:1}.aioseo-col.text-md-left{text-align:left!important;justify-content:flex-start}.aioseo-col.text-md-center{text-align:center!important;justify-content:center}.aioseo-col.text-md-right{text-align:right!important;justify-content:flex-end}}@media only screen and (min-width:1042px){.aioseo-col.col-lg,.aioseo-col.col-lg-1,.aioseo-col.col-lg-2,.aioseo-col.col-lg-3,.aioseo-col.col-lg-4,.aioseo-col.col-lg-5,.aioseo-col.col-lg-6,.aioseo-col.col-lg-7,.aioseo-col.col-lg-8,.aioseo-col.col-lg-9,.aioseo-col.col-lg-10,.aioseo-col.col-lg-11,.aioseo-col.col-lg-12,.aioseo-col.col-lg-offset-0,.aioseo-col.col-lg-offset-1,.aioseo-col.col-lg-offset-2,.aioseo-col.col-lg-offset-3,.aioseo-col.col-lg-offset-4,.aioseo-col.col-lg-offset-5,.aioseo-col.col-lg-offset-6,.aioseo-col.col-lg-offset-7,.aioseo-col.col-lg-offset-8,.aioseo-col.col-lg-offset-9,.aioseo-col.col-lg-offset-10,.aioseo-col.col-lg-offset-11,.aioseo-col.col-lg-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-lg{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-lg-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-lg-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-lg-3{flex-basis:25%;max-width:25%}.aioseo-col.col-lg-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-lg-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-lg-6{flex-basis:50%;max-width:50%}.aioseo-col.col-lg-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-lg-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-lg-9{flex-basis:75%;max-width:75%}.aioseo-col.col-lg-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-lg-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-lg-12{flex-basis:100%;max-width:100%}.aioseo-col.col-lg-offset-0{margin-left:0}.aioseo-col.col-lg-offset-1{margin-left:8.33333333%}.aioseo-col.col-lg-offset-2{margin-left:16.66666667%}.aioseo-col.col-lg-offset-3{margin-left:25%}.aioseo-col.col-lg-offset-4{margin-left:33.33333333%}.aioseo-col.col-lg-offset-5{margin-left:41.66666667%}.aioseo-col.col-lg-offset-6{margin-left:50%}.aioseo-col.col-lg-offset-7{margin-left:58.33333333%}.aioseo-col.col-lg-offset-8{margin-left:66.66666667%}.aioseo-col.col-lg-offset-9{margin-left:75%}.aioseo-col.col-lg-offset-10{margin-left:83.33333333%}.aioseo-col.col-lg-offset-11{margin-left:91.66666667%}.aioseo-col.first-lg{order:-1}.aioseo-col.last-lg{order:1}.aioseo-col.text-lg-left{text-align:left!important;justify-content:flex-start}.aioseo-col.text-lg-center{text-align:center!important;justify-content:center}.aioseo-col.text-lg-right{text-align:right!important;justify-content:flex-end}}@media only screen and (min-width:1140px){.aioseo-col.col-xl,.aioseo-col.col-xl-1,.aioseo-col.col-xl-2,.aioseo-col.col-xl-3,.aioseo-col.col-xl-4,.aioseo-col.col-xl-5,.aioseo-col.col-xl-6,.aioseo-col.col-xl-7,.aioseo-col.col-xl-8,.aioseo-col.col-xl-9,.aioseo-col.col-xl-10,.aioseo-col.col-xl-11,.aioseo-col.col-xl-12,.aioseo-col.col-xl-offset-0,.aioseo-col.col-xl-offset-1,.aioseo-col.col-xl-offset-2,.aioseo-col.col-xl-offset-3,.aioseo-col.col-xl-offset-4,.aioseo-col.col-xl-offset-5,.aioseo-col.col-xl-offset-6,.aioseo-col.col-xl-offset-7,.aioseo-col.col-xl-offset-8,.aioseo-col.col-xl-offset-9,.aioseo-col.col-xl-offset-10,.aioseo-col.col-xl-offset-11,.aioseo-col.col-xl-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-xl{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-xl-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-xl-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-xl-3{flex-basis:25%;max-width:25%}.aioseo-col.col-xl-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-xl-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-xl-6{flex-basis:50%;max-width:50%}.aioseo-col.col-xl-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-xl-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-xl-9{flex-basis:75%;max-width:75%}.aioseo-col.col-xl-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-xl-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-xl-12{flex-basis:100%;max-width:100%}.aioseo-col.col-xl-offset-0{margin-left:0}.aioseo-col.col-xl-offset-1{margin-left:8.33333333%}.aioseo-col.col-xl-offset-2{margin-left:16.66666667%}.aioseo-col.col-xl-offset-3{margin-left:25%}.aioseo-col.col-xl-offset-4{margin-left:33.33333333%}.aioseo-col.col-xl-offset-5{margin-left:41.66666667%}.aioseo-col.col-xl-offset-6{margin-left:50%}.aioseo-col.col-xl-offset-7{margin-left:58.33333333%}.aioseo-col.col-xl-offset-8{margin-left:66.66666667%}.aioseo-col.col-xl-offset-9{margin-left:75%}.aioseo-col.col-xl-offset-10{margin-left:83.33333333%}.aioseo-col.col-xl-offset-11{margin-left:91.66666667%}.aioseo-col.first-xl{order:-1}.aioseo-col.last-xl{order:1}.aioseo-col.text-xl-left{text-align:left!important;justify-content:flex-start}.aioseo-col.text-xl-center{text-align:center!important;justify-content:center}.aioseo-col.text-xl-right{text-align:right!important;justify-content:flex-end}}.aioseo-container,.aioseo-container-fluid{margin-right:auto;margin-left:auto}.aioseo-container{padding:0 20px}.aioseo-container-fluid.hero,.aioseo-container.hero{min-height:100vh;display:flex;justify-content:center;align-items:center}.aioseo-container-fluid{padding-right:2rem;padding-left:2rem}@media only screen and (min-width:782px){.aioseo-container{padding:0 30px}}@media only screen and (min-width:1042px){.aioseo-container{max-width:80rem}.aioseo-container.full-width{max-width:100%}.aioseo-container.small{max-width:810px}}.aioseo-masonry{-moz-column-count:0;column-count:0;-moz-column-gap:20px;column-gap:20px;counter-reset:brick-counter}.aioseo-masonry>*{box-sizing:border-box;-moz-column-break-inside:avoid;break-inside:avoid;counter-increment:brick-counter;margin-bottom:20px}@media only screen and (min-width:782px){.aioseo-masonry{-moz-column-count:1;column-count:1}}@media only screen and (min-width:912px){.aioseo-masonry{-moz-column-count:2;column-count:2}}@media only screen and (min-width:1042px){.aioseo-masonry{-moz-column-count:3;column-count:3}}.aioseo-row{box-sizing:border-box;display:flex;flex:0 1 auto;flex-direction:row;flex-wrap:wrap;margin-right:-.5rem;margin-left:-.5rem}.aioseo-row.reverse{flex-direction:row-reverse}.aioseo-row.start-xs{justify-content:flex-start;text-align:start}.aioseo-row.center-xs{justify-content:center;text-align:center}.aioseo-row.end-xs{justify-content:flex-end;text-align:end}.aioseo-row.top-xs{align-items:flex-start}.aioseo-row.middle-xs{align-items:center}.aioseo-row.bottom-xs{align-items:flex-end}.aioseo-row.around-xs{justify-content:space-around}.aioseo-row.between-xs{justify-content:space-between}@media only screen and (min-width:782px){.aioseo-row.start-sm{justify-content:flex-start;text-align:start}.aioseo-row.center-sm{justify-content:center;text-align:center}.aioseo-row.end-sm{justify-content:flex-end;text-align:end}.aioseo-row.top-sm{align-items:flex-start}.aioseo-row.middle-sm{align-items:center}.aioseo-row.bottom-sm{align-items:flex-end}.aioseo-row.around-sm{justify-content:space-around}.aioseo-row.between-sm{justify-content:space-between}}@media only screen and (min-width:912px){.aioseo-row.start-md{justify-content:flex-start;text-align:start}.aioseo-row.center-md{justify-content:center;text-align:center}.aioseo-row.end-md{justify-content:flex-end;text-align:end}.aioseo-row.top-md{align-items:flex-start}.aioseo-row.middle-md{align-items:center}.aioseo-row.bottom-md{align-items:flex-end}.aioseo-row.around-md{justify-content:space-around}.aioseo-row.between-md{justify-content:space-between}}@media only screen and (min-width:1042px){.aioseo-row.start-lg{justify-content:flex-start;text-align:start}.aioseo-row.center-lg{justify-content:center;text-align:center}.aioseo-row.end-lg{justify-content:flex-end;text-align:end}.aioseo-row.top-lg{align-items:flex-start}.aioseo-row.middle-lg{align-items:center}.aioseo-row.bottom-lg{align-items:flex-end}.aioseo-row.around-lg{justify-content:space-around}.aioseo-row.between-lg{justify-content:space-between}}.aioseo-display-info svg.aioseo-new-page{width:100%;height:auto;max-width:45px}.aioseo-display-info .new-page .aioseo-row{margin:0}.aioseo-display-info .new-page svg.aioseo-external{width:14px;height:14px;margin-right:10px}.aioseo-display-info .new-page .aioseo-description{color:#434960}.aioseo-display-info .new-page button.aioseo-html-sitemaps-disabled-button{border:1px solid #dcdde1;color:#8c8f9a;background-color:#f3f4f5;cursor:default}.aioseo-display-info .new-page .aioseo-alert{width:100%;margin:8px 8px 0}.aioseo-exclude-posts{display:block}.aioseo-exclude-posts .aioseo-select{max-width:600px;display:inline-block;margin-right:10px}.aioseo-exclude-posts .aioseo-select button{display:none}.aioseo-exclude-posts .aioseo-select .multiselect__option{display:flex}.aioseo-exclude-posts .aioseo-select .multiselect__option--highlight .option-title{color:#005ae0}.aioseo-exclude-posts .aioseo-button.gray{margin-top:10px}.aioseo-exclude-posts .option{flex:1 0 auto}.aioseo-exclude-posts .option .option-title{font-weight:500;font-size:16px;color:#141b38}.aioseo-exclude-posts .option .option-title .search-term{font-weight:700}.aioseo-exclude-posts .option .option-details{display:flex;align-items:center;font-size:14px;color:#8c8f9a}.aioseo-exclude-posts .option .option-details span{margin-right:15px}.aioseo-exclude-posts .option-permalink{display:flex;align-items:center}.aioseo-exclude-posts .option-permalink svg.aioseo-external{width:15px;height:15px;color:#434960}.aioseo-exclude-posts .multiselect-toggle{padding:10px 13px;width:40px;position:absolute;height:36px;right:2px;top:2px;text-align:center;z-index:1}.aioseo-exclude-posts .multiselect-toggle svg.aioseo-add-plus{width:14px;height:14px;color:#000}.aioseo-sidebar-row .aioseo-included-objects-toggle{margin-top:5px}.aioseo-sidebar-row .aioseo-included-objects-toggle .aioseo-included-list{margin-top:8px}.aioseo-notification{margin-bottom:20px}.aioseo-notification>div{display:flex;align-items:flex-start;padding-bottom:10px;border-bottom:1px solid #e8e8eb}.aioseo-notification>div .icon{margin-right:20px}.aioseo-notification>div .icon svg{width:20px;height:20px;color:#00aa63}.aioseo-notification>div .icon svg.warning{color:#f18200}.aioseo-notification>div .icon svg.info{color:#005ae0}.aioseo-notification>div .icon svg.success{color:#00aa63}.aioseo-notification>div .icon svg.error{color:#df2a4a}.aioseo-notification>div .body{margin-right:20px;flex:1}.aioseo-notification>div .body .title{font-size:16px;font-weight:600;color:#141b38;margin-bottom:7px;display:flex;align-items:center}.aioseo-notification>div .body .title div:first-child{flex:1;margin-right:5px;line-height:1.4}.aioseo-notification>div .body .notification-content{margin-bottom:10px;max-width:400px}.aioseo-notification>div .body .actions{flex-wrap:wrap;display:flex;align-items:center}.aioseo-notification>div .body .actions>*{margin-bottom:10px}.aioseo-notification>div .body .actions .aioseo-button{margin-right:20px}.aioseo-notification>div .body .actions .dismiss{color:#8c8f9a;font-size:14px}.aioseo-seo-site-score__circle{animation:aioseo-seo-site-score-fill 1s reverse;transform:rotate(-180deg);transform-origin:center;stroke:#00aa63}.aioseo-seo-site-score__circle.fast{-webkit-animation-duration:.5s;animation-duration:.5s;stroke:#df2a4a}.aioseo-seo-site-score__circle.medium{-webkit-animation-duration:.75s;animation-duration:.75s;stroke:#f18200}.aioseo-seo-site-score__background{stroke:#e8e8eb}@-webkit-keyframes aioseo-seo-site-score-fill{to{stroke-dasharray:0 100}}@keyframes aioseo-seo-site-score-fill{to{stroke-dasharray:0 100}}.aioseo-seo-site-score-svg-loading{-webkit-animation:aioseo-seo-site-score-svg-animation 2s linear infinite;animation:aioseo-seo-site-score-svg-animation 2s linear infinite}.aioseo-seo-site-score-loading__circle{-webkit-animation:aioseo-seo-site-score-fill-loading 2s ease-in-out infinite both;animation:aioseo-seo-site-score-fill-loading 2s ease-in-out infinite both;transform:rotate(-180deg);transform-origin:center;stroke:#005ae0}@-webkit-keyframes aioseo-seo-site-score-svg-animation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes aioseo-seo-site-score-svg-animation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@-webkit-keyframes aioseo-seo-site-score-fill-loading{0%,25%{stroke-dashoffset:90;transform:rotate(0)}50%,75%{stroke-dashoffset:10;transform:rotate(45deg)}to{stroke-dashoffset:90;transform:rotate(1turn)}}@keyframes aioseo-seo-site-score-fill-loading{0%,25%{stroke-dashoffset:90;transform:rotate(0)}50%,75%{stroke-dashoffset:10;transform:rotate(45deg)}to{stroke-dashoffset:90;transform:rotate(1turn)}}.aioseo-table-column{display:flex;flex-direction:column;flex-basis:100%;flex:1;padding:5px;justify-content:center}.aioseo-table-row{display:flex;flex-direction:row;flex-wrap:wrap;width:100%}.aioseo-wizard-body{background-color:#fff;max-width:900px;box-shadow:0 2px 5px rgba(0,0,0,.05)}.aioseo-wizard-body .body-content{padding:80px 140px}@media screen and (max-width:782px){.aioseo-wizard-body .body-content{padding:40px}}.aioseo-wizard-body .body-content .header{line-height:1.4}.aioseo-wizard-body .body-footer{border-top:1px solid #e8e8eb;padding:30px;display:flex;align-items:center}.aioseo-wizard-body .body-footer>*{margin-right:10px}.aioseo-wizard-body .body-footer>:last-child{margin-right:0}.aioseo-wizard-body .body-footer .spacer{flex:1 0 auto}.aioseo-wizard-close-and-exit{margin:96px 0;min-height:96px;text-align:center;font-size:14px}.aioseo-wizard-close-and-exit a{color:#8c8f9a!important}.aioseo-wizard-container{margin:40px auto;max-width:900px}@media screen and (max-width:782px){.aioseo-wizard-container{margin:0 20px}}.aioseo-wizard-header{display:flex;align-items:center;justify-content:center;flex-direction:column}.aioseo-wizard-header svg.aioseo-logo{width:100%;max-width:140px;height:auto;margin:60px 10px 40px 0}.aioseo-wizard-progress{display:flex;align-items:center;justify-content:center}@media screen and (max-width:782px){.aioseo-wizard-progress{display:none}}.aioseo-wizard-progress .circle{background-color:#dcdde1;width:16px;height:16px;border-radius:50%}.aioseo-wizard-progress .circle.active{background-color:#005ae0}.aioseo-wizard-progress .spacer{width:59px;border:1px solid #dcdde1;margin:0 12px}.aioseo-wizard-progress .spacer.active{border-color:#005ae0}.aioseo-wizard-steps{color:#8c8f9a;font-size:14px;margin-bottom:20px}.block-editor-block-card{align-items:center}.block-editor-block-card__title.block-editor-block-card__title{margin:0}.aioseo-sidebar-row{margin-bottom:16px}.aioseo-sidebar-row .aioseo-sidebar-title{font-weight:500}
dist/Lite/assets/css/chunk-common.rtl.css CHANGED
@@ -1 +1 @@
1
- .aioseo-app .aioseo-cta{margin-top:30px;background:#fff;width:100%;padding:40px;box-shadow:0 2px 5px rgba(0,0,0,.05);border:1px solid #e8e8eb}.aioseo-app .aioseo-cta.floating{margin-top:0;position:absolute;max-width:850px;right:50%;top:50%;transform:translateX(50%) translateY(-50%);box-shadow:0 5px 20px rgba(0,0,0,.1);border-radius:3px}.aioseo-app .aioseo-cta .header-text{line-height:1.4;font-weight:600;font-size:24px;text-align:center;color:#141b38}.aioseo-app .aioseo-cta .header-text span.large{line-height:1.4;font-size:32px}.aioseo-app .aioseo-cta .description{margin:30px 0 50px;width:100%;max-width:600px;text-align:center;font-size:16px;color:#141b38;line-height:1.4}.aioseo-app .aioseo-cta .description .aioseo-alert{margin-bottom:30px;text-align:right}.aioseo-app .aioseo-cta .feature-list{color:#141b38;font-size:16px;width:100%;max-width:500px;margin-bottom:50px}.aioseo-app .aioseo-cta .feature-list .aioseo-col{display:flex;align-items:flex-start}.aioseo-app .aioseo-cta .feature-list .aioseo-col svg.aioseo-circle-check{color:#00aa63;width:18px;min-width:18px;min-height:18px;margin-left:10px}.aioseo-app .aioseo-cta a.learn-more{margin-top:20px;color:#8c8f9a;font-size:14px}.aioseo-app .aioseo-cta .type-1{display:flex;flex-direction:column;align-items:center}.aioseo-app .aioseo-cta .type-2{margin:30px 50px 30px 0;display:flex}.aioseo-app .aioseo-cta .type-2 .description,.aioseo-app .aioseo-cta .type-2 .header-text{text-align:right}.aioseo-app .aioseo-cta .type-2 .description,.aioseo-app .aioseo-cta .type-2 .feature-list{margin:30px 0}.aioseo-app .aioseo-cta .type-2>div{margin-left:20px;flex:0 0 50%}.aioseo-app .aioseo-cta .type-2 .featured-image{max-height:540px;border:1px solid #e8e8eb;flex:1;overflow:hidden;margin-left:-41px;margin-bottom:-71px;border-radius:0 5px 0 0}.aioseo-app .aioseo-cta .type-2 .featured-image img{max-height:600px}@media only screen and (max-width:912px){.aioseo-app .aioseo-cta .type-2{flex-direction:column;align-items:center}.aioseo-app .aioseo-cta .type-2 .description,.aioseo-app .aioseo-cta .type-2 .header-text{text-align:center}.aioseo-app .aioseo-cta .type-2>div{text-align:center;margin-left:0;margin-bottom:30px;flex:1 0 100%;width:100%}.aioseo-app .aioseo-cta .type-2 .featured-image{margin:0 -10px -41px;border-radius:5px 5px 0 0;max-height:300px}}.aioseo-app .aioseo-cta .type-3 .sub-header{line-height:1.4;font-size:16px;font-weight:600;color:#005ae0;margin-bottom:5px}.aioseo-app .aioseo-cta .type-3 .header-text{text-align:right}.aioseo-app .aioseo-cta .type-3 .feature-list{margin:30px 0}.aioseo-app .aioseo-cta .type-3 .feature-list .aioseo-col svg.aioseo-circle-check{color:#00aa63;width:21px;min-width:21px;min-height:21px;margin-left:5px}.aioseo-app .aioseo-cta .type-3 .aioseo-button{margin-left:12px}.aioseo-box-toggle .aioseo-row .aioseo-col{max-width:calc(200px + 1em)}@media only screen and (max-width:48em){.aioseo-box-toggle .aioseo-row .aioseo-col{max-width:100%}}.aioseo-box-toggle input{position:absolute!important;clip:rect(0,0,0,0);height:1px;width:1px;border:0;overflow:hidden}.aioseo-box-toggle input:checked+label{background-color:#fff;box-shadow:0 5px 10px rgba(0,90,224,.1);border:2px solid #005ae0;font-weight:600}.aioseo-box-toggle label{background-color:#f9f9fa;color:#141b38;font-size:16px;line-height:1;display:flex;align-items:center;justify-content:center;flex-direction:column;border:1px solid #f9f9fa;transition:all .1s ease-in-out;border-radius:3px;height:165px;position:relative}.aioseo-box-toggle label p{position:absolute;bottom:15px;margin:0}.aioseo-box-toggle label:hover{cursor:pointer}.aioseo-button{flex-shrink:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:600;padding:0 24px;border-radius:4px;-webkit-appearance:none;cursor:pointer;height:48px;transition:background-color .2s ease;position:relative;overflow:hidden;text-decoration:none;color:#141b38;white-space:nowrap}.aioseo-button.small{height:30px;font-size:14px;padding:0 12px}.aioseo-button.small .loading-spinner{width:25px;height:25px}.aioseo-button.medium{height:40px;font-size:14px;padding:0 18px}.aioseo-button.medium .loading-spinner{width:35px;height:35px}.aioseo-button.xl{height:66px;border-radius:4px;font-size:18px;padding:0 48px}.aioseo-button.gray{border:1px solid #dcdde1;background-color:#f3f4f5}.aioseo-button.gray:hover{background-color:#fff;color:#141b38}.aioseo-button.gray:active{background-color:#f3f4f5}.aioseo-button.green{border:none;background-color:#00aa63;color:#fff}.aioseo-button.green:hover{background-color:#07c575}.aioseo-button.green:active{background-color:#15955f}.aioseo-button.blue{border:none;background-color:#005ae0;color:#fff}.aioseo-button.blue:hover{background-color:#1a82ea}.aioseo-button.blue:active{background-color:#004f9d}.aioseo-button.wp-blue{border:1px solid #005ae0;background-color:#f3f5f6;color:#005ae0}.aioseo-button.wp-blue:hover{background-color:#1a82ea;border-color:#1a82ea;color:#fff}.aioseo-button.wp-blue:active{background-color:#004f9d;border-color:#004f9d;color:#fff}.aioseo-button.black{border:none;background-color:#434960;color:#fff}.aioseo-button.black:hover{background-color:#2c324c}.aioseo-button.black:active{background-color:#141b38}.aioseo-button.red{border:1px solid #df2a4a;background-color:#fff;color:#df2a4a}.aioseo-button.red:hover{background-color:#df2a4a;color:#fff}.aioseo-button.red:active{background-color:#ab2039}.aioseo-button.loading.blue,.aioseo-button.loading.blue:hover{background-color:#004f9d;color:#004f9d}.aioseo-button.loading.green,.aioseo-button.loading.green:hover{background-color:#15955f;color:#15955f}.aioseo-button.loading.gray,.aioseo-button.loading.gray:hover{background-color:#f3f4f5;color:#f3f4f5}.aioseo-button.loading.black,.aioseo-button.loading.black:hover{background-color:#141b38;color:#141b38}.aioseo-button:disabled{border:1px solid #dcdde1;color:#8c8f9a;background-color:#f3f4f5;cursor:default}.aioseo-button:disabled.gray:hover{color:#8c8f9a}.aioseo-button:disabled.wp-blue{border-color:#ddd;background-color:#f7f7f7}.aioseo-button:disabled.wp-blue:hover{border-color:#ddd;color:#8c8f9a}.aioseo-button:disabled:hover{background-color:#f3f4f5}.aioseo-checkbox{display:inline-flex;align-items:center}.aioseo-checkbox.disabled,.aioseo-checkbox.disabled .form-checkbox .fancy-checkbox,.aioseo-checkbox.no-clicks,.aioseo-checkbox.no-clicks .form-checkbox .fancy-checkbox{cursor:default}.aioseo-checkbox .form-checkbox-wrapper{margin-left:10px;display:flex}.aioseo-checkbox.medium .form-checkbox{width:20px;height:20px}.aioseo-checkbox.medium .form-checkbox .fancy-checkbox svg{width:12px;height:12px}.aioseo-checkbox.medium .form-checkbox span:before{height:18px;width:18px;line-height:20px}.aioseo-checkbox.round .form-checkbox span,.aioseo-checkbox.round .form-checkbox span:before{border-radius:50%}.aioseo-checkbox .form-checkbox{position:relative;display:inline-block;width:28px;height:28px;color:#fff;vertical-align:bottom;text-align:center}.aioseo-checkbox .form-checkbox input{display:none}.aioseo-checkbox .form-checkbox input:checked+.fancy-checkbox.blue{background:#005ae0}.aioseo-checkbox .form-checkbox input:checked+.fancy-checkbox.green{background:#00aa63}.aioseo-checkbox .form-checkbox input:checked+.fancy-checkbox:before{background:transparent}.aioseo-checkbox .form-checkbox input:disabled+.fancy-checkbox{background:#e8e8eb!important;border:1px solid #d0d1d7;cursor:default}.aioseo-checkbox .form-checkbox input:disabled+.fancy-checkbox svg{color:#8c8f9a}.aioseo-checkbox .form-checkbox input:not(:checked):disabled+.fancy-checkbox:before{right:0;bottom:0;background:#e8e8eb}.aioseo-checkbox .form-checkbox .fancy-checkbox svg{color:#fff;width:16px;height:16px}.aioseo-checkbox .form-checkbox span{position:absolute;cursor:pointer;top:0;right:0;left:0;bottom:0;background-color:#d0d1d7;transition:.2s;border-radius:3px;display:flex;align-items:center;justify-content:center}.aioseo-checkbox .form-checkbox span:before{position:absolute;content:"";height:26px;width:26px;right:1px;bottom:1px;background-color:#fff;transition:.2s;font-size:18px;line-height:28px;border-radius:2px}.aioseo-date-picker.vue-daterange-picker{width:100%}.aioseo-date-picker.vue-daterange-picker .form-control{display:flex;align-items:center;color:#141b38;font-size:16px;height:48px;border-radius:3px;border:1px solid #d0d1d7;position:relative}.aioseo-date-picker.vue-daterange-picker .form-control svg.aioseo-circle-close{position:absolute;left:10px;color:#434960;width:15px;height:15px}.aioseo-date-picker.vue-daterange-picker.small .form-control{height:30px}.aioseo-date-picker.vue-daterange-picker.medium .form-control{height:40px}body[class*=all-in-one-seo_page] .daterangepicker .yearselect{width:75px}.aioseo-editor{position:relative}.aioseo-editor .aioseo-editor-description .ql-editor{min-height:100px}.aioseo-editor .aioseo-editor-line-numbers .ql-editor{padding:15px 45px 15px 15px}.aioseo-editor .aioseo-editor-single .ql-editor{padding:8px 10px}.aioseo-editor .aioseo-editor-single.aioseo-editor-line-numbers .ql-editor{padding:8px 45px 8px 10px}.aioseo-editor .aioseo-editor-monospace .ql-editor{font-family:monospace}.aioseo-editor .aioseo-line-numbers{background:#f7f6f7;position:absolute;text-align:left;top:1px;width:29px;right:1px;border-radius:0 3px 3px 0;padding:15px 0 0 9px;display:flex;height:calc(100% - 2px);flex-direction:column;overflow:hidden}.aioseo-editor .aioseo-line-numbers div{min-height:25px;color:#8c8f9a;font-size:12px;line-height:1.9}.aioseo-editor .ql-disabled{pointer-events:none;background-color:#f9f9fa}.aioseo-editor .ql-editor{padding:15px;border-radius:3px;font-size:16px;color:#141b38;border:1px solid #d0d1d7}.aioseo-editor .ql-editor:focus{border:1px solid #005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-editor .ql-editor .mention .ql-mention-denotation-char{display:none}.aioseo-editor .ql-editor .mention .aioseo-tag{height:25px;margin:0 1px;color:#434960;font-weight:600;font-size:14px;padding:3px 10px 3px 25px;background-color:#f3f4f5;border-radius:3px;cursor:pointer;position:relative;display:inline-flex;align-items:center}.aioseo-editor .ql-editor .mention .aioseo-tag .tag-toggle{display:inline-flex;align-items:center;background-color:#e8e8eb;position:absolute;top:0;left:0;bottom:0;border-radius:3px 0 0 3px}.aioseo-editor .ql-editor .mention .aioseo-tag .tag-toggle svg.aioseo-caret{width:18px;height:18px;transition:transform .3s}.aioseo-editor .ql-editor .mention .aioseo-tag .tag-toggle svg.aioseo-caret.rotated{transform:rotate(-180deg)}.aioseo-editor .ql-mention-list-container{color:#141b38;background-color:#fff;max-width:250px;width:100%;margin-top:3px;border:1px solid #d0d1d7;border-radius:3px;box-shadow:0 3px 15px rgba(0,0,0,.1);z-index:9001}.aioseo-editor .ql-mention-list-container .aioseo-tag-custom,.aioseo-editor .ql-mention-list-container .aioseo-tag-search{padding:12px;border-bottom:1px solid #e8e8eb}.aioseo-editor .ql-mention-list-container .aioseo-tag-custom{display:none}.aioseo-editor .ql-mention-list-container .ql-mention-list{list-style:none;margin:0;padding:0;max-height:210px;overflow:auto}.aioseo-editor .ql-mention-list-container .ql-mention-list li{color:#141b38;margin:0;background-color:transparent;border-bottom:1px solid #e8e8eb;padding:15px;cursor:pointer;font-size:14px}.aioseo-editor .ql-mention-list-container .ql-mention-list li:last-child{border-bottom:0}.aioseo-editor .ql-mention-list-container .ql-mention-list li.selected,.aioseo-editor .ql-mention-list-container .ql-mention-list li:hover{color:#005ae0;background-color:#f2f7fd}.aioseo-editor .ql-mention-list-container .ql-mention-list li.selected .aioseo-tag-description,.aioseo-editor .ql-mention-list-container .ql-mention-list li:hover .aioseo-tag-description{color:initial}.aioseo-editor .ql-mention-list-container .ql-mention-list li .aioseo-tag-item{display:flex}.aioseo-editor .ql-mention-list-container .ql-mention-list li .aioseo-tag-item>div:first-child{margin-left:10px}.aioseo-editor .ql-mention-list-container .ql-mention-list li .aioseo-tag-item .aioseo-tag-title{font-weight:600}.aioseo-editor .ql-mention-list-container .ql-mention-list li svg.aioseo-plus{width:10px;height:10px;color:#005ae0}.aioseo-editor .ql-mention-list-container .ql-mention-list li.aioseo-tag-no-match{cursor:default;padding:12px;font-size:16px;font-weight:600}.aioseo-editor .ql-mention-list-container .ql-mention-list li.aioseo-tag-no-match.highlight,.aioseo-editor .ql-mention-list-container .ql-mention-list li.aioseo-tag-no-match:hover{color:initial;background-color:transparent}.aioseo-editor .ql-toolbar{display:none}.aioseo-editor .ql-clipboard{right:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.aioseo-editor .ql-snow .ql-hidden{display:none}.aioseo-editor .ql-container.ql-snow{border:none}.aioseo-editor .ql-container p{font-size:16px;margin:0;line-height:25px}.aioseo-highlight-toggle{border:1px solid #e8e8eb;border-radius:3px;min-height:48px;display:flex;align-items:center;padding:5px 10px;cursor:pointer}.aioseo-highlight-toggle>*{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.aioseo-highlight-toggle.active{border-color:#005ae0;box-shadow:0 5px 10px rgba(0,90,224,.1)}.aioseo-highlight-toggle.medium{min-height:40px}.aioseo-highlight-toggle .icon{display:flex;align-items:center;margin-left:5px}.aioseo-input[data-v-20c03142]{position:relative;width:100%}.aioseo-input.file[data-v-20c03142],.aioseo-input.file input[type=file][data-v-20c03142]{position:absolute;top:0;left:0;right:0;bottom:0;margin:0;padding:0}.aioseo-input.file input[type=file][data-v-20c03142]{cursor:pointer;opacity:0}.aioseo-input.file input[type=file][data-v-20c03142]::-webkit-file-upload-button{visibility:hidden}.aioseo-input.file input[type=file][data-v-20c03142]:focus{box-shadow:none}.aioseo-input input[data-v-20c03142]{height:48px;width:100%;background-color:#fff;border:1px solid #d0d1d7;border-radius:3px;padding:15px;font-size:18px;position:relative;overflow:hidden;margin:0}.aioseo-input input[data-v-20c03142]:disabled{background:#f9f9fa}.aioseo-input input[data-v-20c03142]:focus{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-input input[data-v-20c03142]::-moz-placeholder{color:#8c8f9a}.aioseo-input input[data-v-20c03142]:-ms-input-placeholder{color:#8c8f9a}.aioseo-input input[data-v-20c03142]::placeholder{color:#8c8f9a}.aioseo-input input.prepend[data-v-20c03142]{padding-right:50px}.aioseo-input input.append[data-v-20c03142]{padding-left:50px}.aioseo-input input.small[data-v-20c03142]{height:30px;padding:10px;font-size:14px}.aioseo-input input.small.prepend[data-v-20c03142]{padding-right:30px}.aioseo-input input.small.append[data-v-20c03142]{padding-left:30px}.aioseo-input input.medium[data-v-20c03142]{height:40px;padding:12px;font-size:16px}.aioseo-input input.medium.prepend[data-v-20c03142]{padding-right:35px}.aioseo-input input.medium.append[data-v-20c03142]{padding-left:35px}.aioseo-input.aioseo-active input[data-v-20c03142]{border-color:#00aa63}.aioseo-input.aioseo-active input[data-v-20c03142]:active,.aioseo-input.aioseo-active input[data-v-20c03142]:focus{box-shadow:0 0 0 1px #00aa63}.aioseo-input.aioseo-active .append-icon[data-v-20c03142],.aioseo-input.aioseo-active .prepend-icon[data-v-20c03142]{color:#00aa63}.aioseo-input.aioseo-error input[data-v-20c03142]{border-color:#df2a4a}.aioseo-input.aioseo-error input[data-v-20c03142]:active,.aioseo-input.aioseo-error input[data-v-20c03142]:focus{box-shadow:0 0 0 1px #df2a4a}.aioseo-input.aioseo-error .append-icon[data-v-20c03142],.aioseo-input.aioseo-error .prepend-icon[data-v-20c03142]{color:#df2a4a}.aioseo-input.aioseo-warning input[data-v-20c03142]{border-color:#f18200}.aioseo-input.aioseo-warning input[data-v-20c03142]:active,.aioseo-input.aioseo-warning input[data-v-20c03142]:focus{box-shadow:0 0 0 1px #f18200}.aioseo-input.aioseo-warning .append-icon[data-v-20c03142],.aioseo-input.aioseo-warning .prepend-icon[data-v-20c03142]{color:#f18200}.aioseo-input .prepend-icon[data-v-20c03142]{position:absolute;top:0;right:10px;width:30px;height:100%;color:#d0d1d7;display:flex;align-items:center;z-index:1}.aioseo-input .prepend-icon svg[data-v-20c03142]{width:30px;height:30px}.aioseo-input .prepend-icon.small[data-v-20c03142]{width:20px}.aioseo-input .prepend-icon.small svg[data-v-20c03142]{width:10px;height:10px}.aioseo-input .prepend-icon.medium[data-v-20c03142]{width:15px}.aioseo-input .prepend-icon.medium svg[data-v-20c03142]{width:15px;height:15px}.aioseo-input .append-icon[data-v-20c03142]{position:absolute;top:0;left:10px;width:30px;height:100%;color:#d0d1d7;display:flex;align-items:center;z-index:1}.aioseo-input .append-icon svg[data-v-20c03142]{width:30px;height:30px}.aioseo-input .append-icon.small[data-v-20c03142]{width:10px}.aioseo-input .append-icon.medium[data-v-20c03142]{width:15px}.aioseo-input .append-icon.clickable[data-v-20c03142]{cursor:pointer;padding:0 5px;background:#f3f4f5;border:1px solid #d0d1d7;color:#434960;left:0;width:30px;border-radius:3px 0 0 3px}.aioseo-input .append-icon.clickable.small[data-v-20c03142]{width:15px}.aioseo-input .append-icon.clickable.medium[data-v-20c03142]{padding:0 10px;width:40px}.aioseo-phone-number{max-width:600px}.aioseo-phone-number label{display:none}.aioseo-phone-number .maz-input__input{height:40px;min-height:40px;padding-top:0!important;border:1px solid #d0d1d7}.aioseo-phone-number .maz-input__input:focus{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-phone-number .country-selector{flex:0 0 140px;width:140px;min-width:140px;max-width:140px}.aioseo-phone-number .country-selector:hover{z-index:1}.aioseo-phone-number .country-selector>div.maz-base-component.maz-input.has-value.has-1-right-icon.maz-input--primary>input{padding-right:50px!important}.aioseo-phone-number .country-selector .maz-input.is-focused{border-color:#005ae0}.aioseo-phone-number .country-selector .maz-select__options-list__item.selected.keyboard-selected{background-color:#005ae0}.aioseo-phone-number .maz-phone-number-input__country-flag{right:20px;bottom:12px;z-index:auto}.aioseo-phone-number .maz-input__icon{z-index:auto}.aioseo-phone-number .maz-select__options-list input{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-phone-number .maz-input__input{border-radius:3px}.aioseo-phone-number.invalidNumber div.maz-flex-1>div>input{border-color:red}.aioseo-phone-number.invalidNumber div.maz-flex-1>div>input:focus{border-color:#df2a4a;box-shadow:0 0 0 1px #df2a4a}.aioseo-phone-number.validNumber div.maz-flex-1>div>input:focus{border-color:#00aa63;box-shadow:0 0 0 1px #00aa63}.aioseo-radio{display:inline-flex;align-items:center}.aioseo-radio .form-radio-wrapper{margin-left:10px;display:flex}.aioseo-radio.medium .form-radio{width:20px;height:20px}.aioseo-radio.medium .form-radio .fancy-radio svg{width:12px;height:12px}.aioseo-radio.medium.type-1 .form-radio span:before{height:18px;width:18px;line-height:20px}.aioseo-radio.medium.type-2 .form-radio span:before{height:16px;width:16px;line-height:20px}.aioseo-radio.medium.type-2 .form-radio span:after{height:6px;width:6px;right:6px;bottom:6px}.aioseo-radio .form-radio{position:relative;display:inline-block;width:28px;height:28px;color:#fff;vertical-align:bottom;text-align:center}.aioseo-radio .form-radio input{opacity:0}.aioseo-radio .form-radio input:checked+.fancy-radio{background:#005ae0;border-color:#005ae0}.aioseo-radio .form-radio input:checked+.fancy-radio:before{background:transparent}.aioseo-radio .form-radio input:checked+.fancy-radio:after{display:block}.aioseo-radio .form-radio input:disabled+.fancy-radio{cursor:default}.aioseo-radio .form-radio input:focus+.fancy-radio{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-radio .form-radio .fancy-radio{border-radius:50%}.aioseo-radio .form-radio .fancy-radio svg{color:#fff;width:16px;height:16px}.aioseo-radio .form-radio span{position:absolute;cursor:pointer;top:0;right:0;left:0;bottom:0;transition:.2s;border-radius:50%;display:flex;align-items:center;justify-content:center}.aioseo-radio .form-radio span:before{position:absolute;content:"";height:26px;width:26px;right:1px;bottom:1px;transition:.2s;font-size:18px;line-height:28px;border-radius:50%}.aioseo-radio.type-1 .form-radio span,.aioseo-radio.type-1 .form-radio span:before{background-color:#f3f4f5}.aioseo-radio.type-2 .form-radio span{border:1px solid #d0d1d7;background-color:#fff}.aioseo-radio.type-2 .form-radio span:before{background-color:#fff}.aioseo-radio.type-2 .form-radio span:after{display:none;position:absolute;content:"";height:10px;width:10px;right:8px;bottom:8px;background-color:#fff;transition:.2s;border-radius:50%}.aioseo-radio.disabled{cursor:default}.aioseo-radio.disabled.type-2 .form-radio input:checked+.fancy-radio{background-color:#e8e8eb;border-color:#d0d1d7}.aioseo-radio.disabled.type-2 .form-radio span,.aioseo-radio.disabled.type-2 .form-radio span:before{background-color:#e8e8eb}.aioseo-radio.disabled.type-2 .form-radio span:after{background-color:#8c8f9a}.aioseo-radio-toggle{display:flex;align-items:center;height:40px}.aioseo-radio-toggle div{height:100%}.aioseo-radio-toggle.inline{display:inline-flex}.aioseo-radio-toggle div:first-child{overflow:hidden;border-radius:0 3px 3px 0}.aioseo-radio-toggle div:first-child label{border-radius:0 3px 3px 0}.aioseo-radio-toggle div:last-child{overflow:hidden;border-radius:3px 0 0 3px}.aioseo-radio-toggle div:last-child label{border-radius:3px 0 0 3px}.aioseo-radio-toggle input{position:absolute!important;clip:rect(0,0,0,0);height:1px;width:1px;border:0;overflow:hidden}.aioseo-radio-toggle input:checked+label{background-color:#005ae0;color:#fff}.aioseo-radio-toggle input:checked+label.dark{background-color:#434960;color:#fff}.aioseo-radio-toggle label{height:100%;background-color:#e8e8eb;color:#141b38;font-size:14px;line-height:1;display:flex;align-items:center;justify-content:center;flex-direction:column;transition:all .1s ease-in-out;position:relative;padding:11px 20px;font-weight:600}.aioseo-radio-toggle label.disabled{cursor:default;pointer-events:none;opacity:.5}.aioseo-radio-toggle label:hover{background-color:#dadadf;cursor:pointer}.aioseo-radio-toggle label p{position:absolute;bottom:15px;margin:0}.aioseo-radio-toggle.circle label{background:#fff;color:#8c8f9a}.aioseo-radio-toggle.circle input+label{border-radius:50%;width:36px;height:36px;padding:8px}.aioseo-radio-toggle.circle input:checked+label{background:#e8e8eb;color:#2c324c}.aioseo-select{height:48px}.aioseo-select.multiselect--disabled .multiselect__select{background:none}.aioseo-select .multiselect__select{display:flex;align-items:center;justify-content:center;min-height:46px}.aioseo-select .multiselect__select:before{display:none}.aioseo-select .multiselect__select svg.aioseo-caret{color:#141b38;width:18px;height:18px;transition:transform .3s}.aioseo-select .multiselect__tags{height:100%;border:1px solid #d0d1d7;border-radius:3px;display:flex;justify-content:center;flex-direction:column;padding:16px 16px 16px 40px}.aioseo-select .multiselect__tags .multiselect__spinner{height:calc(100% - 2px);border:2px solid transparent}.aioseo-select .multiselect__tags .multiselect__spinner:after,.aioseo-select .multiselect__tags .multiselect__spinner:before{border-top-color:#434960}.aioseo-select .multiselect__tags .multiselect__single{display:inline-flex;margin:0;padding:0;color:#141b38;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.aioseo-select .multiselect__tags .multiselect__placeholder{color:#8c8f9a;font-size:16px;line-height:20px;margin:0;padding:0}.aioseo-select .multiselect__tags .multiselect__input{padding:0;margin:0 0 0 10px;border-radius:0;border:none;color:#141b38;min-height:auto;line-height:20px}.aioseo-select .multiselect__tags .multiselect__input:focus{outline:0;box-shadow:none;border:none}.aioseo-select .multiselect__tags .multiselect__input::-moz-placeholder{color:#8c8f9a}.aioseo-select .multiselect__tags .multiselect__input:-ms-input-placeholder{color:#8c8f9a}.aioseo-select .multiselect__tags .multiselect__input::placeholder{color:#8c8f9a}.aioseo-select .multiselect__tags .multiselect__tags-wrap{display:flex;align-items:center;flex-wrap:wrap}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag{padding:0;display:inline-flex;align-items:center;font-size:14px;font-weight:600;color:#434960;margin:0 0 0 3px;height:24px;background-color:#f3f4f5;flex-shrink:0}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-value{padding:0 10px 0 5px}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove{padding:0 10px;height:100%;cursor:pointer;background-color:#f3f4f5;display:flex;align-items:center}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove:hover{background-color:#434960;color:#fff}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove:hover svg.aioseo-close{color:#fff}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove svg.aioseo-close{color:#434960;width:10px;height:10px}.aioseo-select.multiselect--active .multiselect__tags-wrap{margin-bottom:7px}.aioseo-select.small{height:30px;min-height:30px}.aioseo-select.small .multiselect__tags{min-height:30px;padding:8px 8px 8px 38px}.aioseo-select.small .multiselect__tags .multiselect__placeholder{font-size:14px}.aioseo-select.small .multiselect__select{height:28px;min-height:28px}.aioseo-select.small .multiselect__input{font-size:14px}.aioseo-select.small .multiselect__content-wrapper li.multiselect__element .multiselect__option{font-size:14px;padding:8px;min-height:30px}.aioseo-select.medium{height:40px}.aioseo-select.medium .multiselect__tags{padding:7px 7px 7px 40px}.aioseo-select.medium .multiselect__select{min-height:38px}.aioseo-select.multiple{min-height:48px;height:auto}.aioseo-select.multiple.small{min-height:30px}.aioseo-select.multiple.medium{min-height:40px}.aioseo-select.multiselect--above .multiselect__content-wrapper{border-top:1px solid #d0d1d7;border-bottom:none}.aioseo-select .multiselect__content-wrapper{border:1px solid #d0d1d7;border-top:none;border-bottom-right-radius:3px;border-bottom-left-radius:3px;z-index:50;-webkit-overflow-scrolling:touch}.aioseo-select .multiselect__content-wrapper .multiselect__content{max-width:100%}.aioseo-select .multiselect__content-wrapper li.multiselect__element{margin:0;border-bottom:1px solid #e8e8eb}.aioseo-select .multiselect__content-wrapper li.multiselect__element.last{border-bottom:none}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option{color:#141b38;font-weight:700;font-size:16px;white-space:normal;line-height:1.4}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--highlight{background-color:#f2f7fd}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--highlight:after{background-color:#005ae0;color:#fff}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--selected{background-color:#f2f7fd}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--disabled{font-weight:400;background-color:#fff!important;color:#8c8f9a}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option .docLink{font-size:13px;float:left}.aioseo-textarea-autosize{width:100%;background-color:#fff;border:1px solid #d0d1d7;border-radius:4px;font-size:16px;padding:12px}.aioseo-toggle{display:inline-flex}.aioseo-toggle:active,.aioseo-toggle:focus{outline:2px solid transparent}.aioseo-toggle.disabled{pointer-events:none}.aioseo-toggle.disabled .toggle-content{opacity:.5}.aioseo-toggle .toggle-content{position:relative;display:inline-block;width:36px;height:20px;margin-left:10px}.aioseo-toggle .toggle-content input{display:none}.aioseo-toggle .toggle-content input:checked+.toggle-switch{border:1px solid #005ae0;background-color:#005ae0}.aioseo-toggle .toggle-content input:checked+.toggle-switch:focus{outline:2px solid transparent}.aioseo-toggle .toggle-content input:checked+.toggle-switch:before{background-color:#fff;transform:translateX(-15px)}.aioseo-toggle .toggle-content input:focus+.toggle-switch{box-shadow:0 0 1px #005ae0;outline:2px solid transparent}.aioseo-toggle .toggle-content .toggle-switch{position:absolute;cursor:pointer;top:0;right:0;left:0;bottom:0;background-color:#fff;border:1px solid #d0d1d7;border-radius:15px;transition:.2s}.aioseo-toggle .toggle-content .toggle-switch:before{position:absolute;content:"";height:14px;width:14px;right:3px;bottom:2px;background-color:#d0d1d7;border-radius:50%;transition:.2s}.aioseo-wp-table input[type=search],.aioseo-wp-table select{border-color:#d0d1d7}.aioseo-wp-table select:focus{border-color:#005ae0;color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-wp-table select:hover{color:#005ae0}.aioseo-wp-table input.button,.aioseo-wp-table input.button:hover{color:#005ae0;border-color:#005ae0}.aioseo-wp-table .header .subsubsub{color:#555d66;font-size:13px;font-weight:600}.aioseo-wp-table .header .subsubsub>span{display:inline-flex}.aioseo-wp-table .header .subsubsub .separator{margin:0 5px}.aioseo-wp-table .header .subsubsub .active{font-weight:700;color:#141b38}.aioseo-wp-table .header .subsubsub a{text-decoration:none}.aioseo-wp-table .header .subsubsub a:hover{text-decoration:underline}.aioseo-wp-table .header .search{display:flex;justify-content:flex-end}.aioseo-wp-table .header .search .aioseo-input{width:100%;max-width:215px;margin-left:6px}.aioseo-wp-table .header .pagination{color:#555d66}.aioseo-wp-table .header .pagination .button,.aioseo-wp-table .header .pagination input{margin-right:6px}.aioseo-wp-table .tablenav-pages .current-page{padding:0 8px 0 0}.aioseo-wp-table .wp-table{width:100%;position:relative}.aioseo-wp-table .wp-table .loader-overlay{position:absolute;top:46px;left:0;bottom:36px;right:0;background:rgba(0,0,0,.3);z-index:1;display:flex;align-items:center;justify-content:center}.aioseo-wp-table .wp-table .no-results{color:#8c8f9a;min-height:200px;display:flex;align-items:center;justify-content:center;font-weight:400;font-size:24px}.aioseo-wp-table .wp-table tr.even{background-color:#f9f9fa}.aioseo-wp-table .wp-table tr.enabled td,.aioseo-wp-table .wp-table tr.enabled td strong a{color:#141b38}.aioseo-wp-table .wp-table tr:not(.enabled):not(.edit-row) td,.aioseo-wp-table .wp-table tr:not(.enabled):not(.edit-row) td a.edit-link{color:#8c8f9a}.aioseo-wp-table .wp-table tr.edit-row th{padding:0 3px 0 0}.aioseo-wp-table .wp-table tr.edit-row td{padding:0 10px 0 30px}.aioseo-wp-table .wp-table tr td strong a{font-weight:400}.aioseo-wp-table .wp-table tr td .row-actions .edit a,.aioseo-wp-table .wp-table tr td strong a:hover{color:#005ae0}.aioseo-wp-table .wp-table tr td .row-actions .edit .trash a{color:#df2a4a}.aioseo-wp-table .wp-table tr td.edit-row-content .wrapper .border{padding:8px 0;border-top:1px solid #e8e8eb}.custom-rules[data-v-06a772d2]{width:100%}.custom-rules .rule-table[data-v-06a772d2]{margin-top:5px;border:1px solid #d0d1d7;border-radius:3px;width:100%;font-family:Helvetica;font-size:14px;font-style:normal;font-weight:400;line-height:21px;letter-spacing:0;text-align:right}.custom-rules .rule-table .rule[data-v-06a772d2]{padding:13px;background:#f9f9fa}.custom-rules .rule-table .rule.even[data-v-06a772d2]{background-color:#fff}.custom-rules .rule[data-v-06a772d2]{display:flex;flex-direction:row;align-items:center;padding-top:10px}.custom-rules .rule[data-v-06a772d2]:first-child{border-radius:3px 3px 0 0}.custom-rules .rule[data-v-06a772d2]:last-child{border-radius:0 0 3px 3px}.custom-rules .rule .rule-settings>.aioseo-select[data-v-06a772d2]:first-child{width:250px;min-width:250px}.custom-rules .rule .rule-settings[data-v-06a772d2]{display:flex;flex-direction:row;align-items:center;flex:1}.custom-rules .rule .rule-settings>[data-v-06a772d2]{margin:0 0 0 6px}.custom-rules .rule .rule-settings>.aioseo-toggle[data-v-06a772d2]{margin:0 4px 0 10px}.custom-rules .rule .actions[data-v-06a772d2],.custom-rules .rule .logical[data-v-06a772d2]{flex:0}.custom-rules svg[data-v-06a772d2]{width:14px;height:14px;cursor:pointer}.custom-rules svg.aioseo-trash[data-v-06a772d2]{color:#dadada}.custom-rules svg.aioseo-trash[data-v-06a772d2]:hover{color:#df2a4a}.custom-rules .aioseo-tooltip[data-v-06a772d2]{margin:0;display:flex}.custom-rules .aioseo-button svg[data-v-06a772d2]{color:#fff}.custom-rules .add-rule[data-v-06a772d2]{margin-top:10px}.custom-rules .add-rule svg[data-v-06a772d2]{margin-left:6px}.aioseo-add-redirection.edit-url{margin-bottom:30px}.aioseo-add-redirection.edit-url .urls{align-items:flex-start}.aioseo-add-redirection.edit-url .urls .url-arrow{margin:-8px 30px 0}.aioseo-add-redirection.edit-url .advanced-settings-link{text-decoration:underline;margin-top:21px}.aioseo-add-redirection.log-404 .urls .source{min-height:103px;align-items:flex-start}.aioseo-add-redirection .generic-error{margin-bottom:20px}.aioseo-add-redirection .aioseo-settings-row .settings-name .name{font-size:14px}.aioseo-add-redirection .urls{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap}.aioseo-add-redirection .urls .break{flex-basis:100%;height:0}.aioseo-add-redirection .urls .url-arrow{width:36px;margin:-15px 30px 0;display:flex;align-items:center;justify-content:center}.aioseo-add-redirection .urls .url-arrow svg{height:103px;color:#005ae0}.aioseo-add-redirection .urls .source,.aioseo-add-redirection .urls .target{flex:1;display:flex;align-items:center}.aioseo-add-redirection .urls .source>*,.aioseo-add-redirection .urls .target>*{flex:1}.aioseo-add-redirection .urls .source .aioseo-input,.aioseo-add-redirection .urls .target .aioseo-input{margin-bottom:10px}.aioseo-add-redirection .urls .target .aioseo-description{height:30px}.aioseo-add-redirection .urls .target .append-icon{width:60px;justify-content:flex-end}.aioseo-add-redirection .urls .target .append-icon svg{max-width:16px;margin-left:5px}.aioseo-add-redirection .urls .target .append-icon svg:last-of-type{margin-left:0}.aioseo-add-redirection .urls .target .append-icon svg.aioseo-circle-check{color:#00aa63}.aioseo-add-redirection .urls .target .append-icon svg.aioseo-circle-close{color:#df2a4a}.aioseo-add-redirection .urls .target .target-url-error,.aioseo-add-redirection .urls .target .target-url-warning{margin-bottom:10px}.aioseo-add-redirection .settings{display:flex;flex-direction:column;align-items:center;margin-top:30px}.aioseo-add-redirection .settings .all-settings{width:100%}.aioseo-add-redirection .settings .all-settings .all-settings-content{display:flex;align-items:center;flex-wrap:wrap}.aioseo-add-redirection .settings .all-settings .all-settings-content .advanced-settings-link{margin:16px 16px 0 0;color:#8c8f9a}@media (max-width:767px){.aioseo-add-redirection .settings .all-settings .all-settings-content{align-items:start}}.aioseo-add-redirection .settings>.actions{align-self:flex-end;margin-top:-50px}.aioseo-add-redirection .settings>.actions.advanced{margin-top:-40px}.aioseo-add-redirection .settings .query-params,.aioseo-add-redirection .settings .redirect-type{margin-bottom:10px;flex:0 1 auto}.aioseo-add-redirection .settings .query-params .aioseo-select,.aioseo-add-redirection .settings .redirect-type .aioseo-select{margin-top:5px}.aioseo-add-redirection .settings .query-params{width:340px}.aioseo-add-redirection .settings .redirect-type{width:300px;margin-left:24px}.aioseo-add-redirection .settings .aioseo-button{align-self:flex-end}.aioseo-add-redirection .settings .cancel-edit-row{margin-right:10px}.aioseo-add-redirection-target-url,.aioseo-redirect-source-url{position:relative}.aioseo-redirect-source-url .aioseo-input input{padding-left:76px}.aioseo-redirect-source-url .aioseo-input .append-icon{width:60px;justify-content:flex-end}.aioseo-redirect-source-url .aioseo-input .append-icon svg{max-width:16px;margin-left:5px}.aioseo-redirect-source-url .aioseo-input .append-icon svg:last-of-type{margin-left:0}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-gear{color:#8c8f9a;cursor:pointer}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-gear.active,.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-gear:hover{color:#005ae0}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-circle-check{color:#00aa63}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-circle-close{color:#df2a4a}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-trash{color:#8c8f9a;cursor:pointer}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-trash.active,.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-trash:hover{color:#df2a4a}.aioseo-redirect-source-url .source-url-error,.aioseo-redirect-source-url .source-url-warning{margin-bottom:10px}.aioseo-redirect-source-url .source-url-options>div{padding-bottom:5px}.aioseo-redirect-source-url .source-url-options>div>div{margin-bottom:5px}.aioseo-add-redirection-url-results{display:flex;position:absolute;background:#fff;width:100%;max-height:300px;overflow:auto;border:1px solid #d0d1d7;border-radius:3px;z-index:50;right:1px;margin-top:-9px}.aioseo-add-redirection-url-results ul{display:inline-block;max-width:100%;list-style:none;padding:0;margin:0;min-width:100%;vertical-align:top}.aioseo-add-redirection-url-results ul li{margin:0;border-bottom:1px solid #e8e8eb;display:block}.aioseo-add-redirection-url-results ul li:last-of-type{border-bottom:none}.aioseo-add-redirection-url-results ul li>span{color:#141b38;font-weight:700;font-size:16px;white-space:normal;line-height:1.4;display:flex;padding:12px;min-height:40px;text-decoration:none;text-transform:none;vertical-align:middle;position:relative;cursor:pointer}.aioseo-add-redirection-url-results ul li>span:hover{background-color:#f2f7fd}.aioseo-add-redirection-url-results ul li>span:hover .option-title{color:#005ae0}.aioseo-add-redirection-url-results .option{flex:1}.aioseo-add-redirection-url-results .option .option-title{font-weight:500;display:flex;font-size:16px;color:#141b38}.aioseo-add-redirection-url-results .option .option-title>div{margin-left:5px}.aioseo-add-redirection-url-results .option .option-title>div:first-of-type{display:inline-block}.aioseo-add-redirection-url-results .option .option-title .search-term{font-weight:700}.aioseo-add-redirection-url-results .option .option-details{display:flex;align-items:center;font-size:14px;color:#8c8f9a}.aioseo-add-redirection-url-results .option .option-details span{margin-left:15px}.aioseo-add-redirection-url-results .option-permalink{display:flex;align-items:center}.aioseo-add-redirection-url-results .option-permalink svg.aioseo-external{width:15px;height:15px;color:#434960}.aioseo-add-template-tag{border-radius:3px;padding:5px 10px;color:#141b38;font-size:14px;border:1px solid #e8e8eb;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-weight:600}.aioseo-add-template-tag:hover{background-color:#f3f4f5}.aioseo-add-template-tag svg.aioseo-plus{width:10px;height:10px;color:#005ae0}.aioseo-additional-pages .additional-pages-table{border:1px solid #d0d1d7;border-radius:3px;margin-bottom:20px}.aioseo-additional-pages .additional-pages-table .page-priority{max-width:110px}.aioseo-additional-pages .additional-pages-table .page-frequency{max-width:166px}.aioseo-additional-pages .additional-pages-table .page-last-modified{max-width:155px}.aioseo-additional-pages .additional-pages-table .page-actions{max-width:20px}.aioseo-additional-pages .additional-pages-table .page-actions .aioseo-tooltip{display:inline-block;margin:0}.aioseo-additional-pages .additional-pages-table .pages-header{height:50px;display:flex;font-size:14px;padding:0 30px;align-items:center;border-bottom:1px solid #d0d1d7}.aioseo-additional-pages .additional-pages-table .pages-header>div{flex:1 0 auto}.aioseo-additional-pages .additional-pages-table .pages-rows{font-size:14px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row{background-color:#fff;height:70px;display:flex;align-items:center;padding:0 30px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row:last-of-type{border-radius:0 0 3px 3px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row.even{background-color:#f9f9fa}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row>div{flex:1 0 auto;padding-left:30px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row>div:last-child{padding-left:0}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row .page-actions svg.aioseo-trash{width:20px;height:20px;color:#8c8f9a;cursor:pointer;transition:color .1s ease}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row .page-actions svg.aioseo-trash:hover{color:#df2a4a}.aioseo-additional-pages svg.aioseo-circle-plus{width:14px;height:14px;margin-left:10px}.aioseo-alert{position:relative;border-radius:3px;padding:24px;font-size:16px;color:#141b38;line-height:1.4}.aioseo-alert.small{padding:8px;font-size:13px}.aioseo-alert .aioseo-alert-close{cursor:pointer;position:absolute;top:-9px;left:-9px;width:18px;height:18px;border-radius:50%;padding:5px;display:inline-flex;justify-content:center;align-content:center}.aioseo-alert .aioseo-alert-close svg{width:100%;height:100%}.aioseo-alert.blue{border:1px solid #005ae0;background-color:#f2f7fd}.aioseo-alert.blue .aioseo-alert-close{background-color:#005ae0;color:#fff}.aioseo-alert.green{border:1px solid #00aa63;background-color:#f2fdf8}.aioseo-alert.green .aioseo-alert-close{background-color:#00aa63;color:#fff}.aioseo-alert.red{border:1px solid #df2a4a;background-color:#fbe9ec}.aioseo-alert.red .aioseo-alert-close{background-color:#df2a4a;color:#fff}.aioseo-alert.yellow{border:1px solid #f18200;background-color:#fcfae8}.aioseo-alert.yellow .aioseo-alert-close{background-color:#f18200;color:#fff}.aioseo-alert.no-border{border-width:0}.aioseo-alert.text-center{text-align:center}.aioseo-analyze-competitor-site-score{border:1px solid #00aa63;border-radius:3px;color:#00aa63;font-size:14px;padding:0 8px;height:24px;display:inline-flex;align-items:center;justify-content:center;margin-left:14px}.aioseo-analyze-competitor-site-score.red{color:#df2a4a;border-color:#df2a4a}.aioseo-analyze-competitor-site-score.orange{color:#f18200;border-color:#f18200}.aioseo-animated-dannie{display:flex;align-content:center;align-items:center;justify-content:center}.aioseo-animated-dannie svg{max-width:250px}.aioseo-api-bar{height:40px;background-color:#df2a4a;color:#fff;font-size:13px;padding:0 40px 0 14px}.aioseo-api-bar,.aioseo-api-bar .upgrade-text{display:flex;align-items:center;justify-content:center}.aioseo-api-bar .upgrade-text{flex:1}.aioseo-api-bar strong{font-weight:600}.aioseo-api-bar svg.aioseo-logo-gear{width:20px;height:20px;min-width:20px;margin-left:14px}.aioseo-api-bar svg.aioseo-close{cursor:pointer;width:12px;height:12px}.aioseo-api-bar a{color:#fff;text-decoration:underline}.aioseo-api-bar a:hover{text-decoration:none}@media screen and (max-width:782px){.aioseo-api-bar{padding:0 10px;height:60px}}.aioseo-attributes ul.aioseo-attributes-list[data-v-02af7dd2]{list-style:inside;list-style-type:disc;margin:20px 0 0}.aioseo-attributes ul.aioseo-attributes-list li[data-v-02af7dd2]{display:flex;margin-bottom:8px;align-items:flex-start}.aioseo-attributes ul.aioseo-attributes-list li div[data-v-02af7dd2]:first-of-type{flex:0 0 140px}.aioseo-blur{filter:blur(3px);pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.aioseo-card{color:#141b38;background-color:#fff;border:1px solid #e8e8eb;box-shadow:0 2px 5px rgba(0,0,0,.05);margin:30px 0}.aioseo-card.disabled .content{background:#f9f9fa;font-size:16px;line-height:24px}@media only screen and (max-width:782px){.aioseo-card{margin:20px 0}}.aioseo-card svg.aioseo-circle-question-mark{width:17px;height:17px;color:#8c8f99;transition:background-color .2s ease}.aioseo-card svg.aioseo-circle-question-mark:hover{color:#5a5c65}.aioseo-card .header{display:flex;align-items:center;height:70px;padding:0 30px;font-weight:600;font-size:18px;border-bottom:1px solid #e8e8eb}.aioseo-card .header .header-icon{display:flex}.aioseo-card .header .header-icon svg{width:24px;height:24px;margin-left:16px}.aioseo-card .header .text{flex:1 0 auto;display:flex;align-items:center}.aioseo-card .header .text svg.aioseo-circle-question-mark{cursor:pointer;width:17px;height:17px}.aioseo-card .header .text .aioseo-pro-badge{margin-right:10px}.aioseo-card .header .text .card-score{display:flex;flex:1;align-items:center;justify-content:flex-end;padding-left:18px;font-size:13px}.aioseo-card .header .text .card-score.green{color:#00aa63}.aioseo-card .header .text .card-score.orange{color:#f18200}.aioseo-card .header .text .card-score.red{color:#df2a4a}.aioseo-card .header .text .card-score svg{margin-left:7px}.aioseo-card .header svg.aioseo-caret{width:24px;height:24px;cursor:pointer;transform:rotate(180deg);transition:transform .3s}.aioseo-card .header svg.aioseo-caret.rotated{transform:rotate(90deg)}.aioseo-card .header svg.aioseo-close{width:14px;height:14px;cursor:pointer}.aioseo-card .content{padding:30px;position:relative}.aioseo-card div.aioseo-settings-row:last-child{margin-bottom:0;border-bottom:none;padding-bottom:0}.aioseo-copy-block{display:inline-flex}.aioseo-copy-block .message{background-color:#fff;min-height:56px;display:flex;align-items:center;border:1px solid #dcdde1;border-radius:0 3px 3px 0;padding:10px 24px;font-weight:600}.aioseo-copy-block .copy-tooltip{display:flex}.aioseo-copy-block .copy{background-color:#fff;min-height:56px;display:flex;align-items:center;border:1px solid #dcdde1;border-right-width:0;border-radius:3px 0 0 3px;padding:10px 16px;font-weight:600;cursor:pointer}.aioseo-copy-block .copy:hover svg.aioseo-copy{color:#a7a7a7}.aioseo-copy-block .copy svg.aioseo-copy{width:20px;height:20px;color:#dadada}.aioseo-copy-block .copy svg.aioseo-circle-check-solid{width:20px;height:20px;color:#00aa63}.aioseo-display-info .aioseo-box-toggle svg{margin-top:-15px;color:#434960}.aioseo-display-info svg.aioseo-new-page,.aioseo-display-info svg.aioseo-shortcode,.aioseo-display-info svg.aioseo-widget{width:100%;height:auto;max-width:60px}.aioseo-display-info svg.aioseo-gutenberg-block{width:59px;height:54px}.aioseo-display-info svg.aioseo-gutenberg-block rect{width:100%;width:56px;height:51px}.aioseo-display-info svg.aioseo-php{width:110px}.aioseo-display-info .copy-box,.aioseo-display-info .extra-box{margin-top:10px;padding:30px;border-radius:3px;background-color:#f9f9fa}.aioseo-display-info .copy-box .aioseo-description,.aioseo-display-info .extra-box .aioseo-description{margin:0}.aioseo-display-info .copy-box .aioseo-copy-block,.aioseo-display-info .extra-box .aioseo-copy-block{margin:20px 0 0}.aioseo-display-info .copy-box .advanced-settings-link,.aioseo-display-info .extra-box .advanced-settings-link{display:inline-block;padding-top:5px;margin:16px 16px 0 0;color:#8c8f9a;text-decoration:underline;font-size:13px}.aioseo-display-info .copy-box .advanced-settings-link:hover,.aioseo-display-info .extra-box .advanced-settings-link:hover{text-decoration:none}.aioseo-display-info .copy-box .advanced-settings,.aioseo-display-info .extra-box .advanced-settings{padding-top:20px}.aioseo-display-info .advanced-settings.advanced-settings-hidden{display:none}.aioseo-display-info .aioseo-tooltip{margin-right:0}.aioseo-exclude-posts{display:flex}.aioseo-facebook-preview{background-color:#f0f2f5;padding:30px;display:flex;align-items:center;justify-content:center}.aioseo-facebook-preview .facebook-post{width:100%;max-width:525px;border-radius:10px;box-shadow:0 2px 5px rgba(0,0,0,.1);background-color:#fff}.aioseo-facebook-preview .facebook-post .facebook-header{height:65px;padding:0 18px;display:flex;align-items:center}.aioseo-facebook-preview .facebook-post .facebook-header .profile-photo{overflow:hidden;width:40px;height:40px;border:1px solid #e8e8eb;border-radius:50%}.aioseo-facebook-preview .facebook-post .facebook-header .profile-photo img{height:100%;width:100%}.aioseo-facebook-preview .facebook-post .facebook-header .poster{margin-right:10px;flex:1 0 auto}.aioseo-facebook-preview .facebook-post .facebook-header .poster .poster-name{font-size:15px;color:#050505;font-weight:500}.aioseo-facebook-preview .facebook-post .facebook-header .poster .poster-date{color:#65676b;font-size:13px}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis{display:inline-flex;align-items:center}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis div{background-color:#5e666f;width:4px;height:4px;border-radius:50%;margin:0 2px}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis div:first-child{margin-right:0}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis div:last-child{margin-left:0}.aioseo-facebook-preview .facebook-post .facebook-content{display:flex;flex-direction:column}.aioseo-facebook-preview .facebook-post .facebook-content img{width:100%;height:auto}.aioseo-facebook-preview .facebook-post .facebook-content.vertical{flex-direction:row}.aioseo-facebook-preview .facebook-post .facebook-content.vertical img{max-width:158px;max-height:158px;width:auto;height:auto}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description{flex:1;background-color:#f2f3f5;padding:9px 13px;color:#606770}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description .site-domain{font-size:13px;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description .site-title{color:#1d2129;font-size:17px;font-weight:600;margin:5px 0}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description .site-description{font-size:14px}.aioseo-facebook-preview .facebook-post .facebook-footer{height:24px}.aioseo-feature-card{height:100%;border:1px solid #e8e8eb;background:#fff;box-shadow:0 2px 5px rgba(0,0,0,.05);color:#141b38;display:flex;flex-direction:column}.aioseo-feature-card .feature-card-body{padding:30px 30px 20px;flex:1}.aioseo-feature-card .feature-card-body.static{padding:30px}.aioseo-feature-card .feature-card-body .feature-card-header{display:flex;align-items:center;font-size:18px;font-weight:600;margin-bottom:16px}.aioseo-feature-card .feature-card-body .feature-card-header img,.aioseo-feature-card .feature-card-body .feature-card-header svg{width:28px;height:28px;margin-left:10px}.aioseo-feature-card .feature-card-body .feature-card-description{color:#434960;font-size:15px}.aioseo-feature-card .feature-card-body .feature-card-description .learn-more{margin-top:10px}.aioseo-feature-card .feature-card-footer{padding:15px}.aioseo-feature-card .feature-card-footer:not(.upgrade-required){border:2px solid #fff;background-color:#f9f9fa;padding:12px;min-height:43px}.aioseo-feature-card .feature-card-footer .feature-card-install-activate{display:flex;align-items:center;justify-content:flex-end;height:30px;position:relative}.aioseo-feature-card .feature-card-footer .feature-card-install-activate .aioseo-loading-spinner{position:absolute;right:0}.aioseo-feature-card .feature-card-footer .feature-card-install-activate .status{font-weight:600;font-size:14px}.aioseo-feature-card .feature-card-footer .feature-card-install-activate .aioseo-toggle .toggle-content{margin-left:0;margin-right:10px}.aioseo-feature-card .feature-card-footer .feature-card-upgrade-cta{display:flex;align-items:center;justify-content:flex-end}.aioseo-feature-card .feature-card-footer.installed .feature-card-install-activate .status{color:#8c8f9a}.aioseo-setup-wizard-container{margin-top:30px;margin-bottom:50px;padding:30px;color:#fff;position:relative;background-color:#005ae0}@media only screen and (max-width:782px){.aioseo-setup-wizard-container{margin-top:20px}}.aioseo-setup-wizard-container p{color:#fff}.aioseo-setup-wizard-container .getting-started-wrapper{display:flex}.aioseo-setup-wizard-container .getting-started-wrapper .video{flex:0 0 533px;margin:20px 20px 0}.aioseo-setup-wizard-container .getting-started-wrapper .video .wrapper{padding-bottom:56.25%;margin-bottom:-60px;position:relative;height:0}.aioseo-setup-wizard-container .getting-started-wrapper .video .wrapper iframe{width:100%;height:100%;position:absolute;top:0;right:0}@media only screen and (max-width:1350px){.aioseo-setup-wizard-container .getting-started-wrapper .video{flex:0 0 593px;margin:20px;align-self:center}.aioseo-setup-wizard-container .getting-started-wrapper .video .wrapper{margin-bottom:0}.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions .aioseo-col{flex-basis:100%;max-width:100%;justify-content:center}}@media only screen and (max-width:1300px){.aioseo-setup-wizard-container .getting-started-wrapper{flex-direction:row;flex-wrap:wrap}.aioseo-setup-wizard-container .getting-started-wrapper .video{margin:20px 0 -60px}.aioseo-setup-wizard-container .getting-started-wrapper .text,.aioseo-setup-wizard-container .getting-started-wrapper .video{flex-basis:100%;width:100%}.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions{justify-content:center}.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions .aioseo-col{flex-basis:inherit;max-width:inherit;justify-content:center}}@media only screen and (max-width:782px){.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions .aioseo-col{flex-basis:100%;max-width:100%;justify-content:center}}.aioseo-setup-wizard-container .aioseo-row{position:relative;z-index:1}.aioseo-setup-wizard-container .wizard-actions .aioseo-col{display:flex;align-items:center}.aioseo-setup-wizard-container .wizard-actions .aioseo-button svg{width:16px;height:16px;margin-left:10px}.aioseo-setup-wizard-container .setup-wizard-bg{width:100%;height:100%;overflow:hidden;z-index:0;position:absolute;top:0;right:0}.aioseo-setup-wizard-container .setup-wizard-bg svg.aioseo-setup-wizard-bg,.aioseo-setup-wizard-container .setup-wizard-bg svg.aioseo-setup-wizard-bg rect{width:auto;height:100%}.aioseo-setup-wizard-container .close-wizard{color:#fff;width:20px;height:20px;position:absolute;left:20px;top:20px;z-index:1;display:flex;align-items:center;justify-content:center}.aioseo-setup-wizard-container .close-wizard:hover{color:#ccc}.aioseo-setup-wizard-container .close-wizard svg.aioseo-close{width:12px;height:12px;cursor:pointer;color:#fff}.aioseo-setup-wizard-container .close-wizard svg.aioseo-close:hover{color:#dadada}.aioseo-setup-wizard-container p.how-to-get-started{margin:0}.aioseo-setup-wizard-container p.welcome-text{line-height:1.6}.aioseo-setup-wizard-container h2{color:#fff;line-height:1.4}.aioseo-setup-wizard-container a{color:#fff}.aioseo-setup-wizard-container svg.aioseo-book{width:20px;height:20px;margin:0 0 0 10px}.aioseo-setup-wizard-container .getting-started-video{padding-left:20px;margin-bottom:-60px;position:relative;height:0;padding-bottom:56.25%}.aioseo-setup-wizard-container .getting-started-video iframe{width:100%;height:100%;position:absolute;top:0;right:0}.aioseo-google-search-preview{padding:32px 30px;border:1px solid #e8e8eb}.aioseo-google-search-preview .domain{font-size:14px;line-height:1.3;color:#3c4043;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.aioseo-google-search-preview .site-title{font-size:20px;line-height:1.3;color:#1a0dab;margin:3px 0}.aioseo-google-search-preview .meta-description{max-width:600px;font-size:14px;line-height:1.4;color:#52565a}.edit-post-sidebar .domain{font-size:13px}.edit-post-sidebar .site-title{font-size:16px}.edit-post-sidebar .meta-description{font-size:12px}.aioseo-modal-content .domain,.aioseo-modal-content .meta-description{font-size:14px}.aioseo-modal-content .site-title{font-size:20px}html:not([data-scroll="0"]) .aioseo-header{box-shadow:0 2px 5px rgba(0,0,0,.05);transition:box-shadow .6s}.aioseo-header{position:fixed;z-index:1051;top:0;left:0;right:0;background-color:#fff;height:72px;color:#141b38}.aioseo-header .mascot{width:35px;height:auto;margin-left:10px}.aioseo-header .aioseo-header-content{padding:0;display:flex;height:72px;align-items:center}.aioseo-header .aioseo-header-content a:focus{box-shadow:none}.aioseo-header .aioseo-header-content svg.aioseo-logo{height:26px;margin-left:10px}.aioseo-header .aioseo-header-content .spacer{display:inline-flex;width:26.25px;height:0;border:1px solid #d0d1d7;transform:rotate(72.26deg)}.aioseo-header .aioseo-header-content .page-name{display:inline-flex;margin-right:10px;font-size:18px;font-weight:400;flex:1 0 auto}.aioseo-header .aioseo-header-content .header-actions{display:flex}.aioseo-header .aioseo-header-content .header-actions .round{position:relative;background-color:#f3f4f5;border-radius:50%;width:40px;height:40px;display:flex;align-items:center;justify-content:center;margin-right:10px;cursor:pointer;transition:background-color .2s ease}.aioseo-header .aioseo-header-content .header-actions .round svg{width:20px;height:20px}.aioseo-header .aioseo-header-content .header-actions .round:hover{background-color:#e5e7e9}.aioseo-header .aioseo-header-content .header-actions .number{position:absolute;background-color:#df2a4a;width:16px;height:16px;font-weight:600;font-size:10px;color:#fff;top:-8px;right:50%;transform:translateX(50%);margin:0;-webkit-animation:bounce 2s 5;animation:bounce 2s 5}.aioseo-header .aioseo-header-content .header-actions .number:hover{background-color:#df2a4a}@-webkit-keyframes bounce{0%,25%,50%,75%,to{transform:translateX(50%) translateY(0)}40%{transform:translateX(50%) translateY(-8px)}60%{transform:translateX(50%) translateY(-4px)}}@keyframes bounce{0%,25%,50%,75%,to{transform:translateX(50%) translateY(0)}40%{transform:translateX(50%) translateY(-8px)}60%{transform:translateX(50%) translateY(-4px)}}body.modal-open{overflow:hidden}.aioseo-help{display:block;position:fixed;top:0;bottom:0;right:0;left:0;height:100%;width:100vw;background-color:#fff;color:#8c8f9a;opacity:0;max-height:100vh;overflow-y:auto;transition:opacity .3s ease-in 0s;z-index:-999}.aioseo-help.visible{opacity:1;z-index:100000}.aioseo-help .aioseo-help-header{background:#fff;width:100%;height:60px;z-index:1;padding:20px;display:flex}.aioseo-help .aioseo-help-header>.logo{flex:1}.aioseo-help .aioseo-help-docs{margin-bottom:25px;display:none}.aioseo-help .aioseo-help-docs li{padding:0 4px 14px 0;margin:0}.aioseo-help .aioseo-help-docs .aioseo-help-docs-viewall{margin:10px 0 0}.aioseo-help .aioseo-help-docs .aioseo-help-additional-docs{display:none}.aioseo-help .aioseo-help-docs .aioseo-help-additional-docs.opened{display:block}.aioseo-help .aioseo-help-docs .icon .aioseo-description{width:20px;margin-top:0;position:relative;top:5px;right:-5px;color:#8c8f9a}.aioseo-help .help-content{background-color:#fff;width:100%;max-width:740px;margin:0 auto 50px;padding:0 20px;box-sizing:border-box;z-index:1}.aioseo-help .help-content .aioseo-help-category{border-top:1px solid #e8e8eb;margin:0}.aioseo-help .help-content .aioseo-help-category:last-child{border-bottom:1px solid #e8e8eb}.aioseo-help .help-content .aioseo-help-category header{display:block;position:relative;cursor:pointer;width:100%;height:68px}.aioseo-help .help-content .aioseo-help-category header .title{display:block;font-size:16px;color:#8c8f9a;font-weight:600;padding:23px 30px 23px 11px}.aioseo-help .help-content .aioseo-help-category .folder-open{position:absolute;top:24px;width:20px;height:20px;color:#8c8f9a}.aioseo-help .help-content .aioseo-help-category .dashicons-arrow-right-alt2{position:absolute;top:20px;left:0;transition:transform .3s ease-out}.aioseo-help .help-content .aioseo-help-category.opened .aioseo-help-docs{display:block}.aioseo-help .help-content .aioseo-help-category.opened .dashicons-arrow-right-alt2{transform:rotate(-90deg)}.aioseo-help .help-content #aioseo-help-search{position:relative;background-color:#fff;text-align:center;top:0;padding:20px 0 50px}.aioseo-help .help-content #aioseo-help-result .aioseo-help-docs{display:block}.aioseo-help .help-content #aioseo-help-footer{display:flex;flex-wrap:nowrap;justify-content:space-between;align-items:center;margin:50px 0 0}@media screen and (max-width:750px){.aioseo-help .help-content #aioseo-help-footer{display:block}}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block{box-sizing:border-box;max-width:325px;border:1px solid #8c8f9a;border-radius:6px;text-align:center}@media screen and (max-width:750px){.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block{max-width:100%}}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block:first-child{margin-left:20px}@media screen and (max-width:750px){.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block:first-child{margin:0 0 20px}}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a{display:block;padding:25px;text-decoration:none;color:#8c8f9a}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a h3{color:#8c8f9a}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a span{font-size:16px;color:#005ae0;text-decoration:underline}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a:hover span{text-decoration:none}.aioseo-help .help-content #aioseo-help-footer .aioseo-description,.aioseo-help .help-content #aioseo-help-footer .aioseo-support{width:48px;margin-top:0;color:#8c8f9a}#aioseo-help-logo{width:132px;height:26px;z-index:2}#aioseo-help-close{width:20px;height:20px;cursor:pointer;opacity:.7;transition:all .05s;z-index:2}@media screen and (max-width:750px){#aioseo-help-close{top:20px;left:20px}}.aioseo-html-tags-editor .no-access{margin-bottom:20px}.aioseo-html-tags-editor .aioseo-description.tags-description{margin:0 0 20px}.aioseo-html-tags-editor .add-tags{display:flex;align-items:center;margin-bottom:20px}.aioseo-html-tags-editor .add-tags div{margin-left:10px}.aioseo-html-tags-editor .add-tags a{font-size:14px}.aioseo-html-tags-editor .add-tags a.no-underline{padding-right:10px}.aioseo-loading-spinner{width:35px;height:35px;position:absolute}.aioseo-loading-spinner .double-bounce1,.aioseo-loading-spinner .double-bounce2{width:100%;height:100%;border-radius:50%;background-color:#fff;opacity:.6;position:absolute;top:0;right:0;-webkit-animation:sk-bounce 1.3s ease-in-out infinite;animation:sk-bounce 1.3s ease-in-out infinite}.aioseo-loading-spinner.dark .double-bounce1,.aioseo-loading-spinner.dark .double-bounce2{background-color:#8c8f9a}.aioseo-loading-spinner .double-bounce2{-webkit-animation-delay:-.65s;animation-delay:-.65s}@-webkit-keyframes sk-bounce{0%,to{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,to{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}body.vue-build{margin:0}body.vue-build .aioseo-app{min-height:calc(100vh - 88px)}body.vue-build .aioseo-app .aioseo-main{padding-bottom:30px}body.aioseo-setup-wizard{margin:0;padding:0}body.aioseo-setup-wizard .aioseo-app{min-height:100vh;width:100%}body[class*=page_aioseo] .aioseo-header,body[class*=page_aioseo] .aioseo-notifications .overlay{right:160px}body[class*=page_aioseo].folded .aioseo-header,body[class*=page_aioseo].folded .aioseo-notifications .overlay{right:36px}body[class*=page_aioseo] #wpcontent{padding:0;background-color:#f3f4f5}body[class*=page_aioseo] .update-nag{display:none}body[class*=page_aioseo].admin-bar .aioseo-app{min-height:calc(100vh - 185px)}body[class*=page_aioseo].admin-bar.aioseo-has-bar .aioseo-app{min-height:calc(100vh - 225px)}body[class*=page_aioseo].admin-bar .aioseo-header,body[class*=page_aioseo].admin-bar .aioseo-notifications .notification-menu,body[class*=page_aioseo].admin-bar .aioseo-notifications .overlay{top:32px}body[class*=page_aioseo] .aioseo-app{min-height:calc(100vh - 153px)}body[class*=page_aioseo].aioseo-has-bar .aioseo-app{min-height:calc(100vh - 193px)}body[class*=page_aioseo].aioseo-has-bar .aioseo-header{height:112px}@media screen and (max-width:782px){body[class*=page_aioseo].aioseo-has-bar .aioseo-header{height:132px}}@media screen and (max-width:960px){body[class*=page_aioseo].auto-fold .aioseo-header,body[class*=page_aioseo].auto-fold .aioseo-notifications .overlay{right:36px}}@media screen and (max-width:782px){body[class*=page_aioseo] #wpbody-content{padding-bottom:20px}body[class*=page_aioseo].admin-bar .aioseo-app{min-height:calc(100vh - 199px)}body[class*=page_aioseo].admin-bar .aioseo-header,body[class*=page_aioseo].admin-bar .aioseo-notifications .notification-menu,body[class*=page_aioseo].admin-bar .aioseo-notifications .overlay{top:46px}body[class*=page_aioseo] .aioseo-header,body[class*=page_aioseo] .aioseo-notifications .overlay,body[class*=page_aioseo].auto-fold .aioseo-header,body[class*=page_aioseo].auto-fold .aioseo-notifications .overlay{right:0}}@media screen and (max-width:600px){body[class*=page_aioseo].admin-bar .aioseo-header,body[class*=page_aioseo].admin-bar .aioseo-notifications .menu,body[class*=page_aioseo].admin-bar .aioseo-notifications .overlay{position:absolute;top:46px}}body.aioseo-has-bar .aioseo-app .aioseo-main>.aioseo-container{margin-top:128px}@media screen and (max-width:782px){body.aioseo-has-bar .aioseo-app .aioseo-main>.aioseo-container{margin-top:148px}}.aioseo-app{box-sizing:border-box;background-color:#f3f4f5}.aioseo-app .route-fade-enter-active,.aioseo-app .route-fade-leave-active{transition:all .2s}.aioseo-app .route-fade-enter,.aioseo-app .route-fade-leave-active{opacity:0}.aioseo-app .route-fade-enter{transform:translateX(-30px)}.aioseo-app .route-fade-leave-active{transform:translateX(30px)}.aioseo-app *,.aioseo-app :after,.aioseo-app :before{box-sizing:inherit}.aioseo-app * :not(.aioseo-button):not(.aioseo-input),.aioseo-app :after :not(.aioseo-button):not(.aioseo-input),.aioseo-app :before :not(.aioseo-button):not(.aioseo-input){line-height:1.4}.aioseo-app p{font-size:16px}.aioseo-app a:not(.aioseo-button){color:#005ae0}.aioseo-app a:not(.aioseo-button).text-white{color:#fff}.aioseo-app a:not(.aioseo-button).no-underline,.aioseo-app a:not(.aioseo-button):hover{text-decoration:none}.aioseo-app h2{font-size:32px;margin:0}.aioseo-app .aioseo-main{height:100%}.aioseo-app .aioseo-main>.aioseo-container{margin-top:88px}.aioseo-app .aioseo-main .save-changes{display:flex;justify-content:flex-end}.aioseo-app .d-flex{display:flex}.aioseo-app .aioseo-section-description{font-size:16px;color:#141b38;line-height:1.8;padding-bottom:30px}.aioseo-app .aioseo-description-text{font-size:14px;line-height:1.8;color:#141b38}.aioseo-app .aioseo-description-text.aioseo-error{color:#df2a4a}.aioseo-app .aioseo-description{font-size:14px;line-height:1.8;margin:8px 0 0;color:#141b38}.aioseo-app .aioseo-description.no-margin{margin:0}.aioseo-app .aioseo-description.aioseo-error{color:#df2a4a}.aioseo-app .max-recommended-count{color:#434960;text-align:left;margin-top:10px;font-size:14px}.aioseo-app .max-recommended-count strong.error{color:#df2a4a}.aioseo-app .popper{text-align:right;font-size:12px;padding:20px;background-color:#fff;border:none;border-radius:3px;box-shadow:0 3px 4.8px 0 rgba(32,71,102,.27);z-index:9999;max-width:350px;line-height:1.4}.aioseo-app .popper.action{padding:8px 12px;background-color:#141b38;color:#fff}.aioseo-app .popper.action .popper__arrow{border-top-color:#141b38}.aioseo-app .popper[x-placement^=bottom]{box-shadow:0 -2px 4.8px 0 rgba(32,71,102,.27)}.aioseo-app .popper .aioseo-description{margin:0}.aioseo-app .aioseo-row-highlight{-webkit-animation-name:color;animation-name:color;-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-iteration-count:2;animation-iteration-count:2}@-webkit-keyframes color{0%{background-color:#fff}50%{background-color:#00aa63}to{background-color:#fff}}@keyframes color{0%{background-color:#fff}50%{background-color:#00aa63}to{background-color:#fff}}.column-aioseo-details{position:relative}.aioseo-seo-site-score .aioseo-blur{display:flex;align-items:center}.aioseo-seo-site-score .aioseo-seo-site-score-cta{position:absolute;right:50%;top:50%;transform:translateX(50%) translateY(-50%);background-color:#fff;padding:24px 30px;border:1px solid #e8e8eb;box-shadow:0 2px 10px rgba(0,90,224,.2);color:#141b38;font-size:16px;font-weight:600;width:82%;max-width:500px;text-align:center}.aioseo-app .aioseo-upgrade-bar{height:40px;background-color:#00aa63;display:flex;align-items:center;justify-content:center;color:#fff;font-size:13px;padding:0 40px 0 14px}.aioseo-app .aioseo-upgrade-bar .upgrade-text{display:flex;align-items:center;flex:1;justify-content:center}.aioseo-app .aioseo-upgrade-bar .upgrade-arrow{font-size:15px;text-decoration:none}.aioseo-app .aioseo-upgrade-bar .upgrade-arrow:hover{text-decoration:none}.aioseo-app .aioseo-upgrade-bar strong{font-weight:600}.aioseo-app .aioseo-upgrade-bar svg.aioseo-logo-gear{width:20px;height:20px;min-width:20px;margin-left:14px}.aioseo-app .aioseo-upgrade-bar svg.aioseo-close{cursor:pointer;width:12px;height:12px}.aioseo-app .aioseo-upgrade-bar a{color:#fff;text-decoration:underline}.aioseo-app .aioseo-upgrade-bar a:hover{text-decoration:none}@media screen and (max-width:782px){.aioseo-app .aioseo-upgrade-bar{padding:0 10px;height:60px}}.field-description[data-v-2bfc1de2]{display:inline-block;margin-top:10px;font-size:14px}.aioseo-address-wrapper[data-v-4bc9bbe6]{display:flex;max-width:500px}.field-description[data-v-4bc9bbe6]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-4bc9bbe6]{margin-top:8px}.field-description[data-v-a0a894b8]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-a0a894b8]{margin-top:8px}.field-description[data-v-4fb4e044]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-4fb4e044]{margin-top:8px}.field-description[data-v-85733554]{display:inline-block;margin-top:10px;font-size:14px}.field-description[data-v-515336a2]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-515336a2]{margin-top:8px}.field-description[data-v-78337de7]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-78337de7]{margin-top:8px}.aioseo-general-settings .more-tooltip-text strong{color:#00aa63}.aioseo-general-settings .license-cta-box{border-radius:3px;background-color:#f2f7fd;padding:20px;max-width:630px;margin:10px 0 30px}.aioseo-general-settings .license-cta-box a{color:#00aa63}.aioseo-general-settings .license-cta-box div{font-weight:600}.aioseo-general-settings .license-cta-box span{font-size:14px;font-style:italic}.aioseo-general-settings .license-key{margin-top:10px;display:flex;max-width:560px}.aioseo-general-settings .license-key .aioseo-input{margin-left:10px}.aioseo-app .aioseo-tabs.internal{margin-bottom:0}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation{margin-top:5px}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation .md-button{height:60px}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple{padding:0 25px}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple .md-ripple-wave{display:none}.aioseo-app .aioseo-tabs.skinny .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple{padding:0 16px}.aioseo-app .md-tabs{display:flex;flex-direction:column}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation{margin-top:2px;background:transparent;display:flex;position:relative;justify-content:flex-start}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation.md-elevation-0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button{color:#141b38;max-width:264px;min-width:72px;height:60px;margin:0;border-radius:0;font-size:15px;font-weight:500;padding:0;display:inline-block;position:relative;overflow:hidden;outline:none;background:transparent;border:0;transition:.4s cubic-bezier(.4,0,.2,1);font-family:inherit;line-height:normal;text-decoration:none;vertical-align:top;white-space:nowrap}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:before{position:absolute;top:0;left:0;bottom:0;right:0;opacity:0;transition:.4s cubic-bezier(.4,0,.2,1);will-change:background-color,opacity;content:" "}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple{padding:0 18px;display:flex;justify-content:center;align-items:center;width:100%;height:100%;position:relative;overflow:hidden;-webkit-mask-image:radial-gradient(circle,#fff 100%,#000 0);mask-image:radial-gradient(circle,#fff 100%,#000 0)}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple .md-button-content{position:static;z-index:2}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:not([disabled]){cursor:pointer}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:not([disabled]):active:before,.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:not([disabled]):hover:before{background-color:currentColor;opacity:.12}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button.md-active{color:#005ae0}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button.md-active:focus{outline:none;box-shadow:none}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-tabs-indicator{height:2px;background-color:#005ae0;bottom:-2px;position:absolute;right:0;transform:translateZ(0);will-change:left,right}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-tabs-indicator.md-tabs-indicator-left{transition:right .3s cubic-bezier(.4,0,.2,1),left .35s cubic-bezier(.4,0,.2,1)}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-tabs-indicator.md-tabs-indicator-right{transition:left .3s cubic-bezier(.4,0,.2,1),right .35s cubic-bezier(.4,0,.2,.1)}.aioseo-app .aioseo-tabs{display:flex;border-bottom:2px solid #e8e8eb;position:relative;margin-bottom:38px}.aioseo-app .aioseo-tabs .save-changes{position:absolute;left:0;bottom:10px}.aioseo-app .aioseo-tabs .tab-score{display:inline-flex;align-items:center;justify-content:flex-end;font-size:11px;font-weight:700;padding-right:12px}.aioseo-app .aioseo-tabs .tab-score.green{color:#00aa63}.aioseo-app .aioseo-tabs .tab-score.orange{color:#f18200}.aioseo-app .aioseo-tabs .tab-score.red{color:#df2a4a}.aioseo-app .aioseo-tabs .tab-score svg{display:inline;margin-left:7px}.aioseo-app .aioseo-mobile-tabs{position:relative;height:40px;margin-top:20px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.aioseo-app .aioseo-mobile-tabs .active-tab{color:#005ae0;padding-right:18px;min-height:100%;display:flex;align-items:center;cursor:pointer}.aioseo-app .aioseo-mobile-tabs .active-tab div{position:relative}.aioseo-app .aioseo-mobile-tabs .active-tab div span{height:2px;background-color:#005ae0;bottom:-7px;position:absolute;right:-18px;left:-18px;z-index:10}.aioseo-app .aioseo-mobile-tabs .active-tab svg.aioseo-caret{width:24px;height:24px;position:relative;top:6px;cursor:pointer;transition:transform .3s}.aioseo-app .aioseo-mobile-tabs .active-tab svg.aioseo-caret.rotated{transform:rotate(-180deg)}.aioseo-app .aioseo-mobile-tabs .tab-dropdown{border:1px solid #e8e8eb;border-top:none}.aioseo-app .aioseo-mobile-tabs .tab-links{background:#fff;position:relative;z-index:3;padding:8px;width:100%;max-width:300px}@media screen and (max-width:782px){.aioseo-app .aioseo-mobile-tabs .tab-links{max-width:100%}}.aioseo-app .aioseo-mobile-tabs .tab-links a{padding:10px;display:block;color:#141b38;text-decoration:none}.aioseo-app .aioseo-mobile-tabs .tab-links a:hover{color:#005ae0}.md-tooltip{background-color:#141b38!important;color:#fff!important;border-radius:2px;padding:6px 12px;font-size:14px}.md-tooltip:after{content:"";position:absolute;top:100%;right:50%;margin-right:-5px;border:5px solid transparent;border-top-color:#141b38}.modal-mask{position:fixed;z-index:9998;top:0;right:0;width:100%;height:100%;background-color:rgba(20,27,56,.3);display:table;transition:opacity .3s ease}@media screen and (max-width:520px){.modal-mask{display:block;top:46px}}.modal-mask .modal-wrapper{display:table-cell;vertical-align:middle}@media screen and (max-width:520px){.modal-mask .modal-wrapper{display:block;height:100%}}.modal-mask .modal-wrapper .modal-container{width:100%;max-width:750px;max-height:90vh;overflow-y:hidden;overflow-x:hidden;margin:0 auto;background-color:#fff;box-shadow:0 10px 30px rgba(0,0,0,.15);transition:all .3s ease}@media screen and (max-width:520px){.modal-mask .modal-wrapper .modal-container{width:100%;max-width:100%;max-height:calc(100vh - 46px);height:100%}}.modal-mask .modal-wrapper .modal-container .modal-header{color:#141b38;position:sticky;top:0;z-index:15;padding:0 40px 0 0;height:70px;font-size:20px;font-weight:700;line-height:1.4;border-bottom:1px solid #e8e8eb;background-color:#fff;display:flex;align-items:center}@media screen and (max-width:520px){.modal-mask .modal-wrapper .modal-container .modal-header{padding:15px 20px 0 0}}.modal-mask .modal-wrapper .modal-container .modal-header button.close{position:absolute;left:11px;top:11px;width:24px;height:24px;background-color:#fff;border:none;display:flex;align-items:center}.modal-mask .modal-wrapper .modal-container .modal-header button.close svg.aioseo-close{cursor:pointer;width:14px;height:14px}.modal-mask .modal-wrapper .modal-container .modal-body .aioseo-post-general,.modal-mask .modal-wrapper .modal-container .modal-body .aioseo-post-social{height:calc(90vh - 120px);max-height:600px;overflow-y:auto;overflow-x:hidden}.modal-mask .modal-wrapper .modal-container .modal-body .aioseo-modal-content.has-padding{padding:40px}@media screen and (max-width:520px){.modal-mask .modal-wrapper .modal-container .aioseo-modal-content,.modal-mask .modal-wrapper .modal-container .aioseo-modal-content>.component-wrapper,.modal-mask .modal-wrapper .modal-container .modal-body,.modal-mask .modal-wrapper .modal-container .modal-body>div{height:100%}.modal-mask .modal-wrapper .modal-container .aioseo-modal-content>.component-wrapper{display:flex;align-items:flex-end}.modal-mask .modal-wrapper .modal-container .aioseo-post-general,.modal-mask .modal-wrapper .modal-container .aioseo-post-social{height:100%!important;max-height:100%!important;padding:20px!important}.modal-mask .modal-wrapper .modal-container .aioseo-post-general .mobile-radio-buttons,.modal-mask .modal-wrapper .modal-container .aioseo-post-social .mobile-radio-buttons{margin-bottom:0}.modal-mask .modal-wrapper .modal-container .aioseo-add-template-tag{display:none}.modal-mask .modal-wrapper .modal-container .tab-facebook .aioseo-settings-row:last-of-type,.modal-mask .modal-wrapper .modal-container .tab-twitter .aioseo-settings-row:last-of-type{margin-bottom:64px!important;padding-bottom:32px!important}}.modal-enter,.modal-leave-active{opacity:0}.modal-enter .modal-container,.modal-leave-active .modal-container{transform:scale(1.1)}.aioseo-notification>div .body .title .date{font-weight:400;color:#8c8f9a;font-size:12px}.aioseo-notification-cards .aioseo-notification:last-child>div{border-bottom:none;margin-bottom:none}.aioseo-notification-cards .no-notifications{display:flex;align-items:center;flex-direction:column;padding-top:100px;font-size:16px;color:#8c8f9a}.aioseo-notification-cards .no-notifications img{width:30%;height:auto}.aioseo-notification-cards .no-notifications .great-scott{margin:20px 0 10px;font-size:24px;font-weight:600;color:#434960}.aioseo-notification-cards .no-notifications .no-new-notifications{margin-bottom:10px}body.aioseo-show-notifications .aioseo-main{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.aioseo-notifications a.dismiss{color:#8c8f9a;font-size:14px}.aioseo-notifications .notification-menu{height:100%;width:100%;max-width:570px;position:fixed;z-index:1053;top:0;left:0;bottom:0;background-color:#fff;overflow-x:hidden;transition:.5s}.aioseo-notifications .notification-menu .notification-header{height:70px;display:flex;align-items:center;padding:0 30px;color:#fff;background-color:#005ae0}.aioseo-notifications .notification-menu .notification-header .new-notifications{font-size:18px;font-weight:600}.aioseo-notifications .notification-menu .notification-header .dismissed-notifications{margin-right:25px;flex:1 1 auto}.aioseo-notifications .notification-menu .notification-header .dismissed-notifications a{font-size:14px;color:#fff}.aioseo-notifications .notification-menu .notification-header svg.aioseo-close{width:14px;height:14px;cursor:pointer}.aioseo-notifications .notification-menu .notification-header svg.aioseo-close:hover{color:#ccc}.aioseo-notifications .notification-menu .notification-cards{padding:30px;height:calc(100% - 192px);overflow:auto}.aioseo-notifications .notification-menu .notification-footer{height:90px;padding:30px;display:flex;align-items:center}.aioseo-notifications .notification-menu .notification-footer div.pagination{flex:1;display:flex;align-items:center}.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number{font-size:13px;color:#141b38;background:#e8e8eb;height:30px;width:30px;display:flex;align-items:center;justify-content:center;border-radius:2px;margin-left:4px;cursor:pointer}.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number:last-child{margin-left:0}.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number.active,.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number:hover{color:#fff;background-color:#005ae0}.aioseo-notifications .overlay{position:fixed;z-index:1052;top:0;left:0;bottom:0;right:160px;background-color:#141b38;opacity:.5;transition:.5s}.aioseo-notifications .notifications-fade-enter-active,.aioseo-notifications .notifications-fade-leave-active{transition:opacity .5s}.aioseo-notifications .notifications-fade-enter,.aioseo-notifications .notifications-fade-leave-to{opacity:0}.aioseo-notifications .notifications-slide-enter-active,.aioseo-notifications .notifications-slide-leave-active{transition:all .5s ease-in-out}.aioseo-notifications .notifications-slide-enter,.aioseo-notifications .notifications-slide-leave-to{left:-570px}.aioseo-post-type-options-toggle{margin-top:20px}.aioseo-priority-score{max-width:350px}.aioseo-priority-score .header-row{font-size:14px}.aioseo-pro-badge{height:24px;border-radius:3px;background:#e8e8eb;color:#434960;font-size:14px;font-weight:600;display:inline-flex;padding:0 8px;align-items:center}.aioseo-score-settings{display:flex;align-items:center;padding-bottom:14px}.aioseo-score-settings svg{margin-left:7px}.aioseo-score-settings span{margin-left:12px}.aioseo-score-button{display:inline-block;padding:5px 8px;font-size:14px;font-weight:700;color:#a1a1a1;border:1px solid #a1a1a1;border-radius:3px}.aioseo-score-button.score-none,.aioseo-score-button.score-red{border-color:#df2a4a;color:#df2a4a!important}.aioseo-score-button.score-orange{border-color:#f18200;color:#f18200!important}.aioseo-score-button.score-green{border-color:#00aa63;color:#00aa63!important}.aioseo-score-button.classic-editor{background:#fff!important;display:inline-block!important;height:auto!important}.aioseo-score-button.classic-editor span{margin-left:0}.aioseo-seo-site-analysis-result{border:1px solid #dcdde1;margin-top:10px}.aioseo-seo-site-analysis-result .result-header{height:66px;padding:0 20px;display:flex;align-items:center}.aioseo-seo-site-analysis-result .result-header .result-icon{display:flex;align-items:center;margin-left:16px}.aioseo-seo-site-analysis-result .result-header .result-icon svg{width:24px;height:24px;color:#8c8f9a}.aioseo-seo-site-analysis-result .result-header .result-icon svg.passed{color:#00aa63}.aioseo-seo-site-analysis-result .result-header .result-icon svg.error{color:#df2a4a}.aioseo-seo-site-analysis-result .result-header .result-icon svg.warning{color:#005ae0}.aioseo-seo-site-analysis-result .result-header .result-content{font-size:16px;font-weight:600;flex:1}.aioseo-seo-site-analysis-result .result-header .result-toggle{width:30px;height:26px;border:1px solid #dcdde1;border-radius:3px;display:flex;align-items:center;justify-content:center;cursor:pointer}.aioseo-seo-site-analysis-result .result-header .result-toggle.active,.aioseo-seo-site-analysis-result .result-header .result-toggle:hover{background-color:#434960}.aioseo-seo-site-analysis-result .result-header .result-toggle.active svg,.aioseo-seo-site-analysis-result .result-header .result-toggle:hover svg{color:#fff}.aioseo-seo-site-analysis-result .result-header .result-toggle.active svg{transform:rotate(180deg)}.aioseo-seo-site-analysis-result .result-header .result-toggle svg{width:100%;max-width:20px;height:auto;color:#8c8f9a;transform:rotate(90deg);transition:transform .3s}.aioseo-seo-site-analysis-result .result-body{padding:0 60px 24px}.aioseo-seo-site-analysis-result .result-body .result-message{color:#434960;font-size:16px}.aioseo-seo-site-analysis-result .result-body .result-code-alt pre,.aioseo-seo-site-analysis-result .result-body .result-code pre{background:#f3f4f5;border-radius:3px;max-width:100%;padding:10px;overflow:auto}.aioseo-seo-site-analysis-result .result-body .result-code-alt pre code,.aioseo-seo-site-analysis-result .result-body .result-code pre code{padding:0;background:transparent}.aioseo-seo-site-analysis-result .result-body .result-code pre{white-space:pre-wrap}.aioseo-seo-site-analysis-result .result-body .result-action{margin-top:20px}.aioseo-seo-site-analysis-results .group-header{font-size:16px;font-weight:600}.aioseo-seo-site-analysis-results .group-header:not(:first-child){margin-top:30px}.aioseo-seo-site-analysis-results .group-keywords{display:flex;margin-top:5px;flex-wrap:wrap;align-items:center}.aioseo-seo-site-analysis-results .group-keywords .keyword{font-size:14px;color:#434960;font-weight:600;background:#f3f4f5;padding:9px 10px;border-radius:3px;margin:0 0 5px 10px}.aioseo-seo-site-analysis-results .group-keywords .keyword:first-child{font-size:20px}.aioseo-settings-row{margin-bottom:22px;padding-bottom:16px;border-bottom:1px solid #e8e8eb}.aioseo-settings-row.no-margin{margin-bottom:0}.aioseo-settings-row.small-padding{padding-bottom:5px}.aioseo-settings-row.medium-margin{margin-bottom:15px}.aioseo-settings-row.no-border{border:none}.aioseo-settings-row.no-side-margin{margin-right:0!important;margin-left:0!important}.aioseo-settings-row .settings-name{color:#141b38}.aioseo-settings-row .settings-name .name{font-weight:600;font-size:16px;display:flex;align-items:center}.aioseo-settings-row .settings-name .name.small-margin{margin-bottom:5px}.aioseo-settings-row .settings-name .name.align{line-height:40px}.aioseo-settings-row .settings-name .name.align-small{line-height:30px}.aioseo-settings-row .settings-name .name .aioseo-pro-badge{margin-right:10px}.aioseo-settings-row .settings-name .aioseo-description{margin-top:20px}.aioseo-settings-row .settings-content{font-size:16px}.aioseo-settings-row p.description{font-size:14px}.aioseo-separators{margin-top:-.5rem}.aioseo-separators .aioseo-col .separator{background-color:#f3f4f5;display:flex;align-items:center;justify-content:center;min-height:51px;font-weight:600;font-size:25px;border:1px solid #dcdde1;border-radius:3px;cursor:pointer}.aioseo-separators .aioseo-col .separator:hover{background-color:#e5e7e9}.aioseo-separators .aioseo-col .separator.active{background-color:#005ae0;border-color:#005ae0;color:#fff}.aioseo-separators .aioseo-col .separator.active:hover{background-color:#005ae0}.aioseo-separators .aioseo-col .show-more{height:100%;display:flex;align-items:center}.aioseo-separators .aioseo-col .show-more a{color:#8c8f9a}.aioseo-separators .aioseo-col .custom-separator{margin:20px 0;display:flex;align-items:center}.aioseo-separators .aioseo-col .custom-separator .aioseo-input{margin-right:10px;max-width:100px}.aioseo-sidebar-card .header{height:46px}.aioseo-sidebar-card .header:hover{cursor:pointer}.aioseo-sidebar-card .content{padding-bottom:8px!important}.aioseo-sidebar-card ul{margin-bottom:0}.aioseo-sidebar-card ul li{margin-bottom:16px;padding-right:25px}.aioseo-sidebar-card ul .description{margin:0}.aioseo-robots-meta .global-robots-settings{margin:0;padding-top:24px}.aioseo-robots-meta .global-robots-settings>.settings{padding:8px 0 16px}.aioseo-robots-meta .global-robots-settings-options{display:flex}.aioseo-robots-meta .global-robots-settings-options .max-snippet{margin-left:30px}.aioseo-robots-meta .global-robots-settings-options .max-snippet .aioseo-input{max-width:90px}.aioseo-robots-meta .global-robots-settings-options .max-video-preview{margin-left:30px}.aioseo-robots-meta .global-robots-settings-options .max-video-preview .aioseo-input{max-width:90px}.aioseo-robots-meta .global-robots-settings-options .max-image-preview .aioseo-select{min-width:155px}.aioseo-robots-meta .global-robots-settings-options>span{display:inline-block;margin-bottom:4px}@media screen and (max-width:782px){.aioseo-robots-meta .global-robots-settings-options{display:block}.aioseo-robots-meta .global-robots-settings-options .max-snippet,.aioseo-robots-meta .global-robots-settings-options .max-video-preview{margin-left:0;margin-bottom:20px}.aioseo-robots-meta .global-robots-settings-options>div .aioseo-input,.aioseo-robots-meta .global-robots-settings-options>div .aioseo-select{min-width:100%}}.edit-post-sidebar .global-robots-settings{padding-top:12px}.edit-post-sidebar .global-robots-settings>.settings{padding:4px 0 12px}.edit-post-sidebar .global-robots-settings>.settings label{font-size:16px}.edit-post-sidebar .global-robots-settings .robots-meta-title{padding-top:4px;display:inline-block}.edit-post-sidebar .global-robots-settings-options{flex-wrap:wrap}.edit-post-sidebar .max-snippet{margin-left:30px!important}.edit-post-sidebar .max-video-preview{margin-left:0!important}.edit-post-sidebar .max-image-preview{margin-top:20px!important}.aioseo-score-amount-wrapper{position:absolute;right:0;top:0;left:0;bottom:0;display:flex;align-items:center;justify-content:center;flex-direction:column;color:#141b38;margin:20px}.aioseo-score-amount-wrapper .aioseo-score-amount .score{font-size:64px;font-weight:600}.aioseo-score-amount-wrapper .aioseo-score-amount .total{font-size:18px;color:#8c8f9a;padding-right:3px}.aioseo-score-amount-wrapper .score-description{max-width:80%;text-align:center;font-size:17px;font-weight:600;line-height:1.1}.aioseo-score-amount-wrapper .score-analyzing{margin-top:20px;font-size:30px}.aioseo-site-score-analyze{position:relative;display:flex;align-items:center;justify-content:center;flex:1}.aioseo-site-score-analyze .analyze-errors{text-align:center;margin-bottom:1em}.aioseo-site-score-analyze .aioseo-seo-site-score-score{position:relative;min-width:175px;max-width:217px;margin-left:5em}.aioseo-site-score-analyze .aioseo-seo-site-score-score svg{width:100%;height:auto}.aioseo-site-score-analyze .aioseo-seo-site-score-description h2{line-height:1.4}.aioseo-site-score-analyze .aioseo-seo-site-score-description svg.aioseo-book{width:20px;height:20px;margin:0 0 0 10px;color:#005ae0}.aioseo-site-score-analyze .aioseo-seo-site-score-description>div{font-size:16px;color:#141b38;margin-bottom:10px}.aioseo-site-score-analyze .aioseo-seo-site-score-description .links{margin-top:30px;font-size:14px;font-weight:600}.aioseo-site-score-analyze .aioseo-seo-site-score-description .links .no-underline{padding-right:5px}.aioseo-site-score-competitor{position:relative;display:flex;align-items:center;justify-content:center;flex-direction:column}.aioseo-site-score-competitor .aioseo-seo-site-score-score{position:relative;min-width:175px;max-width:217px;margin-left:1em}.aioseo-site-score-competitor .aioseo-seo-site-score-score svg{width:100%;height:auto}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations{margin:20px 0}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links){display:flex;align-items:center;font-size:14px;color:#141b38;font-weight:600;margin-bottom:10px}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round{position:relative;border-radius:50%;width:24px;min-width:24px;max-width:24px;height:24px;display:flex;align-items:center;justify-content:center;margin-left:10px;font-size:12px;color:#fff;font-weight:600}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.red{background-color:#df2a4a}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.blue{background-color:#005ae0}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.orange{background-color:#f18200}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.green{background-color:#00aa63}.aioseo-site-score-competitor .refresh-results .aioseo-refresh{width:14px;height:14px;margin-left:10px}.aioseo-site-score-competitor .mobile-snapshot{margin-top:60px;max-width:250px}.aioseo-site-score-competitor .mobile-snapshot div{font-weight:600;font-size:16px;margin-bottom:10px}.aioseo-site-score-competitor .mobile-snapshot img{width:100%;height:auto}.aioseo-site-score-dashboard{position:relative;display:flex;align-items:center;justify-content:center}.aioseo-site-score-dashboard .analyze-errors{text-align:center;margin-bottom:1em}.aioseo-site-score-dashboard .aioseo-seo-site-score-score{position:relative;min-width:175px;max-width:217px;margin-left:1em}.aioseo-site-score-dashboard .aioseo-seo-site-score-score svg{width:100%;height:auto}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links){display:flex;align-items:center;font-size:14px;color:#141b38;font-weight:600;margin-bottom:10px}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round{position:relative;border-radius:50%;width:24px;min-width:24px;max-width:24px;height:24px;display:flex;align-items:center;justify-content:center;margin-left:10px;font-size:12px;color:#fff;font-weight:600}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.red{background-color:#df2a4a}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.blue{background-color:#005ae0}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.orange{background-color:#f18200}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.green{background-color:#00aa63}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations .links{margin-top:30px;font-size:14px;font-weight:600}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations .links .no-underline{padding-right:5px}.aioseo-social-profiles .same-username .use-same{padding:30px;background:#f9f9fa}.aioseo-social-profiles .same-username .use-same .aioseo-checkbox{font-size:16px}.aioseo-social-profiles .aioseo-social-profile-list,.aioseo-social-profiles .same-username .use-same .aioseo-settings-row,.aioseo-social-profiles .same-username .use-same .profiles{margin-top:20px}.aioseo-social-profiles .aioseo-social-profile-list .social-profile{margin-bottom:0;padding-bottom:0;border-bottom:none}.aioseo-social-profiles .aioseo-social-profile-list .social-profile .profile-error{margin-top:10px}.aioseo-social-profiles .aioseo-social-profile-list .social-profile .name{margin-bottom:0}.aioseo-social-profiles .aioseo-social-profile-list .social-profile img{height:16px;width:auto;margin-left:10px}.aioseo-tooltip{margin-right:14px;display:inline-flex}.aioseo-tooltip,.aioseo-twitter-preview{align-items:center;justify-content:center}.aioseo-twitter-preview{background-color:#f0f2f5;padding:30px;display:flex}.aioseo-twitter-preview .twitter-post{width:100%;max-width:500px;border-radius:5px;border:1px solid #e1e8ed;background-color:#fff}.aioseo-twitter-preview .twitter-post .twitter-header{height:65px;padding:0 18px;display:flex;align-items:center}.aioseo-twitter-preview .twitter-post .twitter-header .profile-photo{overflow:hidden;width:40px;height:40px;border:1px solid #e8e8eb;border-radius:50%}.aioseo-twitter-preview .twitter-post .twitter-header .profile-photo img{height:100%;width:100%}.aioseo-twitter-preview .twitter-post .twitter-header .poster{margin-right:10px;flex:1 0 auto}.aioseo-twitter-preview .twitter-post .twitter-header .poster .poster-name{font-size:15px;color:#1c2022;font-weight:600}.aioseo-twitter-preview .twitter-post .twitter-header .poster .poster-username{color:#697882;font-weight:500;font-size:13px}.aioseo-twitter-preview .twitter-post .twitter-container{padding:0 20px 20px}.aioseo-twitter-preview .twitter-post .twitter-container.summary .twitter-content{flex-direction:row}.aioseo-twitter-preview .twitter-post .twitter-container.summary .twitter-content .twitter-image-preview{display:flex;align-items:center;justify-content:center;background-color:#e1e8ed;min-width:125px;min-height:125px;background-size:cover;background-repeat:no-repeat;background-position:50%}.aioseo-twitter-preview .twitter-post .twitter-container.summary .twitter-content .twitter-image-preview svg.aioseo-book{width:50px;height:50px;color:#8999a5}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content{border-radius:10px;overflow:hidden;display:flex;flex-direction:column;border:1px solid #e1e8ed}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content img{width:100%;height:auto}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description{padding:18px;color:#1c2022}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description .site-domain{font-size:14px;color:#8899a6;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description .site-title{font-size:15px;font-weight:600}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description .site-description{font-size:14px;margin:5px 0}.aioseo-col .reverse{flex-direction:column-reverse}.aioseo-col.col-xs,.aioseo-col.col-xs-1,.aioseo-col.col-xs-2,.aioseo-col.col-xs-3,.aioseo-col.col-xs-4,.aioseo-col.col-xs-5,.aioseo-col.col-xs-6,.aioseo-col.col-xs-7,.aioseo-col.col-xs-8,.aioseo-col.col-xs-9,.aioseo-col.col-xs-10,.aioseo-col.col-xs-11,.aioseo-col.col-xs-12,.aioseo-col.col-xs-offset-0,.aioseo-col.col-xs-offset-1,.aioseo-col.col-xs-offset-2,.aioseo-col.col-xs-offset-3,.aioseo-col.col-xs-offset-4,.aioseo-col.col-xs-offset-5,.aioseo-col.col-xs-offset-6,.aioseo-col.col-xs-offset-7,.aioseo-col.col-xs-offset-8,.aioseo-col.col-xs-offset-9,.aioseo-col.col-xs-offset-10,.aioseo-col.col-xs-offset-11,.aioseo-col.col-xs-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-xs{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-xs-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-xs-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-xs-3{flex-basis:25%;max-width:25%}.aioseo-col.col-xs-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-xs-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-xs-6{flex-basis:50%;max-width:50%}.aioseo-col.col-xs-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-xs-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-xs-9{flex-basis:75%;max-width:75%}.aioseo-col.col-xs-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-xs-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-xs-12{flex-basis:100%;max-width:100%}.aioseo-col.col-xs-offset-0{margin-right:0}.aioseo-col.col-xs-offset-1{margin-right:8.33333333%}.aioseo-col.col-xs-offset-2{margin-right:16.66666667%}.aioseo-col.col-xs-offset-3{margin-right:25%}.aioseo-col.col-xs-offset-4{margin-right:33.33333333%}.aioseo-col.col-xs-offset-5{margin-right:41.66666667%}.aioseo-col.col-xs-offset-6{margin-right:50%}.aioseo-col.col-xs-offset-7{margin-right:58.33333333%}.aioseo-col.col-xs-offset-8{margin-right:66.66666667%}.aioseo-col.col-xs-offset-9{margin-right:75%}.aioseo-col.col-xs-offset-10{margin-right:83.33333333%}.aioseo-col.col-xs-offset-11{margin-right:91.66666667%}.aioseo-col.first-xs{order:-1}.aioseo-col.last-xs{order:1}.aioseo-col.text-xs-left{text-align:right!important;justify-content:flex-start}.aioseo-col.text-xs-center{text-align:center!important;justify-content:center}.aioseo-col.text-xs-right{text-align:left!important;justify-content:flex-end}.aioseo-col.p-0{padding:0!important}.aioseo-col.pt-0,.aioseo-col.py-0{padding-top:0!important}.aioseo-col.pr-0,.aioseo-col.px-0{padding-left:0!important}.aioseo-col.pb-0,.aioseo-col.py-0{padding-bottom:0!important}.aioseo-col.pl-0,.aioseo-col.px-0{padding-right:0!important}.aioseo-col.p-1{padding:.25rem!important}.aioseo-col.pt-1,.aioseo-col.py-1{padding-top:.25rem!important}.aioseo-col.pr-1,.aioseo-col.px-1{padding-left:.25rem!important}.aioseo-col.pb-1,.aioseo-col.py-1{padding-bottom:.25rem!important}.aioseo-col.pl-1,.aioseo-col.px-1{padding-right:.25rem!important}.aioseo-col.p-2{padding:.5rem!important}.aioseo-col.pt-2,.aioseo-col.py-2{padding-top:.5rem!important}.aioseo-col.pr-2,.aioseo-col.px-2{padding-left:.5rem!important}.aioseo-col.pb-2,.aioseo-col.py-2{padding-bottom:.5rem!important}.aioseo-col.pl-2,.aioseo-col.px-2{padding-right:.5rem!important}.aioseo-col.p-3{padding:1rem!important}.aioseo-col.pt-3,.aioseo-col.py-3{padding-top:1rem!important}.aioseo-col.pr-3,.aioseo-col.px-3{padding-left:1rem!important}.aioseo-col.pb-3,.aioseo-col.py-3{padding-bottom:1rem!important}.aioseo-col.pl-3,.aioseo-col.px-3{padding-right:1rem!important}.aioseo-col.p-4{padding:1.5rem!important}.aioseo-col.pt-4,.aioseo-col.py-4{padding-top:1.5rem!important}.aioseo-col.pr-4,.aioseo-col.px-4{padding-left:1.5rem!important}.aioseo-col.pb-4,.aioseo-col.py-4{padding-bottom:1.5rem!important}.aioseo-col.pl-4,.aioseo-col.px-4{padding-right:1.5rem!important}.aioseo-col.p-5{padding:3rem!important}.aioseo-col.pt-5,.aioseo-col.py-5{padding-top:3rem!important}.aioseo-col.pr-5,.aioseo-col.px-5{padding-left:3rem!important}.aioseo-col.pb-5,.aioseo-col.py-5{padding-bottom:3rem!important}.aioseo-col.pl-5,.aioseo-col.px-5{padding-right:3rem!important}@media only screen and (min-width:782px){.aioseo-col.col-sm,.aioseo-col.col-sm-1,.aioseo-col.col-sm-2,.aioseo-col.col-sm-3,.aioseo-col.col-sm-4,.aioseo-col.col-sm-5,.aioseo-col.col-sm-6,.aioseo-col.col-sm-7,.aioseo-col.col-sm-8,.aioseo-col.col-sm-9,.aioseo-col.col-sm-10,.aioseo-col.col-sm-11,.aioseo-col.col-sm-12,.aioseo-col.col-sm-offset-0,.aioseo-col.col-sm-offset-1,.aioseo-col.col-sm-offset-2,.aioseo-col.col-sm-offset-3,.aioseo-col.col-sm-offset-4,.aioseo-col.col-sm-offset-5,.aioseo-col.col-sm-offset-6,.aioseo-col.col-sm-offset-7,.aioseo-col.col-sm-offset-8,.aioseo-col.col-sm-offset-9,.aioseo-col.col-sm-offset-10,.aioseo-col.col-sm-offset-11,.aioseo-col.col-sm-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-sm{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-sm-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-sm-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-sm-3{flex-basis:25%;max-width:25%}.aioseo-col.col-sm-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-sm-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-sm-6{flex-basis:50%;max-width:50%}.aioseo-col.col-sm-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-sm-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-sm-9{flex-basis:75%;max-width:75%}.aioseo-col.col-sm-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-sm-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-sm-12{flex-basis:100%;max-width:100%}.aioseo-col.col-sm-offset-0{margin-right:0}.aioseo-col.col-sm-offset-1{margin-right:8.33333333%}.aioseo-col.col-sm-offset-2{margin-right:16.66666667%}.aioseo-col.col-sm-offset-3{margin-right:25%}.aioseo-col.col-sm-offset-4{margin-right:33.33333333%}.aioseo-col.col-sm-offset-5{margin-right:41.66666667%}.aioseo-col.col-sm-offset-6{margin-right:50%}.aioseo-col.col-sm-offset-7{margin-right:58.33333333%}.aioseo-col.col-sm-offset-8{margin-right:66.66666667%}.aioseo-col.col-sm-offset-9{margin-right:75%}.aioseo-col.col-sm-offset-10{margin-right:83.33333333%}.aioseo-col.col-sm-offset-11{margin-right:91.66666667%}.aioseo-col.first-sm{order:-1}.aioseo-col.last-sm{order:1}.aioseo-col.text-sm-left{text-align:right!important;justify-content:flex-start}.aioseo-col.text-sm-center{text-align:center!important;justify-content:center}.aioseo-col.text-sm-right{text-align:left!important;justify-content:flex-end}}@media only screen and (min-width:912px){.aioseo-col.col-md,.aioseo-col.col-md-1,.aioseo-col.col-md-2,.aioseo-col.col-md-3,.aioseo-col.col-md-4,.aioseo-col.col-md-5,.aioseo-col.col-md-6,.aioseo-col.col-md-7,.aioseo-col.col-md-8,.aioseo-col.col-md-9,.aioseo-col.col-md-10,.aioseo-col.col-md-11,.aioseo-col.col-md-12,.aioseo-col.col-md-offset-0,.aioseo-col.col-md-offset-1,.aioseo-col.col-md-offset-2,.aioseo-col.col-md-offset-3,.aioseo-col.col-md-offset-4,.aioseo-col.col-md-offset-5,.aioseo-col.col-md-offset-6,.aioseo-col.col-md-offset-7,.aioseo-col.col-md-offset-8,.aioseo-col.col-md-offset-9,.aioseo-col.col-md-offset-10,.aioseo-col.col-md-offset-11,.aioseo-col.col-md-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-md{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-md-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-md-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-md-3{flex-basis:25%;max-width:25%}.aioseo-col.col-md-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-md-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-md-6{flex-basis:50%;max-width:50%}.aioseo-col.col-md-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-md-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-md-9{flex-basis:75%;max-width:75%}.aioseo-col.col-md-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-md-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-md-12{flex-basis:100%;max-width:100%}.aioseo-col.col-md-offset-0{margin-right:0}.aioseo-col.col-md-offset-1{margin-right:8.33333333%}.aioseo-col.col-md-offset-2{margin-right:16.66666667%}.aioseo-col.col-md-offset-3{margin-right:25%}.aioseo-col.col-md-offset-4{margin-right:33.33333333%}.aioseo-col.col-md-offset-5{margin-right:41.66666667%}.aioseo-col.col-md-offset-6{margin-right:50%}.aioseo-col.col-md-offset-7{margin-right:58.33333333%}.aioseo-col.col-md-offset-8{margin-right:66.66666667%}.aioseo-col.col-md-offset-9{margin-right:75%}.aioseo-col.col-md-offset-10{margin-right:83.33333333%}.aioseo-col.col-md-offset-11{margin-right:91.66666667%}.aioseo-col.first-md{order:-1}.aioseo-col.last-md{order:1}.aioseo-col.text-md-left{text-align:right!important;justify-content:flex-start}.aioseo-col.text-md-center{text-align:center!important;justify-content:center}.aioseo-col.text-md-right{text-align:left!important;justify-content:flex-end}}@media only screen and (min-width:1042px){.aioseo-col.col-lg,.aioseo-col.col-lg-1,.aioseo-col.col-lg-2,.aioseo-col.col-lg-3,.aioseo-col.col-lg-4,.aioseo-col.col-lg-5,.aioseo-col.col-lg-6,.aioseo-col.col-lg-7,.aioseo-col.col-lg-8,.aioseo-col.col-lg-9,.aioseo-col.col-lg-10,.aioseo-col.col-lg-11,.aioseo-col.col-lg-12,.aioseo-col.col-lg-offset-0,.aioseo-col.col-lg-offset-1,.aioseo-col.col-lg-offset-2,.aioseo-col.col-lg-offset-3,.aioseo-col.col-lg-offset-4,.aioseo-col.col-lg-offset-5,.aioseo-col.col-lg-offset-6,.aioseo-col.col-lg-offset-7,.aioseo-col.col-lg-offset-8,.aioseo-col.col-lg-offset-9,.aioseo-col.col-lg-offset-10,.aioseo-col.col-lg-offset-11,.aioseo-col.col-lg-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-lg{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-lg-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-lg-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-lg-3{flex-basis:25%;max-width:25%}.aioseo-col.col-lg-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-lg-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-lg-6{flex-basis:50%;max-width:50%}.aioseo-col.col-lg-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-lg-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-lg-9{flex-basis:75%;max-width:75%}.aioseo-col.col-lg-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-lg-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-lg-12{flex-basis:100%;max-width:100%}.aioseo-col.col-lg-offset-0{margin-right:0}.aioseo-col.col-lg-offset-1{margin-right:8.33333333%}.aioseo-col.col-lg-offset-2{margin-right:16.66666667%}.aioseo-col.col-lg-offset-3{margin-right:25%}.aioseo-col.col-lg-offset-4{margin-right:33.33333333%}.aioseo-col.col-lg-offset-5{margin-right:41.66666667%}.aioseo-col.col-lg-offset-6{margin-right:50%}.aioseo-col.col-lg-offset-7{margin-right:58.33333333%}.aioseo-col.col-lg-offset-8{margin-right:66.66666667%}.aioseo-col.col-lg-offset-9{margin-right:75%}.aioseo-col.col-lg-offset-10{margin-right:83.33333333%}.aioseo-col.col-lg-offset-11{margin-right:91.66666667%}.aioseo-col.first-lg{order:-1}.aioseo-col.last-lg{order:1}.aioseo-col.text-lg-left{text-align:right!important;justify-content:flex-start}.aioseo-col.text-lg-center{text-align:center!important;justify-content:center}.aioseo-col.text-lg-right{text-align:left!important;justify-content:flex-end}}@media only screen and (min-width:1140px){.aioseo-col.col-xl,.aioseo-col.col-xl-1,.aioseo-col.col-xl-2,.aioseo-col.col-xl-3,.aioseo-col.col-xl-4,.aioseo-col.col-xl-5,.aioseo-col.col-xl-6,.aioseo-col.col-xl-7,.aioseo-col.col-xl-8,.aioseo-col.col-xl-9,.aioseo-col.col-xl-10,.aioseo-col.col-xl-11,.aioseo-col.col-xl-12,.aioseo-col.col-xl-offset-0,.aioseo-col.col-xl-offset-1,.aioseo-col.col-xl-offset-2,.aioseo-col.col-xl-offset-3,.aioseo-col.col-xl-offset-4,.aioseo-col.col-xl-offset-5,.aioseo-col.col-xl-offset-6,.aioseo-col.col-xl-offset-7,.aioseo-col.col-xl-offset-8,.aioseo-col.col-xl-offset-9,.aioseo-col.col-xl-offset-10,.aioseo-col.col-xl-offset-11,.aioseo-col.col-xl-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-xl{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-xl-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-xl-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-xl-3{flex-basis:25%;max-width:25%}.aioseo-col.col-xl-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-xl-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-xl-6{flex-basis:50%;max-width:50%}.aioseo-col.col-xl-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-xl-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-xl-9{flex-basis:75%;max-width:75%}.aioseo-col.col-xl-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-xl-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-xl-12{flex-basis:100%;max-width:100%}.aioseo-col.col-xl-offset-0{margin-right:0}.aioseo-col.col-xl-offset-1{margin-right:8.33333333%}.aioseo-col.col-xl-offset-2{margin-right:16.66666667%}.aioseo-col.col-xl-offset-3{margin-right:25%}.aioseo-col.col-xl-offset-4{margin-right:33.33333333%}.aioseo-col.col-xl-offset-5{margin-right:41.66666667%}.aioseo-col.col-xl-offset-6{margin-right:50%}.aioseo-col.col-xl-offset-7{margin-right:58.33333333%}.aioseo-col.col-xl-offset-8{margin-right:66.66666667%}.aioseo-col.col-xl-offset-9{margin-right:75%}.aioseo-col.col-xl-offset-10{margin-right:83.33333333%}.aioseo-col.col-xl-offset-11{margin-right:91.66666667%}.aioseo-col.first-xl{order:-1}.aioseo-col.last-xl{order:1}.aioseo-col.text-xl-left{text-align:right!important;justify-content:flex-start}.aioseo-col.text-xl-center{text-align:center!important;justify-content:center}.aioseo-col.text-xl-right{text-align:left!important;justify-content:flex-end}}.aioseo-container,.aioseo-container-fluid{margin-left:auto;margin-right:auto}.aioseo-container{padding:0 20px}.aioseo-container-fluid.hero,.aioseo-container.hero{min-height:100vh;display:flex;justify-content:center;align-items:center}.aioseo-container-fluid{padding-left:2rem;padding-right:2rem}@media only screen and (min-width:782px){.aioseo-container{padding:0 30px}}@media only screen and (min-width:1042px){.aioseo-container{max-width:80rem}.aioseo-container.full-width{max-width:100%}.aioseo-container.small{max-width:810px}}.aioseo-masonry{-moz-column-count:0;column-count:0;-moz-column-gap:20px;column-gap:20px;counter-reset:brick-counter}.aioseo-masonry>*{box-sizing:border-box;-moz-column-break-inside:avoid;break-inside:avoid;counter-increment:brick-counter;margin-bottom:20px}@media only screen and (min-width:782px){.aioseo-masonry{-moz-column-count:1;column-count:1}}@media only screen and (min-width:912px){.aioseo-masonry{-moz-column-count:2;column-count:2}}@media only screen and (min-width:1042px){.aioseo-masonry{-moz-column-count:3;column-count:3}}.aioseo-row{box-sizing:border-box;display:flex;flex:0 1 auto;flex-direction:row;flex-wrap:wrap;margin-left:-.5rem;margin-right:-.5rem}.aioseo-row.reverse{flex-direction:row-reverse}.aioseo-row.start-xs{justify-content:flex-start;text-align:start}.aioseo-row.center-xs{justify-content:center;text-align:center}.aioseo-row.end-xs{justify-content:flex-end;text-align:end}.aioseo-row.top-xs{align-items:flex-start}.aioseo-row.middle-xs{align-items:center}.aioseo-row.bottom-xs{align-items:flex-end}.aioseo-row.around-xs{justify-content:space-around}.aioseo-row.between-xs{justify-content:space-between}@media only screen and (min-width:782px){.aioseo-row.start-sm{justify-content:flex-start;text-align:start}.aioseo-row.center-sm{justify-content:center;text-align:center}.aioseo-row.end-sm{justify-content:flex-end;text-align:end}.aioseo-row.top-sm{align-items:flex-start}.aioseo-row.middle-sm{align-items:center}.aioseo-row.bottom-sm{align-items:flex-end}.aioseo-row.around-sm{justify-content:space-around}.aioseo-row.between-sm{justify-content:space-between}}@media only screen and (min-width:912px){.aioseo-row.start-md{justify-content:flex-start;text-align:start}.aioseo-row.center-md{justify-content:center;text-align:center}.aioseo-row.end-md{justify-content:flex-end;text-align:end}.aioseo-row.top-md{align-items:flex-start}.aioseo-row.middle-md{align-items:center}.aioseo-row.bottom-md{align-items:flex-end}.aioseo-row.around-md{justify-content:space-around}.aioseo-row.between-md{justify-content:space-between}}@media only screen and (min-width:1042px){.aioseo-row.start-lg{justify-content:flex-start;text-align:start}.aioseo-row.center-lg{justify-content:center;text-align:center}.aioseo-row.end-lg{justify-content:flex-end;text-align:end}.aioseo-row.top-lg{align-items:flex-start}.aioseo-row.middle-lg{align-items:center}.aioseo-row.bottom-lg{align-items:flex-end}.aioseo-row.around-lg{justify-content:space-around}.aioseo-row.between-lg{justify-content:space-between}}.aioseo-display-info svg.aioseo-new-page{width:100%;height:auto;max-width:45px}.aioseo-display-info .new-page .aioseo-row{margin:0}.aioseo-display-info .new-page svg.aioseo-external{width:14px;height:14px;margin-left:10px}.aioseo-display-info .new-page .aioseo-description{color:#434960}.aioseo-display-info .new-page button.aioseo-html-sitemaps-disabled-button{border:1px solid #dcdde1;color:#8c8f9a;background-color:#f3f4f5;cursor:default}.aioseo-display-info .new-page .aioseo-alert{width:100%;margin:8px 8px 0}.aioseo-exclude-posts{display:block}.aioseo-exclude-posts .aioseo-select{max-width:600px;display:inline-block;margin-left:10px}.aioseo-exclude-posts .aioseo-select button{display:none}.aioseo-exclude-posts .aioseo-select .multiselect__option{display:flex}.aioseo-exclude-posts .aioseo-select .multiselect__option--highlight .option-title{color:#005ae0}.aioseo-exclude-posts .aioseo-button.gray{margin-top:10px}.aioseo-exclude-posts .option{flex:1 0 auto}.aioseo-exclude-posts .option .option-title{font-weight:500;font-size:16px;color:#141b38}.aioseo-exclude-posts .option .option-title .search-term{font-weight:700}.aioseo-exclude-posts .option .option-details{display:flex;align-items:center;font-size:14px;color:#8c8f9a}.aioseo-exclude-posts .option .option-details span{margin-left:15px}.aioseo-exclude-posts .option-permalink{display:flex;align-items:center}.aioseo-exclude-posts .option-permalink svg.aioseo-external{width:15px;height:15px;color:#434960}.aioseo-exclude-posts .multiselect-toggle{padding:10px 13px;width:40px;position:absolute;height:36px;left:2px;top:2px;text-align:center;z-index:1}.aioseo-exclude-posts .multiselect-toggle svg.aioseo-add-plus{width:14px;height:14px;color:#000}.aioseo-sidebar-row .aioseo-included-objects-toggle{margin-top:5px}.aioseo-sidebar-row .aioseo-included-objects-toggle .aioseo-included-list{margin-top:8px}.aioseo-notification{margin-bottom:20px}.aioseo-notification>div{display:flex;align-items:flex-start;padding-bottom:10px;border-bottom:1px solid #e8e8eb}.aioseo-notification>div .icon{margin-left:20px}.aioseo-notification>div .icon svg{width:20px;height:20px;color:#00aa63}.aioseo-notification>div .icon svg.warning{color:#f18200}.aioseo-notification>div .icon svg.info{color:#005ae0}.aioseo-notification>div .icon svg.success{color:#00aa63}.aioseo-notification>div .icon svg.error{color:#df2a4a}.aioseo-notification>div .body{margin-left:20px;flex:1}.aioseo-notification>div .body .title{font-size:16px;font-weight:600;color:#141b38;margin-bottom:7px;display:flex;align-items:center}.aioseo-notification>div .body .title div:first-child{flex:1;margin-left:5px;line-height:1.4}.aioseo-notification>div .body .notification-content{margin-bottom:10px;max-width:400px}.aioseo-notification>div .body .actions{flex-wrap:wrap;display:flex;align-items:center}.aioseo-notification>div .body .actions>*{margin-bottom:10px}.aioseo-notification>div .body .actions .aioseo-button{margin-left:20px}.aioseo-notification>div .body .actions .dismiss{color:#8c8f9a;font-size:14px}.aioseo-seo-site-score__circle{animation:aioseo-seo-site-score-fill 1s reverse;transform:rotate(180deg);transform-origin:center;stroke:#00aa63}.aioseo-seo-site-score__circle.fast{-webkit-animation-duration:.5s;animation-duration:.5s;stroke:#df2a4a}.aioseo-seo-site-score__circle.medium{-webkit-animation-duration:.75s;animation-duration:.75s;stroke:#f18200}.aioseo-seo-site-score__background{stroke:#e8e8eb}@-webkit-keyframes aioseo-seo-site-score-fill{to{stroke-dasharray:0 100}}@keyframes aioseo-seo-site-score-fill{to{stroke-dasharray:0 100}}.aioseo-seo-site-score-svg-loading{-webkit-animation:aioseo-seo-site-score-svg-animation 2s linear infinite;animation:aioseo-seo-site-score-svg-animation 2s linear infinite}.aioseo-seo-site-score-loading__circle{-webkit-animation:aioseo-seo-site-score-fill-loading 2s ease-in-out infinite both;animation:aioseo-seo-site-score-fill-loading 2s ease-in-out infinite both;transform:rotate(180deg);transform-origin:center;stroke:#005ae0}@-webkit-keyframes aioseo-seo-site-score-svg-animation{0%{transform:rotate(0deg)}to{transform:rotate(-1turn)}}@keyframes aioseo-seo-site-score-svg-animation{0%{transform:rotate(0deg)}to{transform:rotate(-1turn)}}@-webkit-keyframes aioseo-seo-site-score-fill-loading{0%,25%{stroke-dashoffset:90;transform:rotate(0)}50%,75%{stroke-dashoffset:10;transform:rotate(-45deg)}to{stroke-dashoffset:90;transform:rotate(-1turn)}}@keyframes aioseo-seo-site-score-fill-loading{0%,25%{stroke-dashoffset:90;transform:rotate(0)}50%,75%{stroke-dashoffset:10;transform:rotate(-45deg)}to{stroke-dashoffset:90;transform:rotate(-1turn)}}.aioseo-table-column{display:flex;flex-direction:column;flex-basis:100%;flex:1;padding:5px;justify-content:center}.aioseo-table-row{display:flex;flex-direction:row;flex-wrap:wrap;width:100%}.aioseo-wizard-body{background-color:#fff;max-width:900px;box-shadow:0 2px 5px rgba(0,0,0,.05)}.aioseo-wizard-body .body-content{padding:80px 140px}@media screen and (max-width:782px){.aioseo-wizard-body .body-content{padding:40px}}.aioseo-wizard-body .body-content .header{line-height:1.4}.aioseo-wizard-body .body-footer{border-top:1px solid #e8e8eb;padding:30px;display:flex;align-items:center}.aioseo-wizard-body .body-footer>*{margin-left:10px}.aioseo-wizard-body .body-footer>:last-child{margin-left:0}.aioseo-wizard-body .body-footer .spacer{flex:1 0 auto}.aioseo-wizard-close-and-exit{margin:96px 0;min-height:96px;text-align:center;font-size:14px}.aioseo-wizard-close-and-exit a{color:#8c8f9a!important}.aioseo-wizard-container{margin:40px auto;max-width:900px}@media screen and (max-width:782px){.aioseo-wizard-container{margin:0 20px}}.aioseo-wizard-header{display:flex;align-items:center;justify-content:center;flex-direction:column}.aioseo-wizard-header svg.aioseo-logo{width:100%;max-width:140px;height:auto;margin:60px 0 40px 10px}.aioseo-wizard-progress{display:flex;align-items:center;justify-content:center}@media screen and (max-width:782px){.aioseo-wizard-progress{display:none}}.aioseo-wizard-progress .circle{background-color:#dcdde1;width:16px;height:16px;border-radius:50%}.aioseo-wizard-progress .circle.active{background-color:#005ae0}.aioseo-wizard-progress .spacer{width:59px;border:1px solid #dcdde1;margin:0 12px}.aioseo-wizard-progress .spacer.active{border-color:#005ae0}.aioseo-wizard-steps{color:#8c8f9a;font-size:14px;margin-bottom:20px}.block-editor-block-card{align-items:center}.block-editor-block-card__title.block-editor-block-card__title{margin:0}.aioseo-sidebar-row{margin-bottom:16px}.aioseo-sidebar-row .aioseo-sidebar-title{font-weight:500}.aioseo-localseo-info .aioseo-input,.aioseo-localseo-info .aioseo-multiselect,.aioseo-localseo-info .aioseo-select{max-width:480px}.aioseo-localseo-info .field-description{font-size:14px}.aioseo-localseo-info .info-businessaddress-row .columns{display:flex;flex:0 1 auto;flex-direction:row;flex-wrap:wrap}.aioseo-localseo-opening .field-description{display:inline-block;margin:10px 0;font-size:14px}.aioseo-localseo-opening .field-description.mt-8{margin-top:8px}.aioseo-localseo-opening .aioseo-input,.aioseo-localseo-opening .aioseo-multiselect,.aioseo-localseo-opening .aioseo-select{max-width:480px}.aioseo-localseo-opening .aioseo-col-flex{display:flex;align-items:center;padding:12px 0;border-bottom:1px solid #e8e8eb}.aioseo-localseo-opening .aioseo-col-flex:first-of-type{padding-top:0}.aioseo-localseo-opening .aioseo-col-flex:last-of-type{padding-bottom:0;border:none}.aioseo-localseo-opening .aioseo-col-flex .aioseo-col-day{flex:1}.aioseo-localseo-opening .aioseo-col-flex .aioseo-col-alwaysopen,.aioseo-localseo-opening .aioseo-col-flex .aioseo-col-hours{flex:2}.aioseo-localseo-opening .aioseo-col-flex span.separator{margin:0 5px}.aioseo-localseo-opening .aioseo-col-flex .aioseo-select{display:inline-block;max-width:120px;margin-bottom:5px}.aioseo-localseo-opening .aioseo-col-flex .multiselect--disabled .multiselect__single,.aioseo-localseo-opening .aioseo-col-flex .multiselect--disabled .multiselect__tags{background:#f3f4f5}.aioseo-localseo-opening .aioseo-col-alwaysopen .aioseo-checkbox{padding:0 10px}.sidebar-row{margin-bottom:16px}.sidebar-row .title{font-weight:700}
1
+ .aioseo-app .aioseo-cta{margin-top:30px;background:#fff;width:100%;padding:40px;box-shadow:0 2px 5px rgba(0,0,0,.05);border:1px solid #e8e8eb}.aioseo-app .aioseo-cta.floating{margin-top:0;position:absolute;max-width:850px;right:50%;top:50%;transform:translateX(50%) translateY(-50%);box-shadow:0 5px 20px rgba(0,0,0,.1);border-radius:3px}.aioseo-app .aioseo-cta .header-text{line-height:1.4;font-weight:600;font-size:24px;text-align:center;color:#141b38}.aioseo-app .aioseo-cta .header-text span.large{line-height:1.4;font-size:32px}.aioseo-app .aioseo-cta .description{margin:30px 0 50px;width:100%;max-width:600px;text-align:center;font-size:16px;color:#141b38;line-height:1.4}.aioseo-app .aioseo-cta .description .aioseo-alert{margin-bottom:30px;text-align:right}.aioseo-app .aioseo-cta .feature-list{color:#141b38;font-size:16px;width:100%;max-width:500px;margin-bottom:50px}.aioseo-app .aioseo-cta .feature-list .aioseo-col{display:flex;align-items:flex-start}.aioseo-app .aioseo-cta .feature-list .aioseo-col svg.aioseo-circle-check{color:#00aa63;width:18px;min-width:18px;min-height:18px;margin-left:10px}.aioseo-app .aioseo-cta a.learn-more{margin-top:20px;color:#8c8f9a;font-size:14px}.aioseo-app .aioseo-cta .type-1{display:flex;flex-direction:column;align-items:center}.aioseo-app .aioseo-cta .type-2{margin:30px 50px 30px 0;display:flex}.aioseo-app .aioseo-cta .type-2 .description,.aioseo-app .aioseo-cta .type-2 .header-text{text-align:right}.aioseo-app .aioseo-cta .type-2 .description,.aioseo-app .aioseo-cta .type-2 .feature-list{margin:30px 0}.aioseo-app .aioseo-cta .type-2>div{margin-left:20px;flex:0 0 50%}.aioseo-app .aioseo-cta .type-2 .featured-image{max-height:540px;border:1px solid #e8e8eb;flex:1;overflow:hidden;margin-left:-41px;margin-bottom:-71px;border-radius:0 5px 0 0}.aioseo-app .aioseo-cta .type-2 .featured-image img{max-height:600px}@media only screen and (max-width:912px){.aioseo-app .aioseo-cta .type-2{flex-direction:column;align-items:center}.aioseo-app .aioseo-cta .type-2 .description,.aioseo-app .aioseo-cta .type-2 .header-text{text-align:center}.aioseo-app .aioseo-cta .type-2>div{text-align:center;margin-left:0;margin-bottom:30px;flex:1 0 100%;width:100%}.aioseo-app .aioseo-cta .type-2 .featured-image{margin:0 -10px -41px;border-radius:5px 5px 0 0;max-height:300px}}.aioseo-app .aioseo-cta .type-3 .sub-header{line-height:1.4;font-size:16px;font-weight:600;color:#005ae0;margin-bottom:5px}.aioseo-app .aioseo-cta .type-3 .header-text{text-align:right}.aioseo-app .aioseo-cta .type-3 .feature-list{margin:30px 0}.aioseo-app .aioseo-cta .type-3 .feature-list .aioseo-col svg.aioseo-circle-check{color:#00aa63;width:21px;min-width:21px;min-height:21px;margin-left:5px}.aioseo-app .aioseo-cta .type-3 .aioseo-button{margin-left:12px}.aioseo-box-toggle .aioseo-row .aioseo-col{max-width:calc(200px + 1em)}@media only screen and (max-width:48em){.aioseo-box-toggle .aioseo-row .aioseo-col{max-width:100%}}.aioseo-box-toggle input{position:absolute!important;clip:rect(0,0,0,0);height:1px;width:1px;border:0;overflow:hidden}.aioseo-box-toggle input:checked+label{background-color:#fff;box-shadow:0 5px 10px rgba(0,90,224,.1);border:2px solid #005ae0;font-weight:600}.aioseo-box-toggle label{background-color:#f9f9fa;color:#141b38;font-size:16px;line-height:1;display:flex;align-items:center;justify-content:center;flex-direction:column;border:1px solid #f9f9fa;transition:all .1s ease-in-out;border-radius:3px;height:165px;position:relative}.aioseo-box-toggle label p{position:absolute;bottom:15px;margin:0}.aioseo-box-toggle label:hover{cursor:pointer}.aioseo-button{flex-shrink:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:600;padding:0 24px;border-radius:4px;-webkit-appearance:none;cursor:pointer;height:48px;transition:background-color .2s ease;position:relative;overflow:hidden;text-decoration:none;color:#141b38;white-space:nowrap}.aioseo-button.small,.aioseo-button.small-table{height:30px;font-size:14px;padding:0 12px}.aioseo-button.small-table .loading-spinner,.aioseo-button.small .loading-spinner{width:25px;height:25px}.aioseo-button.small-table{font-size:12px;border-radius:3px}.aioseo-button.medium{height:40px;font-size:14px;padding:0 18px}.aioseo-button.medium .loading-spinner{width:35px;height:35px}.aioseo-button.xl{height:66px;border-radius:4px;font-size:18px;padding:0 48px}.aioseo-button.gray{border:1px solid #dcdde1;background-color:#f3f4f5}.aioseo-button.gray:hover{background-color:#fff;color:#141b38}.aioseo-button.gray:active{background-color:#f3f4f5}.aioseo-button.green{border:none;background-color:#00aa63;color:#fff}.aioseo-button.green:hover{background-color:#07c575}.aioseo-button.green:active{background-color:#15955f}.aioseo-button.blue{border:none;background-color:#005ae0;color:#fff}.aioseo-button.blue:hover{background-color:#1a82ea}.aioseo-button.blue:active{background-color:#004f9d}.aioseo-button.wp-blue{border:1px solid #005ae0;background-color:#f3f5f6;color:#005ae0}.aioseo-button.wp-blue:hover{background-color:#1a82ea;border-color:#1a82ea;color:#fff}.aioseo-button.wp-blue:active{background-color:#004f9d;border-color:#004f9d;color:#fff}.aioseo-button.black{border:none;background-color:#434960;color:#fff}.aioseo-button.black:hover{background-color:#2c324c}.aioseo-button.black:active{background-color:#141b38}.aioseo-button.red{border:1px solid #df2a4a;background-color:#fff;color:#df2a4a}.aioseo-button.red:hover{background-color:#df2a4a;color:#fff}.aioseo-button.red:active{background-color:#ab2039}.aioseo-button.loading.blue,.aioseo-button.loading.blue:hover{background-color:#004f9d;color:#004f9d}.aioseo-button.loading.green,.aioseo-button.loading.green:hover{background-color:#15955f;color:#15955f}.aioseo-button.loading.gray,.aioseo-button.loading.gray:hover{background-color:#f3f4f5;color:#f3f4f5}.aioseo-button.loading.black,.aioseo-button.loading.black:hover{background-color:#141b38;color:#141b38}.aioseo-button:disabled{border:1px solid #dcdde1;color:#8c8f9a;background-color:#f3f4f5;cursor:default}.aioseo-button:disabled.gray:hover{color:#8c8f9a}.aioseo-button:disabled.wp-blue{border-color:#ddd;background-color:#f7f7f7}.aioseo-button:disabled.wp-blue:hover{border-color:#ddd;color:#8c8f9a}.aioseo-button:disabled:hover{background-color:#f3f4f5}.aioseo-checkbox{display:inline-flex;align-items:center}.aioseo-checkbox.disabled,.aioseo-checkbox.disabled .form-checkbox .fancy-checkbox,.aioseo-checkbox.no-clicks,.aioseo-checkbox.no-clicks .form-checkbox .fancy-checkbox{cursor:default}.aioseo-checkbox .form-checkbox-wrapper{margin-left:10px;display:flex}.aioseo-checkbox.medium .form-checkbox{width:20px;height:20px}.aioseo-checkbox.medium .form-checkbox .fancy-checkbox svg{width:12px;height:12px}.aioseo-checkbox.medium .form-checkbox span:before{height:18px;width:18px;line-height:20px}.aioseo-checkbox.round .form-checkbox span,.aioseo-checkbox.round .form-checkbox span:before{border-radius:50%}.aioseo-checkbox .form-checkbox{position:relative;display:inline-block;width:28px;height:28px;color:#fff;vertical-align:bottom;text-align:center}.aioseo-checkbox .form-checkbox input{display:none}.aioseo-checkbox .form-checkbox input:checked+.fancy-checkbox.blue{background:#005ae0}.aioseo-checkbox .form-checkbox input:checked+.fancy-checkbox.green{background:#00aa63}.aioseo-checkbox .form-checkbox input:checked+.fancy-checkbox:before{background:transparent}.aioseo-checkbox .form-checkbox input:disabled+.fancy-checkbox{background:#e8e8eb!important;border:1px solid #d0d1d7;cursor:default}.aioseo-checkbox .form-checkbox input:disabled+.fancy-checkbox svg{color:#8c8f9a}.aioseo-checkbox .form-checkbox input:not(:checked):disabled+.fancy-checkbox:before{right:0;bottom:0;background:#e8e8eb}.aioseo-checkbox .form-checkbox .fancy-checkbox svg{color:#fff;width:16px;height:16px}.aioseo-checkbox .form-checkbox span{position:absolute;cursor:pointer;top:0;right:0;left:0;bottom:0;background-color:#d0d1d7;transition:.2s;border-radius:3px;display:flex;align-items:center;justify-content:center}.aioseo-checkbox .form-checkbox span:before{position:absolute;content:"";height:26px;width:26px;right:1px;bottom:1px;background-color:#fff;transition:.2s;font-size:18px;line-height:28px;border-radius:2px}.aioseo-date-picker.vue-daterange-picker{width:100%}.aioseo-date-picker.vue-daterange-picker .form-control{display:flex;align-items:center;color:#141b38;font-size:16px;height:48px;border-radius:3px;border:1px solid #d0d1d7;position:relative}.aioseo-date-picker.vue-daterange-picker .form-control svg.aioseo-circle-close{position:absolute;left:10px;color:#434960;width:15px;height:15px}.aioseo-date-picker.vue-daterange-picker.small .form-control{height:30px}.aioseo-date-picker.vue-daterange-picker.medium .form-control{height:40px}body[class*=all-in-one-seo_page] .daterangepicker .yearselect{width:75px}.aioseo-editor{position:relative}.aioseo-editor .aioseo-editor-description .ql-editor{min-height:100px}.aioseo-editor .aioseo-editor-line-numbers .ql-editor{padding:15px 45px 15px 15px}.aioseo-editor .aioseo-editor-single .ql-editor{padding:8px 10px}.aioseo-editor .aioseo-editor-single.aioseo-editor-line-numbers .ql-editor{padding:8px 45px 8px 10px}.aioseo-editor .aioseo-editor-monospace .ql-editor{font-family:monospace}.aioseo-editor .aioseo-line-numbers{background:#f7f6f7;position:absolute;text-align:left;top:1px;width:29px;right:1px;border-radius:0 3px 3px 0;padding:15px 0 0 9px;display:flex;height:calc(100% - 2px);flex-direction:column;overflow:hidden}.aioseo-editor .aioseo-line-numbers div{min-height:25px;color:#8c8f9a;font-size:12px;line-height:1.9}.aioseo-editor .ql-disabled{pointer-events:none;background-color:#f9f9fa}.aioseo-editor .ql-editor{padding:15px;border-radius:3px;font-size:16px;color:#141b38;border:1px solid #d0d1d7}.aioseo-editor .ql-editor:focus{border:1px solid #005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-editor .ql-editor .mention .ql-mention-denotation-char{display:none}.aioseo-editor .ql-editor .mention .aioseo-tag{height:25px;margin:0 1px;color:#434960;font-weight:600;font-size:14px;padding:3px 10px 3px 25px;background-color:#f3f4f5;border-radius:3px;cursor:pointer;position:relative;display:inline-flex;align-items:center}.aioseo-editor .ql-editor .mention .aioseo-tag .tag-toggle{display:inline-flex;align-items:center;background-color:#e8e8eb;position:absolute;top:0;left:0;bottom:0;border-radius:3px 0 0 3px}.aioseo-editor .ql-editor .mention .aioseo-tag .tag-toggle svg.aioseo-caret{width:18px;height:18px;transition:transform .3s}.aioseo-editor .ql-editor .mention .aioseo-tag .tag-toggle svg.aioseo-caret.rotated{transform:rotate(-180deg)}.aioseo-editor .ql-mention-list-container{color:#141b38;background-color:#fff;max-width:250px;width:100%;margin-top:3px;border:1px solid #d0d1d7;border-radius:3px;box-shadow:0 3px 15px rgba(0,0,0,.1);z-index:9001}.aioseo-editor .ql-mention-list-container .aioseo-tag-custom,.aioseo-editor .ql-mention-list-container .aioseo-tag-search{padding:12px;border-bottom:1px solid #e8e8eb}.aioseo-editor .ql-mention-list-container .aioseo-tag-custom{display:none}.aioseo-editor .ql-mention-list-container .ql-mention-list{list-style:none;margin:0;padding:0;max-height:210px;overflow:auto}.aioseo-editor .ql-mention-list-container .ql-mention-list li{color:#141b38;margin:0;background-color:transparent;border-bottom:1px solid #e8e8eb;padding:15px;cursor:pointer;font-size:14px}.aioseo-editor .ql-mention-list-container .ql-mention-list li:last-child{border-bottom:0}.aioseo-editor .ql-mention-list-container .ql-mention-list li.selected,.aioseo-editor .ql-mention-list-container .ql-mention-list li:hover{color:#005ae0;background-color:#f2f7fd}.aioseo-editor .ql-mention-list-container .ql-mention-list li.selected .aioseo-tag-description,.aioseo-editor .ql-mention-list-container .ql-mention-list li:hover .aioseo-tag-description{color:initial}.aioseo-editor .ql-mention-list-container .ql-mention-list li .aioseo-tag-item{display:flex}.aioseo-editor .ql-mention-list-container .ql-mention-list li .aioseo-tag-item>div:first-child{margin-left:10px}.aioseo-editor .ql-mention-list-container .ql-mention-list li .aioseo-tag-item .aioseo-tag-title{font-weight:600}.aioseo-editor .ql-mention-list-container .ql-mention-list li svg.aioseo-plus{width:10px;height:10px;color:#005ae0}.aioseo-editor .ql-mention-list-container .ql-mention-list li.aioseo-tag-no-match{cursor:default;padding:12px;font-size:16px;font-weight:600}.aioseo-editor .ql-mention-list-container .ql-mention-list li.aioseo-tag-no-match.highlight,.aioseo-editor .ql-mention-list-container .ql-mention-list li.aioseo-tag-no-match:hover{color:initial;background-color:transparent}.aioseo-editor .ql-toolbar{display:none}.aioseo-editor .ql-clipboard{right:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.aioseo-editor .ql-snow .ql-hidden{display:none}.aioseo-editor .ql-container.ql-snow{border:none}.aioseo-editor .ql-container p{font-size:16px;margin:0;line-height:25px}.aioseo-highlight-toggle{border:1px solid #e8e8eb;border-radius:3px;min-height:48px;display:flex;align-items:center;padding:5px 10px;cursor:pointer}.aioseo-highlight-toggle>*{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.aioseo-highlight-toggle.active{border-color:#005ae0;box-shadow:0 5px 10px rgba(0,90,224,.1)}.aioseo-highlight-toggle.medium{min-height:40px}.aioseo-highlight-toggle .icon{display:flex;align-items:center;margin-left:5px}.aioseo-input[data-v-3f0a80a7]{position:relative;width:100%}.aioseo-input.file[data-v-3f0a80a7],.aioseo-input.file input[type=file][data-v-3f0a80a7]{position:absolute;top:0;left:0;right:0;bottom:0;margin:0;padding:0}.aioseo-input.file input[type=file][data-v-3f0a80a7]{cursor:pointer;opacity:0}.aioseo-input.file input[type=file][data-v-3f0a80a7]::-webkit-file-upload-button{visibility:hidden}.aioseo-input.file input[type=file][data-v-3f0a80a7]:focus{box-shadow:none}.aioseo-input input[data-v-3f0a80a7]{height:48px;width:100%;background-color:#fff;border:1px solid #d0d1d7;border-radius:3px;padding:15px;font-size:18px;position:relative;overflow:hidden;margin:0}.aioseo-input input[data-v-3f0a80a7]:disabled{background:#f9f9fa}.aioseo-input input[data-v-3f0a80a7]:focus{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-input input[data-v-3f0a80a7]::-moz-placeholder{color:#8c8f9a}.aioseo-input input[data-v-3f0a80a7]:-ms-input-placeholder{color:#8c8f9a}.aioseo-input input[data-v-3f0a80a7]::placeholder{color:#8c8f9a}.aioseo-input input.prepend[data-v-3f0a80a7]{padding-right:50px}.aioseo-input input.append[data-v-3f0a80a7]{padding-left:50px}.aioseo-input input.small[data-v-3f0a80a7]{height:30px;padding:10px;font-size:14px}.aioseo-input input.small.prepend[data-v-3f0a80a7]{padding-right:30px}.aioseo-input input.small.append[data-v-3f0a80a7]{padding-left:30px}.aioseo-input input.medium[data-v-3f0a80a7]{height:40px;padding:12px;font-size:16px}.aioseo-input input.medium.prepend[data-v-3f0a80a7]{padding-right:35px}.aioseo-input input.medium.append[data-v-3f0a80a7]{padding-left:35px}.aioseo-input.aioseo-active input[data-v-3f0a80a7]{border-color:#00aa63}.aioseo-input.aioseo-active input[data-v-3f0a80a7]:active,.aioseo-input.aioseo-active input[data-v-3f0a80a7]:focus{box-shadow:0 0 0 1px #00aa63}.aioseo-input.aioseo-active .append-icon[data-v-3f0a80a7],.aioseo-input.aioseo-active .prepend-icon[data-v-3f0a80a7]{color:#00aa63}.aioseo-input.aioseo-error input[data-v-3f0a80a7]{border-color:#df2a4a}.aioseo-input.aioseo-error input[data-v-3f0a80a7]:active,.aioseo-input.aioseo-error input[data-v-3f0a80a7]:focus{box-shadow:0 0 0 1px #df2a4a}.aioseo-input.aioseo-error .append-icon[data-v-3f0a80a7],.aioseo-input.aioseo-error .prepend-icon[data-v-3f0a80a7]{color:#df2a4a}.aioseo-input.aioseo-warning input[data-v-3f0a80a7]{border-color:#f18200}.aioseo-input.aioseo-warning input[data-v-3f0a80a7]:active,.aioseo-input.aioseo-warning input[data-v-3f0a80a7]:focus{box-shadow:0 0 0 1px #f18200}.aioseo-input.aioseo-warning .append-icon[data-v-3f0a80a7],.aioseo-input.aioseo-warning .prepend-icon[data-v-3f0a80a7]{color:#f18200}.aioseo-input .prepend-icon[data-v-3f0a80a7]{position:absolute;top:0;right:10px;width:30px;height:100%;color:#d0d1d7;display:flex;align-items:center;z-index:1}.aioseo-input .prepend-icon svg[data-v-3f0a80a7]{width:30px;height:30px}.aioseo-input .prepend-icon.small[data-v-3f0a80a7]{width:20px}.aioseo-input .prepend-icon.small svg[data-v-3f0a80a7]{width:10px;height:10px}.aioseo-input .prepend-icon.medium[data-v-3f0a80a7]{width:15px}.aioseo-input .prepend-icon.medium svg[data-v-3f0a80a7]{width:15px;height:15px}.aioseo-input .append-icon[data-v-3f0a80a7]{position:absolute;top:0;left:10px;width:30px;height:100%;color:#d0d1d7;display:flex;align-items:center;z-index:1}.aioseo-input .append-icon svg[data-v-3f0a80a7]{width:30px;height:30px}.aioseo-input .append-icon.small[data-v-3f0a80a7]{width:10px}.aioseo-input .append-icon.medium[data-v-3f0a80a7]{width:15px}.aioseo-input .append-icon.clickable[data-v-3f0a80a7]{cursor:pointer;padding:0 5px;background:#f3f4f5;border:1px solid #d0d1d7;color:#434960;left:0;width:30px;border-radius:3px 0 0 3px}.aioseo-input .append-icon.clickable.small[data-v-3f0a80a7]{width:15px}.aioseo-input .append-icon.clickable.medium[data-v-3f0a80a7]{padding:0 10px;width:40px}.aioseo-phone-number{max-width:600px}.aioseo-phone-number label{display:none}.aioseo-phone-number .maz-input__input{height:40px;min-height:40px;padding-top:0!important;border:1px solid #d0d1d7}.aioseo-phone-number .maz-input__input:focus{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-phone-number .country-selector{flex:0 0 140px;width:140px;min-width:140px;max-width:140px}.aioseo-phone-number .country-selector:hover{z-index:1}.aioseo-phone-number .country-selector>div.maz-base-component.maz-input.has-value.has-1-right-icon.maz-input--primary>input{padding-right:50px!important}.aioseo-phone-number .country-selector .maz-input.is-focused{border-color:#005ae0}.aioseo-phone-number .country-selector .maz-select__options-list__item.selected.keyboard-selected{background-color:#005ae0}.aioseo-phone-number .maz-phone-number-input__country-flag{right:20px;bottom:12px;z-index:auto}.aioseo-phone-number .maz-input__icon{z-index:auto}.aioseo-phone-number .maz-select__options-list input{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-phone-number .maz-input__input{border-radius:3px}.aioseo-phone-number.invalidNumber div.maz-flex-1>div>input{border-color:red}.aioseo-phone-number.invalidNumber div.maz-flex-1>div>input:focus{border-color:#df2a4a;box-shadow:0 0 0 1px #df2a4a}.aioseo-phone-number.validNumber div.maz-flex-1>div>input:focus{border-color:#00aa63;box-shadow:0 0 0 1px #00aa63}.aioseo-radio{display:inline-flex;align-items:center}.aioseo-radio .form-radio-wrapper{margin-left:10px;display:flex}.aioseo-radio.medium .form-radio{width:20px;height:20px}.aioseo-radio.medium .form-radio .fancy-radio svg{width:12px;height:12px}.aioseo-radio.medium.type-1 .form-radio span:before{height:18px;width:18px;line-height:20px}.aioseo-radio.medium.type-2 .form-radio span:before{height:16px;width:16px;line-height:20px}.aioseo-radio.medium.type-2 .form-radio span:after{height:6px;width:6px;right:6px;bottom:6px}.aioseo-radio .form-radio{position:relative;display:inline-block;width:28px;height:28px;color:#fff;vertical-align:bottom;text-align:center}.aioseo-radio .form-radio input{opacity:0}.aioseo-radio .form-radio input:checked+.fancy-radio{background:#005ae0;border-color:#005ae0}.aioseo-radio .form-radio input:checked+.fancy-radio:before{background:transparent}.aioseo-radio .form-radio input:checked+.fancy-radio:after{display:block}.aioseo-radio .form-radio input:disabled+.fancy-radio{cursor:default}.aioseo-radio .form-radio input:focus+.fancy-radio{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-radio .form-radio .fancy-radio{border-radius:50%}.aioseo-radio .form-radio .fancy-radio svg{color:#fff;width:16px;height:16px}.aioseo-radio .form-radio span{position:absolute;cursor:pointer;top:0;right:0;left:0;bottom:0;transition:.2s;border-radius:50%;display:flex;align-items:center;justify-content:center}.aioseo-radio .form-radio span:before{position:absolute;content:"";height:26px;width:26px;right:1px;bottom:1px;transition:.2s;font-size:18px;line-height:28px;border-radius:50%}.aioseo-radio.type-1 .form-radio span,.aioseo-radio.type-1 .form-radio span:before{background-color:#f3f4f5}.aioseo-radio.type-2 .form-radio span{border:1px solid #d0d1d7;background-color:#fff}.aioseo-radio.type-2 .form-radio span:before{background-color:#fff}.aioseo-radio.type-2 .form-radio span:after{display:none;position:absolute;content:"";height:10px;width:10px;right:8px;bottom:8px;background-color:#fff;transition:.2s;border-radius:50%}.aioseo-radio.disabled{cursor:default}.aioseo-radio.disabled.type-2 .form-radio input:checked+.fancy-radio{background-color:#e8e8eb;border-color:#d0d1d7}.aioseo-radio.disabled.type-2 .form-radio span,.aioseo-radio.disabled.type-2 .form-radio span:before{background-color:#e8e8eb}.aioseo-radio.disabled.type-2 .form-radio span:after{background-color:#8c8f9a}.aioseo-radio-toggle{display:flex;align-items:center;height:40px}.aioseo-radio-toggle div{height:100%}.aioseo-radio-toggle.inline{display:inline-flex}.aioseo-radio-toggle div:first-child{overflow:hidden;border-radius:0 3px 3px 0}.aioseo-radio-toggle div:first-child label{border-radius:0 3px 3px 0}.aioseo-radio-toggle div:last-child{overflow:hidden;border-radius:3px 0 0 3px}.aioseo-radio-toggle div:last-child label{border-radius:3px 0 0 3px}.aioseo-radio-toggle input{position:absolute!important;clip:rect(0,0,0,0);height:1px;width:1px;border:0;overflow:hidden}.aioseo-radio-toggle input:checked+label{background-color:#005ae0;color:#fff}.aioseo-radio-toggle input:checked+label.dark{background-color:#434960;color:#fff}.aioseo-radio-toggle label{height:100%;background-color:#e8e8eb;color:#141b38;font-size:14px;line-height:1;display:flex;align-items:center;justify-content:center;flex-direction:column;transition:all .1s ease-in-out;position:relative;padding:11px 20px;font-weight:600}.aioseo-radio-toggle label.disabled{cursor:default;pointer-events:none;opacity:.5}.aioseo-radio-toggle label:hover{background-color:#dadadf;cursor:pointer}.aioseo-radio-toggle label p{position:absolute;bottom:15px;margin:0}.aioseo-radio-toggle.circle label{background:#fff;color:#8c8f9a}.aioseo-radio-toggle.circle input+label{border-radius:50%;width:36px;height:36px;padding:8px}.aioseo-radio-toggle.circle input:checked+label{background:#e8e8eb;color:#2c324c}.aioseo-select{height:48px}.aioseo-select.multiselect--disabled .multiselect__select{background:none}.aioseo-select .multiselect__select{display:flex;align-items:center;justify-content:center;min-height:46px}.aioseo-select .multiselect__select:before{display:none}.aioseo-select .multiselect__select svg.aioseo-caret{color:#141b38;width:18px;height:18px;transition:transform .3s}.aioseo-select .multiselect__tags{height:100%;border:1px solid #d0d1d7;border-radius:3px;display:flex;justify-content:center;flex-direction:column;padding:16px 16px 16px 40px}.aioseo-select .multiselect__tags .multiselect__spinner{height:calc(100% - 2px);border:2px solid transparent}.aioseo-select .multiselect__tags .multiselect__spinner:after,.aioseo-select .multiselect__tags .multiselect__spinner:before{border-top-color:#434960}.aioseo-select .multiselect__tags .multiselect__single{display:inline-flex;margin:0;padding:0;color:#141b38;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.aioseo-select .multiselect__tags .multiselect__placeholder{color:#8c8f9a;font-size:16px;line-height:20px;margin:0;padding:0}.aioseo-select .multiselect__tags .multiselect__input{padding:0;margin:0 0 0 10px;border-radius:0;border:none;color:#141b38;min-height:auto;line-height:20px}.aioseo-select .multiselect__tags .multiselect__input:focus{outline:0;box-shadow:none;border:none}.aioseo-select .multiselect__tags .multiselect__input::-moz-placeholder{color:#8c8f9a}.aioseo-select .multiselect__tags .multiselect__input:-ms-input-placeholder{color:#8c8f9a}.aioseo-select .multiselect__tags .multiselect__input::placeholder{color:#8c8f9a}.aioseo-select .multiselect__tags .multiselect__tags-wrap{display:flex;align-items:center;flex-wrap:wrap}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag{padding:0;display:inline-flex;align-items:center;font-size:14px;font-weight:600;color:#434960;margin:0 0 0 3px;height:24px;background-color:#f3f4f5;flex-shrink:0}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-value{padding:0 10px 0 5px}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove{padding:0 10px;height:100%;cursor:pointer;background-color:#f3f4f5;display:flex;align-items:center}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove:hover{background-color:#434960;color:#fff}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove:hover svg.aioseo-close{color:#fff}.aioseo-select .multiselect__tags .multiselect__tags-wrap .multiselect__tag .multiselect__tag-remove svg.aioseo-close{color:#434960;width:10px;height:10px}.aioseo-select.multiselect--active .multiselect__tags-wrap{margin-bottom:7px}.aioseo-select.small{height:30px;min-height:30px}.aioseo-select.small .multiselect__tags{min-height:30px;padding:8px 8px 8px 38px}.aioseo-select.small .multiselect__tags .multiselect__placeholder{font-size:14px}.aioseo-select.small .multiselect__select{height:28px;min-height:28px}.aioseo-select.small .multiselect__input{font-size:14px}.aioseo-select.small .multiselect__content-wrapper li.multiselect__element .multiselect__option{font-size:14px;padding:8px;min-height:30px}.aioseo-select.medium{height:40px}.aioseo-select.medium .multiselect__tags{padding:7px 7px 7px 40px}.aioseo-select.medium .multiselect__select{min-height:38px}.aioseo-select.multiple{min-height:48px;height:auto}.aioseo-select.multiple.small{min-height:30px}.aioseo-select.multiple.medium{min-height:40px}.aioseo-select.multiselect--above .multiselect__content-wrapper{border-top:1px solid #d0d1d7;border-bottom:none}.aioseo-select .multiselect__content-wrapper{border:1px solid #d0d1d7;border-top:none;border-bottom-right-radius:3px;border-bottom-left-radius:3px;z-index:50;-webkit-overflow-scrolling:touch}.aioseo-select .multiselect__content-wrapper .multiselect__content{max-width:100%}.aioseo-select .multiselect__content-wrapper li.multiselect__element{margin:0;border-bottom:1px solid #e8e8eb}.aioseo-select .multiselect__content-wrapper li.multiselect__element.last{border-bottom:none}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option{color:#141b38;font-weight:700;font-size:16px;white-space:normal;line-height:1.4}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--highlight{background-color:#f2f7fd}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--highlight:after{background-color:#005ae0;color:#fff}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--selected{background-color:#f2f7fd}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option--disabled{font-weight:400;background-color:#fff!important;color:#8c8f9a}.aioseo-select .multiselect__content-wrapper li.multiselect__element .multiselect__option .docLink{font-size:13px;float:left}.aioseo-textarea-autosize{width:100%;background-color:#fff;border:1px solid #d0d1d7;border-radius:4px;font-size:16px;padding:12px}.aioseo-toggle{display:inline-flex}.aioseo-toggle:active,.aioseo-toggle:focus{outline:2px solid transparent}.aioseo-toggle.disabled{pointer-events:none}.aioseo-toggle.disabled .toggle-content{opacity:.5}.aioseo-toggle .toggle-content{position:relative;display:inline-block;width:36px;height:20px;margin-left:10px}.aioseo-toggle .toggle-content input{display:none}.aioseo-toggle .toggle-content input:checked+.toggle-switch{border:1px solid #005ae0;background-color:#005ae0}.aioseo-toggle .toggle-content input:checked+.toggle-switch:focus{outline:2px solid transparent}.aioseo-toggle .toggle-content input:checked+.toggle-switch:before{background-color:#fff;transform:translateX(-15px)}.aioseo-toggle .toggle-content input:focus+.toggle-switch{box-shadow:0 0 1px #005ae0;outline:2px solid transparent}.aioseo-toggle .toggle-content .toggle-switch{position:absolute;cursor:pointer;top:0;right:0;left:0;bottom:0;background-color:#fff;border:1px solid #d0d1d7;border-radius:15px;transition:.2s}.aioseo-toggle .toggle-content .toggle-switch:before{position:absolute;content:"";height:14px;width:14px;right:3px;bottom:2px;background-color:#d0d1d7;border-radius:50%;transition:.2s}.aioseo-wp-table input[type=search],.aioseo-wp-table select{border-color:#d0d1d7}.aioseo-wp-table select:focus{border-color:#005ae0;color:#005ae0;box-shadow:0 0 0 1px #005ae0}.aioseo-wp-table select:hover{color:#005ae0}.aioseo-wp-table input.button,.aioseo-wp-table input.button:hover{color:#005ae0;border-color:#005ae0}.aioseo-wp-table .header .subsubsub{color:#555d66;font-size:13px;font-weight:600}.aioseo-wp-table .header .subsubsub>span{display:inline-flex}.aioseo-wp-table .header .subsubsub .separator{margin:0 5px}.aioseo-wp-table .header .subsubsub .active{font-weight:700;color:#141b38}.aioseo-wp-table .header .subsubsub a{text-decoration:none}.aioseo-wp-table .header .subsubsub a:hover{text-decoration:underline}.aioseo-wp-table .header .search{display:flex;justify-content:flex-end}.aioseo-wp-table .header .search .aioseo-input{width:100%;max-width:215px;margin-left:6px}.aioseo-wp-table .header .pagination{color:#555d66}.aioseo-wp-table .header .pagination .button,.aioseo-wp-table .header .pagination input{margin-right:6px}.aioseo-wp-table .tablenav-pages .current-page{padding:0 8px 0 0}.aioseo-wp-table .wp-table{width:100%;position:relative}.aioseo-wp-table .wp-table .loader-overlay{position:absolute;top:46px;left:0;bottom:36px;right:0;background:rgba(0,0,0,.3);z-index:1;display:flex;align-items:center;justify-content:center}.aioseo-wp-table .wp-table .no-results{color:#8c8f9a;min-height:200px;display:flex;align-items:center;justify-content:center;font-weight:400;font-size:24px}.aioseo-wp-table .wp-table tr.even{background-color:#f9f9fa}.aioseo-wp-table .wp-table tr.enabled td,.aioseo-wp-table .wp-table tr.enabled td strong a{color:#141b38}.aioseo-wp-table .wp-table tr:not(.enabled):not(.edit-row) td,.aioseo-wp-table .wp-table tr:not(.enabled):not(.edit-row) td a.edit-link{color:#8c8f9a}.aioseo-wp-table .wp-table tr.edit-row th{padding:0 3px 0 0}.aioseo-wp-table .wp-table tr.edit-row td{padding:0 10px 0 30px}.aioseo-wp-table .wp-table tr td strong a{font-weight:400}.aioseo-wp-table .wp-table tr td .row-actions .edit a,.aioseo-wp-table .wp-table tr td strong a:hover{color:#005ae0}.aioseo-wp-table .wp-table tr td .row-actions .edit .trash a{color:#df2a4a}.aioseo-wp-table .wp-table tr td.edit-row-content .wrapper .border{margin-top:7px;padding:19px 0 20px;border-top:1px solid #e8e8eb}.custom-rules[data-v-191c51fe]{width:100%;margin-top:14px}.custom-rules .rule .rule-settings[data-v-191c51fe]{display:flex;flex-direction:row;align-items:center;flex:1}.custom-rules .rule .rule-settings>.aioseo-select[data-v-191c51fe]:first-child{width:100%;max-width:250px}.custom-rules .rule .rule-settings>[data-v-191c51fe]{margin:0 0 0 16px}.custom-rules .rule .rule-settings>[data-v-191c51fe]:last-child{margin-left:0}.custom-rules .rule .rule-settings>.aioseo-toggle[data-v-191c51fe]{margin:0 4px 0 10px}.custom-rules .rule .actions[data-v-191c51fe],.custom-rules .rule .logical[data-v-191c51fe]{flex:0}.custom-rules svg[data-v-191c51fe]{width:14px;height:14px;cursor:pointer}.custom-rules svg.aioseo-trash[data-v-191c51fe]{color:#dadada}.custom-rules svg.aioseo-trash[data-v-191c51fe]:hover{color:#df2a4a}.custom-rules .aioseo-tooltip[data-v-191c51fe]{margin:0;display:flex}.custom-rules .aioseo-button svg[data-v-191c51fe]{color:#fff;margin-left:6px}.aioseo-add-redirection.edit-url{margin-bottom:30px}.aioseo-add-redirection.edit-url .urls{align-items:flex-start}.aioseo-add-redirection.edit-url .urls .url-arrow{margin:-8px 30px 0}.aioseo-add-redirection.edit-url .advanced-settings-link{margin-top:21px}.aioseo-add-redirection .advanced-settings-link{text-decoration:underline!important}.aioseo-add-redirection.log-404 .urls .source{min-height:103px;align-items:flex-start}.aioseo-add-redirection .generic-error{margin-bottom:20px}.aioseo-add-redirection .aioseo-settings-row .settings-name .name{font-size:14px}.aioseo-add-redirection .urls{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap}.aioseo-add-redirection .urls .break{flex-basis:100%;height:0}.aioseo-add-redirection .urls .url-arrow{width:36px;margin:-15px 30px 0;display:flex;align-items:center;justify-content:center}@media (min-width:1200px){.aioseo-add-redirection .urls .url-arrow{margin:-15px 50px 0}}.aioseo-add-redirection .urls .url-arrow svg{height:103px;color:#005ae0}.aioseo-add-redirection .urls .source,.aioseo-add-redirection .urls .target{flex:1;display:flex;align-items:center}.aioseo-add-redirection .urls .source>*,.aioseo-add-redirection .urls .target>*{flex:1}.aioseo-add-redirection .urls .source .aioseo-input,.aioseo-add-redirection .urls .target .aioseo-input{margin-bottom:12px}.aioseo-add-redirection .urls .target input{padding-left:30px}.aioseo-add-redirection .urls .target .append-icon{width:30px;justify-content:flex-end}.aioseo-add-redirection .urls .target .append-icon svg{max-width:16px;margin-left:5px}.aioseo-add-redirection .urls .target .append-icon svg:last-of-type{margin-left:0}.aioseo-add-redirection .urls .target .append-icon svg.aioseo-circle-check{color:#00aa63}.aioseo-add-redirection .urls .target .append-icon svg.aioseo-circle-close{color:#df2a4a}.aioseo-add-redirection .urls .target .aioseo-description{height:30px}.aioseo-add-redirection .urls .target .target-url-error,.aioseo-add-redirection .urls .target .target-url-warning{margin-bottom:10px}.aioseo-add-redirection .settings{display:flex;flex-direction:column;align-items:center;margin-top:24px}.aioseo-add-redirection .settings .all-settings{width:100%}.aioseo-add-redirection .settings .all-settings .all-settings-content{display:flex;align-items:center;flex-wrap:wrap}.aioseo-add-redirection .settings .all-settings .all-settings-content .advanced-settings-link{margin:16px 16px 0 0;color:#8c8f9a}@media (max-width:767px){.aioseo-add-redirection .settings .all-settings .all-settings-content{align-items:start}}.aioseo-add-redirection .settings>.actions{align-self:flex-end;margin-top:-50px}.aioseo-add-redirection .settings>.actions.advanced{margin-top:24px}.aioseo-add-redirection .settings .query-params,.aioseo-add-redirection .settings .redirect-type{margin-bottom:10px;flex:0 1 auto}.aioseo-add-redirection .settings .query-params .aioseo-select,.aioseo-add-redirection .settings .redirect-type .aioseo-select{margin-top:5px}.aioseo-add-redirection .settings .query-params{width:340px}.aioseo-add-redirection .settings .redirect-type{width:300px;margin-left:24px}.aioseo-add-redirection .settings .aioseo-button{align-self:flex-end}.aioseo-add-redirection .settings .cancel-edit-row{margin-right:10px}@media (min-width:1200px){.aioseo-add-redirection .settings .cancel-edit-row{margin-right:16px}}.aioseo-add-redirection-target-url,.aioseo-redirect-source-url{position:relative}.aioseo-redirect-source-url .aioseo-input input{padding-left:76px!important}.aioseo-redirect-source-url .aioseo-input .append-icon{width:60px;justify-content:flex-end}.aioseo-redirect-source-url .aioseo-input .append-icon svg{max-width:16px;margin-left:5px}.aioseo-redirect-source-url .aioseo-input .append-icon svg:last-of-type{margin-left:0}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-gear{color:#8c8f9a;cursor:pointer}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-gear.active,.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-gear:hover{color:#005ae0}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-circle-check{color:#00aa63}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-circle-close{color:#df2a4a}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-trash{color:#8c8f9a;cursor:pointer}.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-trash.active,.aioseo-redirect-source-url .aioseo-input .append-icon svg.aioseo-trash:hover{color:#df2a4a}.aioseo-redirect-source-url .source-url-error,.aioseo-redirect-source-url .source-url-warning{margin-bottom:10px}.aioseo-redirect-source-url .source-url-options>div{padding-bottom:5px}.aioseo-redirect-source-url .source-url-options>div>div{margin-bottom:5px}.aioseo-add-redirection-url-results{display:flex;position:absolute;background:#fff;width:100%;max-height:300px;overflow:auto;border:1px solid #d0d1d7;border-radius:3px;z-index:50;right:1px;margin-top:-9px}.aioseo-add-redirection-url-results ul{display:inline-block;max-width:100%;list-style:none;padding:0;margin:0;min-width:100%;vertical-align:top}.aioseo-add-redirection-url-results ul li{margin:0;border-bottom:1px solid #e8e8eb;display:block}.aioseo-add-redirection-url-results ul li:last-of-type{border-bottom:none}.aioseo-add-redirection-url-results ul li>span{color:#141b38;font-weight:700;font-size:16px;white-space:normal;line-height:1.4;display:flex;padding:12px;min-height:40px;text-decoration:none;text-transform:none;vertical-align:middle;position:relative;cursor:pointer}.aioseo-add-redirection-url-results ul li>span:hover{background-color:#f2f7fd}.aioseo-add-redirection-url-results ul li>span:hover .option-title{color:#005ae0}.aioseo-add-redirection-url-results .option{flex:1}.aioseo-add-redirection-url-results .option .option-title{font-weight:500;display:flex;font-size:16px;color:#141b38}.aioseo-add-redirection-url-results .option .option-title>div{margin-left:5px}.aioseo-add-redirection-url-results .option .option-title>div:first-of-type{display:inline-block}.aioseo-add-redirection-url-results .option .option-title .search-term{font-weight:700}.aioseo-add-redirection-url-results .option .option-details{display:flex;align-items:center;font-size:14px;color:#8c8f9a}.aioseo-add-redirection-url-results .option .option-details span{margin-left:15px}.aioseo-add-redirection-url-results .option-permalink{display:flex;align-items:center}.aioseo-add-redirection-url-results .option-permalink svg.aioseo-external{width:15px;height:15px;color:#434960}.aioseo-add-template-tag{border-radius:3px;padding:5px 10px;color:#141b38;font-size:14px;border:1px solid #e8e8eb;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-weight:600}.aioseo-add-template-tag:hover{background-color:#f3f4f5}.aioseo-add-template-tag svg.aioseo-plus{width:10px;height:10px;color:#005ae0}.aioseo-additional-pages .additional-pages-table{border:1px solid #d0d1d7;border-radius:3px;margin-bottom:20px}.aioseo-additional-pages .additional-pages-table .page-priority{max-width:110px}.aioseo-additional-pages .additional-pages-table .page-frequency{max-width:166px}.aioseo-additional-pages .additional-pages-table .page-last-modified{max-width:155px}.aioseo-additional-pages .additional-pages-table .page-actions{max-width:20px}.aioseo-additional-pages .additional-pages-table .page-actions .aioseo-tooltip{display:inline-block;margin:0}.aioseo-additional-pages .additional-pages-table .pages-header{height:50px;display:flex;font-size:14px;padding:0 30px;align-items:center;border-bottom:1px solid #d0d1d7}.aioseo-additional-pages .additional-pages-table .pages-header>div{flex:1 0 auto}.aioseo-additional-pages .additional-pages-table .pages-rows{font-size:14px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row{background-color:#fff;height:70px;display:flex;align-items:center;padding:0 30px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row:last-of-type{border-radius:0 0 3px 3px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row.even{background-color:#f9f9fa}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row>div{flex:1 0 auto;padding-left:30px}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row>div:last-child{padding-left:0}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row .page-actions svg.aioseo-trash{width:20px;height:20px;color:#8c8f9a;cursor:pointer;transition:color .1s ease}.aioseo-additional-pages .additional-pages-table .pages-rows .page-row .page-actions svg.aioseo-trash:hover{color:#df2a4a}.aioseo-additional-pages svg.aioseo-circle-plus{width:14px;height:14px;margin-left:10px}.aioseo-alert{position:relative;border-radius:3px;padding:24px;font-size:16px;color:#141b38;line-height:1.4}.aioseo-alert.small{padding:8px;font-size:13px}.aioseo-alert .aioseo-alert-close{cursor:pointer;position:absolute;top:-9px;left:-9px;width:18px;height:18px;border-radius:50%;padding:5px;display:inline-flex;justify-content:center;align-content:center}.aioseo-alert .aioseo-alert-close svg{width:100%;height:100%}.aioseo-alert.blue{border:1px solid #005ae0;background-color:#f2f7fd}.aioseo-alert.blue .aioseo-alert-close{background-color:#005ae0;color:#fff}.aioseo-alert.green{border:1px solid #00aa63;background-color:#f2fdf8}.aioseo-alert.green .aioseo-alert-close{background-color:#00aa63;color:#fff}.aioseo-alert.red{border:1px solid #df2a4a;background-color:#fbe9ec}.aioseo-alert.red .aioseo-alert-close{background-color:#df2a4a;color:#fff}.aioseo-alert.yellow{border:1px solid #f18200;background-color:#fcfae8}.aioseo-alert.yellow .aioseo-alert-close{background-color:#f18200;color:#fff}.aioseo-alert.no-border{border-width:0}.aioseo-alert.text-center{text-align:center}.aioseo-analyze-competitor-site-score{border:1px solid #00aa63;border-radius:3px;color:#00aa63;font-size:14px;padding:0 8px;height:24px;display:inline-flex;align-items:center;justify-content:center;margin-left:14px}.aioseo-analyze-competitor-site-score.red{color:#df2a4a;border-color:#df2a4a}.aioseo-analyze-competitor-site-score.orange{color:#f18200;border-color:#f18200}.aioseo-animated-dannie{display:flex;align-content:center;align-items:center;justify-content:center}.aioseo-animated-dannie svg{max-width:250px}.aioseo-api-bar{height:40px;background-color:#df2a4a;color:#fff;font-size:13px;padding:0 40px 0 14px}.aioseo-api-bar,.aioseo-api-bar .upgrade-text{display:flex;align-items:center;justify-content:center}.aioseo-api-bar .upgrade-text{flex:1}.aioseo-api-bar strong{font-weight:600}.aioseo-api-bar svg.aioseo-logo-gear{width:20px;height:20px;min-width:20px;margin-left:14px}.aioseo-api-bar svg.aioseo-close{cursor:pointer;width:12px;height:12px}.aioseo-api-bar a{color:#fff;text-decoration:underline}.aioseo-api-bar a:hover{text-decoration:none}@media screen and (max-width:782px){.aioseo-api-bar{padding:0 10px;height:60px}}.aioseo-attributes ul.aioseo-attributes-list[data-v-02af7dd2]{list-style:inside;list-style-type:disc;margin:20px 0 0}.aioseo-attributes ul.aioseo-attributes-list li[data-v-02af7dd2]{display:flex;margin-bottom:8px;align-items:flex-start}.aioseo-attributes ul.aioseo-attributes-list li div[data-v-02af7dd2]:first-of-type{flex:0 0 140px}.aioseo-blur{filter:blur(3px);pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.aioseo-card{color:#141b38;background-color:#fff;border:1px solid #e8e8eb;box-shadow:0 2px 5px rgba(0,0,0,.05);margin:30px 0}.aioseo-card.disabled .content{background:#f9f9fa;font-size:16px;line-height:24px}@media only screen and (max-width:782px){.aioseo-card{margin:20px 0}}.aioseo-card svg.aioseo-circle-question-mark{width:17px;height:17px;color:#8c8f99;transition:background-color .2s ease}.aioseo-card svg.aioseo-circle-question-mark:hover{color:#5a5c65}.aioseo-card .header{display:flex;align-items:center;height:70px;padding:0 30px;font-weight:600;font-size:18px;border-bottom:1px solid #e8e8eb}.aioseo-card .header .header-icon{display:flex}.aioseo-card .header .header-icon svg{width:24px;height:24px;margin-left:16px}.aioseo-card .header .text{flex:1 0 auto;display:flex;align-items:center}.aioseo-card .header .text svg.aioseo-circle-question-mark{cursor:pointer;width:17px;height:17px}.aioseo-card .header .text .aioseo-pro-badge{margin-right:10px}.aioseo-card .header .text .card-score{display:flex;flex:1;align-items:center;justify-content:flex-end;padding-left:18px;font-size:13px}.aioseo-card .header .text .card-score.green{color:#00aa63}.aioseo-card .header .text .card-score.orange{color:#f18200}.aioseo-card .header .text .card-score.red{color:#df2a4a}.aioseo-card .header .text .card-score svg{margin-left:7px}.aioseo-card .header svg.aioseo-caret{width:24px;height:24px;cursor:pointer;transform:rotate(180deg);transition:transform .3s}.aioseo-card .header svg.aioseo-caret.rotated{transform:rotate(90deg)}.aioseo-card .header svg.aioseo-close{width:14px;height:14px;cursor:pointer}.aioseo-card .content{padding:30px;position:relative}.aioseo-card div.aioseo-settings-row:last-child{margin-bottom:0;border-bottom:none;padding-bottom:0}.aioseo-copy-block{display:inline-flex}.aioseo-copy-block .message{background-color:#fff;min-height:56px;display:flex;align-items:center;border:1px solid #dcdde1;border-radius:0 3px 3px 0;padding:10px 24px;font-weight:600}.aioseo-copy-block .copy-tooltip{display:flex}.aioseo-copy-block .copy{background-color:#fff;min-height:56px;display:flex;align-items:center;border:1px solid #dcdde1;border-right-width:0;border-radius:3px 0 0 3px;padding:10px 16px;font-weight:600;cursor:pointer}.aioseo-copy-block .copy:hover svg.aioseo-copy{color:#a7a7a7}.aioseo-copy-block .copy svg.aioseo-copy{width:20px;height:20px;color:#dadada}.aioseo-copy-block .copy svg.aioseo-circle-check-solid{width:20px;height:20px;color:#00aa63}.aioseo-display-info .aioseo-box-toggle svg{margin-top:-15px;color:#434960}.aioseo-display-info svg.aioseo-new-page,.aioseo-display-info svg.aioseo-shortcode,.aioseo-display-info svg.aioseo-widget{width:100%;height:auto;max-width:60px}.aioseo-display-info svg.aioseo-gutenberg-block{width:59px;height:54px}.aioseo-display-info svg.aioseo-gutenberg-block rect{width:100%;width:56px;height:51px}.aioseo-display-info svg.aioseo-php{width:110px}.aioseo-display-info .copy-box,.aioseo-display-info .extra-box{margin-top:10px;padding:30px;border-radius:3px;background-color:#f9f9fa}.aioseo-display-info .copy-box .aioseo-description,.aioseo-display-info .extra-box .aioseo-description{margin:0}.aioseo-display-info .copy-box .aioseo-copy-block,.aioseo-display-info .extra-box .aioseo-copy-block{margin:20px 0 0}.aioseo-display-info .copy-box .advanced-settings-link,.aioseo-display-info .extra-box .advanced-settings-link{display:inline-block;padding-top:5px;margin:16px 16px 0 0;color:#8c8f9a;text-decoration:underline;font-size:13px}.aioseo-display-info .copy-box .advanced-settings-link:hover,.aioseo-display-info .extra-box .advanced-settings-link:hover{text-decoration:none}.aioseo-display-info .copy-box .advanced-settings,.aioseo-display-info .extra-box .advanced-settings{padding-top:20px}.aioseo-display-info .advanced-settings.advanced-settings-hidden{display:none}.aioseo-display-info .aioseo-tooltip{margin-right:0}.aioseo-exclude-posts{display:flex}.aioseo-facebook-preview{background-color:#f0f2f5;padding:30px;display:flex;align-items:center;justify-content:center}.aioseo-facebook-preview .facebook-post{width:100%;max-width:525px;border-radius:10px;box-shadow:0 2px 5px rgba(0,0,0,.1);background-color:#fff}.aioseo-facebook-preview .facebook-post .facebook-header{height:65px;padding:0 18px;display:flex;align-items:center}.aioseo-facebook-preview .facebook-post .facebook-header .profile-photo{overflow:hidden;width:40px;height:40px;border:1px solid #e8e8eb;border-radius:50%}.aioseo-facebook-preview .facebook-post .facebook-header .profile-photo img{height:100%;width:100%}.aioseo-facebook-preview .facebook-post .facebook-header .poster{margin-right:10px;flex:1 0 auto}.aioseo-facebook-preview .facebook-post .facebook-header .poster .poster-name{font-size:15px;color:#050505;font-weight:500}.aioseo-facebook-preview .facebook-post .facebook-header .poster .poster-date{color:#65676b;font-size:13px}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis{display:inline-flex;align-items:center}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis div{background-color:#5e666f;width:4px;height:4px;border-radius:50%;margin:0 2px}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis div:first-child{margin-right:0}.aioseo-facebook-preview .facebook-post .facebook-header .ellipsis div:last-child{margin-left:0}.aioseo-facebook-preview .facebook-post .facebook-content{display:flex;flex-direction:column}.aioseo-facebook-preview .facebook-post .facebook-content img{width:100%;height:auto}.aioseo-facebook-preview .facebook-post .facebook-content.vertical{flex-direction:row}.aioseo-facebook-preview .facebook-post .facebook-content.vertical img{max-width:158px;max-height:158px;width:auto;height:auto}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description{flex:1;background-color:#f2f3f5;padding:9px 13px;color:#606770}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description .site-domain{font-size:13px;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description .site-title{color:#1d2129;font-size:17px;font-weight:600;margin:5px 0}.aioseo-facebook-preview .facebook-post .facebook-content .facebook-site-description .site-description{font-size:14px}.aioseo-facebook-preview .facebook-post .facebook-footer{height:24px}.aioseo-feature-card{height:100%;border:1px solid #e8e8eb;background:#fff;box-shadow:0 2px 5px rgba(0,0,0,.05);color:#141b38;display:flex;flex-direction:column}.aioseo-feature-card .feature-card-body{padding:30px 30px 20px;flex:1}.aioseo-feature-card .feature-card-body.static{padding:30px}.aioseo-feature-card .feature-card-body .feature-card-header{display:flex;align-items:center;font-size:18px;font-weight:600;margin-bottom:16px}.aioseo-feature-card .feature-card-body .feature-card-header img,.aioseo-feature-card .feature-card-body .feature-card-header svg{width:28px;height:28px;margin-left:10px}.aioseo-feature-card .feature-card-body .feature-card-description{color:#434960;font-size:15px}.aioseo-feature-card .feature-card-body .feature-card-description .learn-more{margin-top:10px}.aioseo-feature-card .feature-card-footer{padding:15px}.aioseo-feature-card .feature-card-footer:not(.upgrade-required){border:2px solid #fff;background-color:#f9f9fa;padding:12px;min-height:43px}.aioseo-feature-card .feature-card-footer .feature-card-install-activate{display:flex;align-items:center;justify-content:flex-end;height:30px;position:relative}.aioseo-feature-card .feature-card-footer .feature-card-install-activate .aioseo-loading-spinner{position:absolute;right:0}.aioseo-feature-card .feature-card-footer .feature-card-install-activate .status{font-weight:600;font-size:14px}.aioseo-feature-card .feature-card-footer .feature-card-install-activate .aioseo-toggle .toggle-content{margin-left:0;margin-right:10px}.aioseo-feature-card .feature-card-footer .feature-card-upgrade-cta{display:flex;align-items:center;justify-content:flex-end}.aioseo-feature-card .feature-card-footer.installed .feature-card-install-activate .status{color:#8c8f9a}.aioseo-setup-wizard-container{margin-top:30px;margin-bottom:50px;padding:30px;color:#fff;position:relative;background-color:#005ae0}@media only screen and (max-width:782px){.aioseo-setup-wizard-container{margin-top:20px}}.aioseo-setup-wizard-container p{color:#fff}.aioseo-setup-wizard-container .getting-started-wrapper{display:flex}.aioseo-setup-wizard-container .getting-started-wrapper .video{flex:0 0 533px;margin:20px 20px 0}.aioseo-setup-wizard-container .getting-started-wrapper .video .wrapper{padding-bottom:56.25%;margin-bottom:-60px;position:relative;height:0}.aioseo-setup-wizard-container .getting-started-wrapper .video .wrapper iframe{width:100%;height:100%;position:absolute;top:0;right:0}@media only screen and (max-width:1350px){.aioseo-setup-wizard-container .getting-started-wrapper .video{flex:0 0 593px;margin:20px;align-self:center}.aioseo-setup-wizard-container .getting-started-wrapper .video .wrapper{margin-bottom:0}.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions .aioseo-col{flex-basis:100%;max-width:100%;justify-content:center}}@media only screen and (max-width:1300px){.aioseo-setup-wizard-container .getting-started-wrapper{flex-direction:row;flex-wrap:wrap}.aioseo-setup-wizard-container .getting-started-wrapper .video{margin:20px 0 -60px}.aioseo-setup-wizard-container .getting-started-wrapper .text,.aioseo-setup-wizard-container .getting-started-wrapper .video{flex-basis:100%;width:100%}.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions{justify-content:center}.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions .aioseo-col{flex-basis:inherit;max-width:inherit;justify-content:center}}@media only screen and (max-width:782px){.aioseo-setup-wizard-container .getting-started-wrapper .wizard-actions .aioseo-col{flex-basis:100%;max-width:100%;justify-content:center}}.aioseo-setup-wizard-container .aioseo-row{position:relative;z-index:1}.aioseo-setup-wizard-container .wizard-actions .aioseo-col{display:flex;align-items:center}.aioseo-setup-wizard-container .wizard-actions .aioseo-button svg{width:16px;height:16px;margin-left:10px}.aioseo-setup-wizard-container .setup-wizard-bg{width:100%;height:100%;overflow:hidden;z-index:0;position:absolute;top:0;right:0}.aioseo-setup-wizard-container .setup-wizard-bg svg.aioseo-setup-wizard-bg,.aioseo-setup-wizard-container .setup-wizard-bg svg.aioseo-setup-wizard-bg rect{width:auto;height:100%}.aioseo-setup-wizard-container .close-wizard{color:#fff;width:20px;height:20px;position:absolute;left:20px;top:20px;z-index:1;display:flex;align-items:center;justify-content:center}.aioseo-setup-wizard-container .close-wizard:hover{color:#ccc}.aioseo-setup-wizard-container .close-wizard svg.aioseo-close{width:12px;height:12px;cursor:pointer;color:#fff}.aioseo-setup-wizard-container .close-wizard svg.aioseo-close:hover{color:#dadada}.aioseo-setup-wizard-container p.how-to-get-started{margin:0}.aioseo-setup-wizard-container p.welcome-text{line-height:1.6}.aioseo-setup-wizard-container h2{color:#fff;line-height:1.4}.aioseo-setup-wizard-container a{color:#fff}.aioseo-setup-wizard-container svg.aioseo-book{width:20px;height:20px;margin:0 0 0 10px}.aioseo-setup-wizard-container .getting-started-video{padding-left:20px;margin-bottom:-60px;position:relative;height:0;padding-bottom:56.25%}.aioseo-setup-wizard-container .getting-started-video iframe{width:100%;height:100%;position:absolute;top:0;right:0}.aioseo-google-search-preview{padding:32px 30px;border:1px solid #e8e8eb}.aioseo-google-search-preview .domain{font-size:14px;line-height:1.3;color:#3c4043;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.aioseo-google-search-preview .site-title{font-size:20px;line-height:1.3;color:#1a0dab;margin:3px 0}.aioseo-google-search-preview .meta-description{max-width:600px;font-size:14px;line-height:1.4;color:#52565a}.edit-post-sidebar .domain,.editor-post-publish-panel .domain{font-size:13px}.edit-post-sidebar .site-title,.editor-post-publish-panel .site-title{font-size:16px}.edit-post-sidebar .meta-description,.editor-post-publish-panel .meta-description{font-size:12px}.aioseo-modal-content .domain,.aioseo-modal-content .meta-description{font-size:14px}.aioseo-modal-content .site-title{font-size:20px}html:not([data-scroll="0"]) .aioseo-header{box-shadow:0 2px 5px rgba(0,0,0,.05);transition:box-shadow .6s}.aioseo-header{position:fixed;z-index:1051;top:0;left:0;right:0;background-color:#fff;height:72px;color:#141b38}.aioseo-header .mascot{width:35px;height:auto;margin-left:10px}.aioseo-header .aioseo-header-content{padding:0;display:flex;height:72px;align-items:center}.aioseo-header .aioseo-header-content a:focus{box-shadow:none}.aioseo-header .aioseo-header-content svg.aioseo-logo{height:26px;margin-left:10px}.aioseo-header .aioseo-header-content .spacer{display:inline-flex;width:26.25px;height:0;border:1px solid #d0d1d7;transform:rotate(72.26deg)}.aioseo-header .aioseo-header-content .page-name{display:inline-flex;margin-right:10px;font-size:18px;font-weight:400;flex:1 0 auto}.aioseo-header .aioseo-header-content .header-actions{display:flex}.aioseo-header .aioseo-header-content .header-actions .round{position:relative;background-color:#f3f4f5;border-radius:50%;width:40px;height:40px;display:flex;align-items:center;justify-content:center;margin-right:10px;cursor:pointer;transition:background-color .2s ease}.aioseo-header .aioseo-header-content .header-actions .round svg{width:20px;height:20px}.aioseo-header .aioseo-header-content .header-actions .round:hover{background-color:#e5e7e9}.aioseo-header .aioseo-header-content .header-actions .number{position:absolute;background-color:#df2a4a;width:16px;height:16px;font-weight:600;font-size:10px;color:#fff;top:-8px;right:50%;transform:translateX(50%);margin:0;-webkit-animation:bounce 2s 5;animation:bounce 2s 5}.aioseo-header .aioseo-header-content .header-actions .number:hover{background-color:#df2a4a}@-webkit-keyframes bounce{0%,25%,50%,75%,to{transform:translateX(50%) translateY(0)}40%{transform:translateX(50%) translateY(-8px)}60%{transform:translateX(50%) translateY(-4px)}}@keyframes bounce{0%,25%,50%,75%,to{transform:translateX(50%) translateY(0)}40%{transform:translateX(50%) translateY(-8px)}60%{transform:translateX(50%) translateY(-4px)}}body.modal-open{overflow:hidden}.aioseo-help{display:block;position:fixed;top:0;bottom:0;right:0;left:0;height:100%;width:100vw;background-color:#fff;color:#8c8f9a;opacity:0;max-height:100vh;overflow-y:auto;transition:opacity .3s ease-in 0s;z-index:-999}.aioseo-help.visible{opacity:1;z-index:100000}.aioseo-help .aioseo-help-header{background:#fff;width:100%;height:60px;z-index:1;padding:20px;display:flex}.aioseo-help .aioseo-help-header>.logo{flex:1}.aioseo-help .aioseo-help-docs{margin-bottom:25px;display:none}.aioseo-help .aioseo-help-docs li{padding:0 4px 14px 0;margin:0}.aioseo-help .aioseo-help-docs .aioseo-help-docs-viewall{margin:10px 0 0}.aioseo-help .aioseo-help-docs .aioseo-help-additional-docs{display:none}.aioseo-help .aioseo-help-docs .aioseo-help-additional-docs.opened{display:block}.aioseo-help .aioseo-help-docs .icon .aioseo-description{width:20px;margin-top:0;position:relative;top:5px;right:-5px;color:#8c8f9a}.aioseo-help .help-content{background-color:#fff;width:100%;max-width:740px;margin:0 auto 50px;padding:0 20px;box-sizing:border-box;z-index:1}.aioseo-help .help-content .aioseo-help-category{border-top:1px solid #e8e8eb;margin:0}.aioseo-help .help-content .aioseo-help-category:last-child{border-bottom:1px solid #e8e8eb}.aioseo-help .help-content .aioseo-help-category header{display:block;position:relative;cursor:pointer;width:100%;height:68px}.aioseo-help .help-content .aioseo-help-category header .title{display:block;font-size:16px;color:#8c8f9a;font-weight:600;padding:23px 30px 23px 11px}.aioseo-help .help-content .aioseo-help-category .folder-open{position:absolute;top:24px;width:20px;height:20px;color:#8c8f9a}.aioseo-help .help-content .aioseo-help-category .dashicons-arrow-right-alt2{position:absolute;top:20px;left:0;transition:transform .3s ease-out}.aioseo-help .help-content .aioseo-help-category.opened .aioseo-help-docs{display:block}.aioseo-help .help-content .aioseo-help-category.opened .dashicons-arrow-right-alt2{transform:rotate(-90deg)}.aioseo-help .help-content #aioseo-help-search{position:relative;background-color:#fff;text-align:center;top:0;padding:20px 0 50px}.aioseo-help .help-content #aioseo-help-result .aioseo-help-docs{display:block}.aioseo-help .help-content #aioseo-help-footer{display:flex;flex-wrap:nowrap;justify-content:space-between;align-items:center;margin:50px 0 0}@media screen and (max-width:750px){.aioseo-help .help-content #aioseo-help-footer{display:block}}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block{box-sizing:border-box;max-width:325px;border:1px solid #8c8f9a;border-radius:6px;text-align:center}@media screen and (max-width:750px){.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block{max-width:100%}}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block:first-child{margin-left:20px}@media screen and (max-width:750px){.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block:first-child{margin:0 0 20px}}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a{display:block;padding:25px;text-decoration:none;color:#8c8f9a}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a h3{color:#8c8f9a}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a span{font-size:16px;color:#005ae0;text-decoration:underline}.aioseo-help .help-content #aioseo-help-footer .aioseo-help-footer-block a:hover span{text-decoration:none}.aioseo-help .help-content #aioseo-help-footer .aioseo-description,.aioseo-help .help-content #aioseo-help-footer .aioseo-support{width:48px;margin-top:0;color:#8c8f9a}#aioseo-help-logo{width:132px;height:26px;z-index:2}#aioseo-help-close{width:20px;height:20px;cursor:pointer;opacity:.7;transition:all .05s;z-index:2}@media screen and (max-width:750px){#aioseo-help-close{top:20px;left:20px}}.aioseo-html-tags-editor .no-access{margin-bottom:20px}.aioseo-html-tags-editor .aioseo-description.tags-description{margin:0 0 20px}.aioseo-html-tags-editor .add-tags{display:flex;align-items:center;margin-bottom:20px}.aioseo-html-tags-editor .add-tags div{margin-left:10px}.aioseo-html-tags-editor .add-tags a{font-size:14px}.aioseo-html-tags-editor .add-tags a.no-underline{padding-right:10px}.aioseo-loading-spinner{width:35px;height:35px;position:absolute}.aioseo-loading-spinner .double-bounce1,.aioseo-loading-spinner .double-bounce2{width:100%;height:100%;border-radius:50%;background-color:#fff;opacity:.6;position:absolute;top:0;right:0;-webkit-animation:sk-bounce 1.3s ease-in-out infinite;animation:sk-bounce 1.3s ease-in-out infinite}.aioseo-loading-spinner.dark .double-bounce1,.aioseo-loading-spinner.dark .double-bounce2{background-color:#8c8f9a}.aioseo-loading-spinner .double-bounce2{-webkit-animation-delay:-.65s;animation-delay:-.65s}@-webkit-keyframes sk-bounce{0%,to{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,to{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}body.vue-build{margin:0}body.vue-build .aioseo-app{min-height:calc(100vh - 88px)}body.vue-build .aioseo-app .aioseo-main{padding-bottom:30px}body.aioseo-setup-wizard{margin:0;padding:0}body.aioseo-setup-wizard .aioseo-app{min-height:100vh;width:100%}body[class*=page_aioseo] .aioseo-header,body[class*=page_aioseo] .aioseo-notifications .overlay{right:160px}body[class*=page_aioseo].folded .aioseo-header,body[class*=page_aioseo].folded .aioseo-notifications .overlay{right:36px}body[class*=page_aioseo] #wpcontent{padding:0;background-color:#f3f4f5}body[class*=page_aioseo] .update-nag{display:none}body[class*=page_aioseo].admin-bar .aioseo-app{min-height:calc(100vh - 185px)}body[class*=page_aioseo].admin-bar.aioseo-has-bar .aioseo-app{min-height:calc(100vh - 225px)}body[class*=page_aioseo].admin-bar .aioseo-header,body[class*=page_aioseo].admin-bar .aioseo-notifications .notification-menu,body[class*=page_aioseo].admin-bar .aioseo-notifications .overlay{top:32px}body[class*=page_aioseo] .aioseo-app{min-height:calc(100vh - 153px)}body[class*=page_aioseo].aioseo-has-bar .aioseo-app{min-height:calc(100vh - 193px)}body[class*=page_aioseo].aioseo-has-bar .aioseo-header{height:112px}@media screen and (max-width:782px){body[class*=page_aioseo].aioseo-has-bar .aioseo-header{height:132px}}@media screen and (max-width:960px){body[class*=page_aioseo].auto-fold .aioseo-header,body[class*=page_aioseo].auto-fold .aioseo-notifications .overlay{right:36px}}@media screen and (max-width:782px){body[class*=page_aioseo] #wpbody-content{padding-bottom:20px}body[class*=page_aioseo].admin-bar .aioseo-app{min-height:calc(100vh - 199px)}body[class*=page_aioseo].admin-bar .aioseo-header,body[class*=page_aioseo].admin-bar .aioseo-notifications .notification-menu,body[class*=page_aioseo].admin-bar .aioseo-notifications .overlay{top:46px}body[class*=page_aioseo] .aioseo-header,body[class*=page_aioseo] .aioseo-notifications .overlay,body[class*=page_aioseo].auto-fold .aioseo-header,body[class*=page_aioseo].auto-fold .aioseo-notifications .overlay{right:0}}@media screen and (max-width:600px){body[class*=page_aioseo].admin-bar .aioseo-header,body[class*=page_aioseo].admin-bar .aioseo-notifications .menu,body[class*=page_aioseo].admin-bar .aioseo-notifications .overlay{position:absolute;top:46px}}body.aioseo-has-bar .aioseo-app .aioseo-main>.aioseo-container{margin-top:128px}@media screen and (max-width:782px){body.aioseo-has-bar .aioseo-app .aioseo-main>.aioseo-container{margin-top:148px}}.aioseo-app{box-sizing:border-box;background-color:#f3f4f5}.aioseo-app .route-fade-enter-active,.aioseo-app .route-fade-leave-active{transition:all .2s}.aioseo-app .route-fade-enter,.aioseo-app .route-fade-leave-active{opacity:0}.aioseo-app .route-fade-enter{transform:translateX(-30px)}.aioseo-app .route-fade-leave-active{transform:translateX(30px)}.aioseo-app *,.aioseo-app :after,.aioseo-app :before{box-sizing:inherit}.aioseo-app * :not(.aioseo-button):not(.aioseo-input),.aioseo-app :after :not(.aioseo-button):not(.aioseo-input),.aioseo-app :before :not(.aioseo-button):not(.aioseo-input){line-height:1.4}.aioseo-app p{font-size:16px}.aioseo-app a:not(.aioseo-button){color:#005ae0}.aioseo-app a:not(.aioseo-button).text-white{color:#fff}.aioseo-app a:not(.aioseo-button).no-underline,.aioseo-app a:not(.aioseo-button):hover{text-decoration:none}.aioseo-app h2{font-size:32px;margin:0}.aioseo-app .aioseo-main{height:100%}.aioseo-app .aioseo-main>.aioseo-container{margin-top:88px}.aioseo-app .aioseo-main .save-changes{display:flex;justify-content:flex-end}.aioseo-app .d-flex{display:flex}.aioseo-app .aioseo-section-description{font-size:16px;color:#141b38;line-height:1.8;padding-bottom:30px}.aioseo-app .aioseo-description-text{font-size:14px;line-height:1.8;color:#141b38}.aioseo-app .aioseo-description-text.aioseo-error{color:#df2a4a}.aioseo-app .aioseo-description{font-size:14px;line-height:1.8;margin:8px 0 0;color:#141b38}.aioseo-app .aioseo-description.no-margin{margin:0}.aioseo-app .aioseo-description.aioseo-error{color:#df2a4a}.aioseo-app .max-recommended-count{color:#434960;text-align:left;margin-top:10px;font-size:14px}.aioseo-app .max-recommended-count strong.error{color:#df2a4a}.aioseo-app .popper{text-align:right;font-size:12px;padding:20px;background-color:#fff;border:none;border-radius:3px;box-shadow:0 3px 4.8px 0 rgba(32,71,102,.27);z-index:9999;max-width:350px;line-height:1.4}.aioseo-app .popper.action{padding:8px 12px;background-color:#141b38;color:#fff}.aioseo-app .popper.action .popper__arrow{border-top-color:#141b38}.aioseo-app .popper[x-placement^=bottom]{box-shadow:0 -2px 4.8px 0 rgba(32,71,102,.27)}.aioseo-app .popper .aioseo-description{margin:0}.aioseo-app .aioseo-row-highlight{-webkit-animation-name:color;animation-name:color;-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-iteration-count:2;animation-iteration-count:2}@-webkit-keyframes color{0%{background-color:#fff}50%{background-color:#00aa63}to{background-color:#fff}}@keyframes color{0%{background-color:#fff}50%{background-color:#00aa63}to{background-color:#fff}}.column-aioseo-details{position:relative}.aioseo-seo-site-score .aioseo-blur{display:flex;align-items:center}.aioseo-seo-site-score .aioseo-seo-site-score-cta{position:absolute;right:50%;top:50%;transform:translateX(50%) translateY(-50%);background-color:#fff;padding:24px 30px;border:1px solid #e8e8eb;box-shadow:0 2px 10px rgba(0,90,224,.2);color:#141b38;font-size:16px;font-weight:600;width:82%;max-width:500px;text-align:center}.aioseo-app .aioseo-upgrade-bar{height:40px;background-color:#00aa63;display:flex;align-items:center;justify-content:center;color:#fff;font-size:13px;padding:0 40px 0 14px}.aioseo-app .aioseo-upgrade-bar .upgrade-text{display:flex;align-items:center;flex:1;justify-content:center}.aioseo-app .aioseo-upgrade-bar .upgrade-arrow{font-size:15px;text-decoration:none}.aioseo-app .aioseo-upgrade-bar .upgrade-arrow:hover{text-decoration:none}.aioseo-app .aioseo-upgrade-bar strong{font-weight:600}.aioseo-app .aioseo-upgrade-bar svg.aioseo-logo-gear{width:20px;height:20px;min-width:20px;margin-left:14px}.aioseo-app .aioseo-upgrade-bar svg.aioseo-close{cursor:pointer;width:12px;height:12px}.aioseo-app .aioseo-upgrade-bar a{color:#fff;text-decoration:underline}.aioseo-app .aioseo-upgrade-bar a:hover{text-decoration:none}@media screen and (max-width:782px){.aioseo-app .aioseo-upgrade-bar{padding:0 10px;height:60px}}.field-description[data-v-2bfc1de2]{display:inline-block;margin-top:10px;font-size:14px}.aioseo-address-wrapper[data-v-4bc9bbe6]{display:flex;max-width:500px}.field-description[data-v-4bc9bbe6]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-4bc9bbe6]{margin-top:8px}.field-description[data-v-a0a894b8]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-a0a894b8]{margin-top:8px}.field-description[data-v-4fb4e044]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-4fb4e044]{margin-top:8px}.field-description[data-v-85733554]{display:inline-block;margin-top:10px;font-size:14px}.field-description[data-v-515336a2]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-515336a2]{margin-top:8px}.field-description[data-v-78337de7]{display:inline-block;margin-bottom:10px;font-size:14px}.mt-8[data-v-78337de7]{margin-top:8px}.aioseo-general-settings .more-tooltip-text strong{color:#00aa63}.aioseo-general-settings .license-cta-box{border-radius:3px;background-color:#f2f7fd;padding:20px;max-width:630px;margin:10px 0 30px}.aioseo-general-settings .license-cta-box a{color:#00aa63}.aioseo-general-settings .license-cta-box div{font-weight:600}.aioseo-general-settings .license-cta-box span{font-size:14px;font-style:italic}.aioseo-general-settings .license-key{margin-top:10px;display:flex;max-width:560px}.aioseo-general-settings .license-key .aioseo-input{margin-left:10px}.aioseo-app .aioseo-tabs.internal{margin-bottom:0}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation{margin-top:5px}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation .md-button{height:60px}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple{padding:0 25px}.aioseo-app .aioseo-tabs.internal .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple .md-ripple-wave{display:none}.aioseo-app .aioseo-tabs.skinny .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple{padding:0 16px}.aioseo-app .md-tabs{display:flex;flex-direction:column}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation{margin-top:2px;background:transparent;display:flex;position:relative;justify-content:flex-start}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation.md-elevation-0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button{color:#141b38;max-width:264px;min-width:72px;height:60px;margin:0;border-radius:0;font-size:15px;font-weight:500;padding:0;display:inline-block;position:relative;overflow:hidden;outline:none;background:transparent;border:0;transition:.4s cubic-bezier(.4,0,.2,1);font-family:inherit;line-height:normal;text-decoration:none;vertical-align:top;white-space:nowrap}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:before{position:absolute;top:0;left:0;bottom:0;right:0;opacity:0;transition:.4s cubic-bezier(.4,0,.2,1);will-change:background-color,opacity;content:" "}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple{padding:0 18px;display:flex;justify-content:center;align-items:center;width:100%;height:100%;position:relative;overflow:hidden;-webkit-mask-image:radial-gradient(circle,#fff 100%,#000 0);mask-image:radial-gradient(circle,#fff 100%,#000 0)}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button .md-ripple .md-button-content{position:static;z-index:2}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:not([disabled]){cursor:pointer}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:not([disabled]):active:before,.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button:not([disabled]):hover:before{background-color:currentColor;opacity:.12}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button.md-active{color:#005ae0}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-button.md-active:focus{outline:none;box-shadow:none}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-tabs-indicator{height:2px;background-color:#005ae0;bottom:-2px;position:absolute;right:0;transform:translateZ(0);will-change:left,right}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-tabs-indicator.md-tabs-indicator-left{transition:right .3s cubic-bezier(.4,0,.2,1),left .35s cubic-bezier(.4,0,.2,1)}.aioseo-app .md-tabs.md-theme-default .md-tabs-navigation .md-tabs-indicator.md-tabs-indicator-right{transition:left .3s cubic-bezier(.4,0,.2,1),right .35s cubic-bezier(.4,0,.2,.1)}.aioseo-app .aioseo-tabs{display:flex;border-bottom:2px solid #e8e8eb;position:relative;margin-bottom:38px}.aioseo-app .aioseo-tabs .save-changes{position:absolute;left:0;bottom:10px}.aioseo-app .aioseo-tabs .tab-score{display:inline-flex;align-items:center;justify-content:flex-end;font-size:11px;font-weight:700;padding-right:12px}.aioseo-app .aioseo-tabs .tab-score.green{color:#00aa63}.aioseo-app .aioseo-tabs .tab-score.orange{color:#f18200}.aioseo-app .aioseo-tabs .tab-score.red{color:#df2a4a}.aioseo-app .aioseo-tabs .tab-score svg{display:inline;margin-left:7px}.aioseo-app .aioseo-mobile-tabs{position:relative;height:40px;margin-top:20px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.aioseo-app .aioseo-mobile-tabs .active-tab{color:#005ae0;padding-right:18px;min-height:100%;display:flex;align-items:center;cursor:pointer}.aioseo-app .aioseo-mobile-tabs .active-tab div{position:relative}.aioseo-app .aioseo-mobile-tabs .active-tab div span{height:2px;background-color:#005ae0;bottom:-7px;position:absolute;right:-18px;left:-18px;z-index:10}.aioseo-app .aioseo-mobile-tabs .active-tab svg.aioseo-caret{width:24px;height:24px;position:relative;top:6px;cursor:pointer;transition:transform .3s}.aioseo-app .aioseo-mobile-tabs .active-tab svg.aioseo-caret.rotated{transform:rotate(-180deg)}.aioseo-app .aioseo-mobile-tabs .tab-dropdown{border:1px solid #e8e8eb;border-top:none}.aioseo-app .aioseo-mobile-tabs .tab-links{background:#fff;position:relative;z-index:3;padding:8px;width:100%;max-width:300px}@media screen and (max-width:782px){.aioseo-app .aioseo-mobile-tabs .tab-links{max-width:100%}}.aioseo-app .aioseo-mobile-tabs .tab-links a{padding:10px;display:block;color:#141b38;text-decoration:none}.aioseo-app .aioseo-mobile-tabs .tab-links a:hover{color:#005ae0}.md-tooltip{background-color:#141b38!important;color:#fff!important;border-radius:2px;padding:6px 12px;font-size:14px}.md-tooltip:after{content:"";position:absolute;top:100%;right:50%;margin-right:-5px;border:5px solid transparent;border-top-color:#141b38}.modal-mask{position:fixed;z-index:9998;top:0;right:0;width:100%;height:100%;background-color:rgba(20,27,56,.3);display:table;transition:opacity .3s ease}@media screen and (max-width:520px){.modal-mask{display:block;top:46px}}.modal-mask .modal-wrapper{display:table-cell;vertical-align:middle}@media screen and (max-width:520px){.modal-mask .modal-wrapper{display:block;height:100%}}.modal-mask .modal-wrapper .modal-container{width:100%;max-width:750px;max-height:90vh;overflow-y:hidden;overflow-x:hidden;margin:0 auto;background-color:#fff;box-shadow:0 10px 30px rgba(0,0,0,.15);transition:all .3s ease}@media screen and (max-width:520px){.modal-mask .modal-wrapper .modal-container{width:100%;max-width:100%;max-height:calc(100vh - 46px);height:100%}}.modal-mask .modal-wrapper .modal-container .modal-header{color:#141b38;position:sticky;top:0;z-index:15;padding:0 40px 0 0;height:70px;font-size:20px;font-weight:700;line-height:1.4;border-bottom:1px solid #e8e8eb;background-color:#fff;display:flex;align-items:center}@media screen and (max-width:520px){.modal-mask .modal-wrapper .modal-container .modal-header{padding:15px 20px 0 0}}.modal-mask .modal-wrapper .modal-container .modal-header button.close{position:absolute;left:11px;top:11px;width:24px;height:24px;background-color:#fff;border:none;display:flex;align-items:center}.modal-mask .modal-wrapper .modal-container .modal-header button.close svg.aioseo-close{cursor:pointer;width:14px;height:14px}.modal-mask .modal-wrapper .modal-container .modal-body .aioseo-post-general,.modal-mask .modal-wrapper .modal-container .modal-body .aioseo-post-social{height:calc(90vh - 120px);max-height:600px;overflow-y:auto;overflow-x:hidden}.modal-mask .modal-wrapper .modal-container .modal-body .aioseo-modal-content.has-padding{padding:40px}@media screen and (max-width:520px){.modal-mask .modal-wrapper .modal-container .aioseo-modal-content,.modal-mask .modal-wrapper .modal-container .aioseo-modal-content>.component-wrapper,.modal-mask .modal-wrapper .modal-container .modal-body,.modal-mask .modal-wrapper .modal-container .modal-body>div{height:100%}.modal-mask .modal-wrapper .modal-container .aioseo-modal-content>.component-wrapper{display:flex;align-items:flex-end}.modal-mask .modal-wrapper .modal-container .aioseo-post-general,.modal-mask .modal-wrapper .modal-container .aioseo-post-social{height:100%!important;max-height:100%!important;padding:20px!important}.modal-mask .modal-wrapper .modal-container .aioseo-post-general .mobile-radio-buttons,.modal-mask .modal-wrapper .modal-container .aioseo-post-social .mobile-radio-buttons{margin-bottom:0}.modal-mask .modal-wrapper .modal-container .aioseo-add-template-tag{display:none}.modal-mask .modal-wrapper .modal-container .tab-facebook .aioseo-settings-row:last-of-type,.modal-mask .modal-wrapper .modal-container .tab-twitter .aioseo-settings-row:last-of-type{margin-bottom:64px!important;padding-bottom:32px!important}}.modal-enter,.modal-leave-active{opacity:0}.modal-enter .modal-container,.modal-leave-active .modal-container{transform:scale(1.1)}.aioseo-notification>div .body .title .date{font-weight:400;color:#8c8f9a;font-size:12px}.aioseo-notification-cards .aioseo-notification:last-child>div{border-bottom:none;margin-bottom:none}.aioseo-notification-cards .no-notifications{display:flex;align-items:center;flex-direction:column;padding-top:100px;font-size:16px;color:#8c8f9a}.aioseo-notification-cards .no-notifications img{width:30%;height:auto}.aioseo-notification-cards .no-notifications .great-scott{margin:20px 0 10px;font-size:24px;font-weight:600;color:#434960}.aioseo-notification-cards .no-notifications .no-new-notifications{margin-bottom:10px}body.aioseo-show-notifications .aioseo-main{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.aioseo-notifications a.dismiss{color:#8c8f9a;font-size:14px}.aioseo-notifications .notification-menu{height:100%;width:100%;max-width:570px;position:fixed;z-index:1053;top:0;left:0;bottom:0;background-color:#fff;overflow-x:hidden;transition:.5s}.aioseo-notifications .notification-menu .notification-header{height:70px;display:flex;align-items:center;padding:0 30px;color:#fff;background-color:#005ae0}.aioseo-notifications .notification-menu .notification-header .new-notifications{font-size:18px;font-weight:600}.aioseo-notifications .notification-menu .notification-header .dismissed-notifications{margin-right:25px;flex:1 1 auto}.aioseo-notifications .notification-menu .notification-header .dismissed-notifications a{font-size:14px;color:#fff}.aioseo-notifications .notification-menu .notification-header svg.aioseo-close{width:14px;height:14px;cursor:pointer}.aioseo-notifications .notification-menu .notification-header svg.aioseo-close:hover{color:#ccc}.aioseo-notifications .notification-menu .notification-cards{padding:30px;height:calc(100% - 192px);overflow:auto}.aioseo-notifications .notification-menu .notification-footer{height:90px;padding:30px;display:flex;align-items:center}.aioseo-notifications .notification-menu .notification-footer div.pagination{flex:1;display:flex;align-items:center}.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number{font-size:13px;color:#141b38;background:#e8e8eb;height:30px;width:30px;display:flex;align-items:center;justify-content:center;border-radius:2px;margin-left:4px;cursor:pointer}.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number:last-child{margin-left:0}.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number.active,.aioseo-notifications .notification-menu .notification-footer div.pagination .page-number:hover{color:#fff;background-color:#005ae0}.aioseo-notifications .overlay{position:fixed;z-index:1052;top:0;left:0;bottom:0;right:160px;background-color:#141b38;opacity:.5;transition:.5s}.aioseo-notifications .notifications-fade-enter-active,.aioseo-notifications .notifications-fade-leave-active{transition:opacity .5s}.aioseo-notifications .notifications-fade-enter,.aioseo-notifications .notifications-fade-leave-to{opacity:0}.aioseo-notifications .notifications-slide-enter-active,.aioseo-notifications .notifications-slide-leave-active{transition:all .5s ease-in-out}.aioseo-notifications .notifications-slide-enter,.aioseo-notifications .notifications-slide-leave-to{left:-570px}.aioseo-post-type-options-toggle{margin-top:20px}.aioseo-priority-score{max-width:350px}.aioseo-priority-score .header-row{font-size:14px}.aioseo-pro-badge{height:24px;border-radius:3px;background:#e8e8eb;color:#434960;font-size:14px;font-weight:600;display:inline-flex;padding:0 8px;align-items:center}.aioseo-score-settings{display:flex;align-items:center;padding-bottom:14px}.aioseo-score-settings svg{margin-left:7px}.aioseo-score-settings span{margin-left:12px}.aioseo-score-button{display:inline-block;padding:5px 8px;font-size:14px;font-weight:700;color:#a1a1a1;border:1px solid #a1a1a1;border-radius:3px}.aioseo-score-button.score-none,.aioseo-score-button.score-red{border-color:#df2a4a;color:#df2a4a!important}.aioseo-score-button.score-orange{border-color:#f18200;color:#f18200!important}.aioseo-score-button.score-green{border-color:#00aa63;color:#00aa63!important}.aioseo-score-button.classic-editor{background:#fff!important;display:inline-block!important;height:auto!important}.aioseo-score-button.classic-editor span{margin-left:0}.aioseo-seo-site-analysis-result{border:1px solid #dcdde1;margin-top:10px}.aioseo-seo-site-analysis-result .result-header{height:66px;padding:0 20px;display:flex;align-items:center}.aioseo-seo-site-analysis-result .result-header .result-icon{display:flex;align-items:center;margin-left:16px}.aioseo-seo-site-analysis-result .result-header .result-icon svg{width:24px;height:24px;color:#8c8f9a}.aioseo-seo-site-analysis-result .result-header .result-icon svg.passed{color:#00aa63}.aioseo-seo-site-analysis-result .result-header .result-icon svg.error{color:#df2a4a}.aioseo-seo-site-analysis-result .result-header .result-icon svg.warning{color:#005ae0}.aioseo-seo-site-analysis-result .result-header .result-content{font-size:16px;font-weight:600;flex:1}.aioseo-seo-site-analysis-result .result-header .result-toggle{width:30px;height:26px;border:1px solid #dcdde1;border-radius:3px;display:flex;align-items:center;justify-content:center;cursor:pointer}.aioseo-seo-site-analysis-result .result-header .result-toggle.active,.aioseo-seo-site-analysis-result .result-header .result-toggle:hover{background-color:#434960}.aioseo-seo-site-analysis-result .result-header .result-toggle.active svg,.aioseo-seo-site-analysis-result .result-header .result-toggle:hover svg{color:#fff}.aioseo-seo-site-analysis-result .result-header .result-toggle.active svg{transform:rotate(180deg)}.aioseo-seo-site-analysis-result .result-header .result-toggle svg{width:100%;max-width:20px;height:auto;color:#8c8f9a;transform:rotate(90deg);transition:transform .3s}.aioseo-seo-site-analysis-result .result-body{padding:0 60px 24px}.aioseo-seo-site-analysis-result .result-body .result-message{color:#434960;font-size:16px}.aioseo-seo-site-analysis-result .result-body .result-code-alt pre,.aioseo-seo-site-analysis-result .result-body .result-code pre{background:#f3f4f5;border-radius:3px;max-width:100%;padding:10px;overflow:auto}.aioseo-seo-site-analysis-result .result-body .result-code-alt pre code,.aioseo-seo-site-analysis-result .result-body .result-code pre code{padding:0;background:transparent}.aioseo-seo-site-analysis-result .result-body .result-code pre{white-space:pre-wrap}.aioseo-seo-site-analysis-result .result-body .result-action{margin-top:20px}.aioseo-seo-site-analysis-results .group-header{font-size:16px;font-weight:600}.aioseo-seo-site-analysis-results .group-header:not(:first-child){margin-top:30px}.aioseo-seo-site-analysis-results .group-keywords{display:flex;margin-top:5px;flex-wrap:wrap;align-items:center}.aioseo-seo-site-analysis-results .group-keywords .keyword{font-size:14px;color:#434960;font-weight:600;background:#f3f4f5;padding:9px 10px;border-radius:3px;margin:0 0 5px 10px}.aioseo-seo-site-analysis-results .group-keywords .keyword:first-child{font-size:20px}.aioseo-settings-row{margin-bottom:22px;padding-bottom:16px;border-bottom:1px solid #e8e8eb}.aioseo-settings-row.no-margin{margin-bottom:0}.aioseo-settings-row.small-padding{padding-bottom:5px}.aioseo-settings-row.medium-margin{margin-bottom:15px}.aioseo-settings-row.no-border{border:none}.aioseo-settings-row.no-side-margin{margin-right:0!important;margin-left:0!important}.aioseo-settings-row .settings-name{color:#141b38}.aioseo-settings-row .settings-name .name{font-weight:600;font-size:16px;display:flex;align-items:center}.aioseo-settings-row .settings-name .name.small-margin{margin-bottom:5px}.aioseo-settings-row .settings-name .name.align{line-height:40px}.aioseo-settings-row .settings-name .name.align-small{line-height:30px}.aioseo-settings-row .settings-name .name .aioseo-pro-badge{margin-right:10px}.aioseo-settings-row .settings-name .aioseo-description{margin-top:20px}.aioseo-settings-row .settings-content{font-size:16px}.aioseo-settings-row p.description{font-size:14px}.aioseo-separators{margin-top:-.5rem}.aioseo-separators .aioseo-col .separator{background-color:#f3f4f5;display:flex;align-items:center;justify-content:center;min-height:51px;font-weight:600;font-size:25px;border:1px solid #dcdde1;border-radius:3px;cursor:pointer}.aioseo-separators .aioseo-col .separator:hover{background-color:#e5e7e9}.aioseo-separators .aioseo-col .separator.active{background-color:#005ae0;border-color:#005ae0;color:#fff}.aioseo-separators .aioseo-col .separator.active:hover{background-color:#005ae0}.aioseo-separators .aioseo-col .show-more{height:100%;display:flex;align-items:center}.aioseo-separators .aioseo-col .show-more a{color:#8c8f9a}.aioseo-separators .aioseo-col .custom-separator{margin:20px 0;display:flex;align-items:center}.aioseo-separators .aioseo-col .custom-separator .aioseo-input{margin-right:10px;max-width:100px}.aioseo-sidebar-card .header{height:46px}.aioseo-sidebar-card .header:hover{cursor:pointer}.aioseo-sidebar-card .content{padding-bottom:8px!important}.aioseo-sidebar-card ul{margin-bottom:0}.aioseo-sidebar-card ul li{margin-bottom:16px;padding-right:25px}.aioseo-sidebar-card ul .description{margin:0}.aioseo-robots-meta .global-robots-settings{margin:0;padding-top:24px}.aioseo-robots-meta .global-robots-settings>.settings{padding:8px 0 16px}.aioseo-robots-meta .global-robots-settings-options{display:flex}.aioseo-robots-meta .global-robots-settings-options .max-snippet{margin-left:30px}.aioseo-robots-meta .global-robots-settings-options .max-snippet .aioseo-input{max-width:90px}.aioseo-robots-meta .global-robots-settings-options .max-video-preview{margin-left:30px}.aioseo-robots-meta .global-robots-settings-options .max-video-preview .aioseo-input{max-width:90px}.aioseo-robots-meta .global-robots-settings-options .max-image-preview .aioseo-select{min-width:155px}.aioseo-robots-meta .global-robots-settings-options>span{display:inline-block;margin-bottom:4px}@media screen and (max-width:782px){.aioseo-robots-meta .global-robots-settings-options{display:block}.aioseo-robots-meta .global-robots-settings-options .max-snippet,.aioseo-robots-meta .global-robots-settings-options .max-video-preview{margin-left:0;margin-bottom:20px}.aioseo-robots-meta .global-robots-settings-options>div .aioseo-input,.aioseo-robots-meta .global-robots-settings-options>div .aioseo-select{min-width:100%}}.edit-post-sidebar .global-robots-settings{padding-top:12px}.edit-post-sidebar .global-robots-settings>.settings{padding:4px 0 12px}.edit-post-sidebar .global-robots-settings>.settings label{font-size:16px}.edit-post-sidebar .global-robots-settings .robots-meta-title{padding-top:4px;display:inline-block}.edit-post-sidebar .global-robots-settings-options{flex-wrap:wrap}.edit-post-sidebar .max-snippet{margin-left:30px!important}.edit-post-sidebar .max-video-preview{margin-left:0!important}.edit-post-sidebar .max-image-preview{margin-top:20px!important}.aioseo-score-amount-wrapper{position:absolute;right:0;top:0;left:0;bottom:0;display:flex;align-items:center;justify-content:center;flex-direction:column;color:#141b38;margin:20px}.aioseo-score-amount-wrapper .aioseo-score-amount .score{font-size:64px;font-weight:600}.aioseo-score-amount-wrapper .aioseo-score-amount .total{font-size:18px;color:#8c8f9a;padding-right:3px}.aioseo-score-amount-wrapper .score-description{max-width:80%;text-align:center;font-size:17px;font-weight:600;line-height:1.1}.aioseo-score-amount-wrapper .score-analyzing{margin-top:20px;font-size:30px}.aioseo-site-score-analyze{position:relative;display:flex;align-items:center;justify-content:center;flex:1}.aioseo-site-score-analyze .analyze-errors{text-align:center;margin-bottom:1em}.aioseo-site-score-analyze .aioseo-seo-site-score-score{position:relative;min-width:175px;max-width:217px;margin-left:5em}.aioseo-site-score-analyze .aioseo-seo-site-score-score svg{width:100%;height:auto}.aioseo-site-score-analyze .aioseo-seo-site-score-description h2{line-height:1.4}.aioseo-site-score-analyze .aioseo-seo-site-score-description svg.aioseo-book{width:20px;height:20px;margin:0 0 0 10px;color:#005ae0}.aioseo-site-score-analyze .aioseo-seo-site-score-description>div{font-size:16px;color:#141b38;margin-bottom:10px}.aioseo-site-score-analyze .aioseo-seo-site-score-description .links{margin-top:30px;font-size:14px;font-weight:600}.aioseo-site-score-analyze .aioseo-seo-site-score-description .links .no-underline{padding-right:5px}.aioseo-site-score-competitor{position:relative;display:flex;align-items:center;justify-content:center;flex-direction:column}.aioseo-site-score-competitor .aioseo-seo-site-score-score{position:relative;min-width:175px;max-width:217px;margin-left:1em}.aioseo-site-score-competitor .aioseo-seo-site-score-score svg{width:100%;height:auto}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations{margin:20px 0}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links){display:flex;align-items:center;font-size:14px;color:#141b38;font-weight:600;margin-bottom:10px}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round{position:relative;border-radius:50%;width:24px;min-width:24px;max-width:24px;height:24px;display:flex;align-items:center;justify-content:center;margin-left:10px;font-size:12px;color:#fff;font-weight:600}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.red{background-color:#df2a4a}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.blue{background-color:#005ae0}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.orange{background-color:#f18200}.aioseo-site-score-competitor .aioseo-seo-site-score-recommendations>div:not(.links) .round.green{background-color:#00aa63}.aioseo-site-score-competitor .refresh-results .aioseo-refresh{width:14px;height:14px;margin-left:10px}.aioseo-site-score-competitor .mobile-snapshot{margin-top:60px;max-width:250px}.aioseo-site-score-competitor .mobile-snapshot div{font-weight:600;font-size:16px;margin-bottom:10px}.aioseo-site-score-competitor .mobile-snapshot img{width:100%;height:auto}.aioseo-site-score-dashboard{position:relative;display:flex;align-items:center;justify-content:center}.aioseo-site-score-dashboard .analyze-errors{text-align:center;margin-bottom:1em}.aioseo-site-score-dashboard .aioseo-seo-site-score-score{position:relative;min-width:175px;max-width:217px;margin-left:1em}.aioseo-site-score-dashboard .aioseo-seo-site-score-score svg{width:100%;height:auto}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links){display:flex;align-items:center;font-size:14px;color:#141b38;font-weight:600;margin-bottom:10px}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round{position:relative;border-radius:50%;width:24px;min-width:24px;max-width:24px;height:24px;display:flex;align-items:center;justify-content:center;margin-left:10px;font-size:12px;color:#fff;font-weight:600}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.red{background-color:#df2a4a}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.blue{background-color:#005ae0}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.orange{background-color:#f18200}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations>div:not(.links) .round.green{background-color:#00aa63}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations .links{margin-top:30px;font-size:14px;font-weight:600}.aioseo-site-score-dashboard .aioseo-seo-site-score-recommendations .links .no-underline{padding-right:5px}.aioseo-social-profiles .same-username .use-same{padding:30px;background:#f9f9fa}.aioseo-social-profiles .same-username .use-same .aioseo-checkbox{font-size:16px}.aioseo-social-profiles .aioseo-social-profile-list,.aioseo-social-profiles .same-username .use-same .aioseo-settings-row,.aioseo-social-profiles .same-username .use-same .profiles{margin-top:20px}.aioseo-social-profiles .aioseo-social-profile-list .social-profile{margin-bottom:0;padding-bottom:0;border-bottom:none}.aioseo-social-profiles .aioseo-social-profile-list .social-profile .logo-svg{margin-left:10px}.aioseo-social-profiles .aioseo-social-profile-list .social-profile .profile-error{margin-top:10px}.aioseo-social-profiles .aioseo-social-profile-list .social-profile .name{margin-bottom:0}.aioseo-tooltip{margin-right:14px;display:inline-flex}.aioseo-tooltip,.aioseo-twitter-preview{align-items:center;justify-content:center}.aioseo-twitter-preview{background-color:#f0f2f5;padding:30px;display:flex}.aioseo-twitter-preview .twitter-post{width:100%;max-width:500px;border-radius:5px;border:1px solid #e1e8ed;background-color:#fff}.aioseo-twitter-preview .twitter-post .twitter-header{height:65px;padding:0 18px;display:flex;align-items:center}.aioseo-twitter-preview .twitter-post .twitter-header .profile-photo{overflow:hidden;width:40px;height:40px;border:1px solid #e8e8eb;border-radius:50%}.aioseo-twitter-preview .twitter-post .twitter-header .profile-photo img{height:100%;width:100%}.aioseo-twitter-preview .twitter-post .twitter-header .poster{margin-right:10px;flex:1 0 auto}.aioseo-twitter-preview .twitter-post .twitter-header .poster .poster-name{font-size:15px;color:#1c2022;font-weight:600}.aioseo-twitter-preview .twitter-post .twitter-header .poster .poster-username{color:#697882;font-weight:500;font-size:13px}.aioseo-twitter-preview .twitter-post .twitter-container{padding:0 20px 20px}.aioseo-twitter-preview .twitter-post .twitter-container.summary .twitter-content{flex-direction:row}.aioseo-twitter-preview .twitter-post .twitter-container.summary .twitter-content .twitter-image-preview{display:flex;align-items:center;justify-content:center;background-color:#e1e8ed;min-width:125px;min-height:125px;background-size:cover;background-repeat:no-repeat;background-position:50%}.aioseo-twitter-preview .twitter-post .twitter-container.summary .twitter-content .twitter-image-preview svg.aioseo-book{width:50px;height:50px;color:#8999a5}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content{border-radius:10px;overflow:hidden;display:flex;flex-direction:column;border:1px solid #e1e8ed}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content img{width:100%;height:auto}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description{padding:18px;color:#1c2022}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description .site-domain{font-size:14px;color:#8899a6;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description .site-title{font-size:15px;font-weight:600}.aioseo-twitter-preview .twitter-post .twitter-container .twitter-content .twitter-site-description .site-description{font-size:14px;margin:5px 0}.aioseo-col .reverse{flex-direction:column-reverse}.aioseo-col.col-xs,.aioseo-col.col-xs-1,.aioseo-col.col-xs-2,.aioseo-col.col-xs-3,.aioseo-col.col-xs-4,.aioseo-col.col-xs-5,.aioseo-col.col-xs-6,.aioseo-col.col-xs-7,.aioseo-col.col-xs-8,.aioseo-col.col-xs-9,.aioseo-col.col-xs-10,.aioseo-col.col-xs-11,.aioseo-col.col-xs-12,.aioseo-col.col-xs-offset-0,.aioseo-col.col-xs-offset-1,.aioseo-col.col-xs-offset-2,.aioseo-col.col-xs-offset-3,.aioseo-col.col-xs-offset-4,.aioseo-col.col-xs-offset-5,.aioseo-col.col-xs-offset-6,.aioseo-col.col-xs-offset-7,.aioseo-col.col-xs-offset-8,.aioseo-col.col-xs-offset-9,.aioseo-col.col-xs-offset-10,.aioseo-col.col-xs-offset-11,.aioseo-col.col-xs-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-xs{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-xs-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-xs-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-xs-3{flex-basis:25%;max-width:25%}.aioseo-col.col-xs-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-xs-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-xs-6{flex-basis:50%;max-width:50%}.aioseo-col.col-xs-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-xs-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-xs-9{flex-basis:75%;max-width:75%}.aioseo-col.col-xs-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-xs-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-xs-12{flex-basis:100%;max-width:100%}.aioseo-col.col-xs-offset-0{margin-right:0}.aioseo-col.col-xs-offset-1{margin-right:8.33333333%}.aioseo-col.col-xs-offset-2{margin-right:16.66666667%}.aioseo-col.col-xs-offset-3{margin-right:25%}.aioseo-col.col-xs-offset-4{margin-right:33.33333333%}.aioseo-col.col-xs-offset-5{margin-right:41.66666667%}.aioseo-col.col-xs-offset-6{margin-right:50%}.aioseo-col.col-xs-offset-7{margin-right:58.33333333%}.aioseo-col.col-xs-offset-8{margin-right:66.66666667%}.aioseo-col.col-xs-offset-9{margin-right:75%}.aioseo-col.col-xs-offset-10{margin-right:83.33333333%}.aioseo-col.col-xs-offset-11{margin-right:91.66666667%}.aioseo-col.first-xs{order:-1}.aioseo-col.last-xs{order:1}.aioseo-col.text-xs-left{text-align:right!important;justify-content:flex-start}.aioseo-col.text-xs-center{text-align:center!important;justify-content:center}.aioseo-col.text-xs-right{text-align:left!important;justify-content:flex-end}.aioseo-col.p-0{padding:0!important}.aioseo-col.pt-0,.aioseo-col.py-0{padding-top:0!important}.aioseo-col.pr-0,.aioseo-col.px-0{padding-left:0!important}.aioseo-col.pb-0,.aioseo-col.py-0{padding-bottom:0!important}.aioseo-col.pl-0,.aioseo-col.px-0{padding-right:0!important}.aioseo-col.p-1{padding:.25rem!important}.aioseo-col.pt-1,.aioseo-col.py-1{padding-top:.25rem!important}.aioseo-col.pr-1,.aioseo-col.px-1{padding-left:.25rem!important}.aioseo-col.pb-1,.aioseo-col.py-1{padding-bottom:.25rem!important}.aioseo-col.pl-1,.aioseo-col.px-1{padding-right:.25rem!important}.aioseo-col.p-2{padding:.5rem!important}.aioseo-col.pt-2,.aioseo-col.py-2{padding-top:.5rem!important}.aioseo-col.pr-2,.aioseo-col.px-2{padding-left:.5rem!important}.aioseo-col.pb-2,.aioseo-col.py-2{padding-bottom:.5rem!important}.aioseo-col.pl-2,.aioseo-col.px-2{padding-right:.5rem!important}.aioseo-col.p-3{padding:1rem!important}.aioseo-col.pt-3,.aioseo-col.py-3{padding-top:1rem!important}.aioseo-col.pr-3,.aioseo-col.px-3{padding-left:1rem!important}.aioseo-col.pb-3,.aioseo-col.py-3{padding-bottom:1rem!important}.aioseo-col.pl-3,.aioseo-col.px-3{padding-right:1rem!important}.aioseo-col.p-4{padding:1.5rem!important}.aioseo-col.pt-4,.aioseo-col.py-4{padding-top:1.5rem!important}.aioseo-col.pr-4,.aioseo-col.px-4{padding-left:1.5rem!important}.aioseo-col.pb-4,.aioseo-col.py-4{padding-bottom:1.5rem!important}.aioseo-col.pl-4,.aioseo-col.px-4{padding-right:1.5rem!important}.aioseo-col.p-5{padding:3rem!important}.aioseo-col.pt-5,.aioseo-col.py-5{padding-top:3rem!important}.aioseo-col.pr-5,.aioseo-col.px-5{padding-left:3rem!important}.aioseo-col.pb-5,.aioseo-col.py-5{padding-bottom:3rem!important}.aioseo-col.pl-5,.aioseo-col.px-5{padding-right:3rem!important}@media only screen and (min-width:782px){.aioseo-col.col-sm,.aioseo-col.col-sm-1,.aioseo-col.col-sm-2,.aioseo-col.col-sm-3,.aioseo-col.col-sm-4,.aioseo-col.col-sm-5,.aioseo-col.col-sm-6,.aioseo-col.col-sm-7,.aioseo-col.col-sm-8,.aioseo-col.col-sm-9,.aioseo-col.col-sm-10,.aioseo-col.col-sm-11,.aioseo-col.col-sm-12,.aioseo-col.col-sm-offset-0,.aioseo-col.col-sm-offset-1,.aioseo-col.col-sm-offset-2,.aioseo-col.col-sm-offset-3,.aioseo-col.col-sm-offset-4,.aioseo-col.col-sm-offset-5,.aioseo-col.col-sm-offset-6,.aioseo-col.col-sm-offset-7,.aioseo-col.col-sm-offset-8,.aioseo-col.col-sm-offset-9,.aioseo-col.col-sm-offset-10,.aioseo-col.col-sm-offset-11,.aioseo-col.col-sm-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-sm{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-sm-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-sm-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-sm-3{flex-basis:25%;max-width:25%}.aioseo-col.col-sm-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-sm-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-sm-6{flex-basis:50%;max-width:50%}.aioseo-col.col-sm-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-sm-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-sm-9{flex-basis:75%;max-width:75%}.aioseo-col.col-sm-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-sm-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-sm-12{flex-basis:100%;max-width:100%}.aioseo-col.col-sm-offset-0{margin-right:0}.aioseo-col.col-sm-offset-1{margin-right:8.33333333%}.aioseo-col.col-sm-offset-2{margin-right:16.66666667%}.aioseo-col.col-sm-offset-3{margin-right:25%}.aioseo-col.col-sm-offset-4{margin-right:33.33333333%}.aioseo-col.col-sm-offset-5{margin-right:41.66666667%}.aioseo-col.col-sm-offset-6{margin-right:50%}.aioseo-col.col-sm-offset-7{margin-right:58.33333333%}.aioseo-col.col-sm-offset-8{margin-right:66.66666667%}.aioseo-col.col-sm-offset-9{margin-right:75%}.aioseo-col.col-sm-offset-10{margin-right:83.33333333%}.aioseo-col.col-sm-offset-11{margin-right:91.66666667%}.aioseo-col.first-sm{order:-1}.aioseo-col.last-sm{order:1}.aioseo-col.text-sm-left{text-align:right!important;justify-content:flex-start}.aioseo-col.text-sm-center{text-align:center!important;justify-content:center}.aioseo-col.text-sm-right{text-align:left!important;justify-content:flex-end}}@media only screen and (min-width:912px){.aioseo-col.col-md,.aioseo-col.col-md-1,.aioseo-col.col-md-2,.aioseo-col.col-md-3,.aioseo-col.col-md-4,.aioseo-col.col-md-5,.aioseo-col.col-md-6,.aioseo-col.col-md-7,.aioseo-col.col-md-8,.aioseo-col.col-md-9,.aioseo-col.col-md-10,.aioseo-col.col-md-11,.aioseo-col.col-md-12,.aioseo-col.col-md-offset-0,.aioseo-col.col-md-offset-1,.aioseo-col.col-md-offset-2,.aioseo-col.col-md-offset-3,.aioseo-col.col-md-offset-4,.aioseo-col.col-md-offset-5,.aioseo-col.col-md-offset-6,.aioseo-col.col-md-offset-7,.aioseo-col.col-md-offset-8,.aioseo-col.col-md-offset-9,.aioseo-col.col-md-offset-10,.aioseo-col.col-md-offset-11,.aioseo-col.col-md-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-md{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-md-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-md-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-md-3{flex-basis:25%;max-width:25%}.aioseo-col.col-md-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-md-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-md-6{flex-basis:50%;max-width:50%}.aioseo-col.col-md-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-md-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-md-9{flex-basis:75%;max-width:75%}.aioseo-col.col-md-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-md-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-md-12{flex-basis:100%;max-width:100%}.aioseo-col.col-md-offset-0{margin-right:0}.aioseo-col.col-md-offset-1{margin-right:8.33333333%}.aioseo-col.col-md-offset-2{margin-right:16.66666667%}.aioseo-col.col-md-offset-3{margin-right:25%}.aioseo-col.col-md-offset-4{margin-right:33.33333333%}.aioseo-col.col-md-offset-5{margin-right:41.66666667%}.aioseo-col.col-md-offset-6{margin-right:50%}.aioseo-col.col-md-offset-7{margin-right:58.33333333%}.aioseo-col.col-md-offset-8{margin-right:66.66666667%}.aioseo-col.col-md-offset-9{margin-right:75%}.aioseo-col.col-md-offset-10{margin-right:83.33333333%}.aioseo-col.col-md-offset-11{margin-right:91.66666667%}.aioseo-col.first-md{order:-1}.aioseo-col.last-md{order:1}.aioseo-col.text-md-left{text-align:right!important;justify-content:flex-start}.aioseo-col.text-md-center{text-align:center!important;justify-content:center}.aioseo-col.text-md-right{text-align:left!important;justify-content:flex-end}}@media only screen and (min-width:1042px){.aioseo-col.col-lg,.aioseo-col.col-lg-1,.aioseo-col.col-lg-2,.aioseo-col.col-lg-3,.aioseo-col.col-lg-4,.aioseo-col.col-lg-5,.aioseo-col.col-lg-6,.aioseo-col.col-lg-7,.aioseo-col.col-lg-8,.aioseo-col.col-lg-9,.aioseo-col.col-lg-10,.aioseo-col.col-lg-11,.aioseo-col.col-lg-12,.aioseo-col.col-lg-offset-0,.aioseo-col.col-lg-offset-1,.aioseo-col.col-lg-offset-2,.aioseo-col.col-lg-offset-3,.aioseo-col.col-lg-offset-4,.aioseo-col.col-lg-offset-5,.aioseo-col.col-lg-offset-6,.aioseo-col.col-lg-offset-7,.aioseo-col.col-lg-offset-8,.aioseo-col.col-lg-offset-9,.aioseo-col.col-lg-offset-10,.aioseo-col.col-lg-offset-11,.aioseo-col.col-lg-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-lg{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-lg-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-lg-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-lg-3{flex-basis:25%;max-width:25%}.aioseo-col.col-lg-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-lg-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-lg-6{flex-basis:50%;max-width:50%}.aioseo-col.col-lg-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-lg-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-lg-9{flex-basis:75%;max-width:75%}.aioseo-col.col-lg-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-lg-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-lg-12{flex-basis:100%;max-width:100%}.aioseo-col.col-lg-offset-0{margin-right:0}.aioseo-col.col-lg-offset-1{margin-right:8.33333333%}.aioseo-col.col-lg-offset-2{margin-right:16.66666667%}.aioseo-col.col-lg-offset-3{margin-right:25%}.aioseo-col.col-lg-offset-4{margin-right:33.33333333%}.aioseo-col.col-lg-offset-5{margin-right:41.66666667%}.aioseo-col.col-lg-offset-6{margin-right:50%}.aioseo-col.col-lg-offset-7{margin-right:58.33333333%}.aioseo-col.col-lg-offset-8{margin-right:66.66666667%}.aioseo-col.col-lg-offset-9{margin-right:75%}.aioseo-col.col-lg-offset-10{margin-right:83.33333333%}.aioseo-col.col-lg-offset-11{margin-right:91.66666667%}.aioseo-col.first-lg{order:-1}.aioseo-col.last-lg{order:1}.aioseo-col.text-lg-left{text-align:right!important;justify-content:flex-start}.aioseo-col.text-lg-center{text-align:center!important;justify-content:center}.aioseo-col.text-lg-right{text-align:left!important;justify-content:flex-end}}@media only screen and (min-width:1140px){.aioseo-col.col-xl,.aioseo-col.col-xl-1,.aioseo-col.col-xl-2,.aioseo-col.col-xl-3,.aioseo-col.col-xl-4,.aioseo-col.col-xl-5,.aioseo-col.col-xl-6,.aioseo-col.col-xl-7,.aioseo-col.col-xl-8,.aioseo-col.col-xl-9,.aioseo-col.col-xl-10,.aioseo-col.col-xl-11,.aioseo-col.col-xl-12,.aioseo-col.col-xl-offset-0,.aioseo-col.col-xl-offset-1,.aioseo-col.col-xl-offset-2,.aioseo-col.col-xl-offset-3,.aioseo-col.col-xl-offset-4,.aioseo-col.col-xl-offset-5,.aioseo-col.col-xl-offset-6,.aioseo-col.col-xl-offset-7,.aioseo-col.col-xl-offset-8,.aioseo-col.col-xl-offset-9,.aioseo-col.col-xl-offset-10,.aioseo-col.col-xl-offset-11,.aioseo-col.col-xl-offset-12{box-sizing:border-box;flex:0 0 auto;padding:.5rem}.aioseo-col.col-xl{flex-grow:1;flex-basis:0;max-width:100%}.aioseo-col.col-xl-1{flex-basis:8.33333333%;max-width:8.33333333%}.aioseo-col.col-xl-2{flex-basis:16.66666667%;max-width:16.66666667%}.aioseo-col.col-xl-3{flex-basis:25%;max-width:25%}.aioseo-col.col-xl-4{flex-basis:33.33333333%;max-width:33.33333333%}.aioseo-col.col-xl-5{flex-basis:41.66666667%;max-width:41.66666667%}.aioseo-col.col-xl-6{flex-basis:50%;max-width:50%}.aioseo-col.col-xl-7{flex-basis:58.33333333%;max-width:58.33333333%}.aioseo-col.col-xl-8{flex-basis:66.66666667%;max-width:66.66666667%}.aioseo-col.col-xl-9{flex-basis:75%;max-width:75%}.aioseo-col.col-xl-10{flex-basis:83.33333333%;max-width:83.33333333%}.aioseo-col.col-xl-11{flex-basis:91.66666667%;max-width:91.66666667%}.aioseo-col.col-xl-12{flex-basis:100%;max-width:100%}.aioseo-col.col-xl-offset-0{margin-right:0}.aioseo-col.col-xl-offset-1{margin-right:8.33333333%}.aioseo-col.col-xl-offset-2{margin-right:16.66666667%}.aioseo-col.col-xl-offset-3{margin-right:25%}.aioseo-col.col-xl-offset-4{margin-right:33.33333333%}.aioseo-col.col-xl-offset-5{margin-right:41.66666667%}.aioseo-col.col-xl-offset-6{margin-right:50%}.aioseo-col.col-xl-offset-7{margin-right:58.33333333%}.aioseo-col.col-xl-offset-8{margin-right:66.66666667%}.aioseo-col.col-xl-offset-9{margin-right:75%}.aioseo-col.col-xl-offset-10{margin-right:83.33333333%}.aioseo-col.col-xl-offset-11{margin-right:91.66666667%}.aioseo-col.first-xl{order:-1}.aioseo-col.last-xl{order:1}.aioseo-col.text-xl-left{text-align:right!important;justify-content:flex-start}.aioseo-col.text-xl-center{text-align:center!important;justify-content:center}.aioseo-col.text-xl-right{text-align:left!important;justify-content:flex-end}}.aioseo-container,.aioseo-container-fluid{margin-left:auto;margin-right:auto}.aioseo-container{padding:0 20px}.aioseo-container-fluid.hero,.aioseo-container.hero{min-height:100vh;display:flex;justify-content:center;align-items:center}.aioseo-container-fluid{padding-left:2rem;padding-right:2rem}@media only screen and (min-width:782px){.aioseo-container{padding:0 30px}}@media only screen and (min-width:1042px){.aioseo-container{max-width:80rem}.aioseo-container.full-width{max-width:100%}.aioseo-container.small{max-width:810px}}.aioseo-masonry{-moz-column-count:0;column-count:0;-moz-column-gap:20px;column-gap:20px;counter-reset:brick-counter}.aioseo-masonry>*{box-sizing:border-box;-moz-column-break-inside:avoid;break-inside:avoid;counter-increment:brick-counter;margin-bottom:20px}@media only screen and (min-width:782px){.aioseo-masonry{-moz-column-count:1;column-count:1}}@media only screen and (min-width:912px){.aioseo-masonry{-moz-column-count:2;column-count:2}}@media only screen and (min-width:1042px){.aioseo-masonry{-moz-column-count:3;column-count:3}}.aioseo-row{box-sizing:border-box;display:flex;flex:0 1 auto;flex-direction:row;flex-wrap:wrap;margin-left:-.5rem;margin-right:-.5rem}.aioseo-row.reverse{flex-direction:row-reverse}.aioseo-row.start-xs{justify-content:flex-start;text-align:start}.aioseo-row.center-xs{justify-content:center;text-align:center}.aioseo-row.end-xs{justify-content:flex-end;text-align:end}.aioseo-row.top-xs{align-items:flex-start}.aioseo-row.middle-xs{align-items:center}.aioseo-row.bottom-xs{align-items:flex-end}.aioseo-row.around-xs{justify-content:space-around}.aioseo-row.between-xs{justify-content:space-between}@media only screen and (min-width:782px){.aioseo-row.start-sm{justify-content:flex-start;text-align:start}.aioseo-row.center-sm{justify-content:center;text-align:center}.aioseo-row.end-sm{justify-content:flex-end;text-align:end}.aioseo-row.top-sm{align-items:flex-start}.aioseo-row.middle-sm{align-items:center}.aioseo-row.bottom-sm{align-items:flex-end}.aioseo-row.around-sm{justify-content:space-around}.aioseo-row.between-sm{justify-content:space-between}}@media only screen and (min-width:912px){.aioseo-row.start-md{justify-content:flex-start;text-align:start}.aioseo-row.center-md{justify-content:center;text-align:center}.aioseo-row.end-md{justify-content:flex-end;text-align:end}.aioseo-row.top-md{align-items:flex-start}.aioseo-row.middle-md{align-items:center}.aioseo-row.bottom-md{align-items:flex-end}.aioseo-row.around-md{justify-content:space-around}.aioseo-row.between-md{justify-content:space-between}}@media only screen and (min-width:1042px){.aioseo-row.start-lg{justify-content:flex-start;text-align:start}.aioseo-row.center-lg{justify-content:center;text-align:center}.aioseo-row.end-lg{justify-content:flex-end;text-align:end}.aioseo-row.top-lg{align-items:flex-start}.aioseo-row.middle-lg{align-items:center}.aioseo-row.bottom-lg{align-items:flex-end}.aioseo-row.around-lg{justify-content:space-around}.aioseo-row.between-lg{justify-content:space-between}}.aioseo-display-info svg.aioseo-new-page{width:100%;height:auto;max-width:45px}.aioseo-display-info .new-page .aioseo-row{margin:0}.aioseo-display-info .new-page svg.aioseo-external{width:14px;height:14px;margin-left:10px}.aioseo-display-info .new-page .aioseo-description{color:#434960}.aioseo-display-info .new-page button.aioseo-html-sitemaps-disabled-button{border:1px solid #dcdde1;color:#8c8f9a;background-color:#f3f4f5;cursor:default}.aioseo-display-info .new-page .aioseo-alert{width:100%;margin:8px 8px 0}.aioseo-exclude-posts{display:block}.aioseo-exclude-posts .aioseo-select{max-width:600px;display:inline-block;margin-left:10px}.aioseo-exclude-posts .aioseo-select button{display:none}.aioseo-exclude-posts .aioseo-select .multiselect__option{display:flex}.aioseo-exclude-posts .aioseo-select .multiselect__option--highlight .option-title{color:#005ae0}.aioseo-exclude-posts .aioseo-button.gray{margin-top:10px}.aioseo-exclude-posts .option{flex:1 0 auto}.aioseo-exclude-posts .option .option-title{font-weight:500;font-size:16px;color:#141b38}.aioseo-exclude-posts .option .option-title .search-term{font-weight:700}.aioseo-exclude-posts .option .option-details{display:flex;align-items:center;font-size:14px;color:#8c8f9a}.aioseo-exclude-posts .option .option-details span{margin-left:15px}.aioseo-exclude-posts .option-permalink{display:flex;align-items:center}.aioseo-exclude-posts .option-permalink svg.aioseo-external{width:15px;height:15px;color:#434960}.aioseo-exclude-posts .multiselect-toggle{padding:10px 13px;width:40px;position:absolute;height:36px;left:2px;top:2px;text-align:center;z-index:1}.aioseo-exclude-posts .multiselect-toggle svg.aioseo-add-plus{width:14px;height:14px;color:#000}.aioseo-sidebar-row .aioseo-included-objects-toggle{margin-top:5px}.aioseo-sidebar-row .aioseo-included-objects-toggle .aioseo-included-list{margin-top:8px}.aioseo-notification{margin-bottom:20px}.aioseo-notification>div{display:flex;align-items:flex-start;padding-bottom:10px;border-bottom:1px solid #e8e8eb}.aioseo-notification>div .icon{margin-left:20px}.aioseo-notification>div .icon svg{width:20px;height:20px;color:#00aa63}.aioseo-notification>div .icon svg.warning{color:#f18200}.aioseo-notification>div .icon svg.info{color:#005ae0}.aioseo-notification>div .icon svg.success{color:#00aa63}.aioseo-notification>div .icon svg.error{color:#df2a4a}.aioseo-notification>div .body{margin-left:20px;flex:1}.aioseo-notification>div .body .title{font-size:16px;font-weight:600;color:#141b38;margin-bottom:7px;display:flex;align-items:center}.aioseo-notification>div .body .title div:first-child{flex:1;margin-left:5px;line-height:1.4}.aioseo-notification>div .body .notification-content{margin-bottom:10px;max-width:400px}.aioseo-notification>div .body .actions{flex-wrap:wrap;display:flex;align-items:center}.aioseo-notification>div .body .actions>*{margin-bottom:10px}.aioseo-notification>div .body .actions .aioseo-button{margin-left:20px}.aioseo-notification>div .body .actions .dismiss{color:#8c8f9a;font-size:14px}.aioseo-seo-site-score__circle{animation:aioseo-seo-site-score-fill 1s reverse;transform:rotate(180deg);transform-origin:center;stroke:#00aa63}.aioseo-seo-site-score__circle.fast{-webkit-animation-duration:.5s;animation-duration:.5s;stroke:#df2a4a}.aioseo-seo-site-score__circle.medium{-webkit-animation-duration:.75s;animation-duration:.75s;stroke:#f18200}.aioseo-seo-site-score__background{stroke:#e8e8eb}@-webkit-keyframes aioseo-seo-site-score-fill{to{stroke-dasharray:0 100}}@keyframes aioseo-seo-site-score-fill{to{stroke-dasharray:0 100}}.aioseo-seo-site-score-svg-loading{-webkit-animation:aioseo-seo-site-score-svg-animation 2s linear infinite;animation:aioseo-seo-site-score-svg-animation 2s linear infinite}.aioseo-seo-site-score-loading__circle{-webkit-animation:aioseo-seo-site-score-fill-loading 2s ease-in-out infinite both;animation:aioseo-seo-site-score-fill-loading 2s ease-in-out infinite both;transform:rotate(180deg);transform-origin:center;stroke:#005ae0}@-webkit-keyframes aioseo-seo-site-score-svg-animation{0%{transform:rotate(0deg)}to{transform:rotate(-1turn)}}@keyframes aioseo-seo-site-score-svg-animation{0%{transform:rotate(0deg)}to{transform:rotate(-1turn)}}@-webkit-keyframes aioseo-seo-site-score-fill-loading{0%,25%{stroke-dashoffset:90;transform:rotate(0)}50%,75%{stroke-dashoffset:10;transform:rotate(-45deg)}to{stroke-dashoffset:90;transform:rotate(-1turn)}}@keyframes aioseo-seo-site-score-fill-loading{0%,25%{stroke-dashoffset:90;transform:rotate(0)}50%,75%{stroke-dashoffset:10;transform:rotate(-45deg)}to{stroke-dashoffset:90;transform:rotate(-1turn)}}.aioseo-table-column{display:flex;flex-direction:column;flex-basis:100%;flex:1;padding:5px;justify-content:center}.aioseo-table-row{display:flex;flex-direction:row;flex-wrap:wrap;width:100%}.aioseo-wizard-body{background-color:#fff;max-width:900px;box-shadow:0 2px 5px rgba(0,0,0,.05)}.aioseo-wizard-body .body-content{padding:80px 140px}@media screen and (max-width:782px){.aioseo-wizard-body .body-content{padding:40px}}.aioseo-wizard-body .body-content .header{line-height:1.4}.aioseo-wizard-body .body-footer{border-top:1px solid #e8e8eb;padding:30px;display:flex;align-items:center}.aioseo-wizard-body .body-footer>*{margin-left:10px}.aioseo-wizard-body .body-footer>:last-child{margin-left:0}.aioseo-wizard-body .body-footer .spacer{flex:1 0 auto}.aioseo-wizard-close-and-exit{margin:96px 0;min-height:96px;text-align:center;font-size:14px}.aioseo-wizard-close-and-exit a{color:#8c8f9a!important}.aioseo-wizard-container{margin:40px auto;max-width:900px}@media screen and (max-width:782px){.aioseo-wizard-container{margin:0 20px}}.aioseo-wizard-header{display:flex;align-items:center;justify-content:center;flex-direction:column}.aioseo-wizard-header svg.aioseo-logo{width:100%;max-width:140px;height:auto;margin:60px 0 40px 10px}.aioseo-wizard-progress{display:flex;align-items:center;justify-content:center}@media screen and (max-width:782px){.aioseo-wizard-progress{display:none}}.aioseo-wizard-progress .circle{background-color:#dcdde1;width:16px;height:16px;border-radius:50%}.aioseo-wizard-progress .circle.active{background-color:#005ae0}.aioseo-wizard-progress .spacer{width:59px;border:1px solid #dcdde1;margin:0 12px}.aioseo-wizard-progress .spacer.active{border-color:#005ae0}.aioseo-wizard-steps{color:#8c8f9a;font-size:14px;margin-bottom:20px}.block-editor-block-card{align-items:center}.block-editor-block-card__title.block-editor-block-card__title{margin:0}.aioseo-sidebar-row{margin-bottom:16px}.aioseo-sidebar-row .aioseo-sidebar-title{font-weight:500}
dist/Lite/assets/css/headline-analyzer.css CHANGED
@@ -1,3 +1,3 @@
1
- /*! ! built on Friday, August 13th 2021, 4:37:42 pm */
2
  .aioseo-inline-buttons{display:grid;grid-template-columns:repeat(2, 1fr)}.aioseo-switcher-button{border:0;border-radius:0;font-size:14px;font-weight:normal;color:#434960;padding:16px 10px;box-shadow:0px 2px 0px #e8e8eb;cursor:pointer;text-align:left;white-space:nowrap;position:relative;transition:0.4s cubic-bezier(0.4, 0, 0.2, 1);background:#fafafa}.aioseo-switcher-button:before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;opacity:0;transition:0.4s cubic-bezier(0.4, 0, 0.2, 1);will-change:background-color,opacity;content:" "}.aioseo-switcher-button.active:before,.aioseo-switcher-button:hover:before,.aioseo-switcher-button:active:before{background-color:currentColor;opacity:.12}.aioseo-switcher-button.active{font-weight:700;color:#141B38;box-shadow:0px 2px 0px #005AE0}.aioseo-headline-analyzer-wrapper{position:relative}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-pie-chart-container{position:relative;width:200px;height:200px;margin:0 auto;margin-bottom:18px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-pie-chart-container .aioseo-headline-analyzer-total-out-of-score{font-size:18px;color:#8c8f9a;font-weight:600;z-index:0}.aioseo-headline-analyzer-wrapper .components-panel__body.is-opened svg.components-panel__arrow{transform:rotate(0deg)}.aioseo-headline-analyzer-wrapper .components-panel__body svg.components-panel__arrow{transform:rotate(-90deg);top:50%;margin-top:-12px;transition:.3s}.aioseo-headline-analyzer-wrapper p{font-size:13px;color:#434960;margin-bottom:16px}.aioseo-headline-analyzer-wrapper p>strong{font-size:13px;font-weight:700}.aioseo-headline-analyzer-wrapper .green{color:#00aa63}.aioseo-headline-analyzer-wrapper .orange{color:#f18200}.aioseo-headline-analyzer-wrapper .red{color:#df2a4a}.aioseo-headline-analyzer-wrapper .green-bg{background:#00aa63}.aioseo-headline-analyzer-wrapper .orange-bg{background:#f18200}.aioseo-headline-analyzer-wrapper .red-bg{background:#df2a4a}.aioseo-headline-analyzer-wrapper .components-panel__body-toggle.components-button{font-weight:700;color:#141B38;padding:18px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-empty-title-warning{text-align:center;padding:0 20px;margin:20px 0;font-size:13px;color:#141B38}.aioseo-headline-analyzer-wrapper .components-panel__body.is-opened>.components-panel__body-title{margin:0}.aioseo-headline-analyzer-wrapper .components-panel__body.is-opened{padding:0}.aioseo-headline-analyzer-wrapper .components-panel__body.is-opened .aioseo-headline-analyzer-words-block,.aioseo-headline-analyzer-wrapper .components-panel__body.is-opened .aioseo-headline-analyzer-panel-first-block{padding:0 16px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-score.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-sentiment.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-previous-scores.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-character-count.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-tab-new-score.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-tab-new-score-form.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-word-count.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-beginning-ending-words.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-tab-new-score.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-search-preview.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-types.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-word-balance.is-opened .components-panel__body-title{border-bottom:1px solid #e8e8eb;margin-bottom:16px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-current-score,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-score-status{position:absolute;top:45%;left:0;right:0;text-align:center;font-size:50px;line-height:0%;z-index:0;font-weight:700}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-current-score p,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-score-status p{margin-bottom:0}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel{top:calc(58% + 16px)}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-score-status{top:65%;font-size:16px;z-index:0}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-current-score-tab p{text-align:center}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-current-score-tab .aioseo-headline-analyzer-current-title{text-align:center;font-size:16px;color:#141B38;margin:0 0 24px 0;line-height:1.4}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel h4{text-align:center;font-size:16px;color:#141B38;margin:0 0 28px 0;line-height:1.4}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel .aioseo-headline-analyzer-pie-chart-container{position:relative;width:200px;height:200px;margin:0 auto;margin-bottom:18px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel .aioseo-headline-analyzer-pie-chart-container .aioseo-headline-analyzer-new-score{position:absolute;top:calc(38% + 16px);left:0;right:0;text-align:center;font-size:50px;font-weight:700;line-height:0%;z-index:10}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel .aioseo-headline-analyzer-pie-chart-container .aioseo-headline-analyzer-new-score p{margin-bottom:0}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel .current-score{border-top:1px solid #E8E8EB;padding-top:24px;display:flex;align-items:center;flex-direction:row}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel .current-score .aioseo-headline-analyzer-score{min-height:40px;min-width:40px;font-weight:700;color:#ffffff;margin-right:16px;text-align:center;line-height:40px;border-radius:50%;font-size:18px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel .current-score h5{font-weight:400;color:#8C8F9A;margin-top:0;margin-bottom:8px;font-size:13px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel .current-score p{margin-top:8px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-tab{margin-bottom:6px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-form-block{padding:6px 12px 22px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-input-field{margin-bottom:10px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-input-field .components-base-control__label{display:block;max-width:100%;font-size:13px;margin:0 0 10px;color:#434960}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-input-field input{padding:11px 12px;font-size:13px;border:1px solid #D0D1D7;color:#393f4c;border-radius:3px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-button{font-size:14px;border-radius:4px;padding:0;height:40px;background:#005AE0;width:100%;justify-content:center;color:#ffffff;font-weight:600;border:1px solid transparent;transition:background-color .2s ease;opacity:1}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-button:disabled{border:1px solid #dcdde1;background-color:#f3f4f5;color:#8c8f9a;cursor:default}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-button:disabled:hover{color:#8c8f9a}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-button:hover,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-button:focus,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-button:visited{color:#ffffff;box-shadow:none}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-score-difference{font-weight:700;position:absolute;left:0;top:16%;right:0;text-align:center;width:42px;height:26px;margin:0 auto;font-size:16px;line-height:26px;border-radius:4px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-score-difference.red{background:#fbe9ec}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-score-difference.orange{background:#FCFAE8}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-score-difference.green{background:#CBEAE1}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-previous-scores{margin:0 !important}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-previous-scores li{margin-bottom:16px;cursor:pointer;display:flex;flex-direction:row;align-items:center;color:#434960;font-size:13px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-previous-scores li span.aioseo-headline-analyzer-score{min-height:24px;min-width:24px;margin-right:8px;font-size:11px;text-align:center;line-height:24px;border-radius:50%;color:#ffffff;font-weight:700}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-previous-scores li span.aioseo-headline-analyzer-score-text{flex-basis:calc(100% - 32px)}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-has-icon .components-panel__body-toggle .components-panel__icon{position:absolute;right:52px;top:50%;margin-top:-10px}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-has-icon.red .components-panel__body-toggle .components-panel__icon path{fill:#df2a4a}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-has-icon.orange .components-panel__body-toggle .components-panel__icon path{fill:#f18200}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-has-icon.green .components-panel__body-toggle .components-panel__icon path{fill:#00aa63}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-has-icon-alternative{position:relative}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-has-icon-alternative .aioseo-headline-analyzer-panel-icon-alternative{position:absolute;top:14px;right:40px;font-weight:700}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-word-balance .components-panel__row,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-sentiment .components-panel__row,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-types .components-panel__row,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-character-count .components-panel__row,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-word-count .components-panel__row,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-beginning-ending-words .components-panel__row,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row{display:block}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-word-balance .components-panel__row h4,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-sentiment .components-panel__row h4,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-types .components-panel__row h4,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-character-count .components-panel__row h4,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-word-count .components-panel__row h4,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-beginning-ending-words .components-panel__row h4,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row h4{font-size:16px;color:#141B38;font-weight:700;margin:0 0 16px 0}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block{margin-top:16px;border-bottom:1px solid #e8e8eb}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block h5{font-size:13px;color:#434960;margin-top:0;margin-bottom:16px;font-weight:700}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-block-data{overflow:hidden;display:flex;flex-direction:row}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-block-data span{display:block;float:left;flex-basis:70%;z-index:0}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-block-data span.aioseo-headline-analyzer-words-block-percentage{font-size:28px;font-weight:700;flex-basis:25%;justify-content:flex-start;align-items:center;display:flex;margin-right:11px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-block-data span.aioseo-headline-analyzer-words-block-goal{width:100%;font-size:13px;font-weight:400;color:#8C8F9A}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-block-data span.aioseo-headline-analyzer-words-block-progressbar{width:100%;position:relative;height:4px;margin-top:4px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-block-data span.aioseo-headline-analyzer-words-block-progressbar .aioseo-headline-analyzer-progressbar-bg{width:100%;background:#EEF0F2;height:4px;z-index:9;position:absolute;top:0;left:0;border-radius:30px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-block-data span.aioseo-headline-analyzer-words-block-progressbar .aioseo-headline-analyzer-progressbar-part{position:absolute;height:4px;top:0;left:0;z-index:10;border-radius:30px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-tag-list{margin:0;padding:0;list-style:none;display:block;margin-top:16px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-tag-list li{display:inline-block;font-size:13px;font-weight:700;color:#434960;background:#F3F4F5;border-radius:3px;padding:4px 9px;margin-right:8px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-guideline{margin-top:8px;color:#4f4f4f}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-character-length>span,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-word-length>span{width:36px;height:48px;display:inline-block;background:#e8e8eb;text-align:center;line-height:48px;font-size:28px;color:#2c324c;font-weight:700;margin-right:4px;border-radius:4px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-character-length>span.character-zero,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-word-length>span.character-zero{color:#D0D1D7}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-status-on-character-length,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-status-on-word-length{display:block;font-weight:700;font-size:16px;color:#141b38;margin-bottom:16px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-character-count-container,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-word-counter{margin-bottom:16px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-character-count p{text-align:left}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-character-count .aioseo-headline-analyzer-pie-chart-container{position:relative;width:200px;height:80px;margin:0 auto;margin-bottom:18px;margin-left:-40px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-character-count .aioseo-headline-analyzer-pie-chart-container .aioseo-headline-analyzer-character-length{position:absolute;top:50%;left:0;right:0;text-align:center;font-size:30px;line-height:0%;z-index:10}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-character-count .aioseo-headline-analyzer-pie-chart-container .aioseo-headline-analyzer-status-on-character-length{position:absolute;left:144px;top:50%;font-size:16px;color:#141B38;margin:-9px 0 0 0;font-weight:700;width:130px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-word-count p{text-align:left}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-word-count .aioseo-headline-analyzer-pie-chart-container{position:relative;width:200px;height:80px;margin:0 auto;margin-bottom:18px;margin-left:-40px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-word-count .aioseo-headline-analyzer-pie-chart-container .aioseo-headline-analyzer-word-length{position:absolute;top:50%;left:0;right:0;text-align:center;font-size:30px;line-height:0%;z-index:10}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-word-count .aioseo-headline-analyzer-pie-chart-container .aioseo-headline-analyzer-status-on-word-length{position:absolute;left:144px;top:50%;font-size:16px;color:#141B38;margin:-9px 0 0 0;font-weight:700;width:130px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-beginning-ending-words .aioseo-headline-analyzer-words{display:block;margin-bottom:18px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-beginning-ending-words .aioseo-headline-analyzer-words span{font-size:13px;color:#434960;background:#f3f4f5;border-radius:3px;padding:4px 8px;font-weight:700;display:inline-block}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-beginning-ending-words .aioseo-headline-analyzer-words-guideline{margin-top:20px}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-beginning-ending-words .aioseo-headline-analyzer-word-ending-title,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-beginning-ending-words .aioseo-headline-analyzer-word-begining-title{font-weight:700;font-size:13px;color:#141b38;margin-bottom:12px;list-style:initial;margin:0 16px 8px 16px;padding:0 0 0 8px}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-beginning-ending-words .aioseo-headline-analyzer-word-ending-title li,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-beginning-ending-words .aioseo-headline-analyzer-word-begining-title li{margin:0}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row .aioseo-headline-analyzer-search-prevew-wrap{background:#ffffff;border:0.837954px solid #e8e8eb;padding:8px;margin-bottom:16px}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row h4{color:#1a0dab;font-size:16px;margin-top:0 !important;text-transform:none;margin-bottom:5px;font-weight:500}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row .aioseo-headline-analyzer-post-url{margin-bottom:5px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row .aioseo-headline-analyzer-post-url a{color:#3c4043;font-size:13px;text-decoration:none}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row .aioseo-headline-analyzer-post-url a:hover{opacity:0.8}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row p{font-size:12px;color:#434960;margin:0px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-types .aioseo-headline-analyzer-panel-types-title{display:block;width:100%;font-size:14px;color:#141B38}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-types .aioseo-headline-analyzer-panel-types-title span{float:right;margin-right:25px;color:#141B38;font-size:13px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-types p a{color:#005AE0;text-decoration:none}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-types p a span{text-decoration:underline}.edit-post-header__settings button.components-button[aioseo-button-color]{display:flex;align-items:center}.edit-post-header__settings button.components-button[aioseo-button-color] svg{max-width:22px;max-height:20px;margin-right:8px}.edit-post-header__settings button.components-button[aioseo-button-color] span{color:#fff;font-weight:700}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]{border:1px solid #df2a4a}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:active,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:focus,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"].is-pressed{background:#df2a4a !important}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:active svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:focus svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"].is-pressed svg path{fill:#fff}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"] svg path{fill:#df2a4a}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"] span{color:#df2a4a}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]{border:1px solid #f18200}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:active,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:focus,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"].is-pressed{background:#f18200 !important}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:active svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:focus svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"].is-pressed svg path{fill:#fff}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"] svg path{fill:#f08629}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"] span{color:#f18200}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]{border:1px solid #1ec185}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:active,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:focus,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"].is-pressed{background:#1ec185 !important}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:active svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:focus svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"].is-pressed svg path{fill:#fff}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"] svg path{fill:#1ec185}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"] span{color:#1bb17a}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:active,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:focus,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"].is-pressed,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:active,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:focus,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"].is-pressed,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:active,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:focus,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"].is-pressed{box-shadow:none !important}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:active svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:focus svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"].is-pressed svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:active svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:focus svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"].is-pressed svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:active svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:focus svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"].is-pressed svg path{fill:#fff !important}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:active span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:focus span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"].is-pressed span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:active span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:focus span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"].is-pressed span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:active span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:focus span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"].is-pressed span{color:#fff}.edit-post-sidebar{scroll-behavior:smooth}.aioseo-headline-analyzer-current-score-content>p{font-weight:700}.aioseo-headline-analyzer-bottom-notice{padding:16px;background:#E6EEFC;margin:16px;border-radius:3px;font-size:13px;color:#141B38}.aioseo-headline-analyzer-bottom-notice p{text-align:left}.aioseo-headline-analyzer-bottom-notice p a{color:#005AE0;text-decoration:none}.aioseo-headline-analyzer-bottom-notice p a span{text-decoration:underline}.aioseo-donut-container{display:flex;align-items:center;justify-content:center}.aioseo-donut-container .aioseo-seo-headline-analyzer-score__circle{animation:aioseo-seo-site-score-fill 1s reverse;transform:rotate(-180deg);transform-origin:center}
3
 
1
+ /*! ! built on Tuesday, September 21st 2021, 9:50:25 pm */
2
  .aioseo-inline-buttons{display:grid;grid-template-columns:repeat(2, 1fr)}.aioseo-switcher-button{border:0;border-radius:0;font-size:14px;font-weight:normal;color:#434960;padding:16px 10px;box-shadow:0px 2px 0px #e8e8eb;cursor:pointer;text-align:left;white-space:nowrap;position:relative;transition:0.4s cubic-bezier(0.4, 0, 0.2, 1);background:#fafafa}.aioseo-switcher-button:before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;opacity:0;transition:0.4s cubic-bezier(0.4, 0, 0.2, 1);will-change:background-color,opacity;content:" "}.aioseo-switcher-button.active:before,.aioseo-switcher-button:hover:before,.aioseo-switcher-button:active:before{background-color:currentColor;opacity:.12}.aioseo-switcher-button.active{font-weight:700;color:#141B38;box-shadow:0px 2px 0px #005AE0}.aioseo-headline-analyzer-wrapper{position:relative}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-pie-chart-container{position:relative;width:200px;height:200px;margin:0 auto;margin-bottom:18px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-pie-chart-container .aioseo-headline-analyzer-total-out-of-score{font-size:18px;color:#8c8f9a;font-weight:600;z-index:0}.aioseo-headline-analyzer-wrapper .components-panel__body.is-opened svg.components-panel__arrow{transform:rotate(0deg)}.aioseo-headline-analyzer-wrapper .components-panel__body svg.components-panel__arrow{transform:rotate(-90deg);top:50%;margin-top:-12px;transition:.3s}.aioseo-headline-analyzer-wrapper p{font-size:13px;color:#434960;margin-bottom:16px}.aioseo-headline-analyzer-wrapper p>strong{font-size:13px;font-weight:700}.aioseo-headline-analyzer-wrapper .green{color:#00aa63}.aioseo-headline-analyzer-wrapper .orange{color:#f18200}.aioseo-headline-analyzer-wrapper .red{color:#df2a4a}.aioseo-headline-analyzer-wrapper .green-bg{background:#00aa63}.aioseo-headline-analyzer-wrapper .orange-bg{background:#f18200}.aioseo-headline-analyzer-wrapper .red-bg{background:#df2a4a}.aioseo-headline-analyzer-wrapper .components-panel__body-toggle.components-button{font-weight:700;color:#141B38;padding:18px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-empty-title-warning{text-align:center;padding:0 20px;margin:20px 0;font-size:13px;color:#141B38}.aioseo-headline-analyzer-wrapper .components-panel__body.is-opened>.components-panel__body-title{margin:0}.aioseo-headline-analyzer-wrapper .components-panel__body.is-opened{padding:0}.aioseo-headline-analyzer-wrapper .components-panel__body.is-opened .aioseo-headline-analyzer-words-block,.aioseo-headline-analyzer-wrapper .components-panel__body.is-opened .aioseo-headline-analyzer-panel-first-block{padding:0 16px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-score.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-sentiment.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-previous-scores.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-character-count.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-tab-new-score.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-tab-new-score-form.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-word-count.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-beginning-ending-words.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-tab-new-score.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-search-preview.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-types.is-opened .components-panel__body-title,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-word-balance.is-opened .components-panel__body-title{border-bottom:1px solid #e8e8eb;margin-bottom:16px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-current-score,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-score-status{position:absolute;top:45%;left:0;right:0;text-align:center;font-size:50px;line-height:0%;z-index:0;font-weight:700}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-current-score p,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-score-status p{margin-bottom:0}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel{top:calc(58% + 16px)}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-score-status{top:65%;font-size:16px;z-index:0}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-current-score-tab p{text-align:center}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-current-score-tab .aioseo-headline-analyzer-current-title{text-align:center;font-size:16px;color:#141B38;margin:0 0 24px 0;line-height:1.4}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel h4{text-align:center;font-size:16px;color:#141B38;margin:0 0 28px 0;line-height:1.4}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel .aioseo-headline-analyzer-pie-chart-container{position:relative;width:200px;height:200px;margin:0 auto;margin-bottom:18px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel .aioseo-headline-analyzer-pie-chart-container .aioseo-headline-analyzer-new-score{position:absolute;top:calc(38% + 16px);left:0;right:0;text-align:center;font-size:50px;font-weight:700;line-height:0%;z-index:10}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel .aioseo-headline-analyzer-pie-chart-container .aioseo-headline-analyzer-new-score p{margin-bottom:0}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel .current-score{border-top:1px solid #E8E8EB;padding-top:24px;display:flex;align-items:center;flex-direction:row}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel .current-score .aioseo-headline-analyzer-score{min-height:40px;min-width:40px;font-weight:700;color:#ffffff;margin-right:16px;text-align:center;line-height:40px;border-radius:50%;font-size:18px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel .current-score h5{font-weight:400;color:#8C8F9A;margin-top:0;margin-bottom:8px;font-size:13px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-panel .current-score p{margin-top:8px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-tab{margin-bottom:6px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-new-score-form-block{padding:6px 12px 22px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-input-field{margin-bottom:10px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-input-field .components-base-control__label{display:block;max-width:100%;font-size:13px;margin:0 0 10px;color:#434960}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-input-field input{padding:11px 12px;font-size:13px;border:1px solid #D0D1D7;color:#393f4c;border-radius:3px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-button{font-size:14px;border-radius:4px;padding:0;height:40px;background:#005AE0;width:100%;justify-content:center;color:#ffffff;font-weight:600;border:1px solid transparent;transition:background-color .2s ease;opacity:1}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-button:disabled{border:1px solid #dcdde1;background-color:#f3f4f5;color:#8c8f9a;cursor:default}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-button:disabled:hover{color:#8c8f9a}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-button:hover,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-button:focus,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-button:visited{color:#ffffff;box-shadow:none}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-score-difference{font-weight:700;position:absolute;left:0;top:16%;right:0;text-align:center;width:42px;height:26px;margin:0 auto;font-size:16px;line-height:26px;border-radius:4px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-score-difference.red{background:#fbe9ec}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-score-difference.orange{background:#FCFAE8}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-score-difference.green{background:#CBEAE1}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-previous-scores{margin:0 !important}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-previous-scores li{margin-bottom:16px;cursor:pointer;display:flex;flex-direction:row;align-items:center;color:#434960;font-size:13px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-previous-scores li span.aioseo-headline-analyzer-score{min-height:24px;min-width:24px;margin-right:8px;font-size:11px;text-align:center;line-height:24px;border-radius:50%;color:#ffffff;font-weight:700}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-previous-scores li span.aioseo-headline-analyzer-score-text{flex-basis:calc(100% - 32px)}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-has-icon .components-panel__body-toggle .components-panel__icon{position:absolute;right:52px;top:50%;margin-top:-10px}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-has-icon.red .components-panel__body-toggle .components-panel__icon path{fill:#df2a4a}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-has-icon.orange .components-panel__body-toggle .components-panel__icon path{fill:#f18200}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-has-icon.green .components-panel__body-toggle .components-panel__icon path{fill:#00aa63}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-has-icon-alternative{position:relative}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-has-icon-alternative .aioseo-headline-analyzer-panel-icon-alternative{position:absolute;top:14px;right:40px;font-weight:700}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-word-balance .components-panel__row,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-sentiment .components-panel__row,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-types .components-panel__row,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-character-count .components-panel__row,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-word-count .components-panel__row,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-beginning-ending-words .components-panel__row,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row{display:block}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-word-balance .components-panel__row h4,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-sentiment .components-panel__row h4,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-types .components-panel__row h4,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-character-count .components-panel__row h4,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-word-count .components-panel__row h4,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-beginning-ending-words .components-panel__row h4,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row h4{font-size:16px;color:#141B38;font-weight:700;margin:0 0 16px 0}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block{margin-top:16px;border-bottom:1px solid #e8e8eb}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block h5{font-size:13px;color:#434960;margin-top:0;margin-bottom:16px;font-weight:700}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-block-data{overflow:hidden;display:flex;flex-direction:row}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-block-data span{display:block;float:left;flex-basis:70%;z-index:0}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-block-data span.aioseo-headline-analyzer-words-block-percentage{font-size:28px;font-weight:700;flex-basis:25%;justify-content:flex-start;align-items:center;display:flex;margin-right:11px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-block-data span.aioseo-headline-analyzer-words-block-goal{width:100%;font-size:13px;font-weight:400;color:#8C8F9A}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-block-data span.aioseo-headline-analyzer-words-block-progressbar{width:100%;position:relative;height:4px;margin-top:4px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-block-data span.aioseo-headline-analyzer-words-block-progressbar .aioseo-headline-analyzer-progressbar-bg{width:100%;background:#EEF0F2;height:4px;z-index:9;position:absolute;top:0;left:0;border-radius:30px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-block-data span.aioseo-headline-analyzer-words-block-progressbar .aioseo-headline-analyzer-progressbar-part{position:absolute;height:4px;top:0;left:0;z-index:10;border-radius:30px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-tag-list{margin:0;padding:0;list-style:none;display:block;margin-top:16px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-tag-list li{display:inline-block;font-size:13px;font-weight:700;color:#434960;background:#F3F4F5;border-radius:3px;padding:4px 9px;margin-right:8px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-words-block .aioseo-headline-analyzer-words-guideline{margin-top:8px;color:#4f4f4f}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-character-length>span,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-word-length>span{width:36px;height:48px;display:inline-block;background:#e8e8eb;text-align:center;line-height:48px;font-size:28px;color:#2c324c;font-weight:700;margin-right:4px;border-radius:4px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-character-length>span.character-zero,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-word-length>span.character-zero{color:#D0D1D7}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-status-on-character-length,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-status-on-word-length{display:block;font-weight:700;font-size:16px;color:#141b38;margin-bottom:16px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-character-count-container,.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-word-counter{margin-bottom:16px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-character-count p{text-align:left}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-character-count .aioseo-headline-analyzer-pie-chart-container{position:relative;width:200px;height:80px;margin:0 auto;margin-bottom:18px;margin-left:-40px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-character-count .aioseo-headline-analyzer-pie-chart-container .aioseo-headline-analyzer-character-length{position:absolute;top:50%;left:0;right:0;text-align:center;font-size:30px;line-height:0%;z-index:10}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-character-count .aioseo-headline-analyzer-pie-chart-container .aioseo-headline-analyzer-status-on-character-length{position:absolute;left:144px;top:50%;font-size:16px;color:#141B38;margin:-9px 0 0 0;font-weight:700;width:130px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-word-count p{text-align:left}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-word-count .aioseo-headline-analyzer-pie-chart-container{position:relative;width:200px;height:80px;margin:0 auto;margin-bottom:18px;margin-left:-40px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-word-count .aioseo-headline-analyzer-pie-chart-container .aioseo-headline-analyzer-word-length{position:absolute;top:50%;left:0;right:0;text-align:center;font-size:30px;line-height:0%;z-index:10}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-word-count .aioseo-headline-analyzer-pie-chart-container .aioseo-headline-analyzer-status-on-word-length{position:absolute;left:144px;top:50%;font-size:16px;color:#141B38;margin:-9px 0 0 0;font-weight:700;width:130px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-beginning-ending-words .aioseo-headline-analyzer-words{display:block;margin-bottom:18px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-beginning-ending-words .aioseo-headline-analyzer-words span{font-size:13px;color:#434960;background:#f3f4f5;border-radius:3px;padding:4px 8px;font-weight:700;display:inline-block}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-beginning-ending-words .aioseo-headline-analyzer-words-guideline{margin-top:20px}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-beginning-ending-words .aioseo-headline-analyzer-word-ending-title,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-beginning-ending-words .aioseo-headline-analyzer-word-begining-title{font-weight:700;font-size:13px;color:#141b38;margin-bottom:12px;list-style:initial;margin:0 16px 8px 16px;padding:0 0 0 8px}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-beginning-ending-words .aioseo-headline-analyzer-word-ending-title li,.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-beginning-ending-words .aioseo-headline-analyzer-word-begining-title li{margin:0}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row .aioseo-headline-analyzer-search-prevew-wrap{background:#ffffff;border:0.837954px solid #e8e8eb;padding:8px;margin-bottom:16px}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row h4{color:#1a0dab;font-size:16px;margin-top:0 !important;text-transform:none;margin-bottom:5px;font-weight:500}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row .aioseo-headline-analyzer-post-url{margin-bottom:5px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row .aioseo-headline-analyzer-post-url a{color:#3c4043;font-size:13px;text-decoration:none}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row .aioseo-headline-analyzer-post-url a:hover{opacity:0.8}.aioseo-headline-analyzer-wrapper .components-panel__body.aioseo-headline-analyzer-panel-search-preview .components-panel__row p{font-size:12px;color:#434960;margin:0px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-types .aioseo-headline-analyzer-panel-types-title{display:block;width:100%;font-size:14px;color:#141B38}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-types .aioseo-headline-analyzer-panel-types-title span{float:right;margin-right:25px;color:#141B38;font-size:13px}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-types p a{color:#005AE0;text-decoration:none}.aioseo-headline-analyzer-wrapper .aioseo-headline-analyzer-panel-types p a span{text-decoration:underline}.edit-post-header__settings button.components-button[aioseo-button-color]{display:flex;align-items:center}.edit-post-header__settings button.components-button[aioseo-button-color] svg{max-width:22px;max-height:20px;margin-right:8px}.edit-post-header__settings button.components-button[aioseo-button-color] span{color:#fff;font-weight:700}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]{border:1px solid #df2a4a}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:active,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:focus,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"].is-pressed{background:#df2a4a !important}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:active svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:focus svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"].is-pressed svg path{fill:#fff}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"] svg path{fill:#df2a4a}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"] span{color:#df2a4a}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]{border:1px solid #f18200}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:active,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:focus,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"].is-pressed{background:#f18200 !important}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:active svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:focus svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"].is-pressed svg path{fill:#fff}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"] svg path{fill:#f08629}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"] span{color:#f18200}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]{border:1px solid #1ec185}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:active,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:focus,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"].is-pressed{background:#1ec185 !important}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:active svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:focus svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"].is-pressed svg path{fill:#fff}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"] svg path{fill:#1ec185}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"] span{color:#1bb17a}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:active,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:focus,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"].is-pressed,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:active,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:focus,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"].is-pressed,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:active,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:focus,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"].is-pressed{box-shadow:none !important}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:active svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:focus svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"].is-pressed svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:active svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:focus svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"].is-pressed svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:active svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:focus svg path,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"].is-pressed svg path{fill:#fff !important}.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:active span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"]:focus span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="red"].is-pressed span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:active span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"]:focus span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="green"].is-pressed span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:active span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"]:focus span,.edit-post-header__settings button.components-button[aioseo-button-color][aioseo-button-color="orange"].is-pressed span{color:#fff}.edit-post-sidebar{scroll-behavior:smooth}.aioseo-headline-analyzer-current-score-content>p{font-weight:700}.aioseo-headline-analyzer-bottom-notice{padding:16px;background:#E6EEFC;margin:16px;border-radius:3px;font-size:13px;color:#141B38}.aioseo-headline-analyzer-bottom-notice p{text-align:left}.aioseo-headline-analyzer-bottom-notice p a{color:#005AE0;text-decoration:none}.aioseo-headline-analyzer-bottom-notice p a span{text-decoration:underline}.aioseo-donut-container{display:flex;align-items:center;justify-content:center}.aioseo-donut-container .aioseo-seo-headline-analyzer-score__circle{animation:aioseo-seo-site-score-fill 1s reverse;transform:rotate(-180deg);transform-origin:center}
3
 
dist/Lite/assets/css/headline-analyzer.css.gz CHANGED
Binary file
dist/Lite/assets/css/local-seo-Maps-vue.css ADDED
@@ -0,0 +1 @@
 
1
+ .aioseo-local-maps{position:relative}.aioseo-local-maps .image-upload{display:flex}.aioseo-local-maps .image-upload .aioseo-input{max-width:445px;margin-right:10px}.aioseo-local-maps .image-upload .insert-image{min-width:214px;margin-right:10px}.aioseo-local-maps .image-upload .insert-image svg.aioseo-circle-plus{width:13px;height:13px;margin-right:10px}.aioseo-local-maps .aioseo-settings-row .aioseo-alert{margin-top:10px}.aioseo-local-maps .aioseo-settings-row .aioseo-input,.aioseo-local-maps .aioseo-settings-row .aioseo-select{max-width:480px}.aioseo-local-maps .apikey-description{margin:0 0 16px}
dist/Lite/assets/css/local-seo-Maps-vue.rtl.css ADDED
@@ -0,0 +1 @@
 
1
+ .aioseo-local-maps{position:relative}.aioseo-local-maps .image-upload{display:flex}.aioseo-local-maps .image-upload .aioseo-input{max-width:445px;margin-left:10px}.aioseo-local-maps .image-upload .insert-image{min-width:214px;margin-left:10px}.aioseo-local-maps .image-upload .insert-image svg.aioseo-circle-plus{width:13px;height:13px;margin-left:10px}.aioseo-local-maps .aioseo-settings-row .aioseo-alert{margin-top:10px}.aioseo-local-maps .aioseo-settings-row .aioseo-input,.aioseo-local-maps .aioseo-settings-row .aioseo-select{max-width:480px}.aioseo-local-maps .apikey-description{margin:0 0 16px}
dist/Lite/assets/css/local-seo-lite-Maps-vue.css ADDED
@@ -0,0 +1 @@
 
1
+ .aioseo-local-maps{position:relative}
dist/Lite/assets/css/local-seo-lite-Maps-vue.rtl.css ADDED
@@ -0,0 +1 @@
 
1
+ .aioseo-local-maps{position:relative}
dist/Lite/assets/css/local-seo-pro-Maps-vue.css ADDED
@@ -0,0 +1 @@
 
1
+ .aioseo-local-maps .image-upload{display:flex}.aioseo-local-maps .image-upload .aioseo-input{max-width:445px;margin-right:10px}.aioseo-local-maps .image-upload .insert-image{min-width:214px;margin-right:10px}.aioseo-local-maps .image-upload .insert-image svg.aioseo-circle-plus{width:13px;height:13px;margin-right:10px}.aioseo-local-maps .aioseo-settings-row .aioseo-alert{margin-top:10px}.aioseo-local-maps .aioseo-settings-row .aioseo-input,.aioseo-local-maps .aioseo-settings-row .aioseo-select{max-width:480px}.aioseo-local-maps .apikey-description{margin:0 0 16px}
dist/Lite/assets/css/local-seo-pro-Maps-vue.rtl.css ADDED
@@ -0,0 +1 @@
 
1
+ .aioseo-local-maps .image-upload{display:flex}.aioseo-local-maps .image-upload .aioseo-input{max-width:445px;margin-left:10px}.aioseo-local-maps .image-upload .insert-image{min-width:214px;margin-left:10px}.aioseo-local-maps .image-upload .insert-image svg.aioseo-circle-plus{width:13px;height:13px;margin-left:10px}.aioseo-local-maps .aioseo-settings-row .aioseo-alert{margin-top:10px}.aioseo-local-maps .aioseo-settings-row .aioseo-input,.aioseo-local-maps .aioseo-settings-row .aioseo-select{max-width:480px}.aioseo-local-maps .apikey-description{margin:0 0 16px}
dist/Lite/assets/css/post-settings.css CHANGED
@@ -1 +1 @@
1
- .aioseo-post-advanced .inline-upsell{display:inline-flex;margin-top:20px}.aioseo-post-advanced .selectbox-row{display:flex;align-items:center}.aioseo-post-advanced .selectbox-row .separator{display:inline-block;margin:0 20px;padding-bottom:10px;align-self:flex-end}.aioseo-post-advanced .selectbox-row .select{display:inline-block;width:100%;max-width:125px}.aioseo-post-advanced .selectbox-row .select>span{display:inline-block;font-size:14px;margin-bottom:10px}.aioseo-analysis-detail{margin:0 0 35px}.aioseo-analysis-detail li{padding-left:24px;position:relative;margin-bottom:24px}.aioseo-analysis-detail li:last-of-type{margin-bottom:0}.aioseo-analysis-detail li svg{position:relative;left:0;top:3px}.aioseo-analysis-detail li svg.aioseo-circle-check{color:#00aa63}.aioseo-analysis-detail li svg.aioseo-circle-close{color:#df2a4a}.aioseo-analysis-detail li svg.aioseo-circle-check,.aioseo-analysis-detail li svg.aioseo-circle-close{position:absolute;left:0;top:5px}.aioseo-analysis-detail li svg.aioseo-caret{cursor:pointer;transform:rotate(-180deg);transition:transform .3s}.aioseo-analysis-detail li .title{margin-bottom:6px!important}.aioseo-analysis-detail li .title.toggled svg{transform:rotate(-90deg)}.aioseo-analysis-detail li .title.toggled+.description{opacity:0;height:0;margin:0}.aioseo-analysis-detail li .description{font-size:14px;font-style:normal;opacity:1;height:auto;transition:all .3s}.edit-post-sidebar .aioseo-analysis-detail .title{font-size:14px}.edit-post-sidebar .aioseo-analysis-detail .description{font-size:13px}.page-analysis-panel .aioseo-tabs{background:#fff!important}.page-analysis-panel .aioseo-tabs .md-button-content{display:flex}.page-analysis-panel .aioseo-tabs .md-button{font-weight:700!important}.aioseo-focus-keyphrase-panel .modal-body{max-height:calc(90vh - 70px);overflow:auto}.aioseo-focus-keyphrase-panel .modal-body .aioseo-modal-content .aioseo-alert{margin-bottom:20px}.aioseo-focus-keyphrase-panel .semrush-country-selector{max-width:350px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table{width:100%;border:1px solid #d0d1d7;border-radius:3px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-trend,.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-volume{text-align:center}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions>div{display:flex;align-items:center;justify-content:flex-end}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .focus-keyphrase{display:flex;align-items:center;justify-content:flex-end;color:#00aa63;min-width:135px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .focus-keyphrase svg{margin-right:5px;width:16px;height:16px;color:#00aa63}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score{border-radius:3px;padding:5px;font-weight:700;font-size:13px;cursor:pointer;border:1px solid #005ae0}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score.score-green{color:#00aa63;border-color:#00aa63}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score.score-orange{color:#f18200;border-color:#f18200}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score.score-red{color:#df2a4a;border-color:#df2a4a}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover{background-color:#005ae0;color:#fff}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover.score-green{background-color:#00aa63}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover.score-orange{background-color:#f18200}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover.score-red{background-color:#df2a4a}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .remove-keyphrase{display:flex;align-items:center;justify-content:flex-end}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .remove-keyphrase svg{width:16px;height:16px;cursor:pointer}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .remove-keyphrase svg:hover{color:#df2a4a}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-header{height:50px;font-size:14px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-header th{border-bottom:1px solid #d0d1d7;padding:15px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-header th:first-of-type{padding-left:30px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-header th:last-of-type{padding-right:30px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows{font-size:14px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row{background-color:#fff;height:70px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row:last-of-type td:first-of-type{border-radius:0 0 0 3px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row:last-of-type td:last-of-type{border-radius:0 0 3px 0}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row.even{background-color:#f9f9fa}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td{padding:15px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td:first-of-type{padding-left:30px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td:last-of-type{padding-right:30px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row.loading,.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td.no-results>*{display:flex;align-items:center;justify-content:center}.aioseo-description.additional-keyphrases-description,.edit-post-sidebar .aioseo-app .aioseo-description.additional-keyphrases-description{margin:0 0 20px}.aioseo-post-general svg.aioseo-circle-question-mark{width:17px;height:17px;color:#8c8f99;transition:background-color .2s ease}.aioseo-post-general svg.aioseo-circle-question-mark:hover{color:#5a5c65}.aioseo-post-general .mobile-radio-buttons{margin:0!important;padding:0!important;border:0}.aioseo-post-general .mobile-radio-buttons>.aioseo-col{padding:0}.aioseo-post-general .mobile-radio-buttons .aioseo-radio-toggle{justify-content:flex-end}.aioseo-post-general .mobile-radio-buttons .aioseo-radio-toggle>div{margin-left:10px}.aioseo-post-general .ismobile{max-width:375px}.aioseo-post-general .add-keyphrase,.aioseo-post-general .edit-snippet{margin-top:12px;border:1px solid #dcdde1}.aioseo-post-general .add-keyphrase svg,.aioseo-post-general .edit-snippet svg{margin-right:5px}.aioseo-post-general .disabled-button{margin-top:12px;border:1px solid #dcdde1;color:#8c8f9a;background-color:#f3f4f5;cursor:default;height:30px;font-size:14px;padding:0 12px;flex-shrink:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;font-weight:600;border-radius:4px;-webkit-appearance:none;transition:background-color .2s ease;position:relative;overflow:hidden;text-decoration:none;white-space:nowrap}.aioseo-post-general .disabled-button svg{margin-right:5px}.aioseo-post-general .aioseo-toggle{display:block}.aioseo-post-general .aioseo-toggle .toggle-content input:checked+.toggle-switch{border:1px solid #00aa63;background-color:#00aa63}.aioseo-post-general .aioseo-keyphrase-tag{display:inline-block;margin-right:10px;margin-bottom:16px;border-radius:3px;font-size:14px;font-weight:700}.aioseo-post-general .aioseo-keyphrase-tag.selected{position:relative}.aioseo-post-general .aioseo-keyphrase-tag.selected:after,.aioseo-post-general .aioseo-keyphrase-tag.selected:before{content:"";position:absolute;display:block;z-index:10;bottom:-17px;border-style:solid}.aioseo-post-general .aioseo-keyphrase-tag.selected:before{left:calc(50% - 6px);border-width:0 10px 10px;border-color:transparent transparent #e8e8eb}.aioseo-post-general .aioseo-keyphrase-tag.selected:after{left:calc(50% - 4px);border-width:0 8px 8px;border-color:transparent transparent #fff}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag{display:block;padding:9px 10px;border:1px solid #f3f4f5;border-radius:3px;background:#f3f4f5;cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag.hidden{opacity:0;height:0;padding:0}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-name{cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-edit{opacity:0;margin:0 8px;cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score{cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score.score-green{color:#00aa63}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score.score-orange{color:#f18200}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score.score-red{color:#df2a4a}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag{position:relative}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag>input{width:100%;padding:8px 10px;border:1px solid #e8e8eb;border-radius:3px}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag .keyphrase-delete{position:absolute;top:2px;right:10px;width:16px;height:16px;display:block;cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag .keyphrase-delete:hover{color:#df2a4a}.aioseo-post-general .aioseo-keyphrase-tag:hover .keyphrase-edit{opacity:1}.aioseo-post-general .focus-keyphrase-panel .aioseo-analysis-detail{margin-bottom:0}.aioseo-post-general .analysis-wrapper{border-top:1px solid #e8e8eb}.aioseo-post-general .analysis-loading{position:relative;margin-top:16px}.edit-post-sidebar .aioseo-google-search-preview{padding:10px}.edit-post-sidebar .aioseo-button.edit-snippet{display:inline-flex}.edit-post-sidebar .snippet-focus-keyphrases-row{border-bottom:none;margin-bottom:0!important}.edit-post-sidebar .snippet-preview-row{padding-bottom:0!important;border-bottom:none}.edit-post-sidebar .card-additional-keyphrase,.edit-post-sidebar .card-basic-seo,.edit-post-sidebar .card-focus-keyphrase,.edit-post-sidebar .card-readability-seo,.edit-post-sidebar .card-title-seo{margin:0 -1rem;box-shadow:none;border:none;border-top:1px solid #e8e8eb}.edit-post-sidebar .card-additional-keyphrase .header,.edit-post-sidebar .card-basic-seo .header,.edit-post-sidebar .card-focus-keyphrase .header,.edit-post-sidebar .card-readability-seo .header,.edit-post-sidebar .card-title-seo .header{padding:1rem;border-bottom:none;font-size:14px;font-weight:700}.edit-post-sidebar .card-additional-keyphrase .content,.edit-post-sidebar .card-basic-seo .content,.edit-post-sidebar .card-focus-keyphrase .content,.edit-post-sidebar .card-readability-seo .content,.edit-post-sidebar .card-title-seo .content{padding:24px 16px;font-size:14px;border-top:1px solid #e8e8eb}.edit-post-sidebar .card-additional-keyphrase .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-additional-keyphrase .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-basic-seo .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-basic-seo .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-readability-seo .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-readability-seo .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-title-seo .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-title-seo .aioseo-analysis-detail:last-of-type .title{margin-bottom:0}.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail{margin:16px 0!important}.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail:empty{margin:16px}.edit-post-sidebar .card-focus-keyphrase .add-keyphrase{width:100%}.edit-post-sidebar .card-additional-keyphrase .aioseo-analysis-detail{margin:0 0 16px!important}.edit-post-sidebar .card-additional-keyphrase .add-keyphrase{width:100%;margin-bottom:16px}.edit-post-sidebar .card-readability-seo{border-bottom:1px solid #e8e8eb}.edit-post-sidebar .aioseo-keyphrase-tag{display:block;margin-right:0;margin-bottom:10px}.edit-post-sidebar .aioseo-keyphrase-tag:after{content:none!important}.edit-post-sidebar .aioseo-keyphrase-tag.selected{border:2px solid #e8e8eb}.edit-post-sidebar .aioseo-keyphrase-tag.selected:after,.edit-post-sidebar .aioseo-keyphrase-tag.selected:before{content:none}.edit-post-sidebar .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag{display:flex;width:100%}.edit-post-sidebar .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag .keyphrase-score{flex:1;text-align:right}.edit-post-sidebar .card-basic-seo .aioseo-analysis-detail,.edit-post-sidebar .card-readability-seo .aioseo-analysis-detail,.edit-post-sidebar .card-title-seo .aioseo-analysis-detail{margin-top:0}.edit-post-sidebar .analysis-wrapper{border-top:none}.aioseo-modal-content>.aioseo-settings-row{border:none;margin-bottom:0!important}.aioseo-modal-content .aioseo-post-general>.mobile-radio-buttons{position:absolute;right:40px;top:18px;margin-bottom:0;padding-bottom:0}.aioseo-modal-content .settings-name .name{font-size:16px!important;margin-bottom:6px!important}.aioseo-modal-content .snippet-description-row,.aioseo-modal-content .snippet-title-row{position:relative;display:block;margin-top:32px}.aioseo-modal-content .snippet-description-row .settings-name,.aioseo-modal-content .snippet-title-row .settings-name{margin-bottom:8px}.aioseo-modal-content .snippet-description-row .aioseo-description,.aioseo-modal-content .snippet-title-row .aioseo-description{display:none}.aioseo-modal-content .snippet-description-row .add-tags,.aioseo-modal-content .snippet-title-row .add-tags{position:absolute;top:0;right:8px;margin:0}@media screen and (max-width:520px){.aioseo-modal-content .snippet-description-row .add-tags .aioseo-add-template-tag,.aioseo-modal-content .snippet-title-row .add-tags .aioseo-add-template-tag{display:none}}.aioseo-modal-content .snippet-title-row{margin-top:24px;padding-bottom:24px!important}.aioseo-modal-content .snippet-description-row,.aioseo-modal-content .snippet-preview-row{border:none;margin-bottom:0!important;padding-bottom:0!important}.aioseo-modal-content .snippet-pillar-row{display:none}.aioseo-modal-content .component-wrapper .aioseo-settings-row>.aioseo-col{padding-top:.5rem!important}.aioseo-modal-content .component-wrapper .aioseo-google-search-preview{padding:32px 28px!important}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button:not(.md-active){min-width:72px!important;margin:0!important}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button:hover{background-color:#e2e3e6}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button:before{border-radius:100%!important;display:none}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button .label{display:inline!important}.aioseo-modal-content .mobile-radio-buttons .aioseo-tabs .md-button:not(.md-active){margin:0!important}.aioseo-modal-content .mobile-radio-buttons .aioseo-tabs .md-button:not(.md-active):before{top:0!important}.aioseo-post-schema-lite{position:relative;min-height:450px}.aioseo-post-schema-lite .schema-type{max-width:350px}.aioseo-post-schema-lite .aioseo-description{font-size:14px;line-height:1.8;margin:8px 0 0;color:#141b38}.aioseo-post-schema-lite .field-description{font-size:14px}.aioseo-post-schema-lite .block{display:block}.aioseo-post-schema-lite .aioseo-settings-row:last-of-type{margin-bottom:30px!important;padding-bottom:30px!important}.aioseo-post-schema-lite .schema-book-rating-options{display:flex}.aioseo-post-schema-lite .schema-book-rating-options .rating,.aioseo-post-schema-lite .schema-book-rating-options .rating-min{margin-right:30px;flex:1}.aioseo-post-schema-lite .schema-book-rating-options .rating-max{flex:1}@media screen and (max-width:782px){.aioseo-post-schema-lite .schema-book-rating-options{display:block}.aioseo-post-schema-lite .schema-book-rating-options .rating,.aioseo-post-schema-lite .schema-book-rating-options .rating-min{margin-right:0;margin-bottom:30px}}.aioseo-post-schema-lite .schema-person-options{display:flex;flex:0 1 auto;flex-direction:row;flex-wrap:wrap}@media screen and (max-width:782px){.aioseo-post-schema-lite .schema-person-options{display:block}}.aioseo-post-schema-lite .aioseo-alert.schema-upsell{max-width:560px}.edit-post-sidebar .aioseo-post-schema .aioseo-settings-row.aioseo-row .col-md-9 .settings-content .aioseo-col{padding-left:0;padding-right:0}.edit-post-sidebar .schema-book-rating-options{display:block}.edit-post-sidebar .schema-book-rating-options .rating,.edit-post-sidebar .schema-book-rating-options .rating-min{margin:0 0 20px}.edit-post-sidebar .schema-upsell{margin-top:20px}.tab-facebook .facebook-image-upload{display:flex}.tab-facebook .facebook-image-upload .aioseo-input{max-width:445px;margin-right:10px}.tab-facebook .facebook-image-upload .insert-image{min-width:214px;margin-right:10px}.tab-facebook .facebook-image-upload .insert-image svg.aioseo-circle-plus{width:13px;height:13px;margin-right:10px}.tab-facebook .facebook-image img{margin-top:20px;width:auto;max-width:525px;max-height:525px;height:auto}.tab-facebook .facebook-image.vertical img{max-width:158px;max-height:158px}.tab-facebook .facebook-meta-input{margin-top:10px}.tab-twitter .twitter-image-upload{display:flex}.tab-twitter .twitter-image-upload .aioseo-input{max-width:445px;margin-right:10px}.tab-twitter .twitter-image-upload .insert-image{min-width:214px;margin-right:10px}.tab-twitter .twitter-image-upload .insert-image svg.aioseo-circle-plus{width:13px;height:13px;margin-right:10px}.tab-twitter .twitter-image img{margin-top:20px;width:auto;max-width:525px;max-height:525px;height:auto}.tab-twitter .twitter-image.vertical img{max-width:158px;max-height:158px}.tab-twitter .twitter-custom-field,.tab-twitter .twitter-image-source{padding-top:8px!important;padding-bottom:24px!important}.tab-twitter .twitter-card-type,.tab-twitter .twitter-image{padding-top:8px!important}.tab-twitter .aioseo-settings-row:last-of-type,.tab-twitter .use-facebook{margin-bottom:32px!important;padding-bottom:32px!important}.open-social-modal{margin-top:12px;border:1px solid #dcdde1}.open-social-modal svg{margin-right:5px}.open-social-copy>.col-md-3{display:none}.aioseo-post-social .aioseo-col.col-md-9{position:relative}.aioseo-post-social .mobile-radio-buttons{margin:0;padding:0;border:0}.aioseo-post-social .mobile-radio-buttons .aioseo-radio-toggle{justify-content:flex-end;position:absolute;right:20px;top:12px}.aioseo-post-social .mobile-radio-buttons .aioseo-radio-toggle>div{margin-left:10px}.aioseo-post-social .mobile-radio-buttons .col-md-9{padding-left:4px;padding-right:0}.aioseo-post-social .ismobile,.aioseo-post-social .ismobilecard .facebook-post,.aioseo-post-social .ismobilecard .twitter-post{max-width:375px}.aioseo-post-social .aioseo-tabs{background:#fff!important;border:none!important;border-bottom:2px solid #e8e8eb!important}.edit-post-sidebar .mobile-radio-buttons,.edit-post-sidebar .tab-facebook,.edit-post-sidebar .tab-twitter{display:none}.aioseo-modal-content .mobile-radio-buttons{padding-bottom:0!important}.aioseo-modal-content .mobile-radio-buttons .aioseo-radio-toggle{right:0!important;top:8px!important}@media screen and (max-width:520px){.aioseo-modal-content .mobile-radio-buttons .aioseo-radio-toggle{display:none}}.aioseo-modal-content .tab-facebook,.aioseo-modal-content .tab-twitter{display:block}.aioseo-modal-content .tab-facebook .aioseo-settings-row:first-of-type,.aioseo-modal-content .tab-twitter .aioseo-settings-row:first-of-type{border-bottom:0;padding-bottom:0}.aioseo-modal-content .tab-facebook .aioseo-settings-row:first-of-type .aioseo-col:first-of-type,.aioseo-modal-content .tab-twitter .aioseo-settings-row:first-of-type .aioseo-col:first-of-type{display:none}.aioseo-modal-content .tab-facebook .aioseo-html-tags-editor,.aioseo-modal-content .tab-twitter .aioseo-html-tags-editor{margin-top:0}.aioseo-modal-content .tab-facebook .aioseo-html-tags-editor .aioseo-description,.aioseo-modal-content .tab-twitter .aioseo-html-tags-editor .aioseo-description{display:none}.aioseo-modal-content .tab-facebook .aioseo-html-tags-editor .add-tags,.aioseo-modal-content .tab-twitter .aioseo-html-tags-editor .add-tags{position:absolute;top:-40px;right:8px;margin:0}.aioseo-modal-content .tab-facebook .facebook-description-settings,.aioseo-modal-content .tab-facebook .facebook-title-settings,.aioseo-modal-content .tab-facebook .twitter-description-settings,.aioseo-modal-content .tab-facebook .twitter-title-settings,.aioseo-modal-content .tab-twitter .facebook-description-settings,.aioseo-modal-content .tab-twitter .facebook-title-settings,.aioseo-modal-content .tab-twitter .twitter-description-settings,.aioseo-modal-content .tab-twitter .twitter-title-settings{padding-bottom:24px}.aioseo-modal-content .tab-facebook .facebook-description-settings .col-md-9,.aioseo-modal-content .tab-facebook .facebook-title-settings .col-md-9,.aioseo-modal-content .tab-facebook .twitter-description-settings .col-md-9,.aioseo-modal-content .tab-facebook .twitter-title-settings .col-md-9,.aioseo-modal-content .tab-twitter .facebook-description-settings .col-md-9,.aioseo-modal-content .tab-twitter .facebook-title-settings .col-md-9,.aioseo-modal-content .tab-twitter .twitter-description-settings .col-md-9,.aioseo-modal-content .tab-twitter .twitter-title-settings .col-md-9{padding-top:0!important;margin-top:0}.aioseo-modal-content .mobile-radio-buttons{display:block!important}.aioseo-modal-content .mobile-radio-buttons>.col-md-3{display:none}.aioseo-modal-content .mobile-radio-buttons>.col-md-9{padding:0;flex-basis:100%!important;max-width:100%!important}.aioseo-modal-content .aioseo-settings-row>.col-md-3{padding-bottom:0}.aioseo-modal-content .aioseo-settings-row>.col-md-3,.aioseo-modal-content .aioseo-settings-row>.col-md-9{flex-basis:100%;max-width:100%}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs.internal{padding-left:40px}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button-content{display:flex;align-items:center}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button-content svg{display:inline;width:16px;height:16px}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button:before{height:auto!important;border-radius:0!important}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button .label{display:inline!important;margin-left:10px}.aioseo-modal-content>.aioseo-settings-row.mobile-radio-buttons{position:sticky;top:60px;z-index:10;padding-bottom:0}.aioseo-modal-content>.aioseo-settings-row.mobile-radio-buttons .md-button{max-height:46px}.aioseo-modal-content .aioseo-tab-content{position:relative;padding:30px 40px!important}.aioseo-modal-content .aioseo-tab-content.aioseo-post-social{padding:22px 40px!important}.aioseo-app,.aioseo-metabox .aioseo-app{background:#fff}.aioseo-app .aioseo-tabs,.aioseo-metabox .aioseo-app .aioseo-tabs{border-bottom-width:2px;background:#f3f4f5}.aioseo-app .aioseo-tabs .md-tabs-navigation,.aioseo-metabox .aioseo-app .aioseo-tabs .md-tabs-navigation{margin-top:0!important}.aioseo-app .aioseo-tabs .md-button,.aioseo-metabox .aioseo-app .aioseo-tabs .md-button{height:50px!important;font-size:14px!important;color:#434960!important}.aioseo-app .aioseo-tabs .md-button.md-active,.aioseo-metabox .aioseo-app .aioseo-tabs .md-button.md-active{color:#141b38!important;font-weight:700!important}.aioseo-app .aioseo-tabs .md-button .icon,.aioseo-app .aioseo-tabs svg,.aioseo-metabox .aioseo-app .aioseo-tabs .md-button .icon,.aioseo-metabox .aioseo-app .aioseo-tabs svg{display:none}@media screen and (max-width:785px){.aioseo-app .aioseo-tabs svg.aioseo-caret,.aioseo-metabox .aioseo-app .aioseo-tabs svg.aioseo-caret{display:inline}}.aioseo-app .aioseo-tab-content,.aioseo-metabox .aioseo-app .aioseo-tab-content{background:#fff;border-top:0;padding:30px}.aioseo-app .aioseo-settings-row,.aioseo-metabox .aioseo-app .aioseo-settings-row{margin-bottom:16px;padding-bottom:16px}.edit-post-sidebar .col-md-3,.edit-post-sidebar .col-md-4,.edit-post-sidebar .col-sm-6,.edit-post-sidebar .col-xs-12{width:100%;flex-basis:100%!important;max-width:100%!important}.edit-post-sidebar .components-panel{border-bottom:none}.edit-post-sidebar .aioseo-mobile-tabs{display:none}.edit-post-sidebar .tabs-scroller{display:block!important}.edit-post-sidebar .aioseo-tabs{background:#fafafa}.edit-post-sidebar .aioseo-tabs .md-button{height:51px!important;color:#141b38!important}.edit-post-sidebar .aioseo-tabs .md-button .md-ripple{padding:0 10px!important}.edit-post-sidebar .aioseo-tabs .md-button .icon{display:inline;line-height:1.3rem}.edit-post-sidebar .aioseo-tabs .md-button .icon:before{line-height:inherit}.edit-post-sidebar .aioseo-tabs .md-button .label{display:none}.edit-post-sidebar .aioseo-tabs .md-button.md-active{color:#141b38!important}.edit-post-sidebar .aioseo-tabs .md-button.md-active .label{display:inline;margin-left:10px}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active){min-width:36px!important;margin:0 3px!important}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active):before{top:8px!important;border-radius:50%;height:36px;color:#141b38}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active) svg{display:inline;width:16px;height:16px;margin-top:4px;color:#8c8f9a}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active):focus svg,.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active):hover svg{color:#141b38}.edit-post-sidebar .aioseo-app input{border:1px solid #d0d1d7}.edit-post-sidebar .aioseo-app input:focus{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.edit-post-sidebar .aioseo-app input::-moz-placeholder{color:#8c8f9a}.edit-post-sidebar .aioseo-app input:-ms-input-placeholder{color:#8c8f9a}.edit-post-sidebar .aioseo-app input::placeholder{color:#8c8f9a}.edit-post-sidebar .aioseo-app .aioseo-textarea-autosize{border:1px solid #d0d1d7}.edit-post-sidebar .aioseo-app .aioseo-tab-content{padding:20px 16px;border:none}.edit-post-sidebar .aioseo-app .aioseo-description{margin:0}.edit-post-sidebar .aioseo-settings-row{margin-bottom:16px;padding-bottom:16px}.edit-post-sidebar .aioseo-settings-row:last-of-type{border-bottom:0;margin-bottom:0!important;padding-bottom:0!important}.edit-post-sidebar .aioseo-settings-row>.aioseo-col{padding-top:0}.edit-post-sidebar .aioseo-settings-row .settings-name .name{font-size:14px;font-weight:700;margin-bottom:0}.aioseo-modal-content .aioseo-tabs.internal{border-bottom-width:1px!important}@media screen and (max-width:520px){.aioseo-modal-content .aioseo-tabs.internal{padding-left:20px!important}}.aioseo-modal-content .md-tabs-navigation .md-tabs-indicator{bottom:-1px!important}@media only screen and (min-width:782px){.aioseo-modal-content .col-md-4{flex-basis:33.33333333%!important;max-width:33.33333333%!important}.aioseo-modal-content .col-md-5{flex-basis:41.66666667%!important;max-width:41.66666667%!important}.aioseo-modal-content .col-md-7{flex-basis:58.33333333%!important;max-width:58.33333333%!important}.aioseo-modal-content .col-md-8{flex-basis:66.66666667%!important;max-width:66.66666667%!important}}
1
+ .aioseo-post-advanced .inline-upsell{display:inline-flex;margin-top:20px}.aioseo-post-advanced .selectbox-row{display:flex;align-items:center}.aioseo-post-advanced .selectbox-row .separator{display:inline-block;margin:0 20px;padding-bottom:10px;align-self:flex-end}.aioseo-post-advanced .selectbox-row .select{display:inline-block;width:100%;max-width:125px}.aioseo-post-advanced .selectbox-row .select>span{display:inline-block;font-size:14px;margin-bottom:10px}.aioseo-analysis-detail{margin:0 0 35px}.aioseo-analysis-detail li{padding-left:24px;position:relative;margin-bottom:24px}.aioseo-analysis-detail li:last-of-type{margin-bottom:0}.aioseo-analysis-detail li svg{position:relative;left:0;top:3px}.aioseo-analysis-detail li svg.aioseo-circle-check{color:#00aa63}.aioseo-analysis-detail li svg.aioseo-circle-close{color:#df2a4a}.aioseo-analysis-detail li svg.aioseo-circle-check,.aioseo-analysis-detail li svg.aioseo-circle-close{position:absolute;left:0;top:5px}.aioseo-analysis-detail li svg.aioseo-caret{cursor:pointer;transform:rotate(-180deg);transition:transform .3s}.aioseo-analysis-detail li .title{margin-bottom:6px!important}.aioseo-analysis-detail li .title.toggled svg{transform:rotate(-90deg)}.aioseo-analysis-detail li .title.toggled+.description{opacity:0;height:0;margin:0}.aioseo-analysis-detail li .description{font-size:14px;font-style:normal;opacity:1;height:auto;transition:all .3s}.edit-post-sidebar .aioseo-analysis-detail .title{font-size:14px}.edit-post-sidebar .aioseo-analysis-detail .description{font-size:13px}.page-analysis-panel .aioseo-tabs{background:#fff!important}.page-analysis-panel .aioseo-tabs .md-button-content{display:flex}.page-analysis-panel .aioseo-tabs .md-button{font-weight:700!important}.aioseo-app.aioseo-focus-keyphrase-panel-modal .modal-body{max-height:calc(90vh - 70px);overflow:auto}.aioseo-app.aioseo-focus-keyphrase-panel-modal .modal-body .aioseo-modal-content .aioseo-alert{margin-bottom:20px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .semrush-country-selector{max-width:350px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table{width:100%;border:1px solid #d0d1d7;border-radius:3px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-trend,.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-volume{text-align:center}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions>div{display:flex;align-items:center;justify-content:flex-end}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .focus-keyphrase{display:flex;align-items:center;justify-content:flex-end;color:#00aa63;min-width:135px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .focus-keyphrase svg{margin-right:5px;width:16px;height:16px;color:#00aa63}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score{border-radius:3px;padding:5px;font-weight:700;font-size:13px;cursor:pointer;border:1px solid #005ae0}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score.score-green{color:#00aa63;border-color:#00aa63}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score.score-orange{color:#f18200;border-color:#f18200}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score.score-red{color:#df2a4a;border-color:#df2a4a}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover{background-color:#005ae0;color:#fff}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover.score-green{background-color:#00aa63}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover.score-orange{background-color:#f18200}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover.score-red{background-color:#df2a4a}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .remove-keyphrase{display:flex;align-items:center;justify-content:flex-end}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .remove-keyphrase svg{width:16px;height:16px;cursor:pointer}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .remove-keyphrase svg:hover{color:#df2a4a}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-header{height:50px;font-size:14px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-header th{border-bottom:1px solid #d0d1d7;padding:15px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-header th:first-of-type{padding-left:30px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-header th:last-of-type{padding-right:30px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows{font-size:14px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row{background-color:#fff;height:70px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row:last-of-type td:first-of-type{border-radius:0 0 0 3px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row:last-of-type td:last-of-type{border-radius:0 0 3px 0}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row.even{background-color:#f9f9fa}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td{padding:15px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td:first-of-type{padding-left:30px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td:last-of-type{padding-right:30px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row.loading,.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td.no-results>*{display:flex;align-items:center;justify-content:center}.aioseo-description.additional-keyphrases-description,.edit-post-sidebar .aioseo-app .aioseo-description.additional-keyphrases-description{margin:0 0 20px}.aioseo-post-general svg.aioseo-circle-question-mark{width:17px;height:17px;color:#8c8f99;transition:background-color .2s ease}.aioseo-post-general svg.aioseo-circle-question-mark:hover{color:#5a5c65}.aioseo-post-general .mobile-radio-buttons{margin:0!important;padding:0!important;border:0}.aioseo-post-general .mobile-radio-buttons>.aioseo-col{padding:0}.aioseo-post-general .mobile-radio-buttons .aioseo-radio-toggle{justify-content:flex-end}.aioseo-post-general .mobile-radio-buttons .aioseo-radio-toggle>div{margin-left:10px}.aioseo-post-general .ismobile{max-width:375px}.aioseo-post-general .add-keyphrase,.aioseo-post-general .edit-snippet{margin-top:12px;border:1px solid #dcdde1}.aioseo-post-general .add-keyphrase svg,.aioseo-post-general .edit-snippet svg{margin-right:5px}.aioseo-post-general .disabled-button{margin-top:12px;border:1px solid #dcdde1;color:#8c8f9a;background-color:#f3f4f5;cursor:default;height:30px;font-size:14px;padding:0 12px;flex-shrink:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;font-weight:600;border-radius:4px;-webkit-appearance:none;transition:background-color .2s ease;position:relative;overflow:hidden;text-decoration:none;white-space:nowrap}.aioseo-post-general .disabled-button svg{margin-right:5px}.aioseo-post-general .aioseo-toggle{display:block}.aioseo-post-general .aioseo-toggle .toggle-content input:checked+.toggle-switch{border:1px solid #00aa63;background-color:#00aa63}.aioseo-post-general .aioseo-keyphrase-tag{display:inline-block;margin-right:10px;margin-bottom:16px;border-radius:3px;font-size:14px;font-weight:700}.aioseo-post-general .aioseo-keyphrase-tag.selected{position:relative}.aioseo-post-general .aioseo-keyphrase-tag.selected:after,.aioseo-post-general .aioseo-keyphrase-tag.selected:before{content:"";position:absolute;display:block;z-index:10;bottom:-17px;border-style:solid}.aioseo-post-general .aioseo-keyphrase-tag.selected:before{left:calc(50% - 6px);border-width:0 10px 10px;border-color:transparent transparent #e8e8eb}.aioseo-post-general .aioseo-keyphrase-tag.selected:after{left:calc(50% - 4px);border-width:0 8px 8px;border-color:transparent transparent #fff}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag{display:block;padding:9px 10px;border:1px solid #f3f4f5;border-radius:3px;background:#f3f4f5;cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag.hidden{opacity:0;height:0;padding:0}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-name{cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-edit{opacity:0;margin:0 8px;cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score{cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score.score-green{color:#00aa63}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score.score-orange{color:#f18200}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score.score-red{color:#df2a4a}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag{position:relative}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag>input{width:100%;padding:8px 10px;border:1px solid #e8e8eb;border-radius:3px}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag .keyphrase-delete{position:absolute;top:2px;right:10px;width:16px;height:16px;display:block;cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag .keyphrase-delete:hover{color:#df2a4a}.aioseo-post-general .aioseo-keyphrase-tag:hover .keyphrase-edit{opacity:1}.aioseo-post-general .focus-keyphrase-panel .aioseo-analysis-detail{margin-bottom:0}.aioseo-post-general .analysis-wrapper{border-top:1px solid #e8e8eb}.aioseo-post-general .analysis-loading{position:relative;margin-top:16px}.edit-post-sidebar .aioseo-google-search-preview{padding:10px}.edit-post-sidebar .aioseo-button.edit-snippet{display:inline-flex}.edit-post-sidebar .snippet-focus-keyphrases-row{border-bottom:none;margin-bottom:0!important}.edit-post-sidebar .snippet-preview-row{padding-bottom:0!important;border-bottom:none}.edit-post-sidebar .card-additional-keyphrase,.edit-post-sidebar .card-basic-seo,.edit-post-sidebar .card-focus-keyphrase,.edit-post-sidebar .card-readability-seo,.edit-post-sidebar .card-title-seo{margin:0 -1rem;box-shadow:none;border:none;border-top:1px solid #e8e8eb}.edit-post-sidebar .card-additional-keyphrase .header,.edit-post-sidebar .card-basic-seo .header,.edit-post-sidebar .card-focus-keyphrase .header,.edit-post-sidebar .card-readability-seo .header,.edit-post-sidebar .card-title-seo .header{padding:1rem;border-bottom:none;font-size:14px;font-weight:700}.edit-post-sidebar .card-additional-keyphrase .content,.edit-post-sidebar .card-basic-seo .content,.edit-post-sidebar .card-focus-keyphrase .content,.edit-post-sidebar .card-readability-seo .content,.edit-post-sidebar .card-title-seo .content{padding:24px 16px;font-size:14px;border-top:1px solid #e8e8eb}.edit-post-sidebar .card-additional-keyphrase .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-additional-keyphrase .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-basic-seo .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-basic-seo .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-readability-seo .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-readability-seo .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-title-seo .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-title-seo .aioseo-analysis-detail:last-of-type .title{margin-bottom:0}.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail{margin:16px 0!important}.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail:empty{margin:16px}.edit-post-sidebar .card-focus-keyphrase .add-keyphrase{width:100%}.edit-post-sidebar .card-additional-keyphrase .aioseo-analysis-detail{margin:0 0 16px!important}.edit-post-sidebar .card-additional-keyphrase .add-keyphrase{width:100%;margin-bottom:16px}.edit-post-sidebar .card-readability-seo{border-bottom:1px solid #e8e8eb}.edit-post-sidebar .aioseo-keyphrase-tag{display:block;margin-right:0;margin-bottom:10px}.edit-post-sidebar .aioseo-keyphrase-tag:after{content:none!important}.edit-post-sidebar .aioseo-keyphrase-tag.selected{border:2px solid #e8e8eb}.edit-post-sidebar .aioseo-keyphrase-tag.selected:after,.edit-post-sidebar .aioseo-keyphrase-tag.selected:before{content:none}.edit-post-sidebar .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag{display:flex;width:100%}.edit-post-sidebar .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag .keyphrase-score{flex:1;text-align:right}.edit-post-sidebar .card-basic-seo .aioseo-analysis-detail,.edit-post-sidebar .card-readability-seo .aioseo-analysis-detail,.edit-post-sidebar .card-title-seo .aioseo-analysis-detail{margin-top:0}.edit-post-sidebar .analysis-wrapper{border-top:none}.aioseo-modal-content>.aioseo-settings-row{border:none;margin-bottom:0!important}.aioseo-modal-content .aioseo-post-general>.mobile-radio-buttons{position:absolute;right:40px;top:18px;margin-bottom:0;padding-bottom:0}.aioseo-modal-content .settings-name .name{font-size:16px!important;margin-bottom:6px!important}.aioseo-modal-content .snippet-description-row,.aioseo-modal-content .snippet-title-row{position:relative;display:block;margin-top:32px}.aioseo-modal-content .snippet-description-row .settings-name,.aioseo-modal-content .snippet-title-row .settings-name{margin-bottom:8px}.aioseo-modal-content .snippet-description-row .aioseo-description,.aioseo-modal-content .snippet-title-row .aioseo-description{display:none}.aioseo-modal-content .snippet-description-row .add-tags,.aioseo-modal-content .snippet-title-row .add-tags{position:absolute;top:0;right:8px;margin:0}@media screen and (max-width:520px){.aioseo-modal-content .snippet-description-row .add-tags .aioseo-add-template-tag,.aioseo-modal-content .snippet-title-row .add-tags .aioseo-add-template-tag{display:none}}.aioseo-modal-content .snippet-title-row{margin-top:24px;padding-bottom:24px!important}.aioseo-modal-content .snippet-description-row,.aioseo-modal-content .snippet-preview-row{border:none;margin-bottom:0!important;padding-bottom:0!important}.aioseo-modal-content .snippet-pillar-row{display:none}.aioseo-modal-content .component-wrapper .aioseo-settings-row>.aioseo-col{padding-top:.5rem!important}.aioseo-modal-content .component-wrapper .aioseo-google-search-preview{padding:32px 28px!important}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button:not(.md-active){min-width:72px!important;margin:0!important}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button:hover{background-color:#e2e3e6}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button:before{border-radius:100%!important;display:none}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button .label{display:inline!important}.aioseo-modal-content .mobile-radio-buttons .aioseo-tabs .md-button:not(.md-active){margin:0!important}.aioseo-modal-content .mobile-radio-buttons .aioseo-tabs .md-button:not(.md-active):before{top:0!important}.aioseo-post-schema-lite{position:relative;min-height:450px}.aioseo-post-schema-lite .schema-type{max-width:350px}.aioseo-post-schema-lite .aioseo-description{font-size:14px;line-height:1.8;margin:8px 0 0;color:#141b38}.aioseo-post-schema-lite .field-description{font-size:14px}.aioseo-post-schema-lite .block{display:block}.aioseo-post-schema-lite .aioseo-settings-row:last-of-type{margin-bottom:30px!important;padding-bottom:30px!important}.aioseo-post-schema-lite .schema-book-rating-options{display:flex}.aioseo-post-schema-lite .schema-book-rating-options .rating,.aioseo-post-schema-lite .schema-book-rating-options .rating-min{margin-right:30px;flex:1}.aioseo-post-schema-lite .schema-book-rating-options .rating-max{flex:1}@media screen and (max-width:782px){.aioseo-post-schema-lite .schema-book-rating-options{display:block}.aioseo-post-schema-lite .schema-book-rating-options .rating,.aioseo-post-schema-lite .schema-book-rating-options .rating-min{margin-right:0;margin-bottom:30px}}.aioseo-post-schema-lite .schema-person-options{display:flex;flex:0 1 auto;flex-direction:row;flex-wrap:wrap}@media screen and (max-width:782px){.aioseo-post-schema-lite .schema-person-options{display:block}}.aioseo-post-schema-lite .aioseo-alert.schema-upsell{max-width:560px}.edit-post-sidebar .aioseo-post-schema .aioseo-settings-row.aioseo-row .col-md-9 .settings-content .aioseo-col{padding-left:0;padding-right:0}.edit-post-sidebar .schema-book-rating-options{display:block}.edit-post-sidebar .schema-book-rating-options .rating,.edit-post-sidebar .schema-book-rating-options .rating-min{margin:0 0 20px}.edit-post-sidebar .schema-upsell{margin-top:20px}.tab-facebook .facebook-image-upload{display:flex}.tab-facebook .facebook-image-upload .aioseo-input{max-width:445px;margin-right:10px}.tab-facebook .facebook-image-upload .insert-image{min-width:214px;margin-right:10px}.tab-facebook .facebook-image-upload .insert-image svg.aioseo-circle-plus{width:13px;height:13px;margin-right:10px}.tab-facebook .facebook-image img{margin-top:20px;width:auto;max-width:525px;max-height:525px;height:auto}.tab-facebook .facebook-image.vertical img{max-width:158px;max-height:158px}.tab-facebook .facebook-meta-input{margin-top:10px}.tab-twitter .twitter-image-upload{display:flex}.tab-twitter .twitter-image-upload .aioseo-input{max-width:445px;margin-right:10px}.tab-twitter .twitter-image-upload .insert-image{min-width:214px;margin-right:10px}.tab-twitter .twitter-image-upload .insert-image svg.aioseo-circle-plus{width:13px;height:13px;margin-right:10px}.tab-twitter .twitter-image img{margin-top:20px;width:auto;max-width:525px;max-height:525px;height:auto}.tab-twitter .twitter-image.vertical img{max-width:158px;max-height:158px}.tab-twitter .twitter-custom-field,.tab-twitter .twitter-image-source{padding-top:8px!important;padding-bottom:24px!important}.tab-twitter .twitter-card-type,.tab-twitter .twitter-image{padding-top:8px!important}.tab-twitter .aioseo-settings-row:last-of-type,.tab-twitter .use-facebook{margin-bottom:32px!important;padding-bottom:32px!important}.open-social-modal{margin-top:12px;border:1px solid #dcdde1}.open-social-modal svg{margin-right:5px}.open-social-copy>.col-md-3{display:none}.aioseo-post-social .aioseo-col.col-md-9{position:relative}.aioseo-post-social .mobile-radio-buttons{margin:0;padding:0;border:0}.aioseo-post-social .mobile-radio-buttons .aioseo-radio-toggle{justify-content:flex-end;position:absolute;right:20px;top:12px}.aioseo-post-social .mobile-radio-buttons .aioseo-radio-toggle>div{margin-left:10px}.aioseo-post-social .mobile-radio-buttons .col-md-9{padding-left:4px;padding-right:0}.aioseo-post-social .ismobile,.aioseo-post-social .ismobilecard .facebook-post,.aioseo-post-social .ismobilecard .twitter-post{max-width:375px}.aioseo-post-social .aioseo-tabs{background:#fff!important;border:none!important;border-bottom:2px solid #e8e8eb!important}.edit-post-sidebar .mobile-radio-buttons,.edit-post-sidebar .tab-facebook,.edit-post-sidebar .tab-twitter{display:none}.aioseo-modal-content .mobile-radio-buttons{padding-bottom:0!important}.aioseo-modal-content .mobile-radio-buttons .aioseo-radio-toggle{right:0!important;top:8px!important}@media screen and (max-width:520px){.aioseo-modal-content .mobile-radio-buttons .aioseo-radio-toggle{display:none}}.aioseo-modal-content .tab-facebook,.aioseo-modal-content .tab-twitter{display:block}.aioseo-modal-content .tab-facebook .aioseo-settings-row:first-of-type,.aioseo-modal-content .tab-twitter .aioseo-settings-row:first-of-type{border-bottom:0;padding-bottom:0}.aioseo-modal-content .tab-facebook .aioseo-settings-row:first-of-type .aioseo-col:first-of-type,.aioseo-modal-content .tab-twitter .aioseo-settings-row:first-of-type .aioseo-col:first-of-type{display:none}.aioseo-modal-content .tab-facebook .aioseo-html-tags-editor,.aioseo-modal-content .tab-twitter .aioseo-html-tags-editor{margin-top:0}.aioseo-modal-content .tab-facebook .aioseo-html-tags-editor .aioseo-description,.aioseo-modal-content .tab-twitter .aioseo-html-tags-editor .aioseo-description{display:none}.aioseo-modal-content .tab-facebook .aioseo-html-tags-editor .add-tags,.aioseo-modal-content .tab-twitter .aioseo-html-tags-editor .add-tags{position:absolute;top:-40px;right:8px;margin:0}.aioseo-modal-content .tab-facebook .facebook-description-settings,.aioseo-modal-content .tab-facebook .facebook-title-settings,.aioseo-modal-content .tab-facebook .twitter-description-settings,.aioseo-modal-content .tab-facebook .twitter-title-settings,.aioseo-modal-content .tab-twitter .facebook-description-settings,.aioseo-modal-content .tab-twitter .facebook-title-settings,.aioseo-modal-content .tab-twitter .twitter-description-settings,.aioseo-modal-content .tab-twitter .twitter-title-settings{padding-bottom:24px}.aioseo-modal-content .tab-facebook .facebook-description-settings .col-md-9,.aioseo-modal-content .tab-facebook .facebook-title-settings .col-md-9,.aioseo-modal-content .tab-facebook .twitter-description-settings .col-md-9,.aioseo-modal-content .tab-facebook .twitter-title-settings .col-md-9,.aioseo-modal-content .tab-twitter .facebook-description-settings .col-md-9,.aioseo-modal-content .tab-twitter .facebook-title-settings .col-md-9,.aioseo-modal-content .tab-twitter .twitter-description-settings .col-md-9,.aioseo-modal-content .tab-twitter .twitter-title-settings .col-md-9{padding-top:0!important;margin-top:0}.aioseo-modal-content .mobile-radio-buttons{display:block!important}.aioseo-modal-content .mobile-radio-buttons>.col-md-3{display:none}.aioseo-modal-content .mobile-radio-buttons>.col-md-9{padding:0;flex-basis:100%!important;max-width:100%!important}.aioseo-modal-content .aioseo-settings-row>.col-md-3{padding-bottom:0}.aioseo-modal-content .aioseo-settings-row>.col-md-3,.aioseo-modal-content .aioseo-settings-row>.col-md-9{flex-basis:100%;max-width:100%}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs.internal{padding-left:40px}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button-content{display:flex;align-items:center}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button-content svg{display:inline;width:16px;height:16px}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button:before{height:auto!important;border-radius:0!important}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button .label{display:inline!important;margin-left:10px}.aioseo-modal-content>.aioseo-settings-row.mobile-radio-buttons{position:sticky;top:60px;z-index:10;padding-bottom:0}.aioseo-modal-content>.aioseo-settings-row.mobile-radio-buttons .md-button{max-height:46px}.aioseo-modal-content .aioseo-tab-content{position:relative;padding:30px 40px!important}.aioseo-modal-content .aioseo-tab-content.aioseo-post-social{padding:22px 40px!important}.aioseo-app,.aioseo-metabox .aioseo-app{background:#fff}.aioseo-app .aioseo-tabs,.aioseo-metabox .aioseo-app .aioseo-tabs{border-bottom-width:2px;background:#f3f4f5}.aioseo-app .aioseo-tabs .md-tabs-navigation,.aioseo-metabox .aioseo-app .aioseo-tabs .md-tabs-navigation{margin-top:0!important}.aioseo-app .aioseo-tabs .md-button,.aioseo-metabox .aioseo-app .aioseo-tabs .md-button{height:50px!important;font-size:14px!important;color:#434960!important}.aioseo-app .aioseo-tabs .md-button.md-active,.aioseo-metabox .aioseo-app .aioseo-tabs .md-button.md-active{color:#141b38!important;font-weight:700!important}.aioseo-app .aioseo-tabs .md-button .icon,.aioseo-app .aioseo-tabs svg,.aioseo-metabox .aioseo-app .aioseo-tabs .md-button .icon,.aioseo-metabox .aioseo-app .aioseo-tabs svg{display:none}@media screen and (max-width:785px){.aioseo-app .aioseo-tabs svg.aioseo-caret,.aioseo-metabox .aioseo-app .aioseo-tabs svg.aioseo-caret{display:inline}}.aioseo-app .aioseo-tab-content,.aioseo-metabox .aioseo-app .aioseo-tab-content{background:#fff;border-top:0;padding:30px}.aioseo-app .aioseo-settings-row,.aioseo-metabox .aioseo-app .aioseo-settings-row{margin-bottom:16px;padding-bottom:16px}.edit-post-sidebar .col-md-3,.edit-post-sidebar .col-md-4,.edit-post-sidebar .col-sm-6,.edit-post-sidebar .col-xs-12{width:100%;flex-basis:100%!important;max-width:100%!important}.edit-post-sidebar .components-panel{border-bottom:none}.edit-post-sidebar .aioseo-mobile-tabs{display:none}.edit-post-sidebar .tabs-scroller{display:block!important}.edit-post-sidebar .aioseo-tabs{background:#fafafa}.edit-post-sidebar .aioseo-tabs .md-button{height:51px!important;color:#141b38!important}.edit-post-sidebar .aioseo-tabs .md-button .md-ripple{padding:0 10px!important}.edit-post-sidebar .aioseo-tabs .md-button .icon{display:inline;line-height:1.3rem}.edit-post-sidebar .aioseo-tabs .md-button .icon:before{line-height:inherit}.edit-post-sidebar .aioseo-tabs .md-button .label{display:none}.edit-post-sidebar .aioseo-tabs .md-button.md-active{color:#141b38!important}.edit-post-sidebar .aioseo-tabs .md-button.md-active .label{display:inline;margin-left:10px}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active){min-width:36px!important;margin:0 3px!important}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active):before{top:8px!important;border-radius:50%;height:36px;color:#141b38}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active) svg{display:inline;width:16px;height:16px;margin-top:4px;color:#8c8f9a}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active):focus svg,.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active):hover svg{color:#141b38}.edit-post-sidebar .aioseo-app input{border:1px solid #d0d1d7}.edit-post-sidebar .aioseo-app input:focus{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.edit-post-sidebar .aioseo-app input::-moz-placeholder{color:#8c8f9a}.edit-post-sidebar .aioseo-app input:-ms-input-placeholder{color:#8c8f9a}.edit-post-sidebar .aioseo-app input::placeholder{color:#8c8f9a}.edit-post-sidebar .aioseo-app .aioseo-textarea-autosize{border:1px solid #d0d1d7}.edit-post-sidebar .aioseo-app .aioseo-tab-content{padding:20px 16px;border:none}.edit-post-sidebar .aioseo-app .aioseo-description{margin:0}.edit-post-sidebar .aioseo-settings-row{margin-bottom:16px;padding-bottom:16px}.edit-post-sidebar .aioseo-settings-row:last-of-type{border-bottom:0;margin-bottom:0!important;padding-bottom:0!important}.edit-post-sidebar .aioseo-settings-row>.aioseo-col{padding-top:0}.edit-post-sidebar .aioseo-settings-row .settings-name .name{font-size:14px;font-weight:700;margin-bottom:0}.aioseo-app.post-settings-modal .aioseo-modal-content .aioseo-tabs.internal{border-bottom-width:1px!important}@media screen and (max-width:520px){.aioseo-app.post-settings-modal .aioseo-modal-content .aioseo-tabs.internal{padding-left:20px!important}}.aioseo-app.post-settings-modal .aioseo-modal-content .md-tabs-navigation .md-tabs-indicator{bottom:-1px!important}@media only screen and (min-width:782px){.aioseo-app.post-settings-modal .aioseo-modal-content .col-md-4{flex-basis:33.33333333%!important;max-width:33.33333333%!important}.aioseo-app.post-settings-modal .aioseo-modal-content .col-md-5{flex-basis:41.66666667%!important;max-width:41.66666667%!important}.aioseo-app.post-settings-modal .aioseo-modal-content .col-md-7{flex-basis:58.33333333%!important;max-width:58.33333333%!important}.aioseo-app.post-settings-modal .aioseo-modal-content .col-md-8{flex-basis:66.66666667%!important;max-width:66.66666667%!important}}.aioseo-post-settings-sidebar-vue{display:flex;justify-content:center}.aioseo-post-settings-sidebar-vue .aioseo-loading-spinner{margin-top:30px}.aioseo-localseo-info .aioseo-input,.aioseo-localseo-info .aioseo-multiselect,.aioseo-localseo-info .aioseo-select{max-width:480px}.aioseo-localseo-info .field-description{font-size:14px}.aioseo-localseo-info .info-businessaddress-row .columns{display:flex;flex:0 1 auto;flex-direction:row;flex-wrap:wrap}.aioseo-localseo-opening .field-description{display:inline-block;margin:10px 0;font-size:14px}.aioseo-localseo-opening .field-description.mt-8{margin-top:8px}.aioseo-localseo-opening .aioseo-input,.aioseo-localseo-opening .aioseo-multiselect,.aioseo-localseo-opening .aioseo-select{max-width:480px}.aioseo-localseo-opening .aioseo-col-flex{display:flex;align-items:center;padding:12px 0;border-bottom:1px solid #e8e8eb}.aioseo-localseo-opening .aioseo-col-flex:first-of-type{padding-top:0}.aioseo-localseo-opening .aioseo-col-flex:last-of-type{padding-bottom:0;border:none}.aioseo-localseo-opening .aioseo-col-flex .aioseo-col-day{flex:1}.aioseo-localseo-opening .aioseo-col-flex .aioseo-col-alwaysopen,.aioseo-localseo-opening .aioseo-col-flex .aioseo-col-hours{flex:2}.aioseo-localseo-opening .aioseo-col-flex span.separator{margin:0 5px}.aioseo-localseo-opening .aioseo-col-flex .aioseo-select{display:inline-block;max-width:120px;margin-bottom:5px}.aioseo-localseo-opening .aioseo-col-flex .multiselect--disabled .multiselect__single,.aioseo-localseo-opening .aioseo-col-flex .multiselect--disabled .multiselect__tags{background:#f3f4f5}.aioseo-localseo-opening .aioseo-col-alwaysopen .aioseo-checkbox{padding:0 10px}.aioseo-localseo-maps .aioseo-input,.aioseo-localseo-maps .aioseo-multiselect,.aioseo-localseo-maps .aioseo-select{max-width:480px}.aioseo-localseo-maps .field-description{font-size:14px}.sidebar-row{margin-bottom:16px}.sidebar-row .title{font-weight:700}.sidebar-row[data-v-4358427c]{margin-bottom:16px}.sidebar-row .title[data-v-4358427c]{font-weight:700}.sidebar-row.dimensions[data-v-4358427c]{display:flex;flex-direction:row;justify-content:space-between;margin:0 -10px}.sidebar-row.dimensions>div[data-v-4358427c]{padding:0 10px}.sidebar-row.dimensions label[data-v-4358427c]{display:block;padding-bottom:8px}.image-upload .aioseo-button[data-v-4358427c],.image-upload .aioseo-input[data-v-4358427c],.image-upload img[data-v-4358427c]{margin-bottom:8px}
dist/Lite/assets/css/post-settings.rtl.css CHANGED
@@ -1 +1 @@
1
- .aioseo-post-advanced .inline-upsell{display:inline-flex;margin-top:20px}.aioseo-post-advanced .selectbox-row{display:flex;align-items:center}.aioseo-post-advanced .selectbox-row .separator{display:inline-block;margin:0 20px;padding-bottom:10px;align-self:flex-end}.aioseo-post-advanced .selectbox-row .select{display:inline-block;width:100%;max-width:125px}.aioseo-post-advanced .selectbox-row .select>span{display:inline-block;font-size:14px;margin-bottom:10px}.aioseo-analysis-detail{margin:0 0 35px}.aioseo-analysis-detail li{padding-right:24px;position:relative;margin-bottom:24px}.aioseo-analysis-detail li:last-of-type{margin-bottom:0}.aioseo-analysis-detail li svg{position:relative;right:0;top:3px}.aioseo-analysis-detail li svg.aioseo-circle-check{color:#00aa63}.aioseo-analysis-detail li svg.aioseo-circle-close{color:#df2a4a}.aioseo-analysis-detail li svg.aioseo-circle-check,.aioseo-analysis-detail li svg.aioseo-circle-close{position:absolute;right:0;top:5px}.aioseo-analysis-detail li svg.aioseo-caret{cursor:pointer;transform:rotate(180deg);transition:transform .3s}.aioseo-analysis-detail li .title{margin-bottom:6px!important}.aioseo-analysis-detail li .title.toggled svg{transform:rotate(90deg)}.aioseo-analysis-detail li .title.toggled+.description{opacity:0;height:0;margin:0}.aioseo-analysis-detail li .description{font-size:14px;font-style:normal;opacity:1;height:auto;transition:all .3s}.edit-post-sidebar .aioseo-analysis-detail .title{font-size:14px}.edit-post-sidebar .aioseo-analysis-detail .description{font-size:13px}.page-analysis-panel .aioseo-tabs{background:#fff!important}.page-analysis-panel .aioseo-tabs .md-button-content{display:flex}.page-analysis-panel .aioseo-tabs .md-button{font-weight:700!important}.aioseo-focus-keyphrase-panel .modal-body{max-height:calc(90vh - 70px);overflow:auto}.aioseo-focus-keyphrase-panel .modal-body .aioseo-modal-content .aioseo-alert{margin-bottom:20px}.aioseo-focus-keyphrase-panel .semrush-country-selector{max-width:350px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table{width:100%;border:1px solid #d0d1d7;border-radius:3px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-trend,.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-volume{text-align:center}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions>div{display:flex;align-items:center;justify-content:flex-end}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .focus-keyphrase{display:flex;align-items:center;justify-content:flex-end;color:#00aa63;min-width:135px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .focus-keyphrase svg{margin-left:5px;width:16px;height:16px;color:#00aa63}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score{border-radius:3px;padding:5px;font-weight:700;font-size:13px;cursor:pointer;border:1px solid #005ae0}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score.score-green{color:#00aa63;border-color:#00aa63}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score.score-orange{color:#f18200;border-color:#f18200}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score.score-red{color:#df2a4a;border-color:#df2a4a}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover{background-color:#005ae0;color:#fff}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover.score-green{background-color:#00aa63}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover.score-orange{background-color:#f18200}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover.score-red{background-color:#df2a4a}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .remove-keyphrase{display:flex;align-items:center;justify-content:flex-end}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .remove-keyphrase svg{width:16px;height:16px;cursor:pointer}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrase-actions .remove-keyphrase svg:hover{color:#df2a4a}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-header{height:50px;font-size:14px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-header th{border-bottom:1px solid #d0d1d7;padding:15px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-header th:first-of-type{padding-right:30px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-header th:last-of-type{padding-left:30px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows{font-size:14px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row{background-color:#fff;height:70px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row:last-of-type td:first-of-type{border-radius:0 0 3px 0}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row:last-of-type td:last-of-type{border-radius:0 0 0 3px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row.even{background-color:#f9f9fa}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td{padding:15px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td:first-of-type{padding-right:30px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td:last-of-type{padding-left:30px}.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row.loading,.aioseo-focus-keyphrase-panel .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td.no-results>*{display:flex;align-items:center;justify-content:center}.aioseo-description.additional-keyphrases-description,.edit-post-sidebar .aioseo-app .aioseo-description.additional-keyphrases-description{margin:0 0 20px}.aioseo-post-general svg.aioseo-circle-question-mark{width:17px;height:17px;color:#8c8f99;transition:background-color .2s ease}.aioseo-post-general svg.aioseo-circle-question-mark:hover{color:#5a5c65}.aioseo-post-general .mobile-radio-buttons{margin:0!important;padding:0!important;border:0}.aioseo-post-general .mobile-radio-buttons>.aioseo-col{padding:0}.aioseo-post-general .mobile-radio-buttons .aioseo-radio-toggle{justify-content:flex-end}.aioseo-post-general .mobile-radio-buttons .aioseo-radio-toggle>div{margin-right:10px}.aioseo-post-general .ismobile{max-width:375px}.aioseo-post-general .add-keyphrase,.aioseo-post-general .edit-snippet{margin-top:12px;border:1px solid #dcdde1}.aioseo-post-general .add-keyphrase svg,.aioseo-post-general .edit-snippet svg{margin-left:5px}.aioseo-post-general .disabled-button{margin-top:12px;border:1px solid #dcdde1;color:#8c8f9a;background-color:#f3f4f5;cursor:default;height:30px;font-size:14px;padding:0 12px;flex-shrink:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;font-weight:600;border-radius:4px;-webkit-appearance:none;transition:background-color .2s ease;position:relative;overflow:hidden;text-decoration:none;white-space:nowrap}.aioseo-post-general .disabled-button svg{margin-left:5px}.aioseo-post-general .aioseo-toggle{display:block}.aioseo-post-general .aioseo-toggle .toggle-content input:checked+.toggle-switch{border:1px solid #00aa63;background-color:#00aa63}.aioseo-post-general .aioseo-keyphrase-tag{display:inline-block;margin-left:10px;margin-bottom:16px;border-radius:3px;font-size:14px;font-weight:700}.aioseo-post-general .aioseo-keyphrase-tag.selected{position:relative}.aioseo-post-general .aioseo-keyphrase-tag.selected:after,.aioseo-post-general .aioseo-keyphrase-tag.selected:before{content:"";position:absolute;display:block;z-index:10;bottom:-17px;border-style:solid}.aioseo-post-general .aioseo-keyphrase-tag.selected:before{right:calc(50% - 6px);border-width:0 10px 10px;border-color:transparent transparent #e8e8eb}.aioseo-post-general .aioseo-keyphrase-tag.selected:after{right:calc(50% - 4px);border-width:0 8px 8px;border-color:transparent transparent #fff}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag{display:block;padding:9px 10px;border:1px solid #f3f4f5;border-radius:3px;background:#f3f4f5;cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag.hidden{opacity:0;height:0;padding:0}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-name{cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-edit{opacity:0;margin:0 8px;cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score{cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score.score-green{color:#00aa63}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score.score-orange{color:#f18200}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score.score-red{color:#df2a4a}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag{position:relative}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag>input{width:100%;padding:8px 10px;border:1px solid #e8e8eb;border-radius:3px}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag .keyphrase-delete{position:absolute;top:2px;left:10px;width:16px;height:16px;display:block;cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag .keyphrase-delete:hover{color:#df2a4a}.aioseo-post-general .aioseo-keyphrase-tag:hover .keyphrase-edit{opacity:1}.aioseo-post-general .focus-keyphrase-panel .aioseo-analysis-detail{margin-bottom:0}.aioseo-post-general .analysis-wrapper{border-top:1px solid #e8e8eb}.aioseo-post-general .analysis-loading{position:relative;margin-top:16px}.edit-post-sidebar .aioseo-google-search-preview{padding:10px}.edit-post-sidebar .aioseo-button.edit-snippet{display:inline-flex}.edit-post-sidebar .snippet-focus-keyphrases-row{border-bottom:none;margin-bottom:0!important}.edit-post-sidebar .snippet-preview-row{padding-bottom:0!important;border-bottom:none}.edit-post-sidebar .card-additional-keyphrase,.edit-post-sidebar .card-basic-seo,.edit-post-sidebar .card-focus-keyphrase,.edit-post-sidebar .card-readability-seo,.edit-post-sidebar .card-title-seo{margin:0 -1rem;box-shadow:none;border:none;border-top:1px solid #e8e8eb}.edit-post-sidebar .card-additional-keyphrase .header,.edit-post-sidebar .card-basic-seo .header,.edit-post-sidebar .card-focus-keyphrase .header,.edit-post-sidebar .card-readability-seo .header,.edit-post-sidebar .card-title-seo .header{padding:1rem;border-bottom:none;font-size:14px;font-weight:700}.edit-post-sidebar .card-additional-keyphrase .content,.edit-post-sidebar .card-basic-seo .content,.edit-post-sidebar .card-focus-keyphrase .content,.edit-post-sidebar .card-readability-seo .content,.edit-post-sidebar .card-title-seo .content{padding:24px 16px;font-size:14px;border-top:1px solid #e8e8eb}.edit-post-sidebar .card-additional-keyphrase .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-additional-keyphrase .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-basic-seo .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-basic-seo .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-readability-seo .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-readability-seo .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-title-seo .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-title-seo .aioseo-analysis-detail:last-of-type .title{margin-bottom:0}.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail{margin:16px 0!important}.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail:empty{margin:16px}.edit-post-sidebar .card-focus-keyphrase .add-keyphrase{width:100%}.edit-post-sidebar .card-additional-keyphrase .aioseo-analysis-detail{margin:0 0 16px!important}.edit-post-sidebar .card-additional-keyphrase .add-keyphrase{width:100%;margin-bottom:16px}.edit-post-sidebar .card-readability-seo{border-bottom:1px solid #e8e8eb}.edit-post-sidebar .aioseo-keyphrase-tag{display:block;margin-left:0;margin-bottom:10px}.edit-post-sidebar .aioseo-keyphrase-tag:after{content:none!important}.edit-post-sidebar .aioseo-keyphrase-tag.selected{border:2px solid #e8e8eb}.edit-post-sidebar .aioseo-keyphrase-tag.selected:after,.edit-post-sidebar .aioseo-keyphrase-tag.selected:before{content:none}.edit-post-sidebar .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag{display:flex;width:100%}.edit-post-sidebar .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag .keyphrase-score{flex:1;text-align:left}.edit-post-sidebar .card-basic-seo .aioseo-analysis-detail,.edit-post-sidebar .card-readability-seo .aioseo-analysis-detail,.edit-post-sidebar .card-title-seo .aioseo-analysis-detail{margin-top:0}.edit-post-sidebar .analysis-wrapper{border-top:none}.aioseo-modal-content>.aioseo-settings-row{border:none;margin-bottom:0!important}.aioseo-modal-content .aioseo-post-general>.mobile-radio-buttons{position:absolute;left:40px;top:18px;margin-bottom:0;padding-bottom:0}.aioseo-modal-content .settings-name .name{font-size:16px!important;margin-bottom:6px!important}.aioseo-modal-content .snippet-description-row,.aioseo-modal-content .snippet-title-row{position:relative;display:block;margin-top:32px}.aioseo-modal-content .snippet-description-row .settings-name,.aioseo-modal-content .snippet-title-row .settings-name{margin-bottom:8px}.aioseo-modal-content .snippet-description-row .aioseo-description,.aioseo-modal-content .snippet-title-row .aioseo-description{display:none}.aioseo-modal-content .snippet-description-row .add-tags,.aioseo-modal-content .snippet-title-row .add-tags{position:absolute;top:0;left:8px;margin:0}@media screen and (max-width:520px){.aioseo-modal-content .snippet-description-row .add-tags .aioseo-add-template-tag,.aioseo-modal-content .snippet-title-row .add-tags .aioseo-add-template-tag{display:none}}.aioseo-modal-content .snippet-title-row{margin-top:24px;padding-bottom:24px!important}.aioseo-modal-content .snippet-description-row,.aioseo-modal-content .snippet-preview-row{border:none;margin-bottom:0!important;padding-bottom:0!important}.aioseo-modal-content .snippet-pillar-row{display:none}.aioseo-modal-content .component-wrapper .aioseo-settings-row>.aioseo-col{padding-top:.5rem!important}.aioseo-modal-content .component-wrapper .aioseo-google-search-preview{padding:32px 28px!important}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button:not(.md-active){min-width:72px!important;margin:0!important}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button:hover{background-color:#e2e3e6}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button:before{border-radius:100%!important;display:none}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button .label{display:inline!important}.aioseo-modal-content .mobile-radio-buttons .aioseo-tabs .md-button:not(.md-active){margin:0!important}.aioseo-modal-content .mobile-radio-buttons .aioseo-tabs .md-button:not(.md-active):before{top:0!important}.aioseo-post-schema-lite{position:relative;min-height:450px}.aioseo-post-schema-lite .schema-type{max-width:350px}.aioseo-post-schema-lite .aioseo-description{font-size:14px;line-height:1.8;margin:8px 0 0;color:#141b38}.aioseo-post-schema-lite .field-description{font-size:14px}.aioseo-post-schema-lite .block{display:block}.aioseo-post-schema-lite .aioseo-settings-row:last-of-type{margin-bottom:30px!important;padding-bottom:30px!important}.aioseo-post-schema-lite .schema-book-rating-options{display:flex}.aioseo-post-schema-lite .schema-book-rating-options .rating,.aioseo-post-schema-lite .schema-book-rating-options .rating-min{margin-left:30px;flex:1}.aioseo-post-schema-lite .schema-book-rating-options .rating-max{flex:1}@media screen and (max-width:782px){.aioseo-post-schema-lite .schema-book-rating-options{display:block}.aioseo-post-schema-lite .schema-book-rating-options .rating,.aioseo-post-schema-lite .schema-book-rating-options .rating-min{margin-left:0;margin-bottom:30px}}.aioseo-post-schema-lite .schema-person-options{display:flex;flex:0 1 auto;flex-direction:row;flex-wrap:wrap}@media screen and (max-width:782px){.aioseo-post-schema-lite .schema-person-options{display:block}}.aioseo-post-schema-lite .aioseo-alert.schema-upsell{max-width:560px}.edit-post-sidebar .aioseo-post-schema .aioseo-settings-row.aioseo-row .col-md-9 .settings-content .aioseo-col{padding-right:0;padding-left:0}.edit-post-sidebar .schema-book-rating-options{display:block}.edit-post-sidebar .schema-book-rating-options .rating,.edit-post-sidebar .schema-book-rating-options .rating-min{margin:0 0 20px}.edit-post-sidebar .schema-upsell{margin-top:20px}.tab-facebook .facebook-image-upload{display:flex}.tab-facebook .facebook-image-upload .aioseo-input{max-width:445px;margin-left:10px}.tab-facebook .facebook-image-upload .insert-image{min-width:214px;margin-left:10px}.tab-facebook .facebook-image-upload .insert-image svg.aioseo-circle-plus{width:13px;height:13px;margin-left:10px}.tab-facebook .facebook-image img{margin-top:20px;width:auto;max-width:525px;max-height:525px;height:auto}.tab-facebook .facebook-image.vertical img{max-width:158px;max-height:158px}.tab-facebook .facebook-meta-input{margin-top:10px}.tab-twitter .twitter-image-upload{display:flex}.tab-twitter .twitter-image-upload .aioseo-input{max-width:445px;margin-left:10px}.tab-twitter .twitter-image-upload .insert-image{min-width:214px;margin-left:10px}.tab-twitter .twitter-image-upload .insert-image svg.aioseo-circle-plus{width:13px;height:13px;margin-left:10px}.tab-twitter .twitter-image img{margin-top:20px;width:auto;max-width:525px;max-height:525px;height:auto}.tab-twitter .twitter-image.vertical img{max-width:158px;max-height:158px}.tab-twitter .twitter-custom-field,.tab-twitter .twitter-image-source{padding-top:8px!important;padding-bottom:24px!important}.tab-twitter .twitter-card-type,.tab-twitter .twitter-image{padding-top:8px!important}.tab-twitter .aioseo-settings-row:last-of-type,.tab-twitter .use-facebook{margin-bottom:32px!important;padding-bottom:32px!important}.open-social-modal{margin-top:12px;border:1px solid #dcdde1}.open-social-modal svg{margin-left:5px}.open-social-copy>.col-md-3{display:none}.aioseo-post-social .aioseo-col.col-md-9{position:relative}.aioseo-post-social .mobile-radio-buttons{margin:0;padding:0;border:0}.aioseo-post-social .mobile-radio-buttons .aioseo-radio-toggle{justify-content:flex-end;position:absolute;left:20px;top:12px}.aioseo-post-social .mobile-radio-buttons .aioseo-radio-toggle>div{margin-right:10px}.aioseo-post-social .mobile-radio-buttons .col-md-9{padding-right:4px;padding-left:0}.aioseo-post-social .ismobile,.aioseo-post-social .ismobilecard .facebook-post,.aioseo-post-social .ismobilecard .twitter-post{max-width:375px}.aioseo-post-social .aioseo-tabs{background:#fff!important;border:none!important;border-bottom:2px solid #e8e8eb!important}.edit-post-sidebar .mobile-radio-buttons,.edit-post-sidebar .tab-facebook,.edit-post-sidebar .tab-twitter{display:none}.aioseo-modal-content .mobile-radio-buttons{padding-bottom:0!important}.aioseo-modal-content .mobile-radio-buttons .aioseo-radio-toggle{left:0!important;top:8px!important}@media screen and (max-width:520px){.aioseo-modal-content .mobile-radio-buttons .aioseo-radio-toggle{display:none}}.aioseo-modal-content .tab-facebook,.aioseo-modal-content .tab-twitter{display:block}.aioseo-modal-content .tab-facebook .aioseo-settings-row:first-of-type,.aioseo-modal-content .tab-twitter .aioseo-settings-row:first-of-type{border-bottom:0;padding-bottom:0}.aioseo-modal-content .tab-facebook .aioseo-settings-row:first-of-type .aioseo-col:first-of-type,.aioseo-modal-content .tab-twitter .aioseo-settings-row:first-of-type .aioseo-col:first-of-type{display:none}.aioseo-modal-content .tab-facebook .aioseo-html-tags-editor,.aioseo-modal-content .tab-twitter .aioseo-html-tags-editor{margin-top:0}.aioseo-modal-content .tab-facebook .aioseo-html-tags-editor .aioseo-description,.aioseo-modal-content .tab-twitter .aioseo-html-tags-editor .aioseo-description{display:none}.aioseo-modal-content .tab-facebook .aioseo-html-tags-editor .add-tags,.aioseo-modal-content .tab-twitter .aioseo-html-tags-editor .add-tags{position:absolute;top:-40px;left:8px;margin:0}.aioseo-modal-content .tab-facebook .facebook-description-settings,.aioseo-modal-content .tab-facebook .facebook-title-settings,.aioseo-modal-content .tab-facebook .twitter-description-settings,.aioseo-modal-content .tab-facebook .twitter-title-settings,.aioseo-modal-content .tab-twitter .facebook-description-settings,.aioseo-modal-content .tab-twitter .facebook-title-settings,.aioseo-modal-content .tab-twitter .twitter-description-settings,.aioseo-modal-content .tab-twitter .twitter-title-settings{padding-bottom:24px}.aioseo-modal-content .tab-facebook .facebook-description-settings .col-md-9,.aioseo-modal-content .tab-facebook .facebook-title-settings .col-md-9,.aioseo-modal-content .tab-facebook .twitter-description-settings .col-md-9,.aioseo-modal-content .tab-facebook .twitter-title-settings .col-md-9,.aioseo-modal-content .tab-twitter .facebook-description-settings .col-md-9,.aioseo-modal-content .tab-twitter .facebook-title-settings .col-md-9,.aioseo-modal-content .tab-twitter .twitter-description-settings .col-md-9,.aioseo-modal-content .tab-twitter .twitter-title-settings .col-md-9{padding-top:0!important;margin-top:0}.aioseo-modal-content .mobile-radio-buttons{display:block!important}.aioseo-modal-content .mobile-radio-buttons>.col-md-3{display:none}.aioseo-modal-content .mobile-radio-buttons>.col-md-9{padding:0;flex-basis:100%!important;max-width:100%!important}.aioseo-modal-content .aioseo-settings-row>.col-md-3{padding-bottom:0}.aioseo-modal-content .aioseo-settings-row>.col-md-3,.aioseo-modal-content .aioseo-settings-row>.col-md-9{flex-basis:100%;max-width:100%}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs.internal{padding-right:40px}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button-content{display:flex;align-items:center}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button-content svg{display:inline;width:16px;height:16px}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button:before{height:auto!important;border-radius:0!important}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button .label{display:inline!important;margin-right:10px}.aioseo-modal-content>.aioseo-settings-row.mobile-radio-buttons{position:sticky;top:60px;z-index:10;padding-bottom:0}.aioseo-modal-content>.aioseo-settings-row.mobile-radio-buttons .md-button{max-height:46px}.aioseo-modal-content .aioseo-tab-content{position:relative;padding:30px 40px!important}.aioseo-modal-content .aioseo-tab-content.aioseo-post-social{padding:22px 40px!important}.aioseo-app,.aioseo-metabox .aioseo-app{background:#fff}.aioseo-app .aioseo-tabs,.aioseo-metabox .aioseo-app .aioseo-tabs{border-bottom-width:2px;background:#f3f4f5}.aioseo-app .aioseo-tabs .md-tabs-navigation,.aioseo-metabox .aioseo-app .aioseo-tabs .md-tabs-navigation{margin-top:0!important}.aioseo-app .aioseo-tabs .md-button,.aioseo-metabox .aioseo-app .aioseo-tabs .md-button{height:50px!important;font-size:14px!important;color:#434960!important}.aioseo-app .aioseo-tabs .md-button.md-active,.aioseo-metabox .aioseo-app .aioseo-tabs .md-button.md-active{color:#141b38!important;font-weight:700!important}.aioseo-app .aioseo-tabs .md-button .icon,.aioseo-app .aioseo-tabs svg,.aioseo-metabox .aioseo-app .aioseo-tabs .md-button .icon,.aioseo-metabox .aioseo-app .aioseo-tabs svg{display:none}@media screen and (max-width:785px){.aioseo-app .aioseo-tabs svg.aioseo-caret,.aioseo-metabox .aioseo-app .aioseo-tabs svg.aioseo-caret{display:inline}}.aioseo-app .aioseo-tab-content,.aioseo-metabox .aioseo-app .aioseo-tab-content{background:#fff;border-top:0;padding:30px}.aioseo-app .aioseo-settings-row,.aioseo-metabox .aioseo-app .aioseo-settings-row{margin-bottom:16px;padding-bottom:16px}.edit-post-sidebar .col-md-3,.edit-post-sidebar .col-md-4,.edit-post-sidebar .col-sm-6,.edit-post-sidebar .col-xs-12{width:100%;flex-basis:100%!important;max-width:100%!important}.edit-post-sidebar .components-panel{border-bottom:none}.edit-post-sidebar .aioseo-mobile-tabs{display:none}.edit-post-sidebar .tabs-scroller{display:block!important}.edit-post-sidebar .aioseo-tabs{background:#fafafa}.edit-post-sidebar .aioseo-tabs .md-button{height:51px!important;color:#141b38!important}.edit-post-sidebar .aioseo-tabs .md-button .md-ripple{padding:0 10px!important}.edit-post-sidebar .aioseo-tabs .md-button .icon{display:inline;line-height:1.3rem}.edit-post-sidebar .aioseo-tabs .md-button .icon:before{line-height:inherit}.edit-post-sidebar .aioseo-tabs .md-button .label{display:none}.edit-post-sidebar .aioseo-tabs .md-button.md-active{color:#141b38!important}.edit-post-sidebar .aioseo-tabs .md-button.md-active .label{display:inline;margin-right:10px}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active){min-width:36px!important;margin:0 3px!important}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active):before{top:8px!important;border-radius:50%;height:36px;color:#141b38}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active) svg{display:inline;width:16px;height:16px;margin-top:4px;color:#8c8f9a}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active):focus svg,.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active):hover svg{color:#141b38}.edit-post-sidebar .aioseo-app input{border:1px solid #d0d1d7}.edit-post-sidebar .aioseo-app input:focus{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.edit-post-sidebar .aioseo-app input::-moz-placeholder{color:#8c8f9a}.edit-post-sidebar .aioseo-app input:-ms-input-placeholder{color:#8c8f9a}.edit-post-sidebar .aioseo-app input::placeholder{color:#8c8f9a}.edit-post-sidebar .aioseo-app .aioseo-textarea-autosize{border:1px solid #d0d1d7}.edit-post-sidebar .aioseo-app .aioseo-tab-content{padding:20px 16px;border:none}.edit-post-sidebar .aioseo-app .aioseo-description{margin:0}.edit-post-sidebar .aioseo-settings-row{margin-bottom:16px;padding-bottom:16px}.edit-post-sidebar .aioseo-settings-row:last-of-type{border-bottom:0;margin-bottom:0!important;padding-bottom:0!important}.edit-post-sidebar .aioseo-settings-row>.aioseo-col{padding-top:0}.edit-post-sidebar .aioseo-settings-row .settings-name .name{font-size:14px;font-weight:700;margin-bottom:0}.aioseo-modal-content .aioseo-tabs.internal{border-bottom-width:1px!important}@media screen and (max-width:520px){.aioseo-modal-content .aioseo-tabs.internal{padding-right:20px!important}}.aioseo-modal-content .md-tabs-navigation .md-tabs-indicator{bottom:-1px!important}@media only screen and (min-width:782px){.aioseo-modal-content .col-md-4{flex-basis:33.33333333%!important;max-width:33.33333333%!important}.aioseo-modal-content .col-md-5{flex-basis:41.66666667%!important;max-width:41.66666667%!important}.aioseo-modal-content .col-md-7{flex-basis:58.33333333%!important;max-width:58.33333333%!important}.aioseo-modal-content .col-md-8{flex-basis:66.66666667%!important;max-width:66.66666667%!important}}
1
+ .aioseo-post-advanced .inline-upsell{display:inline-flex;margin-top:20px}.aioseo-post-advanced .selectbox-row{display:flex;align-items:center}.aioseo-post-advanced .selectbox-row .separator{display:inline-block;margin:0 20px;padding-bottom:10px;align-self:flex-end}.aioseo-post-advanced .selectbox-row .select{display:inline-block;width:100%;max-width:125px}.aioseo-post-advanced .selectbox-row .select>span{display:inline-block;font-size:14px;margin-bottom:10px}.aioseo-analysis-detail{margin:0 0 35px}.aioseo-analysis-detail li{padding-right:24px;position:relative;margin-bottom:24px}.aioseo-analysis-detail li:last-of-type{margin-bottom:0}.aioseo-analysis-detail li svg{position:relative;right:0;top:3px}.aioseo-analysis-detail li svg.aioseo-circle-check{color:#00aa63}.aioseo-analysis-detail li svg.aioseo-circle-close{color:#df2a4a}.aioseo-analysis-detail li svg.aioseo-circle-check,.aioseo-analysis-detail li svg.aioseo-circle-close{position:absolute;right:0;top:5px}.aioseo-analysis-detail li svg.aioseo-caret{cursor:pointer;transform:rotate(180deg);transition:transform .3s}.aioseo-analysis-detail li .title{margin-bottom:6px!important}.aioseo-analysis-detail li .title.toggled svg{transform:rotate(90deg)}.aioseo-analysis-detail li .title.toggled+.description{opacity:0;height:0;margin:0}.aioseo-analysis-detail li .description{font-size:14px;font-style:normal;opacity:1;height:auto;transition:all .3s}.edit-post-sidebar .aioseo-analysis-detail .title{font-size:14px}.edit-post-sidebar .aioseo-analysis-detail .description{font-size:13px}.page-analysis-panel .aioseo-tabs{background:#fff!important}.page-analysis-panel .aioseo-tabs .md-button-content{display:flex}.page-analysis-panel .aioseo-tabs .md-button{font-weight:700!important}.aioseo-app.aioseo-focus-keyphrase-panel-modal .modal-body{max-height:calc(90vh - 70px);overflow:auto}.aioseo-app.aioseo-focus-keyphrase-panel-modal .modal-body .aioseo-modal-content .aioseo-alert{margin-bottom:20px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .semrush-country-selector{max-width:350px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table{width:100%;border:1px solid #d0d1d7;border-radius:3px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-trend,.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-volume{text-align:center}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions>div{display:flex;align-items:center;justify-content:flex-end}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .focus-keyphrase{display:flex;align-items:center;justify-content:flex-end;color:#00aa63;min-width:135px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .focus-keyphrase svg{margin-left:5px;width:16px;height:16px;color:#00aa63}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score{border-radius:3px;padding:5px;font-weight:700;font-size:13px;cursor:pointer;border:1px solid #005ae0}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score.score-green{color:#00aa63;border-color:#00aa63}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score.score-orange{color:#f18200;border-color:#f18200}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score.score-red{color:#df2a4a;border-color:#df2a4a}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover{background-color:#005ae0;color:#fff}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover.score-green{background-color:#00aa63}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover.score-orange{background-color:#f18200}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .keyphrase-score:hover.score-red{background-color:#df2a4a}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .remove-keyphrase{display:flex;align-items:center;justify-content:flex-end}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .remove-keyphrase svg{width:16px;height:16px;cursor:pointer}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrase-actions .remove-keyphrase svg:hover{color:#df2a4a}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-header{height:50px;font-size:14px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-header th{border-bottom:1px solid #d0d1d7;padding:15px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-header th:first-of-type{padding-right:30px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-header th:last-of-type{padding-left:30px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows{font-size:14px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row{background-color:#fff;height:70px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row:last-of-type td:first-of-type{border-radius:0 0 3px 0}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row:last-of-type td:last-of-type{border-radius:0 0 0 3px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row.even{background-color:#f9f9fa}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td{padding:15px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td:first-of-type{padding-right:30px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td:last-of-type{padding-left:30px}.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row.loading,.aioseo-app.aioseo-focus-keyphrase-panel-modal .additional-keyphrases-table .keyphrases-rows tr.keyphrase-row td.no-results>*{display:flex;align-items:center;justify-content:center}.aioseo-description.additional-keyphrases-description,.edit-post-sidebar .aioseo-app .aioseo-description.additional-keyphrases-description{margin:0 0 20px}.aioseo-post-general svg.aioseo-circle-question-mark{width:17px;height:17px;color:#8c8f99;transition:background-color .2s ease}.aioseo-post-general svg.aioseo-circle-question-mark:hover{color:#5a5c65}.aioseo-post-general .mobile-radio-buttons{margin:0!important;padding:0!important;border:0}.aioseo-post-general .mobile-radio-buttons>.aioseo-col{padding:0}.aioseo-post-general .mobile-radio-buttons .aioseo-radio-toggle{justify-content:flex-end}.aioseo-post-general .mobile-radio-buttons .aioseo-radio-toggle>div{margin-right:10px}.aioseo-post-general .ismobile{max-width:375px}.aioseo-post-general .add-keyphrase,.aioseo-post-general .edit-snippet{margin-top:12px;border:1px solid #dcdde1}.aioseo-post-general .add-keyphrase svg,.aioseo-post-general .edit-snippet svg{margin-left:5px}.aioseo-post-general .disabled-button{margin-top:12px;border:1px solid #dcdde1;color:#8c8f9a;background-color:#f3f4f5;cursor:default;height:30px;font-size:14px;padding:0 12px;flex-shrink:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;font-weight:600;border-radius:4px;-webkit-appearance:none;transition:background-color .2s ease;position:relative;overflow:hidden;text-decoration:none;white-space:nowrap}.aioseo-post-general .disabled-button svg{margin-left:5px}.aioseo-post-general .aioseo-toggle{display:block}.aioseo-post-general .aioseo-toggle .toggle-content input:checked+.toggle-switch{border:1px solid #00aa63;background-color:#00aa63}.aioseo-post-general .aioseo-keyphrase-tag{display:inline-block;margin-left:10px;margin-bottom:16px;border-radius:3px;font-size:14px;font-weight:700}.aioseo-post-general .aioseo-keyphrase-tag.selected{position:relative}.aioseo-post-general .aioseo-keyphrase-tag.selected:after,.aioseo-post-general .aioseo-keyphrase-tag.selected:before{content:"";position:absolute;display:block;z-index:10;bottom:-17px;border-style:solid}.aioseo-post-general .aioseo-keyphrase-tag.selected:before{right:calc(50% - 6px);border-width:0 10px 10px;border-color:transparent transparent #e8e8eb}.aioseo-post-general .aioseo-keyphrase-tag.selected:after{right:calc(50% - 4px);border-width:0 8px 8px;border-color:transparent transparent #fff}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag{display:block;padding:9px 10px;border:1px solid #f3f4f5;border-radius:3px;background:#f3f4f5;cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag.hidden{opacity:0;height:0;padding:0}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-name{cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-edit{opacity:0;margin:0 8px;cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score{cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score.score-green{color:#00aa63}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score.score-orange{color:#f18200}.aioseo-post-general .aioseo-keyphrase-tag .keyphrase-score.score-red{color:#df2a4a}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag{position:relative}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag>input{width:100%;padding:8px 10px;border:1px solid #e8e8eb;border-radius:3px}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag .keyphrase-delete{position:absolute;top:2px;left:10px;width:16px;height:16px;display:block;cursor:pointer}.aioseo-post-general .aioseo-keyphrase-tag .aioseo-edit-keyphrase-tag .keyphrase-delete:hover{color:#df2a4a}.aioseo-post-general .aioseo-keyphrase-tag:hover .keyphrase-edit{opacity:1}.aioseo-post-general .focus-keyphrase-panel .aioseo-analysis-detail{margin-bottom:0}.aioseo-post-general .analysis-wrapper{border-top:1px solid #e8e8eb}.aioseo-post-general .analysis-loading{position:relative;margin-top:16px}.edit-post-sidebar .aioseo-google-search-preview{padding:10px}.edit-post-sidebar .aioseo-button.edit-snippet{display:inline-flex}.edit-post-sidebar .snippet-focus-keyphrases-row{border-bottom:none;margin-bottom:0!important}.edit-post-sidebar .snippet-preview-row{padding-bottom:0!important;border-bottom:none}.edit-post-sidebar .card-additional-keyphrase,.edit-post-sidebar .card-basic-seo,.edit-post-sidebar .card-focus-keyphrase,.edit-post-sidebar .card-readability-seo,.edit-post-sidebar .card-title-seo{margin:0 -1rem;box-shadow:none;border:none;border-top:1px solid #e8e8eb}.edit-post-sidebar .card-additional-keyphrase .header,.edit-post-sidebar .card-basic-seo .header,.edit-post-sidebar .card-focus-keyphrase .header,.edit-post-sidebar .card-readability-seo .header,.edit-post-sidebar .card-title-seo .header{padding:1rem;border-bottom:none;font-size:14px;font-weight:700}.edit-post-sidebar .card-additional-keyphrase .content,.edit-post-sidebar .card-basic-seo .content,.edit-post-sidebar .card-focus-keyphrase .content,.edit-post-sidebar .card-readability-seo .content,.edit-post-sidebar .card-title-seo .content{padding:24px 16px;font-size:14px;border-top:1px solid #e8e8eb}.edit-post-sidebar .card-additional-keyphrase .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-additional-keyphrase .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-basic-seo .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-basic-seo .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-readability-seo .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-readability-seo .aioseo-analysis-detail:last-of-type .title,.edit-post-sidebar .card-title-seo .aioseo-analysis-detail:last-of-type,.edit-post-sidebar .card-title-seo .aioseo-analysis-detail:last-of-type .title{margin-bottom:0}.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail{margin:16px 0!important}.edit-post-sidebar .card-focus-keyphrase .aioseo-analysis-detail:empty{margin:16px}.edit-post-sidebar .card-focus-keyphrase .add-keyphrase{width:100%}.edit-post-sidebar .card-additional-keyphrase .aioseo-analysis-detail{margin:0 0 16px!important}.edit-post-sidebar .card-additional-keyphrase .add-keyphrase{width:100%;margin-bottom:16px}.edit-post-sidebar .card-readability-seo{border-bottom:1px solid #e8e8eb}.edit-post-sidebar .aioseo-keyphrase-tag{display:block;margin-left:0;margin-bottom:10px}.edit-post-sidebar .aioseo-keyphrase-tag:after{content:none!important}.edit-post-sidebar .aioseo-keyphrase-tag.selected{border:2px solid #e8e8eb}.edit-post-sidebar .aioseo-keyphrase-tag.selected:after,.edit-post-sidebar .aioseo-keyphrase-tag.selected:before{content:none}.edit-post-sidebar .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag{display:flex;width:100%}.edit-post-sidebar .aioseo-keyphrase-tag .aioseo-add-keyphrase-tag .keyphrase-score{flex:1;text-align:left}.edit-post-sidebar .card-basic-seo .aioseo-analysis-detail,.edit-post-sidebar .card-readability-seo .aioseo-analysis-detail,.edit-post-sidebar .card-title-seo .aioseo-analysis-detail{margin-top:0}.edit-post-sidebar .analysis-wrapper{border-top:none}.aioseo-modal-content>.aioseo-settings-row{border:none;margin-bottom:0!important}.aioseo-modal-content .aioseo-post-general>.mobile-radio-buttons{position:absolute;left:40px;top:18px;margin-bottom:0;padding-bottom:0}.aioseo-modal-content .settings-name .name{font-size:16px!important;margin-bottom:6px!important}.aioseo-modal-content .snippet-description-row,.aioseo-modal-content .snippet-title-row{position:relative;display:block;margin-top:32px}.aioseo-modal-content .snippet-description-row .settings-name,.aioseo-modal-content .snippet-title-row .settings-name{margin-bottom:8px}.aioseo-modal-content .snippet-description-row .aioseo-description,.aioseo-modal-content .snippet-title-row .aioseo-description{display:none}.aioseo-modal-content .snippet-description-row .add-tags,.aioseo-modal-content .snippet-title-row .add-tags{position:absolute;top:0;left:8px;margin:0}@media screen and (max-width:520px){.aioseo-modal-content .snippet-description-row .add-tags .aioseo-add-template-tag,.aioseo-modal-content .snippet-title-row .add-tags .aioseo-add-template-tag{display:none}}.aioseo-modal-content .snippet-title-row{margin-top:24px;padding-bottom:24px!important}.aioseo-modal-content .snippet-description-row,.aioseo-modal-content .snippet-preview-row{border:none;margin-bottom:0!important;padding-bottom:0!important}.aioseo-modal-content .snippet-pillar-row{display:none}.aioseo-modal-content .component-wrapper .aioseo-settings-row>.aioseo-col{padding-top:.5rem!important}.aioseo-modal-content .component-wrapper .aioseo-google-search-preview{padding:32px 28px!important}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button:not(.md-active){min-width:72px!important;margin:0!important}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button:hover{background-color:#e2e3e6}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button:before{border-radius:100%!important;display:none}.aioseo-modal-content .component-wrapper .aioseo-tabs .md-button .label{display:inline!important}.aioseo-modal-content .mobile-radio-buttons .aioseo-tabs .md-button:not(.md-active){margin:0!important}.aioseo-modal-content .mobile-radio-buttons .aioseo-tabs .md-button:not(.md-active):before{top:0!important}.aioseo-post-schema-lite{position:relative;min-height:450px}.aioseo-post-schema-lite .schema-type{max-width:350px}.aioseo-post-schema-lite .aioseo-description{font-size:14px;line-height:1.8;margin:8px 0 0;color:#141b38}.aioseo-post-schema-lite .field-description{font-size:14px}.aioseo-post-schema-lite .block{display:block}.aioseo-post-schema-lite .aioseo-settings-row:last-of-type{margin-bottom:30px!important;padding-bottom:30px!important}.aioseo-post-schema-lite .schema-book-rating-options{display:flex}.aioseo-post-schema-lite .schema-book-rating-options .rating,.aioseo-post-schema-lite .schema-book-rating-options .rating-min{margin-left:30px;flex:1}.aioseo-post-schema-lite .schema-book-rating-options .rating-max{flex:1}@media screen and (max-width:782px){.aioseo-post-schema-lite .schema-book-rating-options{display:block}.aioseo-post-schema-lite .schema-book-rating-options .rating,.aioseo-post-schema-lite .schema-book-rating-options .rating-min{margin-left:0;margin-bottom:30px}}.aioseo-post-schema-lite .schema-person-options{display:flex;flex:0 1 auto;flex-direction:row;flex-wrap:wrap}@media screen and (max-width:782px){.aioseo-post-schema-lite .schema-person-options{display:block}}.aioseo-post-schema-lite .aioseo-alert.schema-upsell{max-width:560px}.edit-post-sidebar .aioseo-post-schema .aioseo-settings-row.aioseo-row .col-md-9 .settings-content .aioseo-col{padding-right:0;padding-left:0}.edit-post-sidebar .schema-book-rating-options{display:block}.edit-post-sidebar .schema-book-rating-options .rating,.edit-post-sidebar .schema-book-rating-options .rating-min{margin:0 0 20px}.edit-post-sidebar .schema-upsell{margin-top:20px}.tab-facebook .facebook-image-upload{display:flex}.tab-facebook .facebook-image-upload .aioseo-input{max-width:445px;margin-left:10px}.tab-facebook .facebook-image-upload .insert-image{min-width:214px;margin-left:10px}.tab-facebook .facebook-image-upload .insert-image svg.aioseo-circle-plus{width:13px;height:13px;margin-left:10px}.tab-facebook .facebook-image img{margin-top:20px;width:auto;max-width:525px;max-height:525px;height:auto}.tab-facebook .facebook-image.vertical img{max-width:158px;max-height:158px}.tab-facebook .facebook-meta-input{margin-top:10px}.tab-twitter .twitter-image-upload{display:flex}.tab-twitter .twitter-image-upload .aioseo-input{max-width:445px;margin-left:10px}.tab-twitter .twitter-image-upload .insert-image{min-width:214px;margin-left:10px}.tab-twitter .twitter-image-upload .insert-image svg.aioseo-circle-plus{width:13px;height:13px;margin-left:10px}.tab-twitter .twitter-image img{margin-top:20px;width:auto;max-width:525px;max-height:525px;height:auto}.tab-twitter .twitter-image.vertical img{max-width:158px;max-height:158px}.tab-twitter .twitter-custom-field,.tab-twitter .twitter-image-source{padding-top:8px!important;padding-bottom:24px!important}.tab-twitter .twitter-card-type,.tab-twitter .twitter-image{padding-top:8px!important}.tab-twitter .aioseo-settings-row:last-of-type,.tab-twitter .use-facebook{margin-bottom:32px!important;padding-bottom:32px!important}.open-social-modal{margin-top:12px;border:1px solid #dcdde1}.open-social-modal svg{margin-left:5px}.open-social-copy>.col-md-3{display:none}.aioseo-post-social .aioseo-col.col-md-9{position:relative}.aioseo-post-social .mobile-radio-buttons{margin:0;padding:0;border:0}.aioseo-post-social .mobile-radio-buttons .aioseo-radio-toggle{justify-content:flex-end;position:absolute;left:20px;top:12px}.aioseo-post-social .mobile-radio-buttons .aioseo-radio-toggle>div{margin-right:10px}.aioseo-post-social .mobile-radio-buttons .col-md-9{padding-right:4px;padding-left:0}.aioseo-post-social .ismobile,.aioseo-post-social .ismobilecard .facebook-post,.aioseo-post-social .ismobilecard .twitter-post{max-width:375px}.aioseo-post-social .aioseo-tabs{background:#fff!important;border:none!important;border-bottom:2px solid #e8e8eb!important}.edit-post-sidebar .mobile-radio-buttons,.edit-post-sidebar .tab-facebook,.edit-post-sidebar .tab-twitter{display:none}.aioseo-modal-content .mobile-radio-buttons{padding-bottom:0!important}.aioseo-modal-content .mobile-radio-buttons .aioseo-radio-toggle{left:0!important;top:8px!important}@media screen and (max-width:520px){.aioseo-modal-content .mobile-radio-buttons .aioseo-radio-toggle{display:none}}.aioseo-modal-content .tab-facebook,.aioseo-modal-content .tab-twitter{display:block}.aioseo-modal-content .tab-facebook .aioseo-settings-row:first-of-type,.aioseo-modal-content .tab-twitter .aioseo-settings-row:first-of-type{border-bottom:0;padding-bottom:0}.aioseo-modal-content .tab-facebook .aioseo-settings-row:first-of-type .aioseo-col:first-of-type,.aioseo-modal-content .tab-twitter .aioseo-settings-row:first-of-type .aioseo-col:first-of-type{display:none}.aioseo-modal-content .tab-facebook .aioseo-html-tags-editor,.aioseo-modal-content .tab-twitter .aioseo-html-tags-editor{margin-top:0}.aioseo-modal-content .tab-facebook .aioseo-html-tags-editor .aioseo-description,.aioseo-modal-content .tab-twitter .aioseo-html-tags-editor .aioseo-description{display:none}.aioseo-modal-content .tab-facebook .aioseo-html-tags-editor .add-tags,.aioseo-modal-content .tab-twitter .aioseo-html-tags-editor .add-tags{position:absolute;top:-40px;left:8px;margin:0}.aioseo-modal-content .tab-facebook .facebook-description-settings,.aioseo-modal-content .tab-facebook .facebook-title-settings,.aioseo-modal-content .tab-facebook .twitter-description-settings,.aioseo-modal-content .tab-facebook .twitter-title-settings,.aioseo-modal-content .tab-twitter .facebook-description-settings,.aioseo-modal-content .tab-twitter .facebook-title-settings,.aioseo-modal-content .tab-twitter .twitter-description-settings,.aioseo-modal-content .tab-twitter .twitter-title-settings{padding-bottom:24px}.aioseo-modal-content .tab-facebook .facebook-description-settings .col-md-9,.aioseo-modal-content .tab-facebook .facebook-title-settings .col-md-9,.aioseo-modal-content .tab-facebook .twitter-description-settings .col-md-9,.aioseo-modal-content .tab-facebook .twitter-title-settings .col-md-9,.aioseo-modal-content .tab-twitter .facebook-description-settings .col-md-9,.aioseo-modal-content .tab-twitter .facebook-title-settings .col-md-9,.aioseo-modal-content .tab-twitter .twitter-description-settings .col-md-9,.aioseo-modal-content .tab-twitter .twitter-title-settings .col-md-9{padding-top:0!important;margin-top:0}.aioseo-modal-content .mobile-radio-buttons{display:block!important}.aioseo-modal-content .mobile-radio-buttons>.col-md-3{display:none}.aioseo-modal-content .mobile-radio-buttons>.col-md-9{padding:0;flex-basis:100%!important;max-width:100%!important}.aioseo-modal-content .aioseo-settings-row>.col-md-3{padding-bottom:0}.aioseo-modal-content .aioseo-settings-row>.col-md-3,.aioseo-modal-content .aioseo-settings-row>.col-md-9{flex-basis:100%;max-width:100%}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs.internal{padding-right:40px}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button-content{display:flex;align-items:center}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button-content svg{display:inline;width:16px;height:16px}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button:before{height:auto!important;border-radius:0!important}.aioseo-modal-content>.aioseo-settings-row .aioseo-tabs .md-button .label{display:inline!important;margin-right:10px}.aioseo-modal-content>.aioseo-settings-row.mobile-radio-buttons{position:sticky;top:60px;z-index:10;padding-bottom:0}.aioseo-modal-content>.aioseo-settings-row.mobile-radio-buttons .md-button{max-height:46px}.aioseo-modal-content .aioseo-tab-content{position:relative;padding:30px 40px!important}.aioseo-modal-content .aioseo-tab-content.aioseo-post-social{padding:22px 40px!important}.aioseo-app,.aioseo-metabox .aioseo-app{background:#fff}.aioseo-app .aioseo-tabs,.aioseo-metabox .aioseo-app .aioseo-tabs{border-bottom-width:2px;background:#f3f4f5}.aioseo-app .aioseo-tabs .md-tabs-navigation,.aioseo-metabox .aioseo-app .aioseo-tabs .md-tabs-navigation{margin-top:0!important}.aioseo-app .aioseo-tabs .md-button,.aioseo-metabox .aioseo-app .aioseo-tabs .md-button{height:50px!important;font-size:14px!important;color:#434960!important}.aioseo-app .aioseo-tabs .md-button.md-active,.aioseo-metabox .aioseo-app .aioseo-tabs .md-button.md-active{color:#141b38!important;font-weight:700!important}.aioseo-app .aioseo-tabs .md-button .icon,.aioseo-app .aioseo-tabs svg,.aioseo-metabox .aioseo-app .aioseo-tabs .md-button .icon,.aioseo-metabox .aioseo-app .aioseo-tabs svg{display:none}@media screen and (max-width:785px){.aioseo-app .aioseo-tabs svg.aioseo-caret,.aioseo-metabox .aioseo-app .aioseo-tabs svg.aioseo-caret{display:inline}}.aioseo-app .aioseo-tab-content,.aioseo-metabox .aioseo-app .aioseo-tab-content{background:#fff;border-top:0;padding:30px}.aioseo-app .aioseo-settings-row,.aioseo-metabox .aioseo-app .aioseo-settings-row{margin-bottom:16px;padding-bottom:16px}.edit-post-sidebar .col-md-3,.edit-post-sidebar .col-md-4,.edit-post-sidebar .col-sm-6,.edit-post-sidebar .col-xs-12{width:100%;flex-basis:100%!important;max-width:100%!important}.edit-post-sidebar .components-panel{border-bottom:none}.edit-post-sidebar .aioseo-mobile-tabs{display:none}.edit-post-sidebar .tabs-scroller{display:block!important}.edit-post-sidebar .aioseo-tabs{background:#fafafa}.edit-post-sidebar .aioseo-tabs .md-button{height:51px!important;color:#141b38!important}.edit-post-sidebar .aioseo-tabs .md-button .md-ripple{padding:0 10px!important}.edit-post-sidebar .aioseo-tabs .md-button .icon{display:inline;line-height:1.3rem}.edit-post-sidebar .aioseo-tabs .md-button .icon:before{line-height:inherit}.edit-post-sidebar .aioseo-tabs .md-button .label{display:none}.edit-post-sidebar .aioseo-tabs .md-button.md-active{color:#141b38!important}.edit-post-sidebar .aioseo-tabs .md-button.md-active .label{display:inline;margin-right:10px}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active){min-width:36px!important;margin:0 3px!important}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active):before{top:8px!important;border-radius:50%;height:36px;color:#141b38}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active) svg{display:inline;width:16px;height:16px;margin-top:4px;color:#8c8f9a}.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active):focus svg,.edit-post-sidebar .aioseo-tabs .md-button:not(.md-active):hover svg{color:#141b38}.edit-post-sidebar .aioseo-app input{border:1px solid #d0d1d7}.edit-post-sidebar .aioseo-app input:focus{border-color:#005ae0;box-shadow:0 0 0 1px #005ae0}.edit-post-sidebar .aioseo-app input::-moz-placeholder{color:#8c8f9a}.edit-post-sidebar .aioseo-app input:-ms-input-placeholder{color:#8c8f9a}.edit-post-sidebar .aioseo-app input::placeholder{color:#8c8f9a}.edit-post-sidebar .aioseo-app .aioseo-textarea-autosize{border:1px solid #d0d1d7}.edit-post-sidebar .aioseo-app .aioseo-tab-content{padding:20px 16px;border:none}.edit-post-sidebar .aioseo-app .aioseo-description{margin:0}.edit-post-sidebar .aioseo-settings-row{margin-bottom:16px;padding-bottom:16px}.edit-post-sidebar .aioseo-settings-row:last-of-type{border-bottom:0;margin-bottom:0!important;padding-bottom:0!important}.edit-post-sidebar .aioseo-settings-row>.aioseo-col{padding-top:0}.edit-post-sidebar .aioseo-settings-row .settings-name .name{font-size:14px;font-weight:700;margin-bottom:0}.aioseo-app.post-settings-modal .aioseo-modal-content .aioseo-tabs.internal{border-bottom-width:1px!important}@media screen and (max-width:520px){.aioseo-app.post-settings-modal .aioseo-modal-content .aioseo-tabs.internal{padding-right:20px!important}}.aioseo-app.post-settings-modal .aioseo-modal-content .md-tabs-navigation .md-tabs-indicator{bottom:-1px!important}@media only screen and (min-width:782px){.aioseo-app.post-settings-modal .aioseo-modal-content .col-md-4{flex-basis:33.33333333%!important;max-width:33.33333333%!important}.aioseo-app.post-settings-modal .aioseo-modal-content .col-md-5{flex-basis:41.66666667%!important;max-width:41.66666667%!important}.aioseo-app.post-settings-modal .aioseo-modal-content .col-md-7{flex-basis:58.33333333%!important;max-width:58.33333333%!important}.aioseo-app.post-settings-modal .aioseo-modal-content .col-md-8{flex-basis:66.66666667%!important;max-width:66.66666667%!important}}.aioseo-post-settings-sidebar-vue{display:flex;justify-content:center}.aioseo-post-settings-sidebar-vue .aioseo-loading-spinner{margin-top:30px}.aioseo-localseo-info .aioseo-input,.aioseo-localseo-info .aioseo-multiselect,.aioseo-localseo-info .aioseo-select{max-width:480px}.aioseo-localseo-info .field-description{font-size:14px}.aioseo-localseo-info .info-businessaddress-row .columns{display:flex;flex:0 1 auto;flex-direction:row;flex-wrap:wrap}.aioseo-localseo-opening .field-description{display:inline-block;margin:10px 0;font-size:14px}.aioseo-localseo-opening .field-description.mt-8{margin-top:8px}.aioseo-localseo-opening .aioseo-input,.aioseo-localseo-opening .aioseo-multiselect,.aioseo-localseo-opening .aioseo-select{max-width:480px}.aioseo-localseo-opening .aioseo-col-flex{display:flex;align-items:center;padding:12px 0;border-bottom:1px solid #e8e8eb}.aioseo-localseo-opening .aioseo-col-flex:first-of-type{padding-top:0}.aioseo-localseo-opening .aioseo-col-flex:last-of-type{padding-bottom:0;border:none}.aioseo-localseo-opening .aioseo-col-flex .aioseo-col-day{flex:1}.aioseo-localseo-opening .aioseo-col-flex .aioseo-col-alwaysopen,.aioseo-localseo-opening .aioseo-col-flex .aioseo-col-hours{flex:2}.aioseo-localseo-opening .aioseo-col-flex span.separator{margin:0 5px}.aioseo-localseo-opening .aioseo-col-flex .aioseo-select{display:inline-block;max-width:120px;margin-bottom:5px}.aioseo-localseo-opening .aioseo-col-flex .multiselect--disabled .multiselect__single,.aioseo-localseo-opening .aioseo-col-flex .multiselect--disabled .multiselect__tags{background:#f3f4f5}.aioseo-localseo-opening .aioseo-col-alwaysopen .aioseo-che