SmartCrawl SEO - Version 2.2.4

Version Description

  • New: URL redirection to external domains

  • Fix: SEO and readability analysis of password-protected posts

  • Fix: sitemap throws error if there's an image with ampersand sign

  • Fix: metabox showing details from other posts when globals modified

  • Fix: better autolinks compatibility with unicode languages

  • Fix: code improvements for sitemap dashboard

  • Fix: twitter and OG issues on static posts page

  • Fix: third-party import notice appears for very old data

  • Fix: conflicts on woocommerce shop page

Download this release

Release Info

Developer khaxan
Plugin Icon 128x128 SmartCrawl SEO
Version 2.2.4
Comparing to
See all releases

Code changes from version 2.2.2.5 to 2.2.4

Files changed (80) hide show
  1. autoloader.php +15 -3
  2. changelog.txt +73 -1
  3. class-mappings.php +6 -0
  4. config.php +1 -1
  5. includes/admin/admin.php +3 -0
  6. includes/admin/metabox.php +38 -17
  7. includes/admin/settings.php +21 -26
  8. includes/admin/settings/onpage.php +13 -35
  9. includes/admin/settings/settings.php +5 -7
  10. includes/admin/templates/advanced-tools/advanced-tools-settings.php +3 -3
  11. includes/admin/templates/checkup/checkup-checkup-results.php +1 -1
  12. includes/admin/templates/dashboard/onboarding.php +1 -1
  13. includes/admin/templates/metabox/analysis-readability.php +58 -50
  14. includes/admin/templates/metabox/analysis-seo-analysis.php +71 -63
  15. includes/admin/templates/metabox/metabox-dummy-preview.php +9 -0
  16. includes/admin/templates/metabox/metabox-main.php +2 -1
  17. includes/admin/templates/metabox/metabox-meta-edit-form.php +13 -18
  18. includes/admin/templates/metabox/metabox-preview.php +9 -39
  19. includes/admin/templates/metabox/metabox-seo-analysis-container.php +8 -3
  20. includes/admin/templates/metabox/metabox-tab-advanced.php +13 -6
  21. includes/admin/templates/metabox/metabox-tab-seo.php +4 -4
  22. includes/admin/templates/metabox/metabox-tab-social.php +12 -8
  23. includes/admin/templates/onpage/onpage-preview.php +4 -4
  24. includes/admin/templates/onpage/onpage-section-homepage.php +1 -10
  25. includes/admin/templates/onpage/onpage-settings.php +1 -3
  26. includes/admin/templates/progress-bar.php +1 -1
  27. includes/admin/templates/settings/import-status-modal.php +8 -0
  28. includes/admin/templates/settings/settings-section-import-export.php +1 -0
  29. includes/admin/templates/settings/underscore-import-error.php +16 -0
  30. includes/admin/templates/settings/underscore-import-options.php +61 -0
  31. includes/admin/templates/settings/underscore-import-progress.php +17 -0
  32. includes/admin/templates/settings/underscore-import-success.php +21 -0
  33. includes/admin/templates/settings/underscore-progress-reset.php +3 -0
  34. includes/admin/templates/sitemap/sitemap-section-settings.php +2 -2
  35. includes/admin/templates/sitemaps-dashboard-widget.php +0 -71
  36. includes/admin/templates/social/social-section-twitter-cards.php +1 -1
  37. includes/admin/templates/social/social-twitter-embed.php +1 -1
  38. includes/admin/templates/term-additions-form.php +24 -19
  39. includes/admin/templates/upsell-modal.php +1 -1
  40. includes/admin/templates/wp-dashboard/sitemaps-widget-js.php +35 -0
  41. includes/admin/templates/wp-dashboard/sitemaps-widget.php +64 -0
  42. includes/core/checks/class-wds-check-keywords-used.php +1 -1
  43. includes/core/checks/class-wds-check-metadesc-length.php +1 -1
  44. includes/core/checks/class-wds-check-subheadings-keywords.php +2 -2
  45. includes/core/checks/class-wds-check-title-length.php +1 -1
  46. includes/core/class-wds-aioseop-importer.php +16 -1
  47. includes/core/class-wds-canonical-value-helper.php +133 -0
  48. includes/core/class-wds-compatibility.php +152 -0
  49. includes/core/class-wds-controller-analysis.php +11 -5
  50. includes/core/class-wds-controller-io.php +18 -13
  51. includes/core/class-wds-controller-pointers.php +150 -0
  52. includes/core/class-wds-controller-sitemap.php +31 -4
  53. includes/core/class-wds-core-request.php +16 -0
  54. includes/core/class-wds-endpoint-resolver.php +35 -6
  55. includes/core/class-wds-importer.php +78 -10
  56. includes/core/class-wds-opengraph-value-helper.php +169 -0
  57. includes/core/class-wds-replacement-helper.php +425 -0
  58. includes/core/class-wds-robots-value-helper.php +2 -2
  59. includes/core/class-wds-simple-renderer.php +31 -0
  60. includes/core/class-wds-type-traverser.php +16 -1
  61. includes/core/class-wds-yoast-importer.php +13 -1
  62. includes/core/core.php +145 -28
  63. includes/css/app.css +1 -1
  64. includes/css/wp-dashboard.css +1 -1
  65. includes/front.php +2 -0
  66. includes/js/wds-admin-onpage.js +25 -1
  67. includes/js/wds-admin-pointers.js +43 -0
  68. includes/js/wds-admin-settings.js +0 -71
  69. includes/js/wds-admin.js +1 -0
  70. includes/js/wds-metabox.js +61 -41
  71. includes/js/wds-third-party-import.js +213 -0
  72. includes/tools/class-wds-opengraph-printer.php +21 -227
  73. includes/tools/class-wds-twitter-printer.php +13 -6
  74. includes/tools/onpage.php +53 -88
  75. includes/tools/redirect.php +28 -3
  76. includes/tools/sitemaps-dashboard-widget.php +24 -17
  77. includes/tools/sitemaps.php +6 -4
  78. languages/{wpmu-dev-seo.pot → wds.pot} +390 -280
  79. readme.txt +73 -1
  80. wpmu-dev-seo.php +2 -3
autoloader.php CHANGED
@@ -1,10 +1,22 @@
1
  <?php
2
 
3
  function smartcrawl_autoload( $class ) {
4
- $class_mappings = include 'class-mappings.php';
5
- if ( isset( $class_mappings[ $class ] ) && file_exists( SMARTCRAWL_PLUGIN_DIR . $class_mappings[ $class ] ) ) {
6
- include SMARTCRAWL_PLUGIN_DIR . $class_mappings[ $class ];
7
  }
 
 
 
 
 
 
 
 
 
 
 
 
8
  }
9
 
10
  spl_autoload_register( 'smartcrawl_autoload' );
1
  <?php
2
 
3
  function smartcrawl_autoload( $class ) {
4
+ $mappings_file = dirname( __FILE__ ) . '/class-mappings.php';
5
+ if ( ! file_exists( $mappings_file ) ) {
6
+ return;
7
  }
8
+
9
+ $class_mappings = include $mappings_file;
10
+ if ( ! isset( $class_mappings[ $class ] ) ) {
11
+ return;
12
+ }
13
+
14
+ $class_path = untrailingslashit( SMARTCRAWL_PLUGIN_DIR ) . $class_mappings[ $class ];
15
+ if ( ! file_exists( $class_path ) ) {
16
+ return;
17
+ }
18
+
19
+ include $class_path;
20
  }
21
 
22
  spl_autoload_register( 'smartcrawl_autoload' );
changelog.txt CHANGED
@@ -1,7 +1,79 @@
1
  Plugin Name: SmartCrawl SEO
2
 
3
  Change Log:
4
- ----------------------------------------------------------------------
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  2.2.2.5 - 2018-09-27
6
  ----------------------------------------------------------------------
7
  - Fix: revert 2.2.2.4 changes causing WSOD on some sites
1
  Plugin Name: SmartCrawl SEO
2
 
3
  Change Log:
4
+ -----------------------------------------------------------------------
5
+ 2.2.4 - 2018-11-28
6
+ ----------------------------------------------------------------------
7
+ - Add: URL redirection to external domains
8
+
9
+ - Fix: SEO and readability analysis of password-protected posts
10
+ - Fix: sitemap throws error if there's an image with ampersand sign
11
+ - Fix: metabox showing details from other posts when globals modified
12
+ - Fix: better autolinks compatibility with unicode languages
13
+ - Fix: code improvements for sitemap dashboard
14
+ - Fix: twitter and OG issues on static posts page
15
+ - Fix: third-party import notice appears for very old data
16
+ - Fix: conflicts on woocommerce shop page
17
+
18
+ 2.2.3 - 2018-11-12
19
+ ----------------------------------------------------------------------
20
+ - Add: created new UI for Yoast and All In One SEO importers
21
+ - Add: new option to keep existing post meta intact during import
22
+ - Add: opengraph code optimizations and improvements
23
+ - Add: made automatic sitemap updates less resource intensive
24
+ - Add: made macros more extensible through new filters and actions
25
+ - Add: support for dynamic placeholders prefixed with 'ct_' 'ct_desc_' and 'cf_'
26
+
27
+ - Fix: issues caused by shortcode execution (integration with Divi, Avada, WPBakery and Swift page builders)
28
+ - Fix: performance issues due to frequent analysis reruns
29
+ - Fix: minor conflict with Gutenberg
30
+ - Fix: autolinking module modifying inline scripts
31
+ - Fix: outdated meta title and meta description limits
32
+ - Fix: metabox conflict on media edit page
33
+ - Fix: saving menus taking too much time when analysis active
34
+ - Fix: post featured image printed as og:image before more specific images
35
+ - Fix: issues in Avada page builder integration
36
+ - Fix: log file not being written correctly
37
+ - Fix: issues caused by faulty packaging
38
+ - Fix: metabox preview showing raw HTML tags
39
+ - Fix: search engine update link unnecessarily shown on WP dashboard
40
+ - Fix: misnamed translation file
41
+ - Fix: missing trailing slash in sitemap home URL
42
+ - Fix: dates shown in sitemap dashboard widget not translatable
43
+ - Fix: sitemap creation error shows html tags
44
+ - Fix: format of date printed through %%currentdate%% placeholder not changeable
45
+ - Fix: miscellaneous typos and copy changes
46
+ - Fix: twitter placeholders on category edit page not accurate
47
+ - Fix: sitemap XSL stylesheet URL/path resolution issue
48
+ - Fix: twitter fields displayed unnecessarily on term edit page
49
+ - Fix: update plugin version constant to ensure cache busting
50
+ - Fix: untruncated title and description shown in Google previews
51
+ - Fix: typo in upsell modal
52
+ - Fix: metabox preview showing divi shortcodes
53
+ - Fix: issues caused by shortcode execution
54
+ - Fix: sub-headings check should pass if even one of the sub-headings contains our focus keywords
55
+ - Fix: twitter card preview not loading
56
+ - Fix: static front page handled as single post page
57
+ - Fix: static homepage does not show correct meta values in all scenarios
58
+ - Fix: static homepage built with builders shows shortcodes in 'Title & Meta' settings
59
+ - Fix: metabox preview showing WPBakery shortcodes
60
+ - Fix: warnings in autoloader
61
+ - Fix: importer support for yoast version 9
62
+ - Fix: metabox preview showing raw placeholders
63
+
64
+ 2.2.2.7 - 2018-10-09
65
+ -----------------------------------------------------------------------
66
+ - Fix: resolved conflict with swift framework mini product widget
67
+ - Fix: resolved styling conflicts with WPBakery and a few other plugins
68
+ - Fix: performance improvement for title and meta rewriting
69
+
70
+ 2.2.2.6 - 2018-10-02
71
+ ----------------------------------------------------------------------
72
+ - Fix: fixed issue causing WSOD on some sites
73
+ - Fix: don't show raw shortcodes in auto-generated meta description
74
+ - Fix: better compatibility of readability and SEO analysis with page builders
75
+ - Fix: made Google preview in the SC metabox more accurate
76
+
77
  2.2.2.5 - 2018-09-27
78
  ----------------------------------------------------------------------
79
  - Fix: revert 2.2.2.4 changes causing WSOD on some sites
class-mappings.php CHANGED
@@ -3,12 +3,15 @@
3
  return array(
4
  // Classes in includes/core/
5
  'Smartcrawl_AIOSEOP_Importer' => '/core/class-wds-aioseop-importer.php',
 
6
  'Smartcrawl_Checks' => '/core/class-wds-checks.php',
 
7
  'Smartcrawl_Controller_Analysis' => '/core/class-wds-controller-analysis.php',
8
  'Smartcrawl_Controller_Cron' => '/core/class-wds-controller-cron.php',
9
  'Smartcrawl_Controller_Hub' => '/core/class-wds-controller-hub.php',
10
  'Smartcrawl_Controller_IO' => '/core/class-wds-controller-io.php',
11
  'Smartcrawl_Controller_Onboard' => '/core/class-wds-controller-onboard.php',
 
12
  'Smartcrawl_Controller_Sitemap' => '/core/class-wds-controller-sitemap.php',
13
  'Smartcrawl_Core_Request' => '/core/class-wds-core-request.php',
14
  'Smartcrawl_Endpoint_Resolver' => '/core/class-wds-endpoint-resolver.php',
@@ -25,7 +28,10 @@ return array(
25
  'Smartcrawl_Model_Redirection' => '/core/class-wds-model-redirection.php',
26
  'Smartcrawl_Model_User' => '/core/class-wds-model-user.php',
27
  'Smartcrawl_Renderable' => '/core/class-wds-renderable.php',
 
 
28
  'Smartcrawl_Reset' => '/core/class-wds-reset.php',
 
29
  'Smartcrawl_Robots_Value_Helper' => '/core/class-wds-robots-value-helper.php',
30
  'Smartcrawl_SeoReport' => '/core/class-wds-seo-report.php',
31
  'Smartcrawl_Service' => '/core/class-wds-service.php',
3
  return array(
4
  // Classes in includes/core/
5
  'Smartcrawl_AIOSEOP_Importer' => '/core/class-wds-aioseop-importer.php',
6
+ 'Smartcrawl_Canonical_Value_Helper' => '/core/class-wds-canonical-value-helper.php',
7
  'Smartcrawl_Checks' => '/core/class-wds-checks.php',
8
+ 'Smartcrawl_Compatibility' => '/core/class-wds-compatibility.php',
9
  'Smartcrawl_Controller_Analysis' => '/core/class-wds-controller-analysis.php',
10
  'Smartcrawl_Controller_Cron' => '/core/class-wds-controller-cron.php',
11
  'Smartcrawl_Controller_Hub' => '/core/class-wds-controller-hub.php',
12
  'Smartcrawl_Controller_IO' => '/core/class-wds-controller-io.php',
13
  'Smartcrawl_Controller_Onboard' => '/core/class-wds-controller-onboard.php',
14
+ 'Smartcrawl_Controller_Pointers' => '/core/class-wds-controller-pointers.php',
15
  'Smartcrawl_Controller_Sitemap' => '/core/class-wds-controller-sitemap.php',
16
  'Smartcrawl_Core_Request' => '/core/class-wds-core-request.php',
17
  'Smartcrawl_Endpoint_Resolver' => '/core/class-wds-endpoint-resolver.php',
28
  'Smartcrawl_Model_Redirection' => '/core/class-wds-model-redirection.php',
29
  'Smartcrawl_Model_User' => '/core/class-wds-model-user.php',
30
  'Smartcrawl_Renderable' => '/core/class-wds-renderable.php',
31
+ 'Smartcrawl_Replacement_Helper' => '/core/class-wds-replacement-helper.php',
32
+ 'Smartcrawl_Simple_Renderer' => '/core/class-wds-simple-renderer.php',
33
  'Smartcrawl_Reset' => '/core/class-wds-reset.php',
34
+ 'Smartcrawl_OpenGraph_Value_Helper' => '/core/class-wds-opengraph-value-helper.php',
35
  'Smartcrawl_Robots_Value_Helper' => '/core/class-wds-robots-value-helper.php',
36
  'Smartcrawl_SeoReport' => '/core/class-wds-seo-report.php',
37
  'Smartcrawl_Service' => '/core/class-wds-service.php',
config.php CHANGED
@@ -52,7 +52,7 @@ if ( ! defined( 'SMARTCRAWL_TITLE_LENGTH_CHAR_COUNT_LIMIT' ) ) {
52
  define( 'SMARTCRAWL_TITLE_LENGTH_CHAR_COUNT_LIMIT', 70 );
53
  }
54
  if ( ! defined( 'SMARTCRAWL_METADESC_LENGTH_CHAR_COUNT_LIMIT' ) ) {
55
- define( 'SMARTCRAWL_METADESC_LENGTH_CHAR_COUNT_LIMIT', 230 );
56
  }
57
 
58
  // Debugging defines.
52
  define( 'SMARTCRAWL_TITLE_LENGTH_CHAR_COUNT_LIMIT', 70 );
53
  }
54
  if ( ! defined( 'SMARTCRAWL_METADESC_LENGTH_CHAR_COUNT_LIMIT' ) ) {
55
+ define( 'SMARTCRAWL_METADESC_LENGTH_CHAR_COUNT_LIMIT', 300 );
56
  }
57
 
58
  // Debugging defines.
includes/admin/admin.php CHANGED
@@ -106,11 +106,14 @@ class Smartcrawl_Admin extends Smartcrawl_Renderable {
106
 
107
  Smartcrawl_Controller_Onboard::serve();
108
  Smartcrawl_Controller_Analysis::serve();
 
109
 
110
  if ( Smartcrawl_Settings::get_setting( 'onpage' ) ) {
111
  Smartcrawl_Metabox::run();
112
  Smartcrawl_Taxonomy::run();
113
  }
 
 
114
  }
115
 
116
  /**
106
 
107
  Smartcrawl_Controller_Onboard::serve();
108
  Smartcrawl_Controller_Analysis::serve();
109
+ Smartcrawl_Controller_Pointers::run();
110
 
111
  if ( Smartcrawl_Settings::get_setting( 'onpage' ) ) {
112
  Smartcrawl_Metabox::run();
113
  Smartcrawl_Taxonomy::run();
114
  }
115
+
116
+ Smartcrawl_Compatibility::run();
117
  }
118
 
119
  /**
includes/admin/metabox.php CHANGED
@@ -65,6 +65,10 @@ class Smartcrawl_Metabox extends Smartcrawl_Renderable {
65
  add_action( 'admin_print_scripts-post.php', array( $this, 'js_load_scripts' ) );
66
  add_action( 'admin_print_scripts-post-new.php', array( $this, 'js_load_scripts' ) );
67
  add_action( 'wp_ajax_wds-metabox-preview', array( $this, 'json_create_preview' ) );
 
 
 
 
68
 
69
  $this->_is_running = true;
70
  }
@@ -85,12 +89,10 @@ class Smartcrawl_Metabox extends Smartcrawl_Renderable {
85
  */
86
  public function json_create_preview() {
87
  $data = $this->get_request_data();
88
- $title = sanitize_text_field( smartcrawl_get_array_value( $data, 'title' ) );
89
- $description = sanitize_text_field( smartcrawl_get_array_value( $data, 'description' ) );
90
  $post_id = (int) smartcrawl_get_array_value( $data, 'post_id' );
91
  $result = array( 'success' => false );
92
 
93
- if ( is_null( $title ) || is_null( $description ) || empty( $post_id ) ) {
94
  wp_send_json( $result );
95
 
96
  return;
@@ -99,9 +101,7 @@ class Smartcrawl_Metabox extends Smartcrawl_Renderable {
99
  $latest_post_version = smartcrawl_get_latest_post_version( $post_id );
100
  $result['success'] = true;
101
  $result['markup'] = $this->_load( 'metabox/metabox-preview', array(
102
- 'post' => $latest_post_version,
103
- 'title' => $title,
104
- 'description' => $description,
105
  ) );
106
 
107
  wp_send_json( $result );
@@ -126,7 +126,10 @@ class Smartcrawl_Metabox extends Smartcrawl_Renderable {
126
  'lax_enforcement' => ( isset( $options['metabox-lax_enforcement'] ) ? ! ! $options['metabox-lax_enforcement'] : false ),
127
  ) );
128
  Smartcrawl_Settings_Admin::register_global_admin_scripts();
129
- wp_enqueue_script( 'wds_metabox_onpage', SMARTCRAWL_PLUGIN_URL . '/js/wds-metabox.js', array( 'wds-select2' ), $version );
 
 
 
130
  wp_localize_script( 'wds_metabox_onpage', '_wds_metabox', array(
131
  'nonce' => wp_create_nonce( 'wds-metabox-nonce' ),
132
  ) );
@@ -136,6 +139,7 @@ class Smartcrawl_Metabox extends Smartcrawl_Renderable {
136
 
137
  Smartcrawl_Settings_Admin::enqueue_shared_ui( false );
138
 
 
139
  wp_enqueue_script( 'wds-admin-opengraph' );
140
  wp_enqueue_style( 'wds-admin-opengraph' );
141
  wp_enqueue_style( 'wds-select2' );
@@ -156,9 +160,7 @@ class Smartcrawl_Metabox extends Smartcrawl_Renderable {
156
  /**
157
  * Handles actual metabox rendering
158
  */
159
- public function smartcrawl_meta_boxes() {
160
- global $post;
161
-
162
  $robots_noindex_value = (int) smartcrawl_get_value( 'meta-robots-noindex' );
163
  $robots_nofollow_value = (int) smartcrawl_get_value( 'meta-robots-nofollow' );
164
  $robots_index_value = (int) smartcrawl_get_value( 'meta-robots-index' );
@@ -202,8 +204,13 @@ class Smartcrawl_Metabox extends Smartcrawl_Renderable {
202
  public function smartcrawl_create_meta_box() {
203
  $show = user_can_see_seo_metabox();
204
  if ( function_exists( 'add_meta_box' ) ) {
205
- $metabox_title = is_multisite() ? __( 'SmartCrawl', 'wds' ) : 'SmartCrawl'; // Show branding for singular installs.
206
- foreach ( get_post_types() as $posttype ) {
 
 
 
 
 
207
  if ( $show ) {
208
  add_meta_box( 'wds-wds-meta-box', $metabox_title, array(
209
  &$this,
@@ -279,7 +286,10 @@ class Smartcrawl_Metabox extends Smartcrawl_Renderable {
279
  $input = stripslashes_deep( $request_data['wds-opengraph'] );
280
  $result = array();
281
 
282
- $result['disabled'] = ! empty( $input['disabled'] );
 
 
 
283
  if ( ! empty( $input['title'] ) ) {
284
  $result['title'] = sanitize_text_field( $input['title'] );
285
  }
@@ -294,7 +304,9 @@ class Smartcrawl_Metabox extends Smartcrawl_Renderable {
294
  }
295
  }
296
 
297
- if ( ! empty( $result ) ) {
 
 
298
  update_post_meta( $post_id, '_wds_opengraph', $result );
299
  }
300
  }
@@ -303,7 +315,10 @@ class Smartcrawl_Metabox extends Smartcrawl_Renderable {
303
  $input = stripslashes_deep( $request_data['wds-twitter'] );
304
  $twitter = array();
305
 
306
- $twitter['disabled'] = ! empty( $input['disabled'] );
 
 
 
307
  if ( ! empty( $input['title'] ) ) {
308
  $twitter['title'] = sanitize_text_field( $input['title'] );
309
  }
@@ -318,14 +333,20 @@ class Smartcrawl_Metabox extends Smartcrawl_Renderable {
318
  }
319
  }
320
 
321
- if ( ! empty( $twitter ) ) {
 
 
322
  update_post_meta( $post_id, '_wds_twitter', $twitter );
323
  }
324
  }
325
 
326
  if ( isset( $request_data['wds_focus'] ) ) {
327
  $focus = stripslashes_deep( $request_data['wds_focus'] );
328
- update_post_meta( $post_id, '_wds_focus-keywords', sanitize_text_field( $focus ) );
 
 
 
 
329
  }
330
 
331
  foreach ( $request_data as $key => $value ) {
65
  add_action( 'admin_print_scripts-post.php', array( $this, 'js_load_scripts' ) );
66
  add_action( 'admin_print_scripts-post-new.php', array( $this, 'js_load_scripts' ) );
67
  add_action( 'wp_ajax_wds-metabox-preview', array( $this, 'json_create_preview' ) );
68
+ /**
69
+ * TODO perhaps we can combine wds-analysis-get-editor-analysis wds-metabox-preview and wds_metabox_update
70
+ * since they are used together so frequently
71
+ */
72
 
73
  $this->_is_running = true;
74
  }
89
  */
90
  public function json_create_preview() {
91
  $data = $this->get_request_data();
 
 
92
  $post_id = (int) smartcrawl_get_array_value( $data, 'post_id' );
93
  $result = array( 'success' => false );
94
 
95
+ if ( empty( $post_id ) ) {
96
  wp_send_json( $result );
97
 
98
  return;
101
  $latest_post_version = smartcrawl_get_latest_post_version( $post_id );
102
  $result['success'] = true;
103
  $result['markup'] = $this->_load( 'metabox/metabox-preview', array(
104
+ 'post' => $latest_post_version,
 
 
105
  ) );
106
 
107
  wp_send_json( $result );
126
  'lax_enforcement' => ( isset( $options['metabox-lax_enforcement'] ) ? ! ! $options['metabox-lax_enforcement'] : false ),
127
  ) );
128
  Smartcrawl_Settings_Admin::register_global_admin_scripts();
129
+ wp_enqueue_script( 'wds_metabox_onpage', SMARTCRAWL_PLUGIN_URL . '/js/wds-metabox.js', array(
130
+ 'wds-select2',
131
+ 'autosave',
132
+ ), $version );
133
  wp_localize_script( 'wds_metabox_onpage', '_wds_metabox', array(
134
  'nonce' => wp_create_nonce( 'wds-metabox-nonce' ),
135
  ) );
139
 
140
  Smartcrawl_Settings_Admin::enqueue_shared_ui( false );
141
 
142
+ wp_enqueue_media();
143
  wp_enqueue_script( 'wds-admin-opengraph' );
144
  wp_enqueue_style( 'wds-admin-opengraph' );
145
  wp_enqueue_style( 'wds-select2' );
160
  /**
161
  * Handles actual metabox rendering
162
  */
163
+ public function smartcrawl_meta_boxes($post) {
 
 
164
  $robots_noindex_value = (int) smartcrawl_get_value( 'meta-robots-noindex' );
165
  $robots_nofollow_value = (int) smartcrawl_get_value( 'meta-robots-nofollow' );
166
  $robots_index_value = (int) smartcrawl_get_value( 'meta-robots-index' );
204
  public function smartcrawl_create_meta_box() {
205
  $show = user_can_see_seo_metabox();
206
  if ( function_exists( 'add_meta_box' ) ) {
207
+ // Show branding for singular installs.
208
+ $metabox_title = is_multisite() ? __( 'SmartCrawl', 'wds' ) : 'SmartCrawl';
209
+ $post_types = get_post_types(array(
210
+ 'show_ui' => true, // Only if it actually supports WP UI.
211
+ ));
212
+ foreach ( $post_types as $posttype ) {
213
+ if ( 'attachment' === $posttype ) { continue; }
214
  if ( $show ) {
215
  add_meta_box( 'wds-wds-meta-box', $metabox_title, array(
216
  &$this,
286
  $input = stripslashes_deep( $request_data['wds-opengraph'] );
287
  $result = array();
288
 
289
+ $og_disabled = ! empty( $input['disabled'] );
290
+ if ( $og_disabled ) {
291
+ $result['disabled'] = true;
292
+ }
293
  if ( ! empty( $input['title'] ) ) {
294
  $result['title'] = sanitize_text_field( $input['title'] );
295
  }
304
  }
305
  }
306
 
307
+ if ( empty( $result ) ) {
308
+ delete_post_meta( $post_id, '_wds_opengraph' );
309
+ } else {
310
  update_post_meta( $post_id, '_wds_opengraph', $result );
311
  }
312
  }
315
  $input = stripslashes_deep( $request_data['wds-twitter'] );
316
  $twitter = array();
317
 
318
+ $twitter_disabled = ! empty( $input['disabled'] );
319
+ if ( $twitter_disabled ) {
320
+ $twitter['disabled'] = true;
321
+ }
322
  if ( ! empty( $input['title'] ) ) {
323
  $twitter['title'] = sanitize_text_field( $input['title'] );
324
  }
333
  }
334
  }
335
 
336
+ if ( empty( $twitter ) ) {
337
+ delete_post_meta( $post_id, '_wds_twitter' );
338
+ } else {
339
  update_post_meta( $post_id, '_wds_twitter', $twitter );
340
  }
341
  }
342
 
343
  if ( isset( $request_data['wds_focus'] ) ) {
344
  $focus = stripslashes_deep( $request_data['wds_focus'] );
345
+ if ( trim( $focus ) === '' ) {
346
+ delete_post_meta( $post_id, '_wds_focus-keywords' );
347
+ } else {
348
+ update_post_meta( $post_id, '_wds_focus-keywords', sanitize_text_field( $focus ) );
349
+ }
350
  }
351
 
352
  foreach ( $request_data as $key => $value ) {
includes/admin/settings.php CHANGED
@@ -421,18 +421,33 @@ abstract class Smartcrawl_Settings_Admin extends Smartcrawl_Settings {
421
  };
422
 
423
  if ( class_exists( 'Smartcrawl_Settings_Settings' ) && ! wp_script_is( 'wds-admin-settings', 'registered' ) ) {
424
- wp_register_script( 'wds-admin-settings', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-settings.js', array(
425
  'wds-admin',
426
- 'wds-qtip2-script',
427
  'jquery',
428
  ), $version );
429
 
430
- wp_localize_script( 'wds-admin-settings', '_wds_setting', array(
431
- 'strings' => array(
432
- 'importing' => esc_html__( 'Importing', 'wds' ),
433
- 'import' => esc_html__( 'Import', 'wds' ),
 
 
 
434
  ),
 
 
 
 
 
435
  ) );
 
 
 
 
 
 
 
436
  };
437
  }
438
 
@@ -580,26 +595,6 @@ abstract class Smartcrawl_Settings_Admin extends Smartcrawl_Settings {
580
  }
581
  }
582
 
583
- if ( ! empty( $_GET['imported'] ) ) {
584
- $plugin = smartcrawl_get_array_value( $_GET, 'plugin' );
585
- $plugin_label = 'yoast' === $plugin ? __( 'Yoast SEO', 'wds' ) : __( 'All In One SEO', 'wds' );
586
-
587
- $plugins_link = sprintf(
588
- '<a href="%s">%s</a>',
589
- admin_url( 'plugins.php' ),
590
- sprintf(
591
- __( 'deactivate %s', 'wds' ),
592
- $plugin_label
593
- )
594
- );
595
-
596
- $this->msg = sprintf(
597
- __( 'Your %1$s configuration has been successfully imported! We recommend you %2$s to avoid any potential conflicts.', 'wds' ),
598
- $plugin_label,
599
- $plugins_link
600
- );
601
- }
602
-
603
  $errors = get_settings_errors( $this->option_name );
604
  if ( $errors ) {
605
  set_transient( 'wds-settings-save-errors', $errors, 3 );
421
  };
422
 
423
  if ( class_exists( 'Smartcrawl_Settings_Settings' ) && ! wp_script_is( 'wds-admin-settings', 'registered' ) ) {
424
+ wp_register_script( 'wds-third-party-import', SMARTCRAWL_PLUGIN_URL . 'js/wds-third-party-import.js', array(
425
  'wds-admin',
426
+ 'underscore',
427
  'jquery',
428
  ), $version );
429
 
430
+ wp_localize_script( 'wds-third-party-import', '_wds_import', array(
431
+ 'templates' => array(
432
+ 'import-options' => $this->_load( 'settings/underscore-import-options' ),
433
+ 'import-error' => $this->_load( 'settings/underscore-import-error' ),
434
+ 'import-progress' => $this->_load( 'settings/underscore-import-progress' ),
435
+ 'import-progress-reset' => $this->_load( 'settings/underscore-progress-reset' ),
436
+ 'import-success' => $this->_load( 'settings/underscore-import-success' ),
437
  ),
438
+ 'strings' => array(
439
+ 'Yoast' => esc_html__( 'Yoast', 'wds' ),
440
+ 'All In One SEO' => esc_html__( 'All In One SEO', 'wds' ),
441
+ ),
442
+ 'nonce' => wp_create_nonce( 'wds-io-nonce' ),
443
  ) );
444
+
445
+ wp_register_script( 'wds-admin-settings', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-settings.js', array(
446
+ 'wds-admin',
447
+ 'wds-third-party-import',
448
+ 'wds-qtip2-script',
449
+ 'jquery',
450
+ ), $version );
451
  };
452
  }
453
 
595
  }
596
  }
597
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
598
  $errors = get_settings_errors( $this->option_name );
599
  if ( $errors ) {
600
  set_transient( 'wds-settings-save-errors', $errors, 3 );
includes/admin/settings/onpage.php CHANGED
@@ -328,6 +328,19 @@ class Smartcrawl_Onpage_Settings extends Smartcrawl_Settings_Admin {
328
  }
329
  break;
330
 
 
 
 
 
 
 
 
 
 
 
 
 
 
331
  case 'bp-group':
332
  $group = $this->_get_random_bp_group();
333
  if ( ! empty( $group ) ) {
@@ -522,8 +535,6 @@ class Smartcrawl_Onpage_Settings extends Smartcrawl_Settings_Admin {
522
  $arguments['separators'] = smartcrawl_get_separators();
523
 
524
  $arguments['show_homepage_options'] = $this->_show_homepage_options();
525
- $arguments['homepage_title'] = $this->_get_homepage_title( $smartcrawl_options );
526
- $arguments['homepage_description'] = $this->_get_homepage_description( $smartcrawl_options );
527
 
528
  $arguments['active_tab'] = $this->_get_last_active_tab( 'tab_homepage' );
529
 
@@ -591,39 +602,6 @@ class Smartcrawl_Onpage_Settings extends Smartcrawl_Settings_Admin {
591
  return $show_homepage_options;
592
  }
593
 
594
- private function _get_homepage_title( $options ) {
595
- $front_page_id = (int) get_option( 'page_on_front' );
596
-
597
- if ( ! $this->_show_homepage_options() && $front_page_id ) {
598
-
599
- $homepage_title = smartcrawl_get_value( 'title', $front_page_id );
600
- if ( empty( $homepage_title ) ) {
601
- $front_page = get_post( $front_page_id );
602
- $homepage_title = $front_page->post_title;
603
- }
604
-
605
- return $homepage_title;
606
- } else {
607
- return $options['title-home'];
608
- }
609
- }
610
-
611
- private function _get_homepage_description( $options ) {
612
- $front_page_id = (int) get_option( 'page_on_front' );
613
-
614
- if ( ! $this->_show_homepage_options() && $front_page_id ) {
615
- $homepage_description = smartcrawl_get_value( 'metadesc', $front_page_id );
616
- if ( empty( $homepage_description ) ) {
617
- $front_page = get_post( $front_page_id );
618
- $homepage_description = substr( strip_tags( $front_page->post_content ), 0, 130 );
619
- }
620
-
621
- return $homepage_description;
622
- } else {
623
- return $options['metadesc-home'];
624
- }
625
- }
626
-
627
  /**
628
  * Default settings
629
  */
328
  }
329
  break;
330
 
331
+ case 'static-homepage':
332
+ $resolver = Smartcrawl_Endpoint_Resolver::resolve();
333
+ $front_page = get_post( (int) get_option( 'page_on_front' ) );
334
+ $resolver->simulate( Smartcrawl_Endpoint_Resolver::L_SINGULAR, is_a( $front_page, 'WP_Post' ) ? $front_page : null );
335
+
336
+ $title = Smartcrawl_OnPage::get()->get_title();
337
+ $description = Smartcrawl_OnPage::get()->get_description();
338
+ $link = get_home_url();
339
+ $updated = true;
340
+
341
+ $resolver->stop_simulation();
342
+ break;
343
+
344
  case 'bp-group':
345
  $group = $this->_get_random_bp_group();
346
  if ( ! empty( $group ) ) {
535
  $arguments['separators'] = smartcrawl_get_separators();
536
 
537
  $arguments['show_homepage_options'] = $this->_show_homepage_options();
 
 
538
 
539
  $arguments['active_tab'] = $this->_get_last_active_tab( 'tab_homepage' );
540
 
602
  return $show_homepage_options;
603
  }
604
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
605
  /**
606
  * Default settings
607
  */
includes/admin/settings/settings.php CHANGED
@@ -465,15 +465,13 @@ class Smartcrawl_Settings_Settings extends Smartcrawl_Settings_Admin {
465
  $this->show_import_notice(
466
  new Smartcrawl_Yoast_Importer(),
467
  'yoast-seo',
468
- esc_html__( 'Yoast SEO', 'wds' ),
469
- 'wordpress-seo/wp-seo.php'
470
  );
471
 
472
  $this->show_import_notice(
473
  new Smartcrawl_AIOSEOP_Importer(),
474
  'all-in-one-seo',
475
- esc_html__( 'All In One SEO', 'wds' ),
476
- 'all-in-one-seo-pack/all_in_one_seo_pack.php'
477
  );
478
  }
479
 
@@ -483,8 +481,8 @@ class Smartcrawl_Settings_Settings extends Smartcrawl_Settings_Admin {
483
  * @param $plugin_name string
484
  * @param $plugin
485
  */
486
- private function show_import_notice( $importer, $plugin_key, $plugin_name, $plugin ) {
487
- if ( ! $importer->data_exists() || ! is_plugin_active( $plugin ) ) {
488
  return;
489
  }
490
 
@@ -494,7 +492,7 @@ class Smartcrawl_Settings_Settings extends Smartcrawl_Settings_Admin {
494
  esc_html__( 'auto-import', 'wds' )
495
  );
496
  $message = sprintf(
497
- esc_html__( "We've detected you have %1\$s, installed. Do you want to %2\$s your configuration into SmartCrawl?" ),
498
  $plugin_name,
499
  $auto_import_url
500
  );
465
  $this->show_import_notice(
466
  new Smartcrawl_Yoast_Importer(),
467
  'yoast-seo',
468
+ esc_html__( 'Yoast SEO', 'wds' )
 
469
  );
470
 
471
  $this->show_import_notice(
472
  new Smartcrawl_AIOSEOP_Importer(),
473
  'all-in-one-seo',
474
+ esc_html__( 'All In One SEO', 'wds' )
 
475
  );
476
  }
477
 
481
  * @param $plugin_name string
482
  * @param $plugin
483
  */
484
+ private function show_import_notice( $importer, $plugin_key, $plugin_name ) {
485
+ if ( ! $importer->data_exists() ) {
486
  return;
487
  }
488
 
492
  esc_html__( 'auto-import', 'wds' )
493
  );
494
  $message = sprintf(
495
+ esc_html__( "We've detected you have %1\$s settings. Do you want to %2\$s your configuration into SmartCrawl?" ),
496
  $plugin_name,
497
  $auto_import_url
498
  );
includes/admin/templates/advanced-tools/advanced-tools-settings.php CHANGED
@@ -23,9 +23,9 @@
23
  'section_args' => array(
24
  'content' => sprintf(
25
  '%s<br/>%s<br/>%s',
26
- __( 'Configure SmartCrawl to automatically link certain key words to a page on your blog or even', 'wds' ),
27
- __( 'a whole new site all together. Internal linking can help boost SEO but giving search engines', 'wds' ),
28
- __( 'ample ways to index your site.', 'wds' )
29
  ),
30
  'image' => 'autolinking-disabled.png',
31
  'component' => 'autolinks',
23
  'section_args' => array(
24
  'content' => sprintf(
25
  '%s<br/>%s<br/>%s',
26
+ _x( 'Configure SmartCrawl to automatically link certain key words to a page on your blog or even', 'part of a larger text', 'wds' ),
27
+ _x( 'a whole new site all together. Internal linking can help boost SEO by giving search engines', 'part of a larger text', 'wds' ),
28
+ _x( 'ample ways to index your site.', 'part of a larger text', 'wds' )
29
  ),
30
  'image' => 'autolinking-disabled.png',
31
  'component' => 'autolinks',
includes/admin/templates/checkup/checkup-checkup-results.php CHANGED
@@ -74,7 +74,7 @@ $show_upsell_message = isset( $show_upsell_message ) ? $show_upsell_message : tr
74
  'dismissible' => false,
75
  'message' => sprintf(
76
  '%s <a href="#upgrade-to-pro">%s</a>',
77
- esc_html__( 'Grab the Pro version of SmartCrawl to unlock unlimited SEO Checkups plus automated scheduled reports to always stay on top of any issues.. These features are included in a WPMU DEV membership along with 100+ plugins &amp; themes, 24/7 support and lots of handy site management tools.', 'wds' ),
78
  esc_html__( '- Try it all FREE today', 'wds' )
79
  ),
80
  ) );
74
  'dismissible' => false,
75
  'message' => sprintf(
76
  '%s <a href="#upgrade-to-pro">%s</a>',
77
+ esc_html__( 'Grab the Pro version of SmartCrawl to unlock unlimited SEO Checkups plus automated scheduled reports to always stay on top of any issues. These features are included in a WPMU DEV membership along with 100+ plugins, 24/7 support and lots of handy site management tools.', 'wds' ),
78
  esc_html__( '- Try it all FREE today', 'wds' )
79
  ),
80
  ) );
includes/admin/templates/dashboard/onboarding.php CHANGED
@@ -2,7 +2,7 @@
2
  data-title="<?php esc_attr_e( 'Quick setup', 'wds' ); ?>">
3
  <div class="intro">
4
  <p>
5
- <?php esc_html_e( "Welcome to SmartCrawl, the hottest SEO plugin for WordPress! Let's quickly set up the basics for you, then you can fine tweak each setting as you go - our recommendations are on by default.", 'wds' ); ?>
6
  </p>
7
  </div>
8
 
2
  data-title="<?php esc_attr_e( 'Quick setup', 'wds' ); ?>">
3
  <div class="intro">
4
  <p>
5
+ <?php esc_html_e( "Welcome to SmartCrawl, the hottest SEO plugin for WordPress! Let's quickly set up the basics for you, then you can fine tune each setting as you go - our recommendations are on by default.", 'wds' ); ?>
6
  </p>
7
  </div>
8
 
includes/admin/templates/metabox/analysis-readability.php CHANGED
@@ -62,61 +62,69 @@ $refresh_analysis_disabled = 'auto-draft' === get_post_status() ? 'disabled' : '
62
  </div>
63
  </div>
64
 
65
- <div class="wds-accordion">
66
- <div class="wds-check-item wds-accordion-section <?php echo esc_attr( $classes ); ?>">
67
- <div class="wds-accordion-handle">
68
- <div class="wds-accordion-handle-part">
69
- <?php esc_html_e( 'Flesch-Kincaid Test', 'wds' ); ?>
70
- </div>
71
 
72
- <?php if ( $readability_ignored ) : ?>
73
- <div class="wds-unignore-container wds-accordion-handle-part">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  <button type="button"
75
- class="wds-unignore wds-button-with-loader wds-button-with-left-loader wds-disabled-during-request button button-small button-dark-o"
76
  data-check_id="readability">
77
- <?php esc_html_e( 'Restore', 'wds' ); ?>
78
  </button>
79
  </div>
80
- <?php else : ?>
81
- <div class="wds-readability-level wds-accordion-handle-part">
82
- <span class="wds-check-item-indicator"><?php echo esc_html( $readability_level ); ?></span>
83
- </div>
84
- <?php endif; ?>
85
- </div>
86
- <div class="wds-accordion-content">
87
- <div class="wds-small-text"><strong><?php esc_html_e( 'Overview', 'wds' ); ?></strong></div>
88
- <p class="wds-small-text"><?php esc_html_e( 'The Flesch-Kincaid readability tests are readability tests designed to indicate how difficult a passage in English is to understand. Here are the benchmarks.', 'wds' ); ?></p>
89
- <table class="wds-list-table">
90
- <tbody>
91
- <tr>
92
- <th><?php esc_html_e( 'Score', 'wds' ); ?></th>
93
- <th><?php esc_html_e( 'Description', 'wds' ); ?></th>
94
- </tr>
95
-
96
- <?php foreach ( $readability_levels_map as $label => $level ) : ?>
97
- <tr>
98
- <?php
99
- if ( ! is_array( $level ) || ! isset( $level['max'] ) || ! isset( $level['min'] ) ) {
100
- continue;
101
- }
102
- ?>
103
- <td><?php echo esc_html( (int) ceil( $level['min'] ) ); ?>
104
- - <?php echo esc_html( (int) ceil( $level['max'] ) ); ?></td>
105
- <td><?php echo esc_html( $label ); ?></td>
106
- </tr>
107
- <?php endforeach; ?>
108
- </tbody>
109
- </table>
110
-
111
- <div class="wds-small-text"><strong><?php esc_html_e( 'How to fix', 'wds' ); ?></strong></div>
112
- <p class="wds-small-text"><?php esc_html_e( 'Try to use shorter sentences, with less difficult words to improve readability.', 'wds' ); ?></p>
113
-
114
- <div class="wds-ignore-container">
115
- <button type="button"
116
- class="wds-ignore wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request button button-small button-dark button-dark-o"
117
- data-check_id="readability">
118
- <?php esc_html_e( 'Ignore', 'wds' ); ?>
119
- </button>
120
  </div>
121
  </div>
122
  </div>
62
  </div>
63
  </div>
64
 
65
+ <div class="wds-analysis-working">
66
+ <p>
67
+ <?php esc_html_e( 'Analyzing content, please wait a few moments', 'wds' ); ?>
68
+ </p>
69
+ </div>
 
70
 
71
+ <div class="wds-report-inner">
72
+ <div class="wds-accordion">
73
+ <div class="wds-check-item wds-accordion-section <?php echo esc_attr( $classes ); ?>">
74
+ <div class="wds-accordion-handle">
75
+ <div class="wds-accordion-handle-part">
76
+ <?php esc_html_e( 'Flesch-Kincaid Test', 'wds' ); ?>
77
+ </div>
78
+
79
+ <?php if ( $readability_ignored ) : ?>
80
+ <div class="wds-unignore-container wds-accordion-handle-part">
81
+ <button type="button"
82
+ class="wds-unignore wds-button-with-loader wds-button-with-left-loader wds-disabled-during-request button button-small button-dark-o"
83
+ data-check_id="readability">
84
+ <?php esc_html_e( 'Restore', 'wds' ); ?>
85
+ </button>
86
+ </div>
87
+ <?php else : ?>
88
+ <div class="wds-readability-level wds-accordion-handle-part">
89
+ <span class="wds-check-item-indicator"><?php echo esc_html( $readability_level ); ?></span>
90
+ </div>
91
+ <?php endif; ?>
92
+ </div>
93
+ <div class="wds-accordion-content">
94
+ <div class="wds-small-text"><strong><?php esc_html_e( 'Overview', 'wds' ); ?></strong></div>
95
+ <p class="wds-small-text"><?php esc_html_e( 'The Flesch-Kincaid readability tests are readability tests designed to indicate how difficult a passage in English is to understand. Here are the benchmarks.', 'wds' ); ?></p>
96
+ <table class="wds-list-table">
97
+ <tbody>
98
+ <tr>
99
+ <th><?php esc_html_e( 'Score', 'wds' ); ?></th>
100
+ <th><?php esc_html_e( 'Description', 'wds' ); ?></th>
101
+ </tr>
102
+
103
+ <?php foreach ( $readability_levels_map as $label => $level ) : ?>
104
+ <tr>
105
+ <?php
106
+ if ( ! is_array( $level ) || ! isset( $level['max'] ) || ! isset( $level['min'] ) ) {
107
+ continue;
108
+ }
109
+ ?>
110
+ <td><?php echo esc_html( (int) ceil( $level['min'] ) ); ?>
111
+ - <?php echo esc_html( (int) ceil( $level['max'] ) ); ?></td>
112
+ <td><?php echo esc_html( $label ); ?></td>
113
+ </tr>
114
+ <?php endforeach; ?>
115
+ </tbody>
116
+ </table>
117
+
118
+ <div class="wds-small-text"><strong><?php esc_html_e( 'How to fix', 'wds' ); ?></strong></div>
119
+ <p class="wds-small-text"><?php esc_html_e( 'Try to use shorter sentences, with less difficult words to improve readability.', 'wds' ); ?></p>
120
+
121
+ <div class="wds-ignore-container">
122
  <button type="button"
123
+ class="wds-ignore wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request button button-small button-dark button-dark-o"
124
  data-check_id="readability">
125
+ <?php esc_html_e( 'Ignore', 'wds' ); ?>
126
  </button>
127
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
  </div>
129
  </div>
130
  </div>
includes/admin/templates/metabox/analysis-seo-analysis.php CHANGED
@@ -19,76 +19,84 @@ $focus_keywords_available = empty( $focus_keywords_available ) ? false : $focus_
19
 
20
  <div class="wds-seo-analysis wds-report" data-errors="<?php echo esc_attr( $error_count ); ?>">
21
 
22
- <div class="wds-notice <?php echo $error_count > 0 ? 'wds-notice-warning' : 'wds-notice-success'; ?>">
23
  <p>
24
- <?php if ( $error_count > 0 ) : ?>
25
- <?php printf( esc_html__( 'You have %d SEO recommendations. We recommend you satisfy as many improvements as possible to ensure your content gets found.', 'wds' ), intval( $error_count ) ); ?>
26
- <?php else : ?>
27
- <?php esc_html_e( 'You have optimized your SEO to the max. Bravo!', 'wds' ); ?>
28
- <?php endif; ?>
29
  </p>
30
  </div>
31
- <div class="wds-accordion">
32
- <?php foreach ( $checks as $check_id => $result ) : ?>
33
- <?php
34
- $passed = $result['status'];
35
- $ignored = $result['ignored'];
36
- $recommendation = $result['recommendation'];
37
- $more_info = $result['more_info'];
38
- $status_msg = $result['status_msg'];
39
 
40
- $classes_array = array();
41
- $classes_array[] = $passed ? 'wds-check-success' : 'wds-check-warning';
42
- $classes_array[] = $ignored ? 'wds-check-invalid disabled' : '';
43
- $classes = implode( ' ', $classes_array );
44
- ?>
45
- <div id="wds-check-<?php echo esc_attr( $check_id ); ?>"
46
- class="wds-check-item wds-accordion-section <?php echo esc_attr( $classes ); ?>">
47
- <div class="wds-accordion-handle">
48
- <div class="wds-accordion-handle-part">
49
- <?php echo wp_kses_post( $status_msg ); ?>
50
- </div>
51
- <?php if ( $ignored ) : ?>
52
- <div class="wds-unignore-container wds-accordion-handle-part">
53
- <button type="button"
54
- id="wds-unignore-check-<?php echo esc_attr( $check_id ); ?>"
55
- class="wds-unignore wds-button-with-loader wds-button-with-left-loader wds-disabled-during-request button button-small button-dark-o"
56
- data-check_id="<?php echo esc_attr( $check_id ); ?>">
57
- <?php esc_html_e( 'Restore', 'wds' ); ?>
58
- </button>
 
 
 
 
 
 
 
 
 
 
59
  </div>
60
- <?php endif; ?>
61
- </div>
62
- <div class="wds-accordion-content">
63
- <?php if ( $recommendation ) : ?>
64
- <div class="wds-recommendation">
65
- <div class="wds-small-text"><strong><?php esc_html_e( 'Recommendation', 'wds' ); ?></strong>
 
 
66
  </div>
67
- <p class="wds-small-text"><?php echo wp_kses_post( $recommendation ); ?></p>
68
- </div>
69
- <?php endif; ?>
70
-
71
- <?php if ( $more_info ) : ?>
72
- <div class="wds-more-info">
73
- <div class="wds-small-text"><strong><?php esc_html_e( 'More Info', 'wds' ); ?></strong>
 
74
  </div>
75
- <p class="wds-small-text"><?php echo wp_kses_post( $more_info ); ?></p>
76
- </div>
77
- <?php endif; ?>
78
-
79
- <?php if ( ! $ignored ) : ?>
80
- <div class="wds-ignore-container">
81
- <button type="button"
82
- id="wds-ignore-check-<?php echo esc_attr( $check_id ); ?>"
83
- class="wds-ignore wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request button button-small button-dark-o"
84
- data-check_id="<?php echo esc_attr( $check_id ); ?>">
85
- <?php esc_html_e( 'Ignore', 'wds' ); ?>
86
- </button>
87
- </div>
88
- <?php endif; ?>
 
 
 
 
 
 
 
89
  </div>
90
- </div>
91
- <?php endforeach; ?>
92
- <div class="cf"></div>
93
  </div>
94
  </div>
19
 
20
  <div class="wds-seo-analysis wds-report" data-errors="<?php echo esc_attr( $error_count ); ?>">
21
 
22
+ <div class="wds-analysis-working">
23
  <p>
24
+ <?php esc_html_e( 'Analyzing content, please wait a few moments', 'wds' ); ?>
 
 
 
 
25
  </p>
26
  </div>
 
 
 
 
 
 
 
 
27
 
28
+ <div class="wds-report-inner">
29
+ <div class="wds-notice <?php echo $error_count > 0 ? 'wds-notice-warning' : 'wds-notice-success'; ?>">
30
+ <p>
31
+ <?php if ( $error_count > 0 ) : ?>
32
+ <?php printf( esc_html__( 'You have %d SEO recommendations. We recommend you satisfy as many improvements as possible to ensure your content gets found.', 'wds' ), intval( $error_count ) ); ?>
33
+ <?php else : ?>
34
+ <?php esc_html_e( 'You have optimized your SEO to the max. Bravo!', 'wds' ); ?>
35
+ <?php endif; ?>
36
+ </p>
37
+ </div>
38
+ <div class="wds-accordion">
39
+ <?php foreach ( $checks as $check_id => $result ) : ?>
40
+ <?php
41
+ $passed = $result['status'];
42
+ $ignored = $result['ignored'];
43
+ $recommendation = $result['recommendation'];
44
+ $more_info = $result['more_info'];
45
+ $status_msg = $result['status_msg'];
46
+
47
+ $classes_array = array();
48
+ $classes_array[] = $passed ? 'wds-check-success' : 'wds-check-warning';
49
+ $classes_array[] = $ignored ? 'wds-check-invalid disabled' : '';
50
+ $classes = implode( ' ', $classes_array );
51
+ ?>
52
+ <div id="wds-check-<?php echo esc_attr( $check_id ); ?>"
53
+ class="wds-check-item wds-accordion-section <?php echo esc_attr( $classes ); ?>">
54
+ <div class="wds-accordion-handle">
55
+ <div class="wds-accordion-handle-part">
56
+ <?php echo wp_kses_post( $status_msg ); ?>
57
  </div>
58
+ <?php if ( $ignored ) : ?>
59
+ <div class="wds-unignore-container wds-accordion-handle-part">
60
+ <button type="button"
61
+ id="wds-unignore-check-<?php echo esc_attr( $check_id ); ?>"
62
+ class="wds-unignore wds-button-with-loader wds-button-with-left-loader wds-disabled-during-request button button-small button-dark-o"
63
+ data-check_id="<?php echo esc_attr( $check_id ); ?>">
64
+ <?php esc_html_e( 'Restore', 'wds' ); ?>
65
+ </button>
66
  </div>
67
+ <?php endif; ?>
68
+ </div>
69
+ <div class="wds-accordion-content">
70
+ <?php if ( $recommendation ) : ?>
71
+ <div class="wds-recommendation">
72
+ <div class="wds-small-text"><strong><?php esc_html_e( 'Recommendation', 'wds' ); ?></strong>
73
+ </div>
74
+ <p class="wds-small-text"><?php echo wp_kses_post( $recommendation ); ?></p>
75
  </div>
76
+ <?php endif; ?>
77
+
78
+ <?php if ( $more_info ) : ?>
79
+ <div class="wds-more-info">
80
+ <div class="wds-small-text"><strong><?php esc_html_e( 'More Info', 'wds' ); ?></strong>
81
+ </div>
82
+ <p class="wds-small-text"><?php echo wp_kses_post( $more_info ); ?></p>
83
+ </div>
84
+ <?php endif; ?>
85
+
86
+ <?php if ( ! $ignored ) : ?>
87
+ <div class="wds-ignore-container">
88
+ <button type="button"
89
+ id="wds-ignore-check-<?php echo esc_attr( $check_id ); ?>"
90
+ class="wds-ignore wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request button button-small button-dark-o"
91
+ data-check_id="<?php echo esc_attr( $check_id ); ?>">
92
+ <?php esc_html_e( 'Ignore', 'wds' ); ?>
93
+ </button>
94
+ </div>
95
+ <?php endif; ?>
96
+ </div>
97
  </div>
98
+ <?php endforeach; ?>
99
+ <div class="cf"></div>
100
+ </div>
101
  </div>
102
  </div>
includes/admin/templates/metabox/metabox-dummy-preview.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <div class="wds-metabox-preview">
2
+ <label class="wds-label"><?php esc_html_e( 'Google Preview' ); ?></label>
3
+
4
+ <?php
5
+ if ( apply_filters( 'wds-metabox-visible_parts-preview_area', true ) ) {
6
+ $this->_render( 'onpage/onpage-preview' );
7
+ }
8
+ ?>
9
+ </div>
includes/admin/templates/metabox/metabox-main.php CHANGED
@@ -34,7 +34,7 @@ if ( ! Smartcrawl_Settings::get_setting( 'analysis-readability' ) ) {
34
  }
35
  ?>
36
  <div class="wpmud wds-metabox">
37
- <div id="container" class="wds-horizontal-tabs">
38
  <?php wp_nonce_field( 'wds-metabox-nonce', '_wds_nonce' ); ?>
39
  <?php
40
  $this->_render( 'metabox/horizontal-tab-nav', array( 'tabs' => $tabs ) );
@@ -83,6 +83,7 @@ if ( ! Smartcrawl_Settings::get_setting( 'analysis-readability' ) ) {
83
  'tab_id' => 'wds_advanced',
84
  'content_template' => 'metabox/metabox-tab-advanced',
85
  'content_args' => array(
 
86
  'robots_noindex_value' => $robots_noindex_value,
87
  'robots_nofollow_value' => $robots_nofollow_value,
88
  'robots_index_value' => $robots_index_value,
34
  }
35
  ?>
36
  <div class="wpmud wds-metabox">
37
+ <div id="container" class="wds-horizontal-tabs">
38
  <?php wp_nonce_field( 'wds-metabox-nonce', '_wds_nonce' ); ?>
39
  <?php
40
  $this->_render( 'metabox/horizontal-tab-nav', array( 'tabs' => $tabs ) );
83
  'tab_id' => 'wds_advanced',
84
  'content_template' => 'metabox/metabox-tab-advanced',
85
  'content_args' => array(
86
+ 'post' => $post,
87
  'robots_noindex_value' => $robots_noindex_value,
88
  'robots_nofollow_value' => $robots_nofollow_value,
89
  'robots_index_value' => $robots_index_value,
includes/admin/templates/metabox/metabox-meta-edit-form.php CHANGED
@@ -1,3 +1,11 @@
 
 
 
 
 
 
 
 
1
  <div class="wds-toggleable inactive wds-edit-meta-toggleable">
2
  <label>
3
  <a class="button button-dark button-small"><?php esc_html_e( 'Edit Meta', 'wds' ); ?></a>
@@ -6,17 +14,6 @@
6
 
7
  <div class="wds-toggleable-inside wds-toggleable-inside-box">
8
  <div class="wds-table-fields wds-table-fields-stacked">
9
- <?php
10
- $title_placeholder = smartcrawl_get_seo_title();
11
- if ( ! $title_placeholder ) {
12
- $title_placeholder = '';
13
- }
14
-
15
- $desc_placeholder = smartcrawl_get_seo_desc();
16
- if ( ! $desc_placeholder ) {
17
- $desc_placeholder = '';
18
- }
19
- ?>
20
 
21
  <?php if ( apply_filters( 'wds-metabox-visible_parts-title_area', true ) ) : ?>
22
  <div class="label">
@@ -28,9 +25,8 @@
28
  <div class="fields">
29
  <input type='text'
30
  id='wds_title'
31
- placeholder='<?php echo esc_html( $title_placeholder ); ?>'
32
  name='wds_title'
33
- value='<?php echo esc_html( smartcrawl_get_value( 'title' ) ); ?>'
34
  class='wds wds-meta-field'/>
35
  </div>
36
  <?php endif; ?>
@@ -45,9 +41,8 @@
45
  <div class="fields">
46
  <textarea rows='2'
47
  name='wds_metadesc'
48
- placeholder='<?php echo esc_html( $desc_placeholder ); ?>'
49
  id='wds_metadesc'
50
- class='wds wds-meta-field'><?php echo esc_html( smartcrawl_get_value( 'metadesc' ) ); ?></textarea>
51
  </div>
52
  <?php endif; ?>
53
 
@@ -62,7 +57,7 @@
62
  <input type='text'
63
  id='wds_keywords'
64
  name='wds_keywords'
65
- value='<?php echo esc_html( smartcrawl_get_value( 'keywords' ) ); ?>'
66
  class='wds'/>
67
  </div>
68
 
@@ -77,7 +72,7 @@
77
  <input type='text'
78
  id='wds_news_keywords'
79
  name='wds_news_keywords'
80
- value='<?php echo esc_attr( smartcrawl_get_value( 'news_keywords' ) ); ?>'
81
  class='wds'/>
82
  </div>
83
 
@@ -85,7 +80,7 @@
85
  <?php
86
  $this->_render( 'toggle-item', array(
87
  'field_name' => 'wds_tags_to_keywords',
88
- 'checked' => smartcrawl_get_value( 'tags_to_keywords' ) ? 'checked="checked"' : '',
89
  'item_label' => esc_html__( 'Tags As Keywords' ),
90
  'item_description' => esc_html__( 'If you enable using tags, post tags will be merged in with any other keywords you enter in the text box.' ),
91
  ) );
1
+ <?php
2
+ $post = empty( $post ) ? null : $post;
3
+ if ( $post ) {
4
+ $post_id = $post->ID;
5
+ } else {
6
+ return;
7
+ }
8
+ ?>
9
  <div class="wds-toggleable inactive wds-edit-meta-toggleable">
10
  <label>
11
  <a class="button button-dark button-small"><?php esc_html_e( 'Edit Meta', 'wds' ); ?></a>
14
 
15
  <div class="wds-toggleable-inside wds-toggleable-inside-box">
16
  <div class="wds-table-fields wds-table-fields-stacked">
 
 
 
 
 
 
 
 
 
 
 
17
 
18
  <?php if ( apply_filters( 'wds-metabox-visible_parts-title_area', true ) ) : ?>
19
  <div class="label">
25
  <div class="fields">
26
  <input type='text'
27
  id='wds_title'
 
28
  name='wds_title'
29
+ value='<?php echo esc_html( smartcrawl_get_value( 'title', $post_id ) ); ?>'
30
  class='wds wds-meta-field'/>
31
  </div>
32
  <?php endif; ?>
41
  <div class="fields">
42
  <textarea rows='2'
43
  name='wds_metadesc'
 
44
  id='wds_metadesc'
45
+ class='wds wds-meta-field'><?php echo esc_html( smartcrawl_get_value( 'metadesc', $post_id ) ); ?></textarea>
46
  </div>
47
  <?php endif; ?>
48
 
57
  <input type='text'
58
  id='wds_keywords'
59
  name='wds_keywords'
60
+ value='<?php echo esc_html( smartcrawl_get_value( 'keywords', $post_id ) ); ?>'
61
  class='wds'/>
62
  </div>
63
 
72
  <input type='text'
73
  id='wds_news_keywords'
74
  name='wds_news_keywords'
75
+ value='<?php echo esc_attr( smartcrawl_get_value( 'news_keywords', $post_id ) ); ?>'
76
  class='wds'/>
77
  </div>
78
 
80
  <?php
81
  $this->_render( 'toggle-item', array(
82
  'field_name' => 'wds_tags_to_keywords',
83
+ 'checked' => smartcrawl_get_value( 'tags_to_keywords', $post_id ) ? 'checked="checked"' : '',
84
  'item_label' => esc_html__( 'Tags As Keywords' ),
85
  'item_description' => esc_html__( 'If you enable using tags, post tags will be merged in with any other keywords you enter in the text box.' ),
86
  ) );
includes/admin/templates/metabox/metabox-preview.php CHANGED
@@ -6,53 +6,23 @@
6
  */
7
 
8
  $post = empty( $post ) ? null : $post;
9
-
10
- // Date.
11
- $date = $post ? date( 'M j, Y', strtotime( $post->post_date ) ) : date( 'M j, Y' );
12
- // Title.
13
- $title = empty( $title ) ? smartcrawl_get_value( 'title' ) : $title;
14
- if ( empty( $title ) && $post ) {
15
- $title = $post->post_title;
16
- }
17
- if ( empty( $title ) ) {
18
- $title = esc_html__( 'Dummy Title', 'wds' );
19
- }
20
- if ( is_object( $post ) ) {
21
- $title = smartcrawl_replace_vars( $title, (array) $post );
22
  }
23
 
24
- // Description.
25
- $description = empty( $description ) ? smartcrawl_get_value( 'metadesc' ) : $description;
26
- if ( empty( $description ) && $post ) {
27
- $description = $post->post_excerpt;
28
- }
29
- if ( empty( $description ) && $post ) {
30
- $description = substr( strip_tags( $post->post_content ), 0, 130 );
31
- }
32
- if ( empty( $description ) ) {
33
- $description = __( 'Dummy description', 'wds' );
34
- }
35
- if ( is_object( $post ) ) {
36
- $description = smartcrawl_replace_vars( $description, (array) $post );
37
- }
38
-
39
- // Slug.
40
- $slug = ! empty( $post->post_name ) ? $post->post_name : sanitize_title( $title );
41
  ?>
42
  <div class="wds-metabox-preview">
43
  <label class="wds-label"><?php esc_html_e( 'Google Preview' ); ?></label>
44
 
45
  <?php
46
  if ( apply_filters( 'wds-metabox-visible_parts-preview_area', true ) ) {
47
- $link = sprintf(
48
- '%s/%s/',
49
- str_replace( 'http://', '', get_bloginfo( 'url' ) ),
50
- $slug
51
- );
52
- if ( ! empty( $post ) && is_object( $post ) && ! empty( $post->ID ) ) {
53
- $link = get_permalink( $post->ID );
54
- }
55
-
56
  $this->_render( 'onpage/onpage-preview', array(
57
  'link' => esc_url( $link ),
58
  'title' => esc_html( $title ),
6
  */
7
 
8
  $post = empty( $post ) ? null : $post;
9
+ if ( ! $post ) {
10
+ return;
 
 
 
 
 
 
 
 
 
 
 
11
  }
12
 
13
+ $post_parent = wp_is_post_revision( $post->ID );
14
+ $link = empty( $post_parent ) ? get_permalink( $post->ID ) : get_permalink( $post_parent );
15
+ $resolver = Smartcrawl_Endpoint_Resolver::resolve();
16
+ $resolver->simulate_post( $post->ID );
17
+ $title = Smartcrawl_OnPage::get()->get_title();
18
+ $description = Smartcrawl_OnPage::get()->get_description();
19
+ $resolver->stop_simulation();
 
 
 
 
 
 
 
 
 
 
20
  ?>
21
  <div class="wds-metabox-preview">
22
  <label class="wds-label"><?php esc_html_e( 'Google Preview' ); ?></label>
23
 
24
  <?php
25
  if ( apply_filters( 'wds-metabox-visible_parts-preview_area', true ) ) {
 
 
 
 
 
 
 
 
 
26
  $this->_render( 'onpage/onpage-preview', array(
27
  'link' => esc_url( $link ),
28
  'title' => esc_html( $title ),
includes/admin/templates/metabox/metabox-seo-analysis-container.php CHANGED
@@ -1,6 +1,11 @@
1
  <?php
2
  $post = empty( $post ) ? null : $post;
3
  $refresh_button_disabled = 'auto-draft' === get_post_status() ? 'disabled' : '';
 
 
 
 
 
4
  ?>
5
 
6
  <div class="wds-seo-analysis-container">
@@ -8,8 +13,8 @@ $refresh_button_disabled = 'auto-draft' === get_post_status() ? 'disabled' : '';
8
  <label class="wds-label"><?php esc_html_e( 'SEO Analysis', 'wds' ); ?></label>
9
 
10
  <button <?php esc_attr( $refresh_button_disabled ); ?>
11
- class="button button-small button-dark button-dark-o wds-refresh-analysis wds-analysis-seo wds-disabled-during-request"
12
- type="button">
13
  <span><?php esc_html_e( 'Refresh', 'wds' ); ?></span>
14
  </button>
15
  </div>
@@ -33,7 +38,7 @@ $refresh_button_disabled = 'auto-draft' === get_post_status() ? 'disabled' : '';
33
  <input type='text'
34
  id='wds_focus'
35
  name='wds_focus'
36
- value='<?php echo esc_html( smartcrawl_get_value( 'focus-keywords' ) ); ?>'
37
  class='wds wds-disabled-during-request'
38
  placeholder="<?php esc_html_e( 'E.g. broken iphone screen', 'wds' ); ?>"/>
39
  </div>
1
  <?php
2
  $post = empty( $post ) ? null : $post;
3
  $refresh_button_disabled = 'auto-draft' === get_post_status() ? 'disabled' : '';
4
+ if ( $post ) {
5
+ $post_id = $post->ID;
6
+ } else {
7
+ return;
8
+ }
9
  ?>
10
 
11
  <div class="wds-seo-analysis-container">
13
  <label class="wds-label"><?php esc_html_e( 'SEO Analysis', 'wds' ); ?></label>
14
 
15
  <button <?php esc_attr( $refresh_button_disabled ); ?>
16
+ class="button button-small button-dark button-dark-o wds-refresh-analysis wds-analysis-seo wds-disabled-during-request"
17
+ type="button">
18
  <span><?php esc_html_e( 'Refresh', 'wds' ); ?></span>
19
  </button>
20
  </div>
38
  <input type='text'
39
  id='wds_focus'
40
  name='wds_focus'
41
+ value='<?php echo esc_html( smartcrawl_get_value( 'focus-keywords', $post_id ) ); ?>'
42
  class='wds wds-disabled-during-request'
43
  placeholder="<?php esc_html_e( 'E.g. broken iphone screen', 'wds' ); ?>"/>
44
  </div>
includes/admin/templates/metabox/metabox-tab-advanced.php CHANGED
@@ -8,6 +8,12 @@ $advanced_options = empty( $advanced_options ) ? array() : $advanced_options;
8
  $sitemap_priority_options = empty( $sitemap_priority_options ) ? array() : $sitemap_priority_options;
9
  $post_type_noindexed = empty( $post_type_noindexed ) ? false : true;
10
  $post_type_nofollowed = empty( $post_type_nofollowed ) ? false : true;
 
 
 
 
 
 
11
  ?>
12
 
13
  <div class="wds-metabox-section wds-advanced-metabox-section wds-form">
@@ -94,9 +100,10 @@ $post_type_nofollowed = empty( $post_type_nofollowed ) ? false : true;
94
  </div>
95
  <div class="fields">
96
  <input type='text' id='wds_canonical' name='wds_canonical'
97
- value='<?php echo esc_attr( smartcrawl_get_value( 'canonical' ) ); ?>' class='wds'/>
 
98
  <span
99
- class="wds-field-legend"><?php esc_html_e( 'Enter the full canonical URL including http:// or https://', 'wds' ); ?></span>
100
  </div>
101
  </div>
102
  <?php endif; ?>
@@ -111,9 +118,9 @@ $post_type_nofollowed = empty( $post_type_nofollowed ) ? false : true;
111
  </div>
112
  <div class="fields">
113
  <input type='text' id='wds_redirect' name='wds_redirect'
114
- value='<?php echo esc_attr( smartcrawl_get_value( 'redirect' ) ); ?>' class='wds'/>
115
  <span
116
- class="wds-field-legend"><?php esc_html_e( 'Enter the URL to send traffic to including http:// or https://', 'wds' ); ?></span>
117
  </div>
118
  </div>
119
  <?php endif; ?>
@@ -130,7 +137,7 @@ $post_type_nofollowed = empty( $post_type_nofollowed ) ? false : true;
130
  class="select-container"
131
  style="width: 100%">
132
 
133
- <?php $priority_value = smartcrawl_get_value( 'sitemap-priority' ); ?>
134
 
135
  <?php foreach ( $sitemap_priority_options as $key => $label ) : ?>
136
  <option value='<?php echo esc_attr( $key ); ?>' <?php selected( $key, $priority_value ); ?>>
@@ -156,7 +163,7 @@ $post_type_nofollowed = empty( $post_type_nofollowed ) ? false : true;
156
  $this->_render( 'toggle-item', array(
157
  'inverted' => true,
158
  'field_name' => 'wds_autolinks-exclude',
159
- 'checked' => smartcrawl_get_value( 'autolinks-exclude' ) ? 'checked="checked"' : '',
160
  'item_label' => esc_html__( 'Enable automatic linking for this post', 'wds' ),
161
  ) );
162
  ?>
8
  $sitemap_priority_options = empty( $sitemap_priority_options ) ? array() : $sitemap_priority_options;
9
  $post_type_noindexed = empty( $post_type_noindexed ) ? false : true;
10
  $post_type_nofollowed = empty( $post_type_nofollowed ) ? false : true;
11
+ $post = empty( $post ) ? null : $post;
12
+ if ( $post ) {
13
+ $post_id = $post->ID;
14
+ } else {
15
+ return;
16
+ }
17
  ?>
18
 
19
  <div class="wds-metabox-section wds-advanced-metabox-section wds-form">
100
  </div>
101
  <div class="fields">
102
  <input type='text' id='wds_canonical' name='wds_canonical'
103
+ value='<?php echo esc_attr( smartcrawl_get_value( 'canonical', $post_id ) ); ?>'
104
+ class='wds'/>
105
  <span
106
+ class="wds-field-legend"><?php esc_html_e( 'Enter the full canonical URL including http:// or https://', 'wds' ); ?></span>
107
  </div>
108
  </div>
109
  <?php endif; ?>
118
  </div>
119
  <div class="fields">
120
  <input type='text' id='wds_redirect' name='wds_redirect'
121
+ value='<?php echo esc_attr( smartcrawl_get_value( 'redirect', $post_id ) ); ?>' class='wds'/>
122
  <span
123
+ class="wds-field-legend"><?php esc_html_e( 'Enter the URL to send traffic to including http:// or https://', 'wds' ); ?></span>
124
  </div>
125
  </div>
126
  <?php endif; ?>
137
  class="select-container"
138
  style="width: 100%">
139
 
140
+ <?php $priority_value = smartcrawl_get_value( 'sitemap-priority', $post_id ); ?>
141
 
142
  <?php foreach ( $sitemap_priority_options as $key => $label ) : ?>
143
  <option value='<?php echo esc_attr( $key ); ?>' <?php selected( $key, $priority_value ); ?>>
163
  $this->_render( 'toggle-item', array(
164
  'inverted' => true,
165
  'field_name' => 'wds_autolinks-exclude',
166
+ 'checked' => smartcrawl_get_value( 'autolinks-exclude', $post_id ) ? 'checked="checked"' : '',
167
  'item_label' => esc_html__( 'Enable automatic linking for this post', 'wds' ),
168
  ) );
169
  ?>
includes/admin/templates/metabox/metabox-tab-seo.php CHANGED
@@ -5,12 +5,12 @@ $post = empty( $post ) ? null : $post;
5
  <div class="wds-form">
6
  <div class="wds-metabox-section">
7
  <?php
8
- $this->_render( 'metabox/metabox-preview', array(
9
- 'post' => $post,
10
- ) );
11
  ?>
12
 
13
- <?php $this->_render( 'metabox/metabox-meta-edit-form' ); ?>
 
 
14
  </div>
15
 
16
  <?php if ( Smartcrawl_Settings::get_setting( 'analysis-seo' ) ) { ?>
5
  <div class="wds-form">
6
  <div class="wds-metabox-section">
7
  <?php
8
+ $this->_render( 'metabox/metabox-dummy-preview' );
 
 
9
  ?>
10
 
11
+ <?php $this->_render( 'metabox/metabox-meta-edit-form', array(
12
+ 'post' => $post,
13
+ ) ); ?>
14
  </div>
15
 
16
  <?php if ( Smartcrawl_Settings::get_setting( 'analysis-seo' ) ) { ?>
includes/admin/templates/metabox/metabox-tab-social.php CHANGED
@@ -6,11 +6,13 @@ $twitter_setting_enabled = empty( $twitter_setting_enabled ) ? false : $twitter_
6
  $twitter_post_type_enabled = empty( $twitter_post_type_enabled ) ? false : $twitter_post_type_enabled;
7
  $onpage_url = Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_ONPAGE );
8
 
9
- if ( ! is_a( $post, 'WP_Post' ) ) {
 
 
10
  return;
11
  }
12
 
13
- $og = smartcrawl_get_value( 'opengraph' );
14
  if ( ! is_array( $og ) ) {
15
  $og = array();
16
  }
@@ -22,10 +24,14 @@ $og = wp_parse_args( $og, array(
22
  'disabled' => false,
23
  ) );
24
 
25
- $og_printer = Smartcrawl_OpenGraph_Printer::get();
 
 
 
 
26
  $og_meta_disabled = (bool) smartcrawl_get_array_value( $og, 'disabled' );
27
 
28
- $twitter = smartcrawl_get_value( 'twitter' );
29
  if ( ! is_array( $twitter ) ) {
30
  $twitter = array();
31
  }
@@ -40,8 +46,6 @@ $twitter = wp_parse_args( $twitter, array(
40
  $twitter_printer = Smartcrawl_Twitter_Printer::get();
41
  $twitter_meta_disabled = smartcrawl_get_array_value( $twitter, 'disabled' );
42
 
43
- $resolver = Smartcrawl_Endpoint_Resolver::resolve();
44
- $resolver->simulate_post( $post->ID );
45
  ?>
46
  <div class="wds-metabox-section wds-social-settings-metabox-section wds-form">
47
  <p>
@@ -65,9 +69,9 @@ $resolver->simulate_post( $post->ID );
65
  'field_name' => 'wds-opengraph',
66
  'disabled' => $og_meta_disabled,
67
  'current_title' => $og['title'],
68
- 'title_placeholder' => $og_printer->get_tag_value( 'title' ),
69
  'current_description' => $og['description'],
70
- 'description_placeholder' => $og_printer->get_tag_value( 'description' ),
71
  'images' => $og['images'],
72
  'single_image' => false,
73
  ) );
6
  $twitter_post_type_enabled = empty( $twitter_post_type_enabled ) ? false : $twitter_post_type_enabled;
7
  $onpage_url = Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_ONPAGE );
8
 
9
+ if ( $post ) {
10
+ $post_id = $post->ID;
11
+ } else {
12
  return;
13
  }
14
 
15
+ $og = smartcrawl_get_value( 'opengraph', $post_id );
16
  if ( ! is_array( $og ) ) {
17
  $og = array();
18
  }
24
  'disabled' => false,
25
  ) );
26
 
27
+ $resolver = Smartcrawl_Endpoint_Resolver::resolve();
28
+ $resolver->simulate_post( $post );
29
+ $og_helper = new Smartcrawl_OpenGraph_Value_Helper();
30
+ $title_placeholder = $og_helper->get_title();
31
+ $description_placeholder = $og_helper->get_description();
32
  $og_meta_disabled = (bool) smartcrawl_get_array_value( $og, 'disabled' );
33
 
34
+ $twitter = smartcrawl_get_value( 'twitter', $post_id );
35
  if ( ! is_array( $twitter ) ) {
36
  $twitter = array();
37
  }
46
  $twitter_printer = Smartcrawl_Twitter_Printer::get();
47
  $twitter_meta_disabled = smartcrawl_get_array_value( $twitter, 'disabled' );
48
 
 
 
49
  ?>
50
  <div class="wds-metabox-section wds-social-settings-metabox-section wds-form">
51
  <p>
69
  'field_name' => 'wds-opengraph',
70
  'disabled' => $og_meta_disabled,
71
  'current_title' => $og['title'],
72
+ 'title_placeholder' => $title_placeholder,
73
  'current_description' => $og['description'],
74
+ 'description_placeholder' => $description_placeholder,
75
  'images' => $og['images'],
76
  'single_image' => false,
77
  ) );
includes/admin/templates/onpage/onpage-preview.php CHANGED
@@ -1,15 +1,15 @@
1
  <?php
2
  $smartcrawl_options = Smartcrawl_Settings::get_options();
3
  $link = ! isset( $link ) ? home_url() : $link;
4
- $title = ! isset( $title ) ? smartcrawl_replace_vars( $smartcrawl_options['title-home'] ) : $title;
5
- $description = ! isset( $description ) ? smartcrawl_replace_vars( $smartcrawl_options['metadesc-home'] ) : $description;
6
  ?>
7
  <div class="wds-preview-container">
8
  <div class="wds-preview">
9
  <div class="wds-preview-title">
10
  <h3>
11
  <a href="<?php echo esc_url( $link ); ?>">
12
- <?php echo esc_html( $title ); ?>
13
  </a>
14
  </h3>
15
  </div>
@@ -19,7 +19,7 @@ $description = ! isset( $description ) ? smartcrawl_replace_vars( $smartcrawl_op
19
  </a>
20
  </div>
21
  <div class="wds-preview-meta">
22
- <?php echo esc_html( $description ); ?>
23
  </div>
24
  </div>
25
  <p class="wds-preview-description"><?php esc_html_e( 'A preview of how your title and meta will appear in Google Search.', 'wds' ); ?></p>
1
  <?php
2
  $smartcrawl_options = Smartcrawl_Settings::get_options();
3
  $link = ! isset( $link ) ? home_url() : $link;
4
+ $title = ! isset( $title ) ? get_bloginfo( 'name' ) : $title;
5
+ $description = ! isset( $description ) ? get_bloginfo( 'description' ) : $description;
6
  ?>
7
  <div class="wds-preview-container">
8
  <div class="wds-preview">
9
  <div class="wds-preview-title">
10
  <h3>
11
  <a href="<?php echo esc_url( $link ); ?>">
12
+ <?php echo esc_html( smartcrawl_truncate_meta_title( $title ) ); ?>
13
  </a>
14
  </h3>
15
  </div>
19
  </a>
20
  </div>
21
  <div class="wds-preview-meta">
22
+ <?php echo esc_html( smartcrawl_truncate_meta_description( $description ) ); ?>
23
  </div>
24
  </div>
25
  <p class="wds-preview-description"><?php esc_html_e( 'A preview of how your title and meta will appear in Google Search.', 'wds' ); ?></p>
includes/admin/templates/onpage/onpage-section-homepage.php CHANGED
@@ -6,16 +6,7 @@ $meta_robots_main_blog_archive = empty( $meta_robots_main_blog_archive ) ? '' :
6
  $option_name = empty( $_view['option_name'] ) ? '' : '';
7
  ?>
8
 
9
- <?php
10
- $this->_render(
11
- 'onpage/onpage-preview',
12
- array(
13
- 'link' => home_url(),
14
- 'title' => smartcrawl_replace_vars( $homepage_title, array() ),
15
- 'description' => smartcrawl_replace_vars( $homepage_description, array() ),
16
- )
17
- );
18
- ?>
19
 
20
  <?php if ( $show_homepage_options ) : ?>
21
 
6
  $option_name = empty( $_view['option_name'] ) ? '' : '';
7
  ?>
8
 
9
+ <?php $this->_render('onpage/onpage-preview'); ?>
 
 
 
 
 
 
 
 
 
10
 
11
  <?php if ( $show_homepage_options ) : ?>
12
 
includes/admin/templates/onpage/onpage-settings.php CHANGED
@@ -61,11 +61,9 @@
61
  'tab_sections' => array(
62
  array(
63
  'section_description' => __( 'Customize your homepage title, description and meta.', 'wds' ),
64
- 'section_type' => 'homepage',
65
  'section_template' => 'onpage/onpage-section-homepage',
66
  'section_args' => array(
67
- 'homepage_title' => $homepage_title,
68
- 'homepage_description' => $homepage_description,
69
  'show_homepage_options' => $show_homepage_options,
70
  'meta_robots_main_blog_archive' => $meta_robots_main_blog_archive,
71
  ),
61
  'tab_sections' => array(
62
  array(
63
  'section_description' => __( 'Customize your homepage title, description and meta.', 'wds' ),
64
+ 'section_type' => $show_homepage_options ? 'homepage' : 'static-homepage',
65
  'section_template' => 'onpage/onpage-section-homepage',
66
  'section_args' => array(
 
 
67
  'show_homepage_options' => $show_homepage_options,
68
  'meta_robots_main_blog_archive' => $meta_robots_main_blog_archive,
69
  ),
includes/admin/templates/progress-bar.php CHANGED
@@ -2,7 +2,7 @@
2
  $progress = empty( $progress ) ? 0 : $progress;
3
  ?>
4
 
5
- <div class="wds-progress">
6
  <span class="wds-progress-bar-current-percent"><?php echo (int) $progress; ?>%</span>
7
  <div class="wds-progress-bar">
8
  <div class="wds-progress-bar-inside" style="width:<?php echo (int) $progress; ?>%;"></div>
2
  $progress = empty( $progress ) ? 0 : $progress;
3
  ?>
4
 
5
+ <div class="wds-progress" data-progress="<?php echo (int) $progress; ?>">
6
  <span class="wds-progress-bar-current-percent"><?php echo (int) $progress; ?>%</span>
7
  <div class="wds-progress-bar">
8
  <div class="wds-progress-bar-inside" style="width:<?php echo (int) $progress; ?>%;"></div>
includes/admin/templates/settings/import-status-modal.php ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <dialog class="wds-modal wds-import-status-dialog"
2
+ id="wds-import-status"
3
+ title="<?php esc_attr_e( 'Import', 'wds' ); ?>">
4
+
5
+ <div class="wds-import-placeholder">
6
+ <?php $this->_render( 'settings/underscore-import-options' ); ?>
7
+ </div>
8
+ </dialog>
includes/admin/templates/settings/settings-section-import-export.php CHANGED
@@ -64,3 +64,4 @@
64
  </div>
65
  </div>
66
  </div>
 
64
  </div>
65
  </div>
66
  </div>
67
+ <?php $this->_render( 'settings/import-status-modal' ); ?>
includes/admin/templates/settings/underscore-import-error.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <p><?php esc_html_e( "We have encountered an error while importing your data. You may retry the import or contact our support if the problem persists.", 'wds' ); ?></p>
2
+ {{ if(error) { }}
3
+ <div class="wds-notice wds-notice-error">
4
+ <p>{{- error }}</p>
5
+ </div>
6
+ {{ } }}
7
+
8
+ <div class="action wds-box-footer">
9
+ <button type="button" class="button button-dark button-dark-o wds-import-skip">
10
+ <?php esc_html_e( 'Cancel', 'wds' ); ?>
11
+ </button>
12
+
13
+ <button class="button wds-import-main-action wds-reattempt-import">
14
+ <?php esc_html_e( 'Try Again', 'wds' ); ?>
15
+ </button>
16
+ </div>
includes/admin/templates/settings/underscore-import-options.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="box-content modal">
2
+ <p><?php printf( esc_html__( "Choose what you'd like to import from %s.", 'wds' ), '{{- plugin_name }}' ); ?></p>
3
+
4
+ <div class="wds-separator-top wds-import-item">
5
+ <?php $this->_render( 'toggle-item', array(
6
+ 'field_name' => 'import-options',
7
+ 'checked' => 'checked',
8
+ 'item_label' => esc_html__( 'Plugin Options', 'wds' ),
9
+ 'item_description' => sprintf( esc_html__( 'Import %s settings that are relevant to SmartCrawl.', 'wds' ), '{{- plugin_name }}' ),
10
+ ) ); ?>
11
+ </div>
12
+
13
+ <div class="wds-separator-top wds-import-item">
14
+ <?php
15
+ $this->_render( 'toggle-item', array(
16
+ 'field_name' => 'import-term-meta',
17
+ 'checked' => 'checked',
18
+ 'item_label' => esc_html__( 'Term Meta', 'wds' ),
19
+ 'item_description' => esc_html__( 'Import your title & meta settings for categories, tags and custom taxonomies.', 'wds' ),
20
+ ) );
21
+ ?>
22
+ </div>
23
+
24
+ <div class="wds-separator-top wds-import-item">
25
+ <?php
26
+ $this->_render( 'toggle-item', array(
27
+ 'field_name' => 'import-post-meta',
28
+ 'checked' => 'checked',
29
+ 'attributes' => array( 'data-dependent' => 'keep-existing-post-meta' ),
30
+ 'item_label' => esc_html__( 'Post Meta', 'wds' ),
31
+ 'item_description' => esc_html__( 'Import your title & meta settings for posts and pages.', 'wds' ),
32
+ ) );
33
+ ?>
34
+ </div>
35
+
36
+ <div class="wds-advanced-import-options">
37
+ <span><?php esc_html_e( 'Advanced', 'wds' ); ?></span>
38
+ <div class="wds-advanced-import-options-inner">
39
+ <div class="wds-separator-top wds-import-item">
40
+ <?php
41
+ $this->_render( 'toggle-item', array(
42
+ 'field_name' => 'keep-existing-post-meta',
43
+ 'checked' => '',
44
+ 'item_label' => esc_html__( 'Keep Existing Post Meta', 'wds' ),
45
+ 'item_description' => esc_html__( 'If you have already set up SmartCrawl on some posts and pages then enable this option to keep those values from getting overwritten.', 'wds' ),
46
+ ) );
47
+ ?>
48
+ </div>
49
+ </div>
50
+ </div>
51
+ </div>
52
+
53
+ <div class="action wds-box-footer">
54
+ <button type="button" class="button wds-import-main-action wds-import-start">
55
+ <?php esc_html_e( 'Begin Import', 'wds' ); ?>
56
+ </button>
57
+
58
+ <span class="wds-box-footer-description" type="button">
59
+ <?php esc_html_e( 'Note: Importing can take a while if you have a large amount of content on your website.', 'wds' ); ?>
60
+ </span>
61
+ </div>
includes/admin/templates/settings/underscore-import-progress.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <p><?php printf(esc_html__( 'Importing your %s settings, please keep this window open …', 'wds' ), '{{- plugin_name }}'); ?></p>
2
+ <?php if ( is_multisite() ): ?>
3
+ <div class="wds-site-progress">
4
+ <label class="wds-label"><?php esc_html_e('Overall Progress', 'wds'); ?></label>
5
+ <?php $this->_render( 'progress-bar', array(
6
+ 'progress' => 0,
7
+ ) ); ?>
8
+ </div>
9
+ <?php endif; ?>
10
+ <div class="wds-post-progress">
11
+ <?php if ( is_multisite() ): ?>
12
+ <label class="wds-label"><?php esc_html_e('Current Subsite', 'wds'); ?></label>
13
+ <?php endif; ?>
14
+ <?php $this->_render( 'progress-bar', array(
15
+ 'progress' => 0,
16
+ ) ); ?>
17
+ </div>
includes/admin/templates/settings/underscore-import-success.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <p><?php esc_html_e( 'All done!', 'wds' ); ?></p>
2
+ <div class="wds-notice wds-notice-success">
3
+ <p>
4
+ <?php printf( esc_html__( 'Your %s settings have been imported successfully and are now active.', 'wds' ), '{{- plugin_name }}' ); ?>
5
+ {{ if(deactivation_url) { }}
6
+ <?php printf( esc_html__( 'We highly recommend you deactivate %s to avoid potential conflicts.', 'wds' ), '{{- plugin_name }}' ); ?>
7
+ {{ } }}
8
+ </p>
9
+ </div>
10
+
11
+ <div class="action wds-box-footer">
12
+ <button type="button" class="button button-dark button-dark-o wds-import-skip">
13
+ <?php esc_html_e( 'Close', 'wds' ); ?>
14
+ </button>
15
+
16
+ {{ if(deactivation_url) { }}
17
+ <a class="button wds-import-main-action" href="{{= deactivation_url }}">
18
+ <?php esc_html_e( 'Deactivate', 'wds' ); ?> {{- plugin_name }}
19
+ </a>
20
+ {{ } }}
21
+ </div>
includes/admin/templates/settings/underscore-progress-reset.php ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ <?php $this->_render( 'progress-bar', array(
2
+ 'progress' => 0,
3
+ ) );
includes/admin/templates/sitemap/sitemap-section-settings.php CHANGED
@@ -30,8 +30,8 @@ $ignore_post_ids = empty( $ignore_post_ids ) ? '' : $ignore_post_ids;
30
  <p>
31
  <?php
32
  printf(
33
- esc_html__( 'Unable to write to sitemap file: <code>%s</code>', 'wds' ),
34
- esc_html( smartcrawl_get_sitemap_path() )
35
  );
36
  ?>
37
  </p>
30
  <p>
31
  <?php
32
  printf(
33
+ esc_html__( 'Unable to write to sitemap file: %s', 'wds' ),
34
+ sprintf( '<code>%s</code>', esc_html( smartcrawl_get_sitemap_path() ) )
35
  );
36
  ?>
37
  </p>
includes/admin/templates/sitemaps-dashboard-widget.php DELETED
@@ -1,71 +0,0 @@
1
- <div style='width:45%;float:left'>
2
- <div>
3
- <?php
4
- printf(
5
- esc_html__( 'Your sitemap contains %s.', 'wds' ),
6
- sprintf(
7
- '<a href="%1$s" target="_blank"><b>%2$d</b> %3$s</a>',
8
- esc_url( $sitemap_url ),
9
- (int) smartcrawl_get_array_value( $opts, 'items' ),
10
- esc_html__( 'items' )
11
- )
12
- );
13
- ?>
14
- </div>
15
- <br/><?php echo esc_html( $datetime ); ?>
16
- <p><a href='#update_sitemap' id='wds_update_now'><?php echo esc_html( $update_sitemap ); ?></a></p>
17
- </div>
18
-
19
- <div style='width:45%;float:right'>
20
- <?php if ( $engines ) { ?>
21
- <ul>
22
- <?php
23
- foreach ( $engines as $key => $engine ) {
24
- $service = ucfirst( $key );
25
- $edate = ! empty( $engine['time'] ) ? date( get_option( 'date_format' ), $engine['time'] ) : false;
26
- $etime = ! empty( $engine['time'] ) ? date( get_option( 'time_format' ), $engine['time'] ) : false;
27
- $edatetime = ( $edate && $etime ) ? sprintf( __( 'Last notified on %1$s, at %2$s.', 'wds' ), $date, $time ) : __( 'Not notified', 'wds' );
28
- ?>
29
- <li><b><?php echo esc_html( $service ); ?>:</b> <?php echo esc_html( $edatetime ); ?></li>
30
- <?php } ?>
31
-
32
- </ul>
33
-
34
- <?php } else { ?>
35
- <div><?php esc_html_e( "Search engines haven't been recently updated.", 'wds' ); ?></div>
36
- <?php } ?>
37
-
38
- <p><a href='#update_search_engines' id='wds_update_engines'><?php echo esc_html( $update_engines ); ?></a></p>
39
- </div>
40
- <div style='clear:both'></div>
41
-
42
- <script type="text/javascript">
43
- ;
44
- (function ($) {
45
- $(function () {
46
- $("#wds_update_now").click(function () {
47
- var me = $(this);
48
- me.html("<?php echo esc_js( $working ); ?>");
49
-
50
- $.post(ajaxurl, {"action": "wds_update_sitemap"}, function () {
51
- me.html("<?php echo esc_js( $done_msg ); ?>");
52
- window.location.reload();
53
- });
54
-
55
- return false;
56
- });
57
-
58
- $("#wds_update_engines").click(function () {
59
- var me = $(this);
60
- me.html("<?php echo esc_js( $working ); ?>");
61
-
62
- $.post(ajaxurl, {"action": "wds_update_engines"}, function () {
63
- me.html("<?php echo esc_js( $done_msg ); ?>");
64
- window.location.reload();
65
- });
66
-
67
- return false;
68
- });
69
- });
70
- })(jQuery);
71
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/admin/templates/social/social-section-twitter-cards.php CHANGED
@@ -51,7 +51,7 @@ $options = empty( $options ) ? $_view['options'] : $options;
51
  data-conditional-val="<?php echo esc_attr( Smartcrawl_Twitter_Printer::CARD_SUMMARY ); ?>">
52
  <?php
53
  $this->_render( 'social/social-twitter-embed', array(
54
- 'tweet_url' => 'https://twitter.com/_HassanAkhtar/status/875530001294270464',
55
  ) );
56
  ?>
57
  </div>
51
  data-conditional-val="<?php echo esc_attr( Smartcrawl_Twitter_Printer::CARD_SUMMARY ); ?>">
52
  <?php
53
  $this->_render( 'social/social-twitter-embed', array(
54
+ 'tweet_url' => 'https://twitter.com/WordPress/status/1046731890244374528',
55
  ) );
56
  ?>
57
  </div>
includes/admin/templates/social/social-twitter-embed.php CHANGED
@@ -19,7 +19,7 @@ if ( ! $tweet_url ) {
19
  /**
20
  * @var WP_Embed $wp_embed
21
  */
22
- echo wp_kses_post( $wp_embed->autoembed( $tweet_url ) );
23
  ?>
24
  <?php endwhile; ?>
25
  <?php wp_reset_postdata(); ?>
19
  /**
20
  * @var WP_Embed $wp_embed
21
  */
22
+ echo $wp_embed->autoembed( $tweet_url ); // phpcs:ignore -- The embed won't work if escaped
23
  ?>
24
  <?php endwhile; ?>
25
  <?php wp_reset_postdata(); ?>
includes/admin/templates/term-additions-form.php CHANGED
@@ -1,3 +1,7 @@
 
 
 
 
1
  <h2><?php esc_html_e( 'SmartCrawl Settings ', 'wds' ); ?></h2>
2
  <table class="form-table">
3
 
@@ -25,7 +29,7 @@
25
  $options = Smartcrawl_Settings::get_options();
26
  ?>
27
 
28
- <?php if ( ! empty( $options['og-enable'] ) ) { ?>
29
  <tr class="form-field">
30
  <th scope="row" valign="top"><label for=""><?php esc_html_e( 'OpenGraph', 'wds' ); ?></label></th>
31
  <td>
@@ -43,13 +47,9 @@
43
  'disabled' => false,
44
  ) );
45
 
46
- $ogp = Smartcrawl_OpenGraph_Printer::get();
47
-
48
- $default_title = $ogp->get_generic_og_tag_value( 'og-title', $taxonomy );
49
- $default_title = ! empty( $default_title ) ? $default_title : $term->name;
50
-
51
- $default_metadesc = $ogp->get_generic_og_tag_value( 'og-description', $taxonomy );
52
- $default_metadesc = ! empty( $default_metadesc ) ? $default_metadesc : $term->name;
53
 
54
  $og_meta_disabled = (bool) smartcrawl_get_array_value( $og, 'disabled' );
55
  ?>
@@ -74,11 +74,11 @@
74
  class="wds-label"><?php esc_html_e( 'Title', 'wds' ); ?></label>
75
  </div>
76
  <div class="fields">
77
- <input type="text"
78
- id="og-title"
79
- name="wds-opengraph[title]"
80
- placeholder="<?php echo $og['title'] ? '' : esc_attr( smartcrawl_replace_vars( $default_title, (array) $term ) ); ?>"
81
- value="<?php echo esc_attr( $og['title'] ); ?>"/>
82
  </div>
83
  </div>
84
 
@@ -89,8 +89,8 @@
89
  </div>
90
  <div class="fields">
91
  <textarea name="wds-opengraph[description]"
92
- placeholder="<?php echo $og['description'] ? '' : esc_attr( smartcrawl_replace_vars( $default_metadesc, (array) $term ) ); ?>"
93
- id="og-description"><?php echo esc_textarea( $og['description'] ); ?></textarea>
94
  </div>
95
  </div>
96
 
@@ -125,10 +125,10 @@
125
  </div>
126
  </td>
127
  <tr>
128
- <?php } ?>
129
 
130
 
131
- <?php if ( ! empty( $options['twitter-card-enable'] ) ) { ?>
132
  <tr class="form-field">
133
  <th scope="row" valign="top"><label for=""><?php esc_html_e( 'Twitter', 'wds' ); ?></label></th>
134
  <td>
@@ -144,6 +144,9 @@
144
  'description' => false,
145
  'disabled' => false,
146
  ) );
 
 
 
147
 
148
  $twitter_meta_disabled = (bool) smartcrawl_get_array_value( $twitter, 'disabled' );
149
  ?>
@@ -170,7 +173,7 @@
170
  <input type="text"
171
  id="twitter-title"
172
  name="wds-twitter[title]"
173
- placeholder="<?php echo $twitter['title'] ? '' : esc_attr( smartcrawl_replace_vars( $term->name ) ); ?>"
174
  value="<?php echo esc_attr( $twitter['title'] ); ?>"/>
175
  </div>
176
  </div>
@@ -182,7 +185,7 @@
182
  </div>
183
  <div class="fields">
184
  <textarea name="wds-twitter[description]"
185
- placeholder="<?php echo $twitter['description'] ? '' : esc_attr( smartcrawl_replace_vars( $term->name ) ); ?>"
186
  id="twitter-description"><?php echo esc_textarea( $twitter['description'] ); ?></textarea>
187
  </div>
188
  </div>
@@ -220,3 +223,5 @@
220
  <?php } ?>
221
 
222
  </table>
 
 
1
+ <?php
2
+ $resolver = Smartcrawl_Endpoint_Resolver::resolve();
3
+ $resolver->simulate_taxonomy_term( $term );
4
+ ?>
5
  <h2><?php esc_html_e( 'SmartCrawl Settings ', 'wds' ); ?></h2>
6
  <table class="form-table">
7
 
29
  $options = Smartcrawl_Settings::get_options();
30
  ?>
31
 
32
+ <?php if ( ! empty( $options['og-enable'] ) && ! empty( $smartcrawl_options["og-active-{$term->taxonomy}"] ) ) { ?>
33
  <tr class="form-field">
34
  <th scope="row" valign="top"><label for=""><?php esc_html_e( 'OpenGraph', 'wds' ); ?></label></th>
35
  <td>
47
  'disabled' => false,
48
  ) );
49
 
50
+ $value_helper = new Smartcrawl_OpenGraph_Value_Helper();
51
+ $default_title = $value_helper->get_title();
52
+ $default_metadesc = $value_helper->get_description();
 
 
 
 
53
 
54
  $og_meta_disabled = (bool) smartcrawl_get_array_value( $og, 'disabled' );
55
  ?>
74
  class="wds-label"><?php esc_html_e( 'Title', 'wds' ); ?></label>
75
  </div>
76
  <div class="fields">
77
+ <input type="text"
78
+ id="og-title"
79
+ name="wds-opengraph[title]"
80
+ placeholder="<?php echo $og['title'] ? '' : esc_attr( $default_title ); ?>"
81
+ value="<?php echo esc_attr( $og['title'] ); ?>"/>
82
  </div>
83
  </div>
84
 
89
  </div>
90
  <div class="fields">
91
  <textarea name="wds-opengraph[description]"
92
+ placeholder="<?php echo $og['description'] ? '' : esc_attr( $default_metadesc ); ?>"
93
+ id="og-description"><?php echo esc_textarea( $og['description'] ); ?></textarea>
94
  </div>
95
  </div>
96
 
125
  </div>
126
  </td>
127
  <tr>
128
+ <?php } ?>
129
 
130
 
131
+ <?php if ( ! empty( $options['twitter-card-enable'] ) && ! empty( $smartcrawl_options["twitter-active-{$term->taxonomy}"] ) ) { ?>
132
  <tr class="form-field">
133
  <th scope="row" valign="top"><label for=""><?php esc_html_e( 'Twitter', 'wds' ); ?></label></th>
134
  <td>
144
  'description' => false,
145
  'disabled' => false,
146
  ) );
147
+ $twitter_printer = Smartcrawl_Twitter_Printer::get();
148
+ $default_twitter_title = $twitter_printer->get_title_content();
149
+ $default_twitter_metadesc = $twitter_printer->get_description_content();
150
 
151
  $twitter_meta_disabled = (bool) smartcrawl_get_array_value( $twitter, 'disabled' );
152
  ?>
173
  <input type="text"
174
  id="twitter-title"
175
  name="wds-twitter[title]"
176
+ placeholder="<?php echo $twitter['title'] ? '' : esc_attr( $default_twitter_title ); ?>"
177
  value="<?php echo esc_attr( $twitter['title'] ); ?>"/>
178
  </div>
179
  </div>
185
  </div>
186
  <div class="fields">
187
  <textarea name="wds-twitter[description]"
188
+ placeholder="<?php echo $twitter['description'] ? '' : esc_attr( $default_twitter_metadesc ); ?>"
189
  id="twitter-description"><?php echo esc_textarea( $twitter['description'] ); ?></textarea>
190
  </div>
191
  </div>
223
  <?php } ?>
224
 
225
  </table>
226
+ <?php $resolver->stop_simulation(); ?>
227
+
includes/admin/templates/upsell-modal.php CHANGED
@@ -20,7 +20,7 @@
20
  </li>
21
  <li>
22
  <span class="wds-strong-text"><?php esc_attr_e( 'Smush Pro', 'wds' ); ?></span>
23
- <p class="wds-small-text"><?php esc_attr_e( 'A membership for Hummingbird Pro also gets you the award winning Smush Pro with unlimited advanced lossy compression that’ll give image heavy websites a speed boost.', 'wds' ); ?></p>
24
  </li>
25
  </ul>
26
 
20
  </li>
21
  <li>
22
  <span class="wds-strong-text"><?php esc_attr_e( 'Smush Pro', 'wds' ); ?></span>
23
+ <p class="wds-small-text"><?php esc_attr_e( 'A membership for SmartCrawl Pro also gets you the award winning Smush Pro with unlimited advanced lossy compression that’ll give image heavy websites a speed boost.', 'wds' ); ?></p>
24
  </li>
25
  </ul>
26
 
includes/admin/templates/wp-dashboard/sitemaps-widget-js.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $updating = empty( $updating ) ? '' : $updating;
3
+ $updated = empty( $updated ) ? '' : $updated;
4
+ $notifying = empty( $notifying ) ? '' : $notifying;
5
+ $notified = empty( $notified ) ? '' : $notified;
6
+ ?>
7
+ <script type="text/javascript">
8
+ ;(function ($) {
9
+ $(function () {
10
+ $("#wds_update_now").click(function () {
11
+ var me = $(this);
12
+ me.html("<?php echo esc_js( $updating ); ?>");
13
+
14
+ $.post(ajaxurl, {"action": "wds_update_sitemap"}, function () {
15
+ me.html("<?php echo esc_js( $updated ); ?>");
16
+ window.location.reload();
17
+ });
18
+
19
+ return false;
20
+ });
21
+
22
+ $("#wds_update_engines").click(function () {
23
+ var me = $(this);
24
+ me.html("<?php echo esc_js( $notifying ); ?>");
25
+
26
+ $.post(ajaxurl, {"action": "wds_update_engines"}, function () {
27
+ me.html("<?php echo esc_js( $notified ); ?>");
28
+ window.location.reload();
29
+ });
30
+
31
+ return false;
32
+ });
33
+ });
34
+ })(jQuery);
35
+ </script>
includes/admin/templates/wp-dashboard/sitemaps-widget.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $last_update_date = empty( $last_update_date ) ? '' : $last_update_date;
3
+ $last_update_time = empty( $last_update_time ) ? '' : $last_update_time;
4
+ $last_update_timestamp = empty( $last_update_timestamp ) ? '' : $last_update_timestamp;
5
+ $se_notifications_enabled = empty( $se_notifications_enabled ) ? '' : $se_notifications_enabled;
6
+ $engines = empty( $engines ) ? array() : $engines;
7
+ $sitemap_stats = empty( $sitemap_stats ) ? array() : $sitemap_stats;
8
+ ?>
9
+
10
+ <div class="wpmud wds-sitemaps-widget">
11
+ <div class="wds-sitemaps-widget-left">
12
+ <div>
13
+ <?php
14
+ printf(
15
+ esc_html__( 'Your sitemap contains %s.', 'wds' ),
16
+ sprintf(
17
+ '<a href="%1$s" target="_blank"><b>%2$d</b> %3$s</a>',
18
+ esc_attr( smartcrawl_get_sitemap_url() ),
19
+ (int) smartcrawl_get_array_value( $sitemap_stats, 'items' ),
20
+ esc_html__( 'items' )
21
+ )
22
+ );
23
+ ?>
24
+ </div>
25
+ <p>
26
+ <?php echo esc_html( $last_update_timestamp ); ?>
27
+ </p>
28
+ <p>
29
+ <a href='#update_sitemap' id='wds_update_now'><?php echo esc_html__( 'Update sitemap now', 'wds' ); ?></a>
30
+ </p>
31
+ </div>
32
+
33
+ <div class="wds-sitemaps-widget-right">
34
+ <?php if ( $engines ) { ?>
35
+ <ul>
36
+ <?php
37
+ foreach ( $engines as $key => $engine ) {
38
+ $service_name = ucfirst( $key );
39
+ $engine_date = ! empty( $engine['time'] ) ? date_i18n( get_option( 'date_format' ), $engine['time'] ) : false;
40
+ $engine_time = ! empty( $engine['time'] ) ? date_i18n( get_option( 'time_format' ), $engine['time'] ) : false;
41
+ $engine_timestamp = ( $engine_date && $engine_time ) ? sprintf( __( 'Last notified on %1$s, at %2$s.', 'wds' ), $engine_date, $engine_time ) : __( 'Not notified', 'wds' );
42
+ ?>
43
+ <li>
44
+ <b><?php echo esc_html( $service_name ); ?>:</b> <?php echo esc_html( $engine_timestamp ); ?>
45
+ </li>
46
+ <?php } ?>
47
+
48
+ </ul>
49
+
50
+ <?php } else { ?>
51
+ <div><?php esc_html_e( "Search engines haven't been recently updated.", 'wds' ); ?></div>
52
+ <?php } ?>
53
+
54
+ <?php if ( $se_notifications_enabled ): ?>
55
+ <p>
56
+ <a href='#update_search_engines' id='wds_update_engines'>
57
+ <?php echo esc_html__( 'Force search engines notification', 'wds' ); ?>
58
+ </a>
59
+ </p>
60
+ <?php else: ?>
61
+ <p><?php esc_html_e( 'Search engine notifications are disabled. You can enable them in the sitemap settings.', 'wds' ); ?></p>
62
+ <?php endif; ?>
63
+ </div>
64
+ </div>
includes/core/checks/class-wds-check-keywords-used.php CHANGED
@@ -94,7 +94,7 @@ class Smartcrawl_Check_Keywords_Used extends Smartcrawl_Check_Post_Abstract {
94
  <br/><br/>
95
 
96
  <?php printf(
97
- '%s <a href=\'https://premium.wpmudev.org/blog/wordpress-canonicalization-guide/\' target=\'_blank\'>%s</a>.',
98
  esc_html__( "Note: If you happen to have two pages with the same content, it's important to tell search engines which one to show in search results using the Canonical URL feature. You can read more about this", 'wds' ),
99
  esc_html__( 'here' )
100
  ); ?>
94
  <br/><br/>
95
 
96
  <?php printf(
97
+ "%s <a href='https://premium.wpmudev.org/blog/wordpress-canonicalization-guide/' target='_blank'>%s</a>.",
98
  esc_html__( "Note: If you happen to have two pages with the same content, it's important to tell search engines which one to show in search results using the Canonical URL feature. You can read more about this", 'wds' ),
99
  esc_html__( 'here' )
100
  ); ?>
includes/core/checks/class-wds-check-metadesc-length.php CHANGED
@@ -18,7 +18,7 @@ class Smartcrawl_Check_Metadesc_Length extends Smartcrawl_Check_Post_Abstract {
18
 
19
  public function get_status_msg() {
20
  if ( ! is_numeric( $this->_state ) ) {
21
- return __( 'Description is a good length', 'wds' );
22
  }
23
 
24
  return 0 === $this->_state
18
 
19
  public function get_status_msg() {
20
  if ( ! is_numeric( $this->_state ) ) {
21
+ return __( 'Description has a good length', 'wds' );
22
  }
23
 
24
  return 0 === $this->_state
includes/core/checks/class-wds-check-subheadings-keywords.php CHANGED
@@ -16,10 +16,10 @@ class Smartcrawl_Check_Subheadings_Keywords extends Smartcrawl_Check_Abstract {
16
  return true;
17
  } // No subheadings, nothing to check.
18
 
19
- $status = true;
20
  foreach ( $subjects as $subject ) {
21
  $status = $this->has_focus( $subject );
22
- if ( ! $status ) {
23
  break;
24
  }
25
  }
16
  return true;
17
  } // No subheadings, nothing to check.
18
 
19
+ $status = false;
20
  foreach ( $subjects as $subject ) {
21
  $status = $this->has_focus( $subject );
22
+ if ( $status ) {
23
  break;
24
  }
25
  }
includes/core/checks/class-wds-check-title-length.php CHANGED
@@ -12,7 +12,7 @@ class Smartcrawl_Check_Title_Length extends Smartcrawl_Check_Post_Abstract {
12
 
13
  public function get_status_msg() {
14
  if ( ! is_numeric( $this->_state ) ) {
15
- return __( 'Title is a good length', 'wds' );
16
  }
17
 
18
  return 0 === $this->_state
12
 
13
  public function get_status_msg() {
14
  if ( ! is_numeric( $this->_state ) ) {
15
+ return __( 'Title has a good length', 'wds' );
16
  }
17
 
18
  return 0 === $this->_state
includes/core/class-wds-aioseop-importer.php CHANGED
@@ -23,7 +23,7 @@ class Smartcrawl_AIOSEOP_Importer extends Smartcrawl_Importer {
23
  return false;
24
  }
25
 
26
- return strpos( $version, '2.' ) === 0;
27
  }
28
 
29
  public function import_options() {
@@ -339,6 +339,11 @@ class Smartcrawl_AIOSEOP_Importer extends Smartcrawl_Importer {
339
  $this->import_post_meta_opengraph( $post_id );
340
  }
341
 
 
 
 
 
 
342
  return count( $all_posts ) === count( $batch_posts );
343
  }
344
 
@@ -462,6 +467,9 @@ class Smartcrawl_AIOSEOP_Importer extends Smartcrawl_Importer {
462
  'instagram.com' => 'instagram_url',
463
  'linkedin.com' => 'linkedin_url',
464
  'plus.google' => 'gplus_url',
 
 
 
465
  );
466
  $social_links = empty( $source_value ) ? array() : explode( "\n", $source_value );
467
 
@@ -670,4 +678,11 @@ class Smartcrawl_AIOSEOP_Importer extends Smartcrawl_Importer {
670
 
671
  return ! $use_home_meta_as_social;
672
  }
 
 
 
 
 
 
 
673
  }
23
  return false;
24
  }
25
 
26
+ return strpos( $version, '2.9' ) === 0;
27
  }
28
 
29
  public function import_options() {
339
  $this->import_post_meta_opengraph( $post_id );
340
  }
341
 
342
+ $this->update_status( array(
343
+ 'remaining_posts' => count( $this->get_posts_with_aioseop_metas() ),
344
+ 'completed_posts' => count( $this->get_posts_with_target_metas() ),
345
+ ) );
346
+
347
  return count( $all_posts ) === count( $batch_posts );
348
  }
349
 
467
  'instagram.com' => 'instagram_url',
468
  'linkedin.com' => 'linkedin_url',
469
  'plus.google' => 'gplus_url',
470
+ 'pinterest.com' => 'pinterest_url',
471
+ 'youtu.be' => 'youtube_url',
472
+ 'youtube.com' => 'youtube_url',
473
  );
474
  $social_links = empty( $source_value ) ? array() : explode( "\n", $source_value );
475
 
678
 
679
  return ! $use_home_meta_as_social;
680
  }
681
+
682
+ protected function get_source_plugins() {
683
+ return array(
684
+ 'all-in-one-seo-pack/all_in_one_seo_pack.php',
685
+ 'all-in-one-seo-pack-pro/all_in_one_seo_pack.php',
686
+ );
687
+ }
688
  }
includes/core/class-wds-canonical-value-helper.php ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Smartcrawl_Canonical_Value_Helper extends Smartcrawl_Type_Traverser {
4
+
5
+ /**
6
+ * @var string
7
+ */
8
+ private $canonical;
9
+
10
+ public function __construct() {
11
+ $this->traverse();
12
+ }
13
+
14
+ public function get_canonical() {
15
+ return apply_filters( 'wds_filter_canonical', $this->canonical );
16
+ }
17
+
18
+ public function handle_bp_groups() {
19
+ $this->canonical = bp_get_group_link( bp_get_group_id() );
20
+ }
21
+
22
+ public function handle_bp_profile() {
23
+ $this->canonical = bp_get_displayed_user_link();
24
+ }
25
+
26
+ public function handle_woo_shop() {
27
+ $this->handle_singular( wc_get_page_id( 'shop' ) );
28
+ }
29
+
30
+ public function handle_blog_home() {
31
+ $this->canonical = trailingslashit( get_bloginfo( 'url' ) );
32
+ }
33
+
34
+ public function handle_static_home() {
35
+ $this->handle_singular( get_option( 'page_for_posts' ) );
36
+ }
37
+
38
+ public function handle_search() {
39
+ // Not needed
40
+ }
41
+
42
+ public function handle_404() {
43
+ // Not needed
44
+ }
45
+
46
+ public function handle_date_archive() {
47
+ $wp_query = $this->get_query_context();
48
+
49
+ $requested_year = $wp_query->get( 'year' );
50
+ $requested_month = $wp_query->get( 'monthnum' );
51
+ $date_callback = ! empty( $requested_year ) && empty( $requested_month )
52
+ ? 'get_year_link'
53
+ : 'get_month_link';
54
+ $this->canonical = $date_callback( $requested_year, $requested_month );
55
+
56
+ $this->append_page_number();
57
+ }
58
+
59
+ public function handle_pt_archive() {
60
+ /**
61
+ * @var $post_type WP_Post_Type
62
+ */
63
+ $post_type = $this->get_queried_object();
64
+ if ( is_a( $post_type, 'WP_Post_Type' ) ) {
65
+ $this->canonical = get_post_type_archive_link( $post_type->name );
66
+
67
+ $this->append_page_number();
68
+ }
69
+ }
70
+
71
+ public function handle_tax_archive() {
72
+ $wp_query = $this->get_query_context();
73
+ $term = $wp_query->get_queried_object();
74
+ $canonical = smartcrawl_get_term_meta( $term, $term->taxonomy, 'wds_canonical' );
75
+ $this->canonical = $canonical ? $canonical : get_term_link( $term, $term->taxonomy );
76
+
77
+ $this->append_page_number();
78
+ }
79
+
80
+ public function handle_author_archive() {
81
+ $user = $this->get_queried_object();
82
+ $this->canonical = get_author_posts_url( $user->ID );
83
+
84
+ $this->append_page_number();
85
+ }
86
+
87
+ public function handle_archive() {
88
+ // Not needed. More specific archives handled already.
89
+ }
90
+
91
+ public function handle_singular( $post_id = 0 ) {
92
+ $post = $post_id ? get_post( $post_id ) : null;
93
+ if ( ! $post ) {
94
+ $post = $this->get_context();
95
+ }
96
+
97
+ $canonical = smartcrawl_get_value( 'canonical', $post->ID );
98
+ if ( empty( $canonical ) ) {
99
+ $canonical = $this->get_post_canonical( $post->ID );
100
+ }
101
+
102
+ $this->canonical = $canonical;
103
+ }
104
+
105
+ private function get_post_canonical( $id ) {
106
+ $link = get_permalink( $id );
107
+ $query = $this->get_query_context();
108
+ $comment_page = $query->get( 'cpage' );
109
+ if ( $comment_page ) {
110
+ $link = get_comments_pagenum_link( $comment_page );
111
+ }
112
+
113
+ return $link;
114
+ }
115
+
116
+ private function append_page_number() {
117
+ /**
118
+ * @var $wp_rewrite WP_Rewrite
119
+ */
120
+ global $wp_rewrite;
121
+
122
+ $wp_query = $this->get_query_context();
123
+ $paged = $wp_query->get( 'paged', 1 );
124
+
125
+ if ( $paged > 1 ) {
126
+ if ( $wp_rewrite->using_permalinks() ) {
127
+ $this->canonical = trailingslashit( $this->canonical ) . sprintf( $wp_rewrite->pagination_base . '/%d/', $paged );
128
+ } else {
129
+ $this->canonical = esc_url_raw( add_query_arg( 'paged', $paged, $this->canonical ) );
130
+ }
131
+ }
132
+ }
133
+ }
includes/core/class-wds-compatibility.php ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class Smartcrawl_Compatibility
5
+ *
6
+ * Fixes third-party compatibility issues
7
+ */
8
+ class Smartcrawl_Compatibility {
9
+ /**
10
+ * Singleton instance
11
+ *
12
+ * @var Smartcrawl_Compatibility
13
+ */
14
+ private static $_instance;
15
+
16
+ /**
17
+ * Currently running state flag
18
+ *
19
+ * @var bool
20
+ */
21
+ private $_is_running = false;
22
+
23
+ /**
24
+ * Constructor
25
+ */
26
+ private function __construct() {
27
+ }
28
+
29
+ /**
30
+ * Boot controller listeners
31
+ *
32
+ * Do it only once, if they're already up do nothing
33
+ *
34
+ * @return bool Status
35
+ */
36
+ public static function run() {
37
+ $me = self::get();
38
+ if ( $me->is_running() ) {
39
+ return false;
40
+ }
41
+
42
+ return $me->_add_hooks();
43
+ }
44
+
45
+ /**
46
+ * Obtain instance without booting up
47
+ *
48
+ * @return Smartcrawl_Compatibility instance
49
+ */
50
+ public static function get() {
51
+ if ( empty( self::$_instance ) ) {
52
+ self::$_instance = new self();
53
+ }
54
+
55
+ return self::$_instance;
56
+ }
57
+
58
+ /**
59
+ * Check if we already have the actions bound
60
+ *
61
+ * @return bool Status
62
+ */
63
+ public function is_running() {
64
+ return $this->_is_running;
65
+ }
66
+
67
+ /**
68
+ * Bind listening actions
69
+ *
70
+ * @return bool
71
+ */
72
+ private function _add_hooks() {
73
+ add_action( 'init', array( $this, 'load_divi_in_ajax' ), - 10 );
74
+ add_action( 'init', array( $this, 'load_wp_bakery_shortcodes' ), - 10 );
75
+ add_filter( 'wds-omitted-shortcodes', array( $this, 'avada_omitted_shortcodes' ) );
76
+ add_filter( 'wds-omitted-shortcodes', array( $this, 'divi_omitted_shortcodes' ) );
77
+ add_filter( 'wds-omitted-shortcodes', array( $this, 'wpbakery_omitted_shortcodes' ) );
78
+ add_filter( 'wds-omitted-shortcodes', array( $this, 'swift_omitted_shortcodes' ) );
79
+
80
+ $this->_is_running = true;
81
+
82
+ return true;
83
+ }
84
+
85
+ public function avada_omitted_shortcodes( $omitted ) {
86
+ return array_merge( $omitted, array(
87
+ 'fusion_code',
88
+ 'fusion_imageframe',
89
+ 'fusion_slide',
90
+ 'fusion_syntax_highlighter',
91
+ ) );
92
+ }
93
+
94
+ public function divi_omitted_shortcodes( $omitted ) {
95
+ return array_merge( $omitted, array(
96
+ 'et_pb_code',
97
+ 'et_pb_fullwidth_code',
98
+ ) );
99
+ }
100
+
101
+ public function wpbakery_omitted_shortcodes( $omitted ) {
102
+ return array_merge( $omitted, array(
103
+ 'vc_raw_js',
104
+ 'vc_raw_html',
105
+ ) );
106
+ }
107
+
108
+ public function swift_omitted_shortcodes( $omitted ) {
109
+ return array_merge( $omitted, array(
110
+ 'spb_raw_js',
111
+ 'spb_raw_html',
112
+ ) );
113
+ }
114
+
115
+ /**
116
+ * Divi doesn't usually load its shortcodes during ajax requests but we need these shortcodes in order to
117
+ * render an accurate preview.
118
+ *
119
+ * Force Divi to load during our requests.
120
+ */
121
+ public function load_divi_in_ajax() {
122
+ if ( $this->is_preview_request() ) {
123
+ $_POST['et_load_builder_modules'] = '1';
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Force WPBakery to load its shortcodes so we can render an accurate preview
129
+ */
130
+ public function load_wp_bakery_shortcodes() {
131
+ if ( $this->is_preview_request() ) {
132
+ $load_shortcodes_callback = array(
133
+ 'WPBMap',
134
+ 'addAllMappedShortcodes',
135
+ );
136
+
137
+ if ( is_callable( $load_shortcodes_callback ) ) {
138
+ add_action( 'init', $load_shortcodes_callback );
139
+ }
140
+ }
141
+ }
142
+
143
+ private function is_preview_request() {
144
+ return is_admin()
145
+ && smartcrawl_is_switch_active( 'DOING_AJAX' )
146
+ && isset( $_POST['_wds_nonce'] )
147
+ && (
148
+ wp_verify_nonce( $_POST['_wds_nonce'], 'wds-metabox-nonce' )
149
+ || wp_verify_nonce( $_POST['_wds_nonce'], 'wds-onpage-nonce' )
150
+ );
151
+ }
152
+ }
includes/core/class-wds-controller-analysis.php CHANGED
@@ -79,9 +79,6 @@ class Smartcrawl_Controller_Analysis extends Smartcrawl_Renderable {
79
  * @return bool
80
  */
81
  private function _add_hooks() {
82
- // Run fresh analysis on each post save.
83
- add_action( 'save_post', array( $this, 'analyze_post' ) );
84
-
85
  // Fetch analysis data via AJAX POST request.
86
  add_action( 'wp_ajax_wds-analysis-get-data', array( $this, 'json_get_post_analysis_data' ) );
87
  add_action( 'wp_ajax_wds-analysis-get-markup', array( $this, 'json_get_post_analysis_markup' ) );
@@ -130,7 +127,6 @@ class Smartcrawl_Controller_Analysis extends Smartcrawl_Renderable {
130
  * @return bool
131
  */
132
  private function _remove_hooks() {
133
- remove_action( 'save_post', array( $this, 'analyze_post' ) );
134
  remove_action( 'wp_ajax_wds-analysis-get-data', array( $this, 'json_get_post_analysis_data' ) );
135
  remove_action( 'wp_ajax_wds-analysis-get-markup', array( $this, 'json_get_post_analysis_markup' ) );
136
  remove_action( 'wp_ajax_wds-analysis-recheck', array( $this, 'json_get_post_analysis_recheck' ) );
@@ -536,6 +532,12 @@ class Smartcrawl_Controller_Analysis extends Smartcrawl_Renderable {
536
  return true;
537
  }
538
 
 
 
 
 
 
 
539
  /**
540
  * Update post analysis data
541
  *
@@ -547,7 +549,11 @@ class Smartcrawl_Controller_Analysis extends Smartcrawl_Renderable {
547
  * @return bool Status
548
  */
549
  public function analyze_post( $post_id ) {
550
- if ( empty( $post_id ) || ! is_numeric( $post_id ) ) {
 
 
 
 
551
  return false;
552
  }
553
 
79
  * @return bool
80
  */
81
  private function _add_hooks() {
 
 
 
82
  // Fetch analysis data via AJAX POST request.
83
  add_action( 'wp_ajax_wds-analysis-get-data', array( $this, 'json_get_post_analysis_data' ) );
84
  add_action( 'wp_ajax_wds-analysis-get-markup', array( $this, 'json_get_post_analysis_markup' ) );
127
  * @return bool
128
  */
129
  private function _remove_hooks() {
 
130
  remove_action( 'wp_ajax_wds-analysis-get-data', array( $this, 'json_get_post_analysis_data' ) );
131
  remove_action( 'wp_ajax_wds-analysis-get-markup', array( $this, 'json_get_post_analysis_markup' ) );
132
  remove_action( 'wp_ajax_wds-analysis-recheck', array( $this, 'json_get_post_analysis_recheck' ) );
532
  return true;
533
  }
534
 
535
+ private function post_type_requires_analysis( $post_id ) {
536
+ $post_type = get_post_type_object( get_post_type( $post_id ) );
537
+
538
+ return $post_type->name === 'revision' || $post_type->public;
539
+ }
540
+
541
  /**
542
  * Update post analysis data
543
  *
549
  * @return bool Status
550
  */
551
  public function analyze_post( $post_id ) {
552
+ if (
553
+ empty( $post_id )
554
+ || ! is_numeric( $post_id )
555
+ || ! $this->post_type_requires_analysis( $post_id )
556
+ ) {
557
  return false;
558
  }
559
 
includes/core/class-wds-controller-io.php CHANGED
@@ -284,18 +284,16 @@ class Smartcrawl_Controller_IO extends Smartcrawl_WorkUnit {
284
  }
285
 
286
  public function import_yoast_data() {
287
- $this->do_import( new Smartcrawl_Yoast_Importer(), 'yoast' );
 
288
  }
289
 
290
  /**
291
  * @param $importer Smartcrawl_Importer
292
  * @param $plugin
293
  */
294
- private function do_import( $importer, $plugin ) {
295
- $result = array(
296
- 'success' => false,
297
- 'url' => $this->get_success_url( $plugin ),
298
- );
299
 
300
  if ( ! $this->user_has_permission_to_import() ) {
301
  $result['message'] = __( "You don't have permission to perform this operation.", 'wds' );
@@ -308,22 +306,20 @@ class Smartcrawl_Controller_IO extends Smartcrawl_WorkUnit {
308
  }
309
 
310
  if ( is_multisite() ) {
311
- $importer->import_for_all_sites();
312
  $in_progress = $importer->is_network_import_in_progress();
313
  } else {
314
- $importer->import();
315
  $in_progress = $importer->is_import_in_progress();
316
  }
317
  $result['success'] = true;
318
  $result['in_progress'] = $in_progress;
 
 
319
 
320
  die( wp_json_encode( $result ) );
321
  }
322
 
323
- private function get_success_url( $plugin ) {
324
- return Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_SETTINGS ) . "&imported=true&plugin={$plugin}#tab_import_export";
325
- }
326
-
327
  private function user_has_permission_to_import() {
328
  if ( ! is_network_admin() && ! is_admin() ) {
329
  return false;
@@ -339,7 +335,8 @@ class Smartcrawl_Controller_IO extends Smartcrawl_WorkUnit {
339
  }
340
 
341
  public function import_aioseop_data() {
342
- $this->do_import( new Smartcrawl_AIOSEOP_Importer(), 'aioseop' );
 
343
  }
344
 
345
  private function get_request_data() {
@@ -353,5 +350,13 @@ class Smartcrawl_Controller_IO extends Smartcrawl_WorkUnit {
353
 
354
  return array();
355
  }
 
 
 
 
 
 
 
 
356
  }
357
 
284
  }
285
 
286
  public function import_yoast_data() {
287
+ $options = $this->get_import_options_from_request();
288
+ $this->do_import( new Smartcrawl_Yoast_Importer(), $options );
289
  }
290
 
291
  /**
292
  * @param $importer Smartcrawl_Importer
293
  * @param $plugin
294
  */
295
+ private function do_import( $importer, $options = array() ) {
296
+ $result = array( 'success' => false );
 
 
 
297
 
298
  if ( ! $this->user_has_permission_to_import() ) {
299
  $result['message'] = __( "You don't have permission to perform this operation.", 'wds' );
306
  }
307
 
308
  if ( is_multisite() ) {
309
+ $importer->import_for_all_sites( $options );
310
  $in_progress = $importer->is_network_import_in_progress();
311
  } else {
312
+ $importer->import( $options );
313
  $in_progress = $importer->is_import_in_progress();
314
  }
315
  $result['success'] = true;
316
  $result['in_progress'] = $in_progress;
317
+ $result['status'] = $importer->get_status();
318
+ $result['deactivation_url'] = $importer->get_deactivation_link();
319
 
320
  die( wp_json_encode( $result ) );
321
  }
322
 
 
 
 
 
323
  private function user_has_permission_to_import() {
324
  if ( ! is_network_admin() && ! is_admin() ) {
325
  return false;
335
  }
336
 
337
  public function import_aioseop_data() {
338
+ $options = $this->get_import_options_from_request();
339
+ $this->do_import( new Smartcrawl_AIOSEOP_Importer(), $options );
340
  }
341
 
342
  private function get_request_data() {
350
 
351
  return array();
352
  }
353
+
354
+ private function get_import_options_from_request() {
355
+ $request_data = $this->get_request_data();
356
+ $options = smartcrawl_get_array_value( $request_data, 'items_to_import' );
357
+ $options['force-restart'] = (boolean) smartcrawl_get_array_value( $request_data, 'restart' );
358
+
359
+ return empty( $options ) ? array() : $options;
360
+ }
361
  }
362
 
includes/core/class-wds-controller-pointers.php ADDED
@@ -0,0 +1,150 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Smartcrawl_Controller_Pointers {
4
+ /**
5
+ * Singleton instance holder
6
+ *
7
+ * @var Smartcrawl_Controller_Pointers
8
+ */
9
+ private static $_instance;
10
+
11
+ /**
12
+ * Controller state flag
13
+ *
14
+ * @var bool
15
+ */
16
+ private $_is_running = false;
17
+
18
+ /**
19
+ * Boot controller listeners
20
+ *
21
+ * Do it only once, if they're already up do nothing
22
+ *
23
+ * @return bool Status
24
+ */
25
+ public static function run() {
26
+ $me = self::get();
27
+ if ( $me->is_running() ) {
28
+ return false;
29
+ }
30
+
31
+ $me->_add_hooks();
32
+
33
+ return true;
34
+ }
35
+
36
+ /**
37
+ * Obtain instance without booting up
38
+ *
39
+ * @return Smartcrawl_Controller_Pointers instance
40
+ */
41
+ public static function get() {
42
+ if ( empty( self::$_instance ) ) {
43
+ self::$_instance = new self();
44
+ }
45
+
46
+ return self::$_instance;
47
+ }
48
+
49
+ /**
50
+ * Check if we already have the actions bound
51
+ *
52
+ * @return bool Status
53
+ */
54
+ public function is_running() {
55
+ return $this->_is_running;
56
+ }
57
+
58
+ /**
59
+ * Bind listening actions
60
+ */
61
+ private function _add_hooks() {
62
+ if ( get_bloginfo( 'version' ) < '3.3' ) {
63
+ return;
64
+ }
65
+
66
+ add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
67
+ add_action( 'admin_footer', array( $this, 'print_styles' ) );
68
+ // add_action( 'wds_admin_pointers-plugins', array( $this, 'smartcrawl_activation_pointer' ) );
69
+
70
+ $this->_is_running = true;
71
+ }
72
+
73
+ public function enqueue() {
74
+ if ( ! $this->get_valid_pointers() ) {
75
+ return;
76
+ }
77
+
78
+ wp_enqueue_script( 'wp-pointer' );
79
+ wp_enqueue_style( 'wp-pointer' );
80
+ wp_enqueue_script(
81
+ 'wds-admin-pointers',
82
+ SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-pointers.js',
83
+ array( 'jquery' ),
84
+ Smartcrawl_Loader::get_version()
85
+ );
86
+ wp_localize_script( 'wds-admin-pointers', '_wds_pointers', $this->get_valid_pointers() );
87
+ }
88
+
89
+ private function get_valid_pointers() {
90
+ $dismissed = explode(
91
+ ',',
92
+ (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) );
93
+ // Get the screen ID
94
+ $screen = get_current_screen();
95
+ $screen_id = $screen->id;
96
+ $pointers = apply_filters( 'wds_admin_pointers-' . $screen_id, array() );
97
+
98
+ // Check pointers and remove dismissed ones.
99
+ foreach ( $pointers as $pointer_id => $pointer ) {
100
+
101
+ // Sanity check
102
+ if ( in_array( $pointer_id, $dismissed ) || empty( $pointer ) || empty( $pointer_id ) || empty( $pointer['target'] ) || empty( $pointer['options'] ) ) {
103
+ continue;
104
+ }
105
+
106
+ $pointer['pointer_id'] = $pointer_id;
107
+
108
+ // Add the pointer to $valid_pointers array
109
+ $valid_pointers['pointers'][ $pointer_id ] = $pointer;
110
+ }
111
+
112
+ // No valid pointers? Stop here.
113
+ if ( empty( $valid_pointers ) ) {
114
+ return array();
115
+ } else {
116
+ return $valid_pointers;
117
+ }
118
+ }
119
+
120
+ public function smartcrawl_activation_pointer( $pointers ) {
121
+ $pointers['wds-activation-pointer'] = array(
122
+ 'target' => '#toplevel_page_wds_wizard',
123
+ 'options' => array(
124
+ 'content' => sprintf( '<h3> %s </h3> <p> %s </p>',
125
+ esc_html__( 'Optimize your SEO', 'wds' ),
126
+ esc_html__( 'Configure your SEO Titles & Meta, enable OpenGraph and activate readability analysis here.', 'wds' )
127
+ ),
128
+ 'position' => array( 'edge' => 'left', 'align' => 'right' ),
129
+ ),
130
+ );
131
+
132
+ return $pointers;
133
+ }
134
+
135
+ public function print_styles() {
136
+ if ( ! $this->get_valid_pointers() ) {
137
+ return;
138
+ }
139
+
140
+ ?>
141
+ <style>
142
+ @media screen and (max-width: 782px) {
143
+ .wds-pointer {
144
+ display: none !important;
145
+ }
146
+ }
147
+ </style>
148
+ <?php
149
+ }
150
+ }
includes/core/class-wds-controller-sitemap.php CHANGED
@@ -32,11 +32,11 @@ class Smartcrawl_Controller_Sitemap extends Smartcrawl_Renderable {
32
 
33
  $smartcrawl_options = Smartcrawl_Settings::get_options();
34
  if ( isset( $smartcrawl_options['sitemap-disable-automatic-regeneration'] ) && empty( $smartcrawl_options['sitemap-disable-automatic-regeneration'] ) ) {
35
- add_action( 'delete_post', array( $this, 'update_sitemap' ) );
36
- add_action( 'publish_post', array( $this, 'update_sitemap' ) );
37
 
38
- add_action( 'delete_page', array( $this, 'update_sitemap' ) );
39
- add_action( 'publish_page', array( $this, 'update_sitemap' ) );
40
  }
41
  }
42
 
@@ -224,6 +224,33 @@ class Smartcrawl_Controller_Sitemap extends Smartcrawl_Renderable {
224
  : $raw;
225
  }
226
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
227
  public function update_engines() {
228
  Smartcrawl_Xml_Sitemap::notify_engines( 1 );
229
  }
32
 
33
  $smartcrawl_options = Smartcrawl_Settings::get_options();
34
  if ( isset( $smartcrawl_options['sitemap-disable-automatic-regeneration'] ) && empty( $smartcrawl_options['sitemap-disable-automatic-regeneration'] ) ) {
35
+ add_action( 'delete_post', array( $this, 'drop_sitemap_cache' ) );
36
+ add_action( 'publish_post', array( $this, 'drop_sitemap_cache' ) );
37
 
38
+ add_action( 'delete_page', array( $this, 'drop_sitemap_cache' ) );
39
+ add_action( 'publish_page', array( $this, 'drop_sitemap_cache' ) );
40
  }
41
  }
42
 
224
  : $raw;
225
  }
226
 
227
+ /**
228
+ * Drops generated sitemap cache files
229
+ *
230
+ * This is so the next sitemap request re-generates the caches.
231
+ * Serves as performance improvement for post-based action listeners.
232
+ *
233
+ * On setups with large posts table, fully regenerating sitemap can take a
234
+ * while. So instead, we just drop the cache and potentially ping the
235
+ * search engines to notify them about the change.
236
+ */
237
+ public function drop_sitemap_cache() {
238
+ $file = smartcrawl_get_sitemap_path();
239
+ $gzipped = "{$file}.gz";
240
+
241
+ if ( file_exists( $file ) ) {
242
+ @unlink( $file );
243
+ }
244
+
245
+ if ( file_exists( $gzipped ) ) {
246
+ @unlink( $gzipped );
247
+ }
248
+
249
+ // Also notify engines of changes.
250
+ // Do *not* forcefully do so, respect settings.
251
+ Smartcrawl_Xml_Sitemap::notify_engines();
252
+ }
253
+
254
  public function update_engines() {
255
  Smartcrawl_Xml_Sitemap::notify_engines( 1 );
256
  }
includes/core/class-wds-core-request.php CHANGED
@@ -52,6 +52,22 @@ class Smartcrawl_Core_Request {
52
  'value' => $cvalue,
53
  ) );
54
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  if ( ! empty( $cookies ) ) {
56
  $params['cookies'] = $cookies;
57
  }
52
  'value' => $cvalue,
53
  ) );
54
  }
55
+
56
+ // Post password cookie.
57
+ $post = $is_post_revision
58
+ ? get_post( $post_parent )
59
+ : get_post( $post_id );
60
+ if ( ! empty( $post->post_password ) ) {
61
+ if ( ! class_exists( 'PasswordHash' ) ) {
62
+ require_once ABSPATH . WPINC . '/class-phpass.php';
63
+ }
64
+ $hasher = new PasswordHash( 8, true );
65
+ $cookies[] = new WP_Http_Cookie( array(
66
+ 'name' => 'wp-postpass_' . COOKIEHASH,
67
+ 'value' => $hasher->HashPassword( $post->post_password ),
68
+ ));
69
+ }
70
+
71
  if ( ! empty( $cookies ) ) {
72
  $params['cookies'] = $cookies;
73
  }
includes/core/class-wds-endpoint-resolver.php CHANGED
@@ -75,7 +75,7 @@ class Smartcrawl_Endpoint_Resolver {
75
  public function resolve_location() {
76
  if ( is_front_page() && 'posts' === get_option( 'show_on_front' ) ) {
77
  $this->set_location( self::L_BLOG_HOME );
78
- } elseif ( is_home() && 'posts' !== get_option( 'show_on_front' ) ) {
79
  $this->set_location( self::L_STATIC_HOME );
80
  } elseif ( is_category() || is_tag() || is_tax() ) {
81
  $this->set_location( self::L_TAX_ARCHIVE );
@@ -139,14 +139,43 @@ class Smartcrawl_Endpoint_Resolver {
139
  * @return bool
140
  */
141
  public function simulate_post( $pid ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
  $this->_presimulation_data[] = array(
143
- 'location' => $this->get_location(),
144
- 'context' => $this->get_context(),
 
145
  );
146
 
147
- $post = get_post( $pid );
148
- $this->set_context( $post );
149
- $this->set_location( self::L_SINGULAR );
150
 
151
  return true;
152
  }
75
  public function resolve_location() {
76
  if ( is_front_page() && 'posts' === get_option( 'show_on_front' ) ) {
77
  $this->set_location( self::L_BLOG_HOME );
78
+ } elseif ( is_home() && 'posts' !== get_option( 'show_on_front' ) ) {
79
  $this->set_location( self::L_STATIC_HOME );
80
  } elseif ( is_category() || is_tag() || is_tax() ) {
81
  $this->set_location( self::L_TAX_ARCHIVE );
139
  * @return bool
140
  */
141
  public function simulate_post( $pid ) {
142
+ $post = get_post( $pid );
143
+ $query = new WP_Query();
144
+ $query->queried_object = $post;
145
+ $query->queried_object_id = $post->ID;
146
+
147
+ return $this->simulate( self::L_SINGULAR, $post, $query );
148
+ }
149
+
150
+ public function simulate_taxonomy_term( $term_id ) {
151
+ $term = get_term( $term_id );
152
+ $query = new WP_Query();
153
+ $query->queried_object = $term;
154
+ $query->queried_object_id = $term->term_id;
155
+
156
+ return $this->simulate( self::L_TAX_ARCHIVE, null, $query );
157
+ }
158
+
159
+ public function simulate_post_type( $post_type ) {
160
+ if ( is_a( $post_type, 'WP_Post_Type' ) ) {
161
+ $post_type = get_post_type_object( $post_type );
162
+ }
163
+ $query = new WP_Query();
164
+ $query->queried_object = $post_type;
165
+
166
+ $this->simulate( self::L_PT_ARCHIVE, null, $query );
167
+ }
168
+
169
+ public function simulate( $location, $context, $query_context = null ) {
170
  $this->_presimulation_data[] = array(
171
+ 'location' => $this->get_location(),
172
+ 'context' => $this->get_context(),
173
+ 'query_context' => $this->get_query_context(),
174
  );
175
 
176
+ $this->set_context( $context );
177
+ $this->set_location( $location );
178
+ $this->set_query_context( $query_context );
179
 
180
  return true;
181
  }
includes/core/class-wds-importer.php CHANGED
@@ -1,10 +1,41 @@
1
  <?php
2
 
3
  abstract class Smartcrawl_Importer {
 
 
4
  abstract public function data_exists();
5
 
6
- public function import_for_all_sites() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  $processed_sites = $this->get_processed_sites_count();
 
 
 
 
 
 
 
8
  $next_site = $this->get_next_site_to_process();
9
  if ( ! $next_site ) {
10
  $this->reset_network_import_flag();
@@ -13,7 +44,7 @@ abstract class Smartcrawl_Importer {
13
  }
14
 
15
  switch_to_blog( $next_site );
16
- $site_import_complete = $this->import();
17
  switch_to_blog( get_main_site_id() );
18
 
19
  if ( $site_import_complete ) {
@@ -23,6 +54,18 @@ abstract class Smartcrawl_Importer {
23
  $this->turn_sitewide_mode_off();
24
  }
25
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  private function get_processed_sites_count() {
27
  return (int) get_site_option( $this->get_next_network_site_option_id(), 0 );
28
  }
@@ -44,16 +87,37 @@ abstract class Smartcrawl_Importer {
44
  delete_site_option( $this->get_next_network_site_option_id() );
45
  }
46
 
47
- public function import( $force_restart = false ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  if ( ! $this->is_import_in_progress() || $force_restart ) {
49
  $this->set_import_flag();
50
- $this->remove_existing_wds_options();
51
- $this->import_options();
52
- $this->import_taxonomy_meta();
53
- $this->remove_existing_wds_post_meta();
 
 
 
 
 
 
 
54
  }
55
 
56
- $complete = $this->import_post_meta();
 
57
  if ( $complete ) {
58
  $this->reset_import_flag();
59
  }
@@ -78,6 +142,10 @@ abstract class Smartcrawl_Importer {
78
  $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '%wds-sitemap%'" );
79
  }
80
 
 
 
 
 
81
  abstract public function import_options();
82
 
83
  abstract public function import_taxonomy_meta();
@@ -119,10 +187,10 @@ abstract class Smartcrawl_Importer {
119
  return $wpdb->get_col( $meta_query ); // phpcs:ignore -- Preparation difficult due to % escaping and complex IN clause
120
  }
121
 
122
- private function get_posts_with_target_metas() {
123
  global $wpdb;
124
 
125
- return $wpdb->get_col( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key LIKE '_wds_%' GROUP BY post_id" );
126
  }
127
 
128
  protected function load_mapping_file( $file ) {
1
  <?php
2
 
3
  abstract class Smartcrawl_Importer {
4
+ private $status = null;
5
+
6
  abstract public function data_exists();
7
 
8
+ abstract protected function get_source_plugins();
9
+
10
+ public function get_active_source_plugin() {
11
+ $source_plugin = $this->get_source_plugins();
12
+ foreach ( $source_plugin as $plugin ) {
13
+ if ( is_plugin_active( $plugin ) ) {
14
+ return $plugin;
15
+ }
16
+ }
17
+
18
+ return false;
19
+ }
20
+
21
+ public function get_deactivation_link() {
22
+ $active_plugin = $this->get_active_source_plugin();
23
+ if ( ! $active_plugin ) {
24
+ return false;
25
+ }
26
+
27
+ return wp_nonce_url( 'plugins.php?action=deactivate&amp;plugin=' . $active_plugin . '&amp;plugin_status=all', 'deactivate-plugin_' . $active_plugin );
28
+ }
29
+
30
+ public function import_for_all_sites( $options = array() ) {
31
  $processed_sites = $this->get_processed_sites_count();
32
+ $this->update_status( array(
33
+ 'total_sites' => get_sites( array(
34
+ 'count' => true,
35
+ 'number' => PHP_INT_MAX,
36
+ ) ),
37
+ 'completed_sites' => $processed_sites,
38
+ ) );
39
  $next_site = $this->get_next_site_to_process();
40
  if ( ! $next_site ) {
41
  $this->reset_network_import_flag();
44
  }
45
 
46
  switch_to_blog( $next_site );
47
+ $site_import_complete = $this->import( $options );
48
  switch_to_blog( get_main_site_id() );
49
 
50
  if ( $site_import_complete ) {
54
  $this->turn_sitewide_mode_off();
55
  }
56
 
57
+ public function get_status() {
58
+ return empty( $this->status ) ? array() : $this->status;
59
+ }
60
+
61
+ protected function set_status( $status ) {
62
+ $this->status = $status;
63
+ }
64
+
65
+ protected function update_status( $status ) {
66
+ $this->status = wp_parse_args( $status, $this->get_status() );
67
+ }
68
+
69
  private function get_processed_sites_count() {
70
  return (int) get_site_option( $this->get_next_network_site_option_id(), 0 );
71
  }
87
  delete_site_option( $this->get_next_network_site_option_id() );
88
  }
89
 
90
+ public function import( $options = array() ) {
91
+ $options = wp_parse_args( $options, array(
92
+ 'import-options' => true,
93
+ 'import-term-meta' => true,
94
+ 'import-post-meta' => true,
95
+ 'force-restart' => false,
96
+ 'keep-existing-post-meta' => false,
97
+ ) );
98
+ $import_options = (boolean) smartcrawl_get_array_value( $options, 'import-options' );
99
+ $import_term_meta = (boolean) smartcrawl_get_array_value( $options, 'import-term-meta' );
100
+ $import_post_meta = (boolean) smartcrawl_get_array_value( $options, 'import-post-meta' );
101
+ $force_restart = (boolean) smartcrawl_get_array_value( $options, 'force-restart' );
102
+ $keep_post_meta = (boolean) smartcrawl_get_array_value( $options, 'keep-existing-post-meta' );
103
+
104
  if ( ! $this->is_import_in_progress() || $force_restart ) {
105
  $this->set_import_flag();
106
+ if ( $import_options ) {
107
+ $this->remove_existing_wds_options();
108
+ $this->import_options();
109
+ }
110
+ if ( $import_term_meta ) {
111
+ $this->remove_existing_wds_taxonomy_meta();
112
+ $this->import_taxonomy_meta();
113
+ }
114
+ if ( $import_post_meta && ! $keep_post_meta ) {
115
+ $this->remove_existing_wds_post_meta();
116
+ }
117
  }
118
 
119
+ // If post meta doesn't need to be imported then we're done.
120
+ $complete = $import_post_meta ? $this->import_post_meta() : true;
121
  if ( $complete ) {
122
  $this->reset_import_flag();
123
  }
142
  $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '%wds-sitemap%'" );
143
  }
144
 
145
+ private function remove_existing_wds_taxonomy_meta() {
146
+ delete_option( 'wds_taxonomy_meta' );
147
+ }
148
+
149
  abstract public function import_options();
150
 
151
  abstract public function import_taxonomy_meta();
187
  return $wpdb->get_col( $meta_query ); // phpcs:ignore -- Preparation difficult due to % escaping and complex IN clause
188
  }
189
 
190
+ protected function get_posts_with_target_metas() {
191
  global $wpdb;
192
 
193
+ return $wpdb->get_col( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key LIKE '_wds_%' AND meta_key NOT IN ('_wds_analysis','_wds_readability') GROUP BY post_id" );
194
  }
195
 
196
  protected function load_mapping_file( $file ) {
includes/core/class-wds-opengraph-value-helper.php ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Smartcrawl_OpenGraph_Value_Helper extends Smartcrawl_Type_Traverser {
4
+
5
+ private $title = '';
6
+ private $description = '';
7
+ private $images = array();
8
+ private $enabled = false;
9
+
10
+ public function __construct() {
11
+ $this->traverse();
12
+ }
13
+
14
+ public function get_title() {
15
+ return $this->title;
16
+ }
17
+
18
+ public function get_description() {
19
+ return $this->description;
20
+ }
21
+
22
+ public function get_images() {
23
+ return array_unique( array_map( 'trim', $this->images ) );
24
+ }
25
+
26
+ public function is_enabled() {
27
+ return $this->enabled;
28
+ }
29
+
30
+ private function get_options() {
31
+ return Smartcrawl_Settings::get_options();
32
+ }
33
+
34
+ private function from_options( $location ) {
35
+ $options = $this->get_options();
36
+
37
+ $title = smartcrawl_get_array_value( $options, 'og-title-' . $location );
38
+ $description = smartcrawl_get_array_value( $options, 'og-description-' . $location );
39
+ $images = smartcrawl_get_array_value( $options, 'og-images-' . $location );
40
+ $enabled = smartcrawl_get_array_value( $options, 'og-active-' . $location );
41
+
42
+ $title = smartcrawl_replace_vars( wp_strip_all_tags( strval( $title ) ), $this->get_queried_object() );
43
+ $description = smartcrawl_replace_vars( wp_strip_all_tags( strval( $description ) ), $this->get_queried_object() );
44
+
45
+ $this->title = empty( $title ) ? Smartcrawl_OnPage::get()->get_title() : $title;
46
+ $this->description = empty( $description ) ? Smartcrawl_OnPage::get()->get_description() : $description;
47
+ $this->images = is_array( $images ) ? $images : array();
48
+ $this->enabled = (bool) $enabled;
49
+ }
50
+
51
+ private function from_post_meta( $post ) {
52
+ $post_meta = smartcrawl_get_value( 'opengraph', $post->ID );
53
+ $title = smartcrawl_get_array_value( $post_meta, 'title' );
54
+ $description = smartcrawl_get_array_value( $post_meta, 'description' );
55
+ $images = smartcrawl_get_array_value( $post_meta, 'images' );
56
+ $disabled = smartcrawl_get_array_value( $post_meta, 'disabled' );
57
+
58
+ if ( ! empty( $title ) ) {
59
+ $this->title = $title;
60
+ }
61
+ if ( ! empty( $description ) ) {
62
+ $this->description = $description;
63
+ }
64
+ if ( is_array( $images ) && ! empty( $images ) ) {
65
+ $this->images = $images;
66
+ }
67
+
68
+ // Add featured image as the last resort
69
+ if ( has_post_thumbnail( $post ) ) {
70
+ $this->images[] = get_the_post_thumbnail_url($post);
71
+ }
72
+
73
+ $this->enabled = ! $disabled;
74
+ }
75
+
76
+ private function from_term_meta( $term ) {
77
+ $term_meta = smartcrawl_get_term_meta( $term, $term->taxonomy, 'opengraph' );
78
+ $title = smartcrawl_get_array_value( $term_meta, 'title' );
79
+ $description = smartcrawl_get_array_value( $term_meta, 'description' );
80
+ $images = smartcrawl_get_array_value( $term_meta, 'images' );
81
+ $disabled = smartcrawl_get_array_value( $term_meta, 'disabled' );
82
+
83
+ if ( ! empty( $title ) ) {
84
+ $this->title = $title;
85
+ }
86
+ if ( ! empty( $description ) ) {
87
+ $this->description = $description;
88
+ }
89
+ if ( is_array( $images ) && ! empty( $images ) ) {
90
+ $this->images = $images;
91
+ }
92
+ $this->enabled = ! $disabled;
93
+ }
94
+
95
+ public function handle_bp_groups() {
96
+ // TODO: Implement handle_bp_groups() method.
97
+ }
98
+
99
+ public function handle_bp_profile() {
100
+ // TODO: Implement handle_bp_profile() method.
101
+ }
102
+
103
+ public function handle_woo_shop() {
104
+ $this->handle_singular( wc_get_page_id( 'shop' ) );
105
+ }
106
+
107
+ public function handle_blog_home() {
108
+ $this->from_options( 'home' );
109
+ }
110
+
111
+ public function handle_static_home() {
112
+ $this->handle_singular( get_option( 'page_for_posts' ) );
113
+ }
114
+
115
+ public function handle_search() {
116
+ $this->from_options( 'search' );
117
+ }
118
+
119
+ public function handle_404() {
120
+ // No OG for 404 page
121
+ }
122
+
123
+ public function handle_date_archive() {
124
+ $this->from_options( 'date' );
125
+ }
126
+
127
+ public function handle_pt_archive() {
128
+ $post_type = $this->get_queried_object();
129
+ if ( is_a( $post_type, 'WP_Post_Type' ) ) {
130
+ $location = Smartcrawl_Onpage_Settings::PT_ARCHIVE_PREFIX . $post_type->name;
131
+ $this->from_options( $location );
132
+ }
133
+ }
134
+
135
+ public function handle_tax_archive() {
136
+ $term = $this->get_queried_object();
137
+ if ( is_a( $term, 'WP_Term' ) ) {
138
+ $this->from_options( $term->taxonomy );
139
+
140
+ if ( $this->enabled ) {
141
+ // Now apply any overrides from the term taxonomy
142
+ $this->from_term_meta( $term );
143
+ }
144
+ }
145
+ }
146
+
147
+ public function handle_author_archive() {
148
+ $this->from_options( 'author' );
149
+ }
150
+
151
+ public function handle_archive() {
152
+ // TODO: Implement handle_archive() method.
153
+ }
154
+
155
+ public function handle_singular( $post_id = 0 ) {
156
+ $post = $post_id ? get_post( $post_id ) : null;
157
+ if ( ! $post ) {
158
+ $post = $this->get_context();
159
+ }
160
+ if ( is_a( $post, 'WP_Post' ) ) {
161
+ $this->from_options( $post->post_type );
162
+
163
+ if ( $this->enabled ) {
164
+ // Now apply any overrides from the individual post's meta
165
+ $this->from_post_meta( $post );
166
+ }
167
+ }
168
+ }
169
+ }
includes/core/class-wds-replacement-helper.php ADDED
@@ -0,0 +1,425 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Smartcrawl_Replacement_Helper extends Smartcrawl_Type_Traverser {
4
+
5
+ private $specific_replacements;
6
+ private $bp_data;
7
+ private $subject;
8
+
9
+ /**
10
+ * Singleton instance
11
+ *
12
+ * @var Smartcrawl_Replacement_Helper
13
+ */
14
+ private static $_instance;
15
+
16
+ /**
17
+ * Constructor
18
+ */
19
+ private function __construct() {
20
+ }
21
+
22
+ /**
23
+ * Singleton instance getter
24
+ *
25
+ * @return Smartcrawl_Replacement_Helper instance
26
+ */
27
+ private static function get() {
28
+ if ( empty( self::$_instance ) ) {
29
+ self::$_instance = new self();
30
+ }
31
+
32
+ return self::$_instance;
33
+ }
34
+
35
+ public static function replace( $subject, $context_object = null ) {
36
+ if ( ! is_string( $subject ) ) {
37
+ return $subject;
38
+ }
39
+
40
+ $instance = self::get();
41
+ $instance->subject = $subject;
42
+ $resolver = $instance->get_resolver();
43
+
44
+ if ( $context_object ) {
45
+ if ( $instance->is_post_object( $context_object ) ) {
46
+ $resolver->simulate_post( $context_object );
47
+ } elseif ( $instance->is_term_object( $context_object ) ) {
48
+ $resolver->simulate_taxonomy_term( $context_object );
49
+ } elseif ( $instance->is_post_type_object( $context_object ) ) {
50
+ $resolver->simulate_post_type( $context_object );
51
+ }
52
+ }
53
+
54
+ $instance->traverse();
55
+ $replacements = array_merge(
56
+ $instance->get_general_replacements(),
57
+ $instance->get_specific_replacements()
58
+ );
59
+
60
+ foreach ( $replacements as $macro => $replacement ) {
61
+ $subject = str_replace( $macro, $instance->process_replacement_value( $replacement ), $subject );
62
+ }
63
+
64
+ if ( $context_object ) {
65
+ $resolver->stop_simulation();
66
+ }
67
+
68
+ return preg_replace( '/%%[a-zA-Z_]*%%/', '', $subject );
69
+ }
70
+
71
+ public static function get_dynamic_replacements( $subject, $context_object ) {
72
+ if ( ! is_string( $subject ) ) {
73
+ return array();
74
+ }
75
+ $instance = self::get();
76
+
77
+ return $instance->find_dynamic_replacements( $subject, $context_object );
78
+ }
79
+
80
+ private function is_post_type_object( $object ) {
81
+ return is_a( $object, 'WP_Post_Type' );
82
+ }
83
+
84
+ private function is_term_object( $context_object ) {
85
+ return is_a( $context_object, 'WP_Term' );
86
+ }
87
+
88
+ private function is_post_object( $context_object ) {
89
+ return is_a( $context_object, 'WP_Post' );
90
+ }
91
+
92
+ private function process_replacement_value( $replacement ) {
93
+ return wp_strip_all_tags( $replacement );
94
+ }
95
+
96
+ public function get_bp_data() {
97
+ if ( empty( $this->bp_data ) && function_exists( 'buddypress' ) ) {
98
+ $this->bp_data = buddypress();
99
+ }
100
+
101
+ return $this->bp_data;
102
+ }
103
+
104
+ public function set_bp_data( $bp_data ) {
105
+ $this->bp_data = $bp_data;
106
+ }
107
+
108
+ private function get_specific_replacements() {
109
+ return empty( $this->specific_replacements ) ? array() : $this->specific_replacements;
110
+ }
111
+
112
+ private function get_general_replacements() {
113
+ $query = $this->get_query_context();
114
+ $paged = intval( $query->get( 'paged' ) );
115
+ $max_num_pages = isset( $query->max_num_pages ) ? $query->max_num_pages : 1;
116
+ $page_x_of_y = esc_html__( 'Page %1$s of %2$s' );
117
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
118
+ $preset_sep = ! empty( $smartcrawl_options['preset-separator'] ) ? $smartcrawl_options['preset-separator'] : 'pipe';
119
+ $separator = ! empty( $smartcrawl_options['separator'] ) ? $smartcrawl_options['separator'] : smartcrawl_get_separators( $preset_sep );
120
+ $pagenum = $paged;
121
+ if ( 0 === $pagenum ) {
122
+ $pagenum = $max_num_pages > 1 ? 1 : '';
123
+ }
124
+
125
+ return array(
126
+ '%%sitename%%' => get_bloginfo( 'name' ),
127
+ '%%sitedesc%%' => get_bloginfo( 'description' ),
128
+ '%%page%%' => $paged !== 0 ? sprintf( $page_x_of_y, $paged, $max_num_pages ) : '',
129
+ '%%spell_page%%' => $paged !== 0 ? sprintf( $page_x_of_y, smartcrawl_spell_number( $paged ), smartcrawl_spell_number( $max_num_pages ) ) : '',
130
+ '%%pagetotal%%' => $max_num_pages > 1 ? $max_num_pages : '',
131
+ '%%spell_pagetotal%%' => $max_num_pages > 1 ? smartcrawl_spell_number( $max_num_pages ) : '',
132
+ '%%pagenumber%%' => empty( $pagenum ) ? '' : $pagenum,
133
+ '%%spell_pagenumber%%' => empty( $pagenum ) ? '' : smartcrawl_spell_number( $pagenum ),
134
+ '%%currenttime%%' => date_i18n( get_option( 'time_format' ) ),
135
+ '%%currentdate%%' => date_i18n( get_option( 'date_format' ) ),
136
+ '%%currentmonth%%' => date_i18n( 'F' ),
137
+ '%%currentyear%%' => date_i18n( 'Y' ),
138
+ '%%sep%%' => $separator,
139
+ );
140
+ }
141
+
142
+ public function handle_bp_groups() {
143
+ $bp = $this->get_bp_data();
144
+ $current_group = empty( $bp->groups->current_group ) ? null : $bp->groups->current_group;
145
+
146
+ $this->specific_replacements = array(
147
+ '%%bp_group_name%%' => $current_group ? $current_group->name : '',
148
+ '%%bp_group_description%%' => $current_group ? $current_group->description : '',
149
+ );
150
+ }
151
+
152
+ public function handle_bp_profile() {
153
+ $bp_active = function_exists( 'buddypress' );
154
+
155
+ $this->specific_replacements = array(
156
+ '%%bp_user_username%%' => $bp_active ? bp_get_displayed_user_username() : '',
157
+ '%%bp_user_full_name%%' => $bp_active ? bp_get_displayed_user_fullname() : '',
158
+ );
159
+ }
160
+
161
+ public function handle_woo_shop() {
162
+ // TODO: Implement handle_woo_shop() method.
163
+ }
164
+
165
+ public function handle_blog_home() {
166
+ // No context specific values available on blog index page
167
+ }
168
+
169
+ public function handle_static_home() {
170
+ $this->handle_singular();
171
+ }
172
+
173
+ public function handle_search() {
174
+ $query = $this->get_query_context();
175
+
176
+ $this->specific_replacements = array(
177
+ '%%searchphrase%%' => esc_html( $query->get( 's' ) ),
178
+ );
179
+ }
180
+
181
+ public function handle_404() {
182
+ // No context specific values available on the 404 page
183
+ }
184
+
185
+ public function handle_date_archive() {
186
+ $this->specific_replacements = array(
187
+ '%%date%%' => $this->get_date_for_archive(),
188
+ );
189
+ }
190
+
191
+ public function handle_pt_archive() {
192
+ $post_type = $this->get_queried_object();
193
+ $is_pt_archive = $this->is_post_type_object( $post_type );
194
+
195
+ $this->specific_replacements = array(
196
+ '%%pt_plural%%' => $is_pt_archive ? $post_type->labels->name : '',
197
+ '%%pt_single%%' => $is_pt_archive ? $post_type->labels->singular_name : '',
198
+ );
199
+ }
200
+
201
+ public function handle_tax_archive() {
202
+ $term = $this->get_queried_object();
203
+ $term_data = $this->is_term_object( $term ) ? (array) $term : array();
204
+ $term_data = wp_parse_args( $term_data, $this->get_term_defaults() );
205
+
206
+ $this->specific_replacements = array(
207
+ '%%id%%' => $term_data['term_id'],
208
+ '%%term_title%%' => $term_data['name'],
209
+ '%%term_description%%' => $term_data['description'],
210
+ );
211
+
212
+ $custom_replacements = $this->find_dynamic_replacements( $this->subject, $term );
213
+ $this->specific_replacements = wp_parse_args( $this->specific_replacements, $custom_replacements );
214
+
215
+ if ( $term_data['taxonomy'] === 'category' ) {
216
+ $this->specific_replacements['%%category%%'] = $term_data['name'];
217
+ $this->specific_replacements['%%category_description%%'] = $term_data['description'];
218
+ } elseif ( $term_data['taxonomy'] === 'post_tag' ) {
219
+ $this->specific_replacements['%%tag%%'] = $term_data['name'];
220
+ $this->specific_replacements['%%tag_description%%'] = $term_data['description'];
221
+ }
222
+ }
223
+
224
+ public function handle_author_archive() {
225
+ $query = $this->get_query_context();
226
+ $user_id = $query->get( 'author' );
227
+
228
+ $this->specific_replacements = array(
229
+ '%%name%%' => empty( $user_id ) ? '' : get_the_author_meta( 'display_name', $user_id ),
230
+ '%%userid%%' => (string) $user_id,
231
+ );
232
+ }
233
+
234
+ public function handle_archive() {
235
+ // No context specific values available on the archive page
236
+ }
237
+
238
+ public function handle_singular() {
239
+ $post = $this->get_context();
240
+ $post_data = $this->is_post_object( $post ) ? (array) $post : array();
241
+ $post_data = wp_parse_args( $post_data, $this->get_post_defaults() );
242
+
243
+ $this->specific_replacements = array(
244
+ '%%date%%' => mysql2date( get_option( 'date_format' ), $post_data['post_date'] ),
245
+ '%%excerpt%%' => smartcrawl_get_trimmed_excerpt( $post_data['post_excerpt'], $post_data['post_content'] ),
246
+ '%%excerpt_only%%' => $post_data['post_excerpt'],
247
+ '%%id%%' => $post_data['ID'],
248
+ '%%modified%%' => $post_data['post_modified'],
249
+ '%%name%%' => empty( $post_data['post_author'] ) ? '' : get_the_author_meta( 'display_name', $post_data['post_author'] ),
250
+ '%%title%%' => $post_data['post_title'],
251
+ '%%userid%%' => $post_data['post_author'],
252
+ );
253
+
254
+ $custom_replacements = $this->find_dynamic_replacements( $this->subject, $post );
255
+ $this->specific_replacements = wp_parse_args( $this->specific_replacements, $custom_replacements );
256
+
257
+ if ( $post_data['post_type'] === 'attachment' ) {
258
+ $this->specific_replacements['%%caption%%'] = $post_data['post_excerpt'];
259
+ } elseif ( $post_data['post_type'] === 'post' ) {
260
+ $this->specific_replacements['%%category%%'] = get_the_category_list( ', ', '', $post_data['ID'] );
261
+ }
262
+ }
263
+
264
+ private function get_hierarchical_terms_for_post_type( $post ) {
265
+ $custom_taxonomy = $this->get_post_type_taxonomy( $post );
266
+ if ( $custom_taxonomy ) {
267
+ $terms = wp_get_post_terms( $post->ID, $custom_taxonomy, array( 'fields' => 'names' ) );
268
+ if ( ! is_wp_error( $terms ) ) {
269
+ return implode( ', ', $terms );
270
+ }
271
+ }
272
+
273
+ return '';
274
+ }
275
+
276
+ private function get_post_type_taxonomy( $post ) {
277
+ $taxonomies = get_object_taxonomies( $post );
278
+
279
+ return empty( $taxonomies ) ? '' : array_shift( $taxonomies );
280
+ }
281
+
282
+ private function get_post_defaults() {
283
+ return array(
284
+ 'ID' => '',
285
+ 'post_author' => '',
286
+ 'post_name' => '',
287
+ 'post_type' => '',
288
+ 'post_title' => '',
289
+ 'post_date' => '',
290
+ 'post_date_gmt' => '',
291
+ 'post_content' => '',
292
+ 'post_excerpt' => '',
293
+ 'post_status' => '',
294
+ 'comment_status' => '',
295
+ 'ping_status' => '',
296
+ 'post_password' => '',
297
+ 'post_parent' => '',
298
+ 'post_modified' => '',
299
+ 'post_modified_gmt' => '',
300
+ 'comment_count' => '',
301
+ 'menu_order' => '',
302
+ );
303
+ }
304
+
305
+ private function get_term_defaults() {
306
+ return array(
307
+ 'name' => '',
308
+ 'term_taxonomy_id' => '',
309
+ 'count' => '',
310
+ 'description' => '',
311
+ 'term_id' => '',
312
+ 'taxonomy' => '',
313
+ 'term_group' => '',
314
+ 'slug' => '',
315
+ );
316
+ }
317
+
318
+ private function get_date_for_archive() {
319
+ $query = $this->get_query_context();
320
+ $day = $query->get( 'day' );
321
+ $month = $query->get( 'monthnum' );
322
+ $year = $query->get( 'year' );
323
+ $format = '';
324
+ if ( empty( $year ) ) {
325
+ // At the very least we need an year
326
+ return '';
327
+ }
328
+ $timestamp = mktime( 0, 0, 0,
329
+ empty( $month ) ? 1 : $month,
330
+ empty( $day ) ? 1 : $day,
331
+ $year
332
+ );
333
+
334
+ if ( ! empty( $day ) ) {
335
+ $format = get_option( 'date_format' );
336
+ } elseif ( ! empty( $month ) ) {
337
+ $format = 'F Y';
338
+ } elseif ( ! empty( $year ) ) {
339
+ $format = 'Y';
340
+ }
341
+
342
+ $date = date_i18n( $format, $timestamp );
343
+
344
+ return $date;
345
+ }
346
+
347
+ private function find_dynamic_replacements( $subject, $context_object ) {
348
+ $term_desc_replacements = $this->find_term_field_replacements( $subject, $context_object, 'ct_desc_', 'description' );
349
+ $subject = str_replace( array_keys( $term_desc_replacements ), '', $subject );
350
+
351
+ $term_name_replacements = $this->find_term_field_replacements( $subject, $context_object, 'ct_', 'name' );
352
+ $subject = str_replace( array_keys( $term_name_replacements ), '', $subject );
353
+
354
+ $meta_replacements = $this->find_meta_replacements( $subject, $context_object );
355
+
356
+ return array_merge( $term_desc_replacements, $term_name_replacements, $meta_replacements );
357
+ }
358
+
359
+ private function find_term_field_replacements( $subject, $context_object, $prefix, $term_field ) {
360
+ $pattern = "/(%%{$prefix}[a-z_]+%%)/";
361
+ $matches = array();
362
+ $replacements = array();
363
+ $match_result = preg_match_all( $pattern, $subject, $matches, PREG_PATTERN_ORDER );
364
+ if ( ! empty( $match_result ) ) {
365
+ $placeholders = array_shift( $matches );
366
+ foreach ( array_unique( $placeholders ) as $placeholder ) {
367
+ $taxonomy_name = str_replace( array( "%%$prefix", '%%' ), '', $placeholder );
368
+
369
+ $taxonomy = get_taxonomy( $taxonomy_name );
370
+ if ( empty( $taxonomy ) ) {
371
+ continue;
372
+ }
373
+
374
+ $terms = $this->get_linked_terms( $context_object, $taxonomy_name );
375
+ if ( ! empty( $terms ) ) {
376
+ $term = array_shift( $terms );
377
+ $replacements[ $placeholder ] = wp_strip_all_tags( get_term_field( $term_field, $term, $taxonomy_name ) );
378
+ }
379
+ }
380
+ }
381
+
382
+ return $replacements;
383
+ }
384
+
385
+ private function find_meta_replacements( $subject, $context_object ) {
386
+ $prefix = 'cf_';
387
+ $pattern = "/(%%{$prefix}[a-z_]+%%)/";
388
+ $matches = array();
389
+ $replacements = array();
390
+ $match_result = preg_match_all( $pattern, $subject, $matches, PREG_PATTERN_ORDER );
391
+ if ( ! empty( $match_result ) ) {
392
+ $placeholders = array_shift( $matches );
393
+ foreach ( array_unique( $placeholders ) as $placeholder ) {
394
+ $meta_key = str_replace( array( "%%$prefix", '%%' ), '', $placeholder );
395
+
396
+ $meta_value = $this->get_meta( $context_object, $meta_key );
397
+ if ( ! empty( $meta_value ) && ! is_array( $meta_value ) && ! is_object( $meta_value ) ) {
398
+ $replacements[ $placeholder ] = wp_strip_all_tags( $meta_value );
399
+ }
400
+ }
401
+ }
402
+
403
+ return $replacements;
404
+ }
405
+
406
+ private function get_meta( $context_object, $meta_key ) {
407
+ if ( $this->is_post_object( $context_object ) ) {
408
+ return get_post_meta( $context_object->ID, $meta_key, true );
409
+ } elseif ( $this->is_term_object( $context_object ) ) {
410
+ return get_term_meta( $context_object->term_id, $meta_key, true );
411
+ }
412
+
413
+ return array();
414
+ }
415
+
416
+ private function get_linked_terms( $context_object, $taxonomy_name ) {
417
+ if ( $this->is_post_object( $context_object ) ) {
418
+ return get_the_terms( $context_object->ID, $taxonomy_name );
419
+ } elseif ( $this->is_term_object( $context_object ) && $context_object->taxonomy === $taxonomy_name ) {
420
+ return array( $context_object );
421
+ }
422
+
423
+ return array();
424
+ }
425
+ }
includes/core/class-wds-robots-value-helper.php CHANGED
@@ -59,7 +59,7 @@ class Smartcrawl_Robots_Value_Helper extends Smartcrawl_Type_Traverser {
59
  }
60
 
61
  public function handle_static_home() {
62
- // TODO: Implement handle_static_home() method.
63
  }
64
 
65
  public function handle_search() {
@@ -170,7 +170,7 @@ class Smartcrawl_Robots_Value_Helper extends Smartcrawl_Type_Traverser {
170
 
171
  public function handle_singular( $post_id = 0 ) {
172
  if ( ! $post_id ) {
173
- global $post;
174
  $post_id = $post->ID;
175
  }
176
 
59
  }
60
 
61
  public function handle_static_home() {
62
+ $this->handle_singular( get_option( 'page_for_posts' ) );
63
  }
64
 
65
  public function handle_search() {
170
 
171
  public function handle_singular( $post_id = 0 ) {
172
  if ( ! $post_id ) {
173
+ $post = $this->get_context();
174
  $post_id = $post->ID;
175
  }
176
 
includes/core/class-wds-simple-renderer.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Smartcrawl_Simple_Renderer extends Smartcrawl_Renderable {
4
+ /**
5
+ * @var Smartcrawl_Simple_Renderer
6
+ */
7
+ private static $_instance;
8
+
9
+ public static function get_instance() {
10
+ if ( empty( self::$_instance ) ) {
11
+ self::$_instance = new self();
12
+ }
13
+
14
+ return self::$_instance;
15
+ }
16
+
17
+ public static function render( $view, $args = array() ) {
18
+ $instance = self::get_instance();
19
+ $instance->_render( $view, $args );
20
+ }
21
+
22
+ public static function load( $view, $args = array() ) {
23
+ $instance = self::get_instance();
24
+
25
+ return $instance->_load( $view, $args );
26
+ }
27
+
28
+ protected function _get_view_defaults() {
29
+ return array();
30
+ }
31
+ }
includes/core/class-wds-type-traverser.php CHANGED
@@ -60,10 +60,25 @@ abstract class Smartcrawl_Type_Traverser {
60
  }
61
  }
62
 
63
- private function get_resolver() {
64
  return Smartcrawl_Endpoint_Resolver::resolve();
65
  }
66
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  abstract public function handle_bp_groups();
68
 
69
  abstract public function handle_bp_profile();
60
  }
61
  }
62
 
63
+ protected function get_resolver() {
64
  return Smartcrawl_Endpoint_Resolver::resolve();
65
  }
66
 
67
+ protected function get_queried_object() {
68
+ $query_context = $this->get_resolver()->get_query_context();
69
+ $queried_object = $query_context->get_queried_object();
70
+
71
+ return $queried_object;
72
+ }
73
+
74
+ protected function get_query_context() {
75
+ return $this->get_resolver()->get_query_context();
76
+ }
77
+
78
+ protected function get_context() {
79
+ return $this->get_resolver()->get_context();
80
+ }
81
+
82
  abstract public function handle_bp_groups();
83
 
84
  abstract public function handle_bp_profile();
includes/core/class-wds-yoast-importer.php CHANGED
@@ -21,7 +21,7 @@ class Smartcrawl_Yoast_Importer extends Smartcrawl_Importer {
21
  return false;
22
  }
23
 
24
- return strpos( $version, '7.' ) === 0 || strpos( $version, '8.' ) === 0;
25
  }
26
 
27
  public function import_options() {
@@ -356,6 +356,11 @@ class Smartcrawl_Yoast_Importer extends Smartcrawl_Importer {
356
  $this->add_post_meta( $post_id, $wds_meta );
357
  }
358
 
 
 
 
 
 
359
  return count( $all_posts ) === count( $batch_posts );
360
  }
361
 
@@ -422,4 +427,11 @@ class Smartcrawl_Yoast_Importer extends Smartcrawl_Importer {
422
  protected function get_custom_handlers() {
423
  return $this->custom_handlers;
424
  }
 
 
 
 
 
 
 
425
  }
21
  return false;
22
  }
23
 
24
+ return strpos( $version, '9.' ) === 0;
25
  }
26
 
27
  public function import_options() {
356
  $this->add_post_meta( $post_id, $wds_meta );
357
  }
358
 
359
+ $this->update_status( array(
360
+ 'remaining_posts' => count( $this->get_posts_with_yoast_metas() ),
361
+ 'completed_posts' => count( $this->get_posts_with_target_metas() ),
362
+ ) );
363
+
364
  return count( $all_posts ) === count( $batch_posts );
365
  }
366
 
427
  protected function get_custom_handlers() {
428
  return $this->custom_handlers;
429
  }
430
+
431
+ protected function get_source_plugins() {
432
+ return array(
433
+ 'wordpress-seo/wp-seo.php',
434
+ 'wordpress-seo-premium/wp-seo-premium.php',
435
+ );
436
+ }
437
  }
includes/core/core.php CHANGED
@@ -101,10 +101,10 @@ function smartcrawl_replace_vars( $string, $args = array() ) {
101
  '%%name%%' => get_the_author_meta( 'display_name', ! empty( $r['post_author'] ) ? $r['post_author'] : get_query_var( 'author' ) ),
102
  '%%userid%%' => ! empty( $r['post_author'] ) ? $r['post_author'] : get_query_var( 'author' ),
103
  '%%searchphrase%%' => esc_html( get_query_var( 's' ) ),
104
- '%%currenttime%%' => date( 'H:i' ),
105
- '%%currentdate%%' => date( 'M jS Y' ),
106
- '%%currentmonth%%' => date( 'F' ),
107
- '%%currentyear%%' => date( 'Y' ),
108
  '%%page%%' => ( intval( get_query_var( 'paged' ) ) !== 0 ) ? 'Page ' . get_query_var( 'paged' ) . ' of ' . $wp_query->max_num_pages : '',
109
  '%%spell_page%%' => ( intval( get_query_var( 'paged' ) ) !== 0 ) ? 'Page ' . smartcrawl_spell_number( get_query_var( 'paged' ) ) . ' of ' . smartcrawl_spell_number( $wp_query->max_num_pages ) : '',
110
  '%%pagetotal%%' => ( $wp_query->max_num_pages > 1 ) ? $wp_query->max_num_pages : '',
@@ -121,7 +121,47 @@ function smartcrawl_replace_vars( $string, $args = array() ) {
121
  '%%pt_single%%' => is_a( $args, 'WP_Post_Type' ) ? $args->labels->singular_name : '',
122
  );
123
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  foreach ( $replacements as $var => $repl ) {
 
 
 
 
 
 
 
125
  $repl = apply_filters( 'wds-macro-variable_replacement', $repl, $var );
126
  $string = str_replace( $var, $repl, $string );
127
  }
@@ -202,7 +242,7 @@ function smartcrawl_get_seo_title( $post = false ) {
202
  return smartcrawl_replace_vars( $smartcrawl_options[ 'title-' . $post->post_type ], (array) $post );
203
  }
204
 
205
- return 'false';
206
  }
207
 
208
  /**
@@ -356,10 +396,94 @@ function _wds_hb_convert_tri( $num, $tri ) {
356
  */
357
  function smartcrawl_get_trimmed_excerpt( $excerpt, $contents ) {
358
  $string = $excerpt ? $excerpt : $contents;
359
- $string = trim( preg_replace( '/\r|\n/', ' ', strip_shortcodes( htmlspecialchars( wp_strip_all_tags( strip_shortcodes( $string ) ), ENT_QUOTES ) ) ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
360
 
361
- return ( preg_match( '/.{156,}/um', $string ) )
362
- ? preg_replace( '/(.{0,152}).*/um', '$1', $string ) . '...'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
363
  : $string;
364
  }
365
 
@@ -389,6 +513,7 @@ function smartcrawl_get_term_meta( $term, $taxonomy, $meta ) {
389
  function smartcrawl_blog_template_settings( $and ) {
390
  // $and .= " AND `option_name` != 'wds_sitemaps_options'"; // Removed plural
391
  $and .= " AND `option_name` != 'wds_sitemap_options'"; // Added singular
 
392
  return $and;
393
  }
394
 
@@ -581,6 +706,7 @@ add_filter( 'post_edit_form_tag', 'register_metabox_collapsed_state' );
581
  * This applies only for multisite, non-sitewide setups.
582
  *
583
  * @param string $slug Slug to check.
 
584
  * @TODO: This function is a duplicate of Smartcrawl_Settings_Admin.is_tab_allowed, make sure only one remains
585
  *
586
  * @return bool
@@ -925,24 +1051,11 @@ function smartcrawl_get_allowed_html_for_forms() {
925
  }
926
 
927
  function smartcrawl_file_get_contents( $file ) {
928
- if ( ! function_exists( 'WP_Filesystem' ) ) {
929
- require_once ABSPATH . 'wp-admin/includes/file.php';
930
- }
931
- WP_Filesystem();
932
- $file_system = new WP_Filesystem_Direct( null );
933
- $contents = $file_system->get_contents( $file );
934
-
935
- return $contents;
936
  }
937
 
938
- function smartcrawl_file_put_contents( $file, $contents, $mode = false ) {
939
- if ( ! function_exists( 'WP_Filesystem' ) ) {
940
- require_once ABSPATH . 'wp-admin/includes/file.php';
941
- }
942
- WP_Filesystem();
943
- $file_system = new WP_Filesystem_Direct( null );
944
-
945
- return $file_system->put_contents( $file, $contents, $mode );
946
  }
947
 
948
  /**
@@ -960,7 +1073,7 @@ function smartcrawl_get_latest_post_version( $post_id ) {
960
  ) );
961
  if ( count( $post_revisions ) ) {
962
  $revision = array_shift( $post_revisions );
963
- if ( strtotime( $revision->post_modified ) > strtotime( $post->post_date ) ) {
964
  return $revision;
965
  }
966
  }
@@ -976,9 +1089,13 @@ function smartcrawl_get_latest_post_version( $post_id ) {
976
  * @return bool
977
  */
978
  function smartcrawl_is_valid_meta_tag( $string ) {
979
- $string = trim($string);
980
- if (!preg_match('/^\<meta/i', $string)) return false;
981
- if (!preg_match('/\>$/', $string)) return false;
 
 
 
 
982
 
983
  return true;
984
  }
101
  '%%name%%' => get_the_author_meta( 'display_name', ! empty( $r['post_author'] ) ? $r['post_author'] : get_query_var( 'author' ) ),
102
  '%%userid%%' => ! empty( $r['post_author'] ) ? $r['post_author'] : get_query_var( 'author' ),
103
  '%%searchphrase%%' => esc_html( get_query_var( 's' ) ),
104
+ '%%currenttime%%' => date_i18n( get_option( 'time_format' ) ),
105
+ '%%currentdate%%' => date_i18n( get_option( 'date_format' ) ),
106
+ '%%currentmonth%%' => date_i18n( 'F' ),
107
+ '%%currentyear%%' => date_i18n( 'Y' ),
108
  '%%page%%' => ( intval( get_query_var( 'paged' ) ) !== 0 ) ? 'Page ' . get_query_var( 'paged' ) . ' of ' . $wp_query->max_num_pages : '',
109
  '%%spell_page%%' => ( intval( get_query_var( 'paged' ) ) !== 0 ) ? 'Page ' . smartcrawl_spell_number( get_query_var( 'paged' ) ) . ' of ' . smartcrawl_spell_number( $wp_query->max_num_pages ) : '',
110
  '%%pagetotal%%' => ( $wp_query->max_num_pages > 1 ) ? $wp_query->max_num_pages : '',
121
  '%%pt_single%%' => is_a( $args, 'WP_Post_Type' ) ? $args->labels->singular_name : '',
122
  );
123
 
124
+ $replacements = array_combine(
125
+ apply_filters( 'wds-known_macros-keys', array_keys( $replacements ) ),
126
+ apply_filters( 'wds-known_macros-values', array_values( $replacements ) )
127
+ );
128
+ $replacements = apply_filters(
129
+ 'wds-known_macros',
130
+ $replacements
131
+ );
132
+
133
+ $context_object = null;
134
+ if ( isset( $r['ID'] ) ) {
135
+ $post_object = get_post( $r['ID'] );
136
+ if ( is_a( $post_object, 'WP_Post' ) ) {
137
+ $context_object = $post_object;
138
+ }
139
+ }
140
+ if ( isset( $r['term_id'] ) ) {
141
+ $term_object = get_term( $r['term_id'] );
142
+ if ( is_a( $term_object, 'WP_Term' ) ) {
143
+ $context_object = $term_object;
144
+ }
145
+ }
146
+ if ( $context_object ) {
147
+ $dynamic_replacements = Smartcrawl_Replacement_Helper::get_dynamic_replacements(
148
+ $string,
149
+ $context_object
150
+ );
151
+ $replacements = array_merge(
152
+ $replacements,
153
+ empty( $dynamic_replacements ) || ! is_array( $dynamic_replacements ) ? array() : $dynamic_replacements
154
+ );
155
+ }
156
+
157
  foreach ( $replacements as $var => $repl ) {
158
+ if ( ! is_scalar( $repl ) ) {
159
+ $repl_value = '';
160
+ if ( ! empty( $repl['callback'] ) && is_callable( $repl['callback'] ) ) {
161
+ $repl_value = call_user_func( $repl['callback'], $var, $r );
162
+ }
163
+ $repl = $repl_value;
164
+ }
165
  $repl = apply_filters( 'wds-macro-variable_replacement', $repl, $var );
166
  $string = str_replace( $var, $repl, $string );
167
  }
242
  return smartcrawl_replace_vars( $smartcrawl_options[ 'title-' . $post->post_type ], (array) $post );
243
  }
244
 
245
+ return false;
246
  }
247
 
248
  /**
396
  */
397
  function smartcrawl_get_trimmed_excerpt( $excerpt, $contents ) {
398
  $string = $excerpt ? $excerpt : $contents;
399
+ // Remove shortcodes but keep the content
400
+ $string = smartcrawl_remove_shortcodes( $string );
401
+ // Strip all HTML tags
402
+ $string = wp_strip_all_tags( $string );
403
+ // Encode any HTML entities like > and <
404
+ $string = esc_attr( $string );
405
+ // Normalize whitespace
406
+ $string = smartcrawl_normalize_whitespace( $string );
407
+
408
+ return smartcrawl_truncate_meta_description( $string );
409
+ }
410
+
411
+ function smartcrawl_normalize_whitespace( $string ) {
412
+ // Replace whitespace characters with simple spaces
413
+ $string = str_replace( array( "\r", "\n", "\t" ), ' ', $string );
414
+ // Replace each set of multiple consecutive spaces with a single space
415
+ $string = preg_replace( '/[ ]+/', ' ', $string );
416
+
417
+ return trim( $string );
418
+ }
419
 
420
+ /**
421
+ * Removes the shortcode tags but keeps the content within them. Will convert [shortcode attr="val"]Some text![/shortcode] to: Some text!
422
+ * @see get_shortcode_regex()
423
+ */
424
+ function smartcrawl_remove_shortcodes( $content ) {
425
+ $pattern = get_shortcode_regex();
426
+ return preg_replace_callback( "/$pattern/s", 'smartcrawl_extract_shortcode_contents', $content );
427
+ }
428
+
429
+ /**
430
+ * Our callback function for making get_shortcode_regex() replacements.
431
+ *
432
+ * @see get_shortcode_regex()
433
+ *
434
+ * @param $matches array This array contains data in the following format:
435
+ * array(
436
+ * 0 => full matched string
437
+ * 1 => the character [ for escaped shortcodes e.g. [[foo]]
438
+ * 2 => the actual shortcode tag
439
+ * 3 => shortcode attributes
440
+ * 4 => ?
441
+ * 5 => The content nested inside the opening and closing shortcode tags
442
+ * 6 => the character ] for escaped shortcodes
443
+ * );
444
+ *
445
+ * @return bool|mixed|string
446
+ */
447
+ function smartcrawl_extract_shortcode_contents( $matches ) {
448
+ if ( empty( $matches ) || count( $matches ) < 7 ) {
449
+ // Not the expected regex for some reason. Try returning the full match or fall back to empty string.
450
+ return isset( $matches[0] ) ? $matches[0] : '';
451
+ }
452
+
453
+ // Allow [[foo]] syntax for escaping a tag.
454
+ if ( '[' === $matches[1] && ']' === $matches[6] ) {
455
+ // Return the whole matched string without the surrounding square brackets that were there for escaping
456
+ return substr( $matches[0], 1, - 1 );
457
+ }
458
+
459
+ $omitted = apply_filters( 'wds-omitted-shortcodes', array() );
460
+ if (
461
+ ! empty( $matches[5] )
462
+ && ! in_array( $matches[2], $omitted )
463
+ ) {
464
+ // Call the removal method on the content nested in the current shortcode
465
+ // This will continue recursively until we have removed all shortcodes
466
+ return smartcrawl_remove_shortcodes( trim( $matches[5] ) . ' ' );
467
+ }
468
+
469
+ // Just remove the content-less, non-escaped shortcodes
470
+ return '';
471
+ }
472
+
473
+ function smartcrawl_truncate_meta_title( $string ) {
474
+ return smartcrawl_truncare_meta( $string, SMARTCRAWL_TITLE_LENGTH_CHAR_COUNT_LIMIT );
475
+ }
476
+
477
+ function smartcrawl_truncate_meta_description( $string ) {
478
+ return smartcrawl_truncare_meta( $string, SMARTCRAWL_METADESC_LENGTH_CHAR_COUNT_LIMIT );
479
+ }
480
+
481
+ function smartcrawl_truncare_meta( $string, $limit ) {
482
+ $pattern = sprintf( '/.{%d,}/um', $limit + 1 );
483
+ $replacement_pattern = sprintf( '/(.{0,%d}).*/um', $limit - 4 ); // -4 for 1 space plus ...
484
+
485
+ return ( preg_match( $pattern, $string ) )
486
+ ? preg_replace( $replacement_pattern, '$1', $string ) . ' ...'
487
  : $string;
488
  }
489
 
513
  function smartcrawl_blog_template_settings( $and ) {
514
  // $and .= " AND `option_name` != 'wds_sitemaps_options'"; // Removed plural
515
  $and .= " AND `option_name` != 'wds_sitemap_options'"; // Added singular
516
+
517
  return $and;
518
  }
519
 
706
  * This applies only for multisite, non-sitewide setups.
707
  *
708
  * @param string $slug Slug to check.
709
+ *
710
  * @TODO: This function is a duplicate of Smartcrawl_Settings_Admin.is_tab_allowed, make sure only one remains
711
  *
712
  * @return bool
1051
  }
1052
 
1053
  function smartcrawl_file_get_contents( $file ) {
1054
+ return file_get_contents( $file ); // phpcs:ignore -- WP_Filesystem doesn't work properly
 
 
 
 
 
 
 
1055
  }
1056
 
1057
+ function smartcrawl_file_put_contents( $file, $contents, $flags = 0 ) {
1058
+ return file_put_contents( $file, $contents, $flags ); // phpcs:ignore -- WP_Filesystem doesn't work properly
 
 
 
 
 
 
1059
  }
1060
 
1061
  /**
1073
  ) );
1074
  if ( count( $post_revisions ) ) {
1075
  $revision = array_shift( $post_revisions );
1076
+ if ( strtotime( $revision->post_modified ) > strtotime( $post->post_modified ) ) {
1077
  return $revision;
1078
  }
1079
  }
1089
  * @return bool
1090
  */
1091
  function smartcrawl_is_valid_meta_tag( $string ) {
1092
+ $string = trim( $string );
1093
+ if ( ! preg_match( '/^\<meta/i', $string ) ) {
1094
+ return false;
1095
+ }
1096
+ if ( ! preg_match( '/\>$/', $string ) ) {
1097
+ return false;
1098
+ }
1099
 
1100
  return true;
1101
  }
includes/css/app.css CHANGED
@@ -1 +1 @@
1
- .cf:after,.wpmud #header:after,.wpmud .dev-box .box-title:after,.wpmud .wds-box-footer:after,.wpmud .uptime-message:after,.wpmud .wds-table-fields:after,.wpmud .wds-keyword-pairs .wds-keyword-pair:after,.wpmud .wds-styleable-file-input:after,.wpmud .wds-preset-separators:after,.wpmud .wds-automatic-linking:after,.wpmud .wds-moz-api-credentials:after{content:"";display:table;clear:both}@media only screen and (max-width: 1200px){.hide-to-large{display:none}}@media only screen and (max-width: 1100px){.hide-to-desktop{display:none}}.wpmud .select2-container .select2-selection--single{background:#FAFAFA;border-color:#ddd;height:44px}.wpmud .select2-container .select2-selection--single .select2-selection__rendered{padding:8px 45px 8px 15px;line-height:1;font:500 15px/25px "Roboto"}.wpmud .select2-container .select2-selection--single .select2-selection__arrow{height:39px;width:45px}.wpmud .select2-container .select2-selection--single .select2-selection__arrow::before{content:"\65";display:block;font-family:"WPMU-DEV-App-Icons",sans-serif;font-size:20px;margin-top:9px;text-align:center}.wpmud .select2-container .select2-selection--single b[role="presentation"]{border-color:transparent}.wpmud .select2-container .select2-dropdown{background:#FAFAFA;border-color:#ddd}.wpmud .select2-container .select2-results__option{margin:0;font:500 15px/25px "Roboto";padding:8px 15px}.wpmud .select2-container .select2-results__option--highlighted[aria-selected]{background-color:rgba(0,0,0,0.05);color:#414042}.wpmud .select2-container .select2-results__option[aria-selected=true]{background-color:#17a8e3;color:#fff}.wpmud .select2-container.select2-container--open .select2-selection--single .select2-selection__arrow::before{content:"\72"}.wpmud .select2-container.select2-container--above .select2-selection--single .select2-selection__arrow::before{content:"\72"}.wpmud .select2-container.select2-container--above.select2-container--open .select2-selection--single .select2-selection__arrow::before{content:"\65"}.wpmud .select2-container.select2-container--above.select2-container--open .select2-selection--single .select2-selection__rendered{padding-top:9px}.wds-select2-dropdown-container .select2-selection--single{background:#FAFAFA;border-color:#ddd;height:44px}.wds-select2-dropdown-container .select2-selection--single .select2-selection__rendered{padding:8px 45px 8px 15px;line-height:1;font:500 15px/25px "Roboto"}.wds-select2-dropdown-container .select2-selection--single .select2-selection__arrow{height:39px;width:45px}.wds-select2-dropdown-container .select2-selection--single .select2-selection__arrow::before{content:"\65";display:block;font-family:"WPMU-DEV-App-Icons",sans-serif;font-size:20px;margin-top:9px;text-align:center}.wds-select2-dropdown-container .select2-selection--single b[role="presentation"]{border-color:transparent}.wds-select2-dropdown-container .select2-dropdown{background:#FAFAFA;border-color:#ddd}.wds-select2-dropdown-container .select2-results__option{margin:0;font:500 15px/25px "Roboto";padding:8px 15px}.wds-select2-dropdown-container .select2-results__option--highlighted[aria-selected]{background-color:rgba(0,0,0,0.05);color:#414042}.wds-select2-dropdown-container .select2-results__option[aria-selected=true]{background-color:#17a8e3;color:#fff}.wds-select2-dropdown-container.select2-container--open .select2-selection--single .select2-selection__arrow::before{content:"\72"}.wds-select2-dropdown-container.select2-container--above .select2-selection--single .select2-selection__arrow::before{content:"\72"}.wds-select2-dropdown-container.select2-container--above.select2-container--open .select2-selection--single .select2-selection__arrow::before{content:"\65"}.wds-select2-dropdown-container.select2-container--above.select2-container--open .select2-selection--single .select2-selection__rendered{padding-top:9px}.wpmud{-webkit-font-smoothing:antialiased}.wpmud-html{background-color:#f1f1f1}.wpmud *{box-sizing:border-box}.wpmud strong,.wpmud b{font-weight:500}.wpmud p{color:#666;line-height:30px;margin-bottom:30px}.wpmud #header{margin-bottom:30px}.wpmud #header h1{color:#333;margin:0 0 30px;display:table;float:left}.wpmud #header h1:last-child{margin-bottom:0}.wpmud #header h1 .wds-toggle{vertical-align:top;width:42px}.wpmud #header ~ .sub-header{margin-top:30px;margin-bottom:30px}.wpmud #header .actions{float:right}.wpmud #header .actions .button{vertical-align:middle;margin-left:20px}.wpmud #header .notice,.wpmud #header div.error,.wpmud #header div.updated{clear:both}.wpmud #wpbody{background:transparent}.wpmud #container{margin:30px 30px 0 10px}.wpmud .dev-box{padding:0}.wpmud .dev-box:last-child{margin-bottom:0}.wpmud .dev-box .box-title{clear:both;height:inherit;margin:0;padding:0 30px}.wpmud .dev-box .box-title h3{float:left;font-size:15px;color:#333}.wpmud .dev-box .box-title .buttons.left{float:left;margin:10px 0 0 20px}.wpmud .dev-box .box-content{padding:30px;word-wrap:break-word}.wpmud .dev-box .box-content.no-padding{padding:0}.wpmud .dev-box .box-content.no-vertical-padding{padding-top:0;padding-bottom:0}.wpmud .dev-box .box-content.no-side-padding{padding-right:0;padding-left:0}.wpmud .dev-box .box-content p{margin-bottom:20px}.wpmud .dev-box .box-content p:last-of-type:last-child{margin-bottom:0}.wpmud .dev-box .box-content .wds-standalone-bottom{margin-bottom:0}.wpmud .dev-box .box-content .buttons{margin-top:20px}.wpmud .dev-box .box-content .buttons.buttons-on-left{text-align:left}.wpmud .dev-box .box-content .buttons.buttons-on-right{text-align:right}.wpmud .dev-box .box-footer{margin-top:0;padding:0 30px 30px 30px}.wpmud .dev-box .box-footer.bordered-top{border-top:2px solid #f4f4f4;padding-top:30px}.wpmud .dev-box .box-footer.modal{margin-top:30px;padding:0}.wpmud .dev-box .box-footer.buttons .select-wrapper{display:inline-block}.wpmud .dev-box .box-footer.buttons .select-wrapper>*{display:inline-block}.wpmud .dev-box .box-footer.buttons .select-wrapper>label{float:left;line-height:43px;margin:0 15px 0 0;padding:0;vertical-align:middle}.wpmud .dev-box .box-footer.buttons .button,.wpmud .dev-box .box-footer.buttons input[type="submit"]{display:inline-block;margin-left:20px}.wpmud .dev-box .box-footer.buttons .button:first-child,.wpmud .dev-box .box-footer.buttons input[type="submit"]:first-child{margin-left:0}.wpmud .wds-modal *{box-sizing:border-box}.wpmud .wds-modal.dev-overlay .title h3{color:#333;font-family:"Roboto Condensed","Roboto",Arial,sans-serif;font-size:15px}.wpmud .wds-modal.dev-overlay .back{background:#333;opacity:0.95}.wpmud .wds-modal .box{padding:0}.wpmud .wds-modal .box .title{margin:0;padding:0 30px}.wpmud .wds-modal .box .content{padding:30px}.wpmud .wds-box-footer{border-top:1px solid #EAEAEA;margin:30px -30px -30px;padding:30px}.wpmud form>div.buttons{text-align:center}.wpmud form .vertical-tabs{padding:15px 0 0}.wpmud .vertical-tabs{margin-bottom:30px}.wpmud .vertical-tabs>.tab input[type="radio"]{display:none}.wpmud .vertical-tabs>.tab>.wds-content-tabs{padding:0;border-radius:7px;left:200px}.wpmud .vertical-tabs>.tab>label{color:#888;font:400 15px/20px "Roboto",Arial,sans-serif;padding:5px 15px;border-radius:20px;text-transform:inherit;width:170px;margin:0 0 10px}.wpmud .vertical-tabs>.tab>label:hover{color:#333}.wpmud .vertical-tabs>.tab>label:after{border-bottom:none}.wpmud .vertical-tabs>.tab input[type="radio"]:checked+label{color:#333;background:#eaeaea;box-shadow:none;padding-top:5px;font-weight:500}.wpmud .vertical-tabs .wds-content-tabs .tab-title{font-weight:600;line-height:24px;margin:0;max-width:100%;padding:18px 30px;border-bottom:1px solid #EAEAEA;text-align:left;font-size:15px;color:#333}.wpmud .vertical-tabs .wds-content-tabs .wds-content-tabs-inner{padding:30px;position:relative}.wpmud .vertical-tabs .wds-content-tabs.wds-accordion{background:#f9f9f9}.wpmud .vertical-tabs .wds-content-tabs.wds-accordion .tab-title{border-radius:7px 7px 0 0;background:#FFF;border-bottom:none}.wpmud .vertical-tabs .wds-content-tabs.wds-accordion .tab-sub-title .toggle{position:absolute;right:80px}.wpmud .vertical-tabs .wds-content-tabs.wds-accordion .tab-sub-title .wds-archive-disabled-label{background:#f2f2f2;border-radius:13px;color:#aaaaaa;display:none;font-size:13px;margin-left:6px;padding:5px 16px;vertical-align:top}.wpmud .vertical-tabs .wds-content-tabs.wds-accordion .tab-sub-title.wds-archive-disabled{color:#888}.wpmud .vertical-tabs .wds-content-tabs.wds-accordion .tab-sub-title.wds-archive-disabled .wds-archive-disabled-label{display:inline}.wpmud .row-inside-form{margin-bottom:30px;padding:0}.wpmud .wds-footer-text{margin-top:20px;text-align:left}.wpmud .wds-group{margin-bottom:15px}.wpmud .wds-group:last-child{margin-bottom:0}.wpmud .block-section-footer{margin-top:30px}.wpmud .wds-seamless-footer{background:#FFF;border-radius:0 0 7px 7px;padding:30px;border-top:1px solid #EAEAEA;text-align:right}.wpmud .wds-accordion .wds-seamless-footer{border-top:none}.wpmud .toggle.toggle{line-height:1}.wpmud .toggle.toggle .toggle-label{background:transparent;border:1px solid #ccc;height:18px;width:40px;margin-left:0}.wpmud .toggle.toggle .toggle-label::after{background:#777771;height:18px;width:18px;border-radius:100%;margin:0;box-shadow:none;position:relative;top:0}.wpmud .toggle.toggle .toggle-label::before{display:none}.wpmud .toggle.toggle .toggle-checkbox:hover+.toggle-label::after{background:#777771;box-shadow:none}.wpmud .toggle.toggle .toggle-checkbox+.toggle-label::after{margin-left:-1px;margin-top:-1px}.wpmud .toggle.toggle .toggle-checkbox:checked+.toggle-label{background:#f9f9f9}.wpmud .toggle.toggle .toggle-checkbox:checked+.toggle-label::after{background:#17a8e3;margin-left:22px}.wpmud .toggle.toggle.wds-inverted-toggle .toggle-label{background:#f9f9f9}.wpmud .toggle.toggle.wds-inverted-toggle .toggle-label::after{background:#17a8e3;margin-left:22px}.wpmud .toggle.toggle.wds-inverted-toggle .toggle-checkbox:hover+.toggle-label::after{background:#17a8e3}.wpmud .toggle.toggle.wds-inverted-toggle .toggle-checkbox:checked+.toggle-label{background:transparent}.wpmud .toggle.toggle.wds-inverted-toggle .toggle-checkbox:checked+.toggle-label::after{margin-left:-1px;background:#777771}.wpmud .wds-form .input,.wpmud .wds-form input[type="text"],.wpmud .wds-form input[type="email"],.wpmud .wds-form input[type="search"],.wpmud .wds-form input[type="password"],.wpmud .wds-form input[type="url"],.wpmud .wds-form select,.wpmud .wds-form textarea{background:#FAFAFA;border-color:#ddd;color:#333}.wpmud .wds-form .input:hover:not(:focus):not(:active),.wpmud .wds-form .input:focus,.wpmud .wds-form .input:active,.wpmud .wds-form input[type="text"]:hover:not(:focus):not(:active),.wpmud .wds-form input[type="text"]:focus,.wpmud .wds-form input[type="text"]:active,.wpmud .wds-form input[type="email"]:hover:not(:focus):not(:active),.wpmud .wds-form input[type="email"]:focus,.wpmud .wds-form input[type="email"]:active,.wpmud .wds-form input[type="search"]:hover:not(:focus):not(:active),.wpmud .wds-form input[type="search"]:focus,.wpmud .wds-form input[type="search"]:active,.wpmud .wds-form input[type="password"]:hover:not(:focus):not(:active),.wpmud .wds-form input[type="password"]:focus,.wpmud .wds-form input[type="password"]:active,.wpmud .wds-form input[type="url"]:hover:not(:focus):not(:active),.wpmud .wds-form input[type="url"]:focus,.wpmud .wds-form input[type="url"]:active,.wpmud .wds-form select:hover:not(:focus):not(:active),.wpmud .wds-form select:focus,.wpmud .wds-form select:active,.wpmud .wds-form textarea:hover:not(:focus):not(:active),.wpmud .wds-form textarea:focus,.wpmud .wds-form textarea:active{background:#ffffff;border-color:#ddd}.wpmud .wds-form .input:-ms-input-placeholder,.wpmud .wds-form input[type="text"]:-ms-input-placeholder,.wpmud .wds-form input[type="email"]:-ms-input-placeholder,.wpmud .wds-form input[type="search"]:-ms-input-placeholder,.wpmud .wds-form input[type="password"]:-ms-input-placeholder,.wpmud .wds-form input[type="url"]:-ms-input-placeholder,.wpmud .wds-form select:-ms-input-placeholder,.wpmud .wds-form textarea:-ms-input-placeholder{color:#aaaaaa}.wpmud .wds-form .input::placeholder,.wpmud .wds-form input[type="text"]::placeholder,.wpmud .wds-form input[type="email"]::placeholder,.wpmud .wds-form input[type="search"]::placeholder,.wpmud .wds-form input[type="password"]::placeholder,.wpmud .wds-form input[type="url"]::placeholder,.wpmud .wds-form select::placeholder,.wpmud .wds-form textarea::placeholder{color:#aaaaaa}.wpmud .wds-form .input:disabled,.wpmud .wds-form .input.disabled,.wpmud .wds-form input[type="text"]:disabled,.wpmud .wds-form input[type="text"].disabled,.wpmud .wds-form input[type="email"]:disabled,.wpmud .wds-form input[type="email"].disabled,.wpmud .wds-form input[type="search"]:disabled,.wpmud .wds-form input[type="search"].disabled,.wpmud .wds-form input[type="password"]:disabled,.wpmud .wds-form input[type="password"].disabled,.wpmud .wds-form input[type="url"]:disabled,.wpmud .wds-form input[type="url"].disabled,.wpmud .wds-form select:disabled,.wpmud .wds-form select.disabled,.wpmud .wds-form textarea:disabled,.wpmud .wds-form textarea.disabled{color:#aaaaaa !important;background-color:#ffffff !important;border:1px solid #ddd !important}.wpmud .wds-form .select-container{background:#FAFAFA;border-color:#ddd}.wpmud .wds-form .select-container-no-style{background:transparent;border-color:transparent}.wpmud .wds-form .select-container .dropdown-handle{background:#FAFAFA;border-color:#ddd;border-left-width:0}.wpmud .wds-form .select-container .dropdown-handle .wdv-icon:before{font-family:"WPMU-DEV-App-Icons",sans-serif;content:"\65";color:#A6A6A6;font-size:20px}.wpmud .wds-form .select-container .list-value{color:#333}.wpmud .wds-form .select-container.active:hover .list-value,.wpmud .wds-form .select-container.active .list-value:hover{color:#333}.wpmud .wds-form .select-container.active .dropdown-handle{background:#ffffff;border-left-width:1px}.wpmud button,.wpmud .button{border-radius:4px;padding:10px 20px;background:#17a8e3}.wpmud button:hover:not(:focus):not(:active),.wpmud .button:hover:not(:focus):not(:active){background:#41baec}.wpmud button:active,.wpmud button:focus,.wpmud .button:active,.wpmud .button:focus{background:#1286b5}.wpmud button.button-light,.wpmud .button.button-light{background:transparent}.wpmud button.button-light:hover:not(:focus):not(:active),.wpmud .button.button-light:hover:not(:focus):not(:active){background:#f4f4f4}.wpmud .media-modal .media-frame h2{max-width:100%;font-family:inherit}.wpmud .media-modal .media-frame .media-button{padding:0 12px;text-transform:none}.wpmud .media-modal .media-frame .search,.wpmud .media-modal .media-frame .setting input,.wpmud .media-modal .media-frame .setting textarea,.wpmud .media-modal .media-frame .attachment-filters{border-radius:0;box-shadow:0 1px 2px rgba(0,0,0,0.07) inset;font-size:12px;line-height:1.4em;padding:4px}.wpmud .media-modal .media-frame .search:not(:disabled):not([readonly]),.wpmud .media-modal .media-frame .setting input:not(:disabled):not([readonly]),.wpmud .media-modal .media-frame .setting textarea:not(:disabled):not([readonly]),.wpmud .media-modal .media-frame .attachment-filters:not(:disabled):not([readonly]){background-color:#fff;border:1px solid #ddd}.wpmud .media-modal .media-frame .search{margin-top:11px}.wpmud .media-modal .media-frame .setting{padding:0}.wpmud .media-modal .media-frame .attachment-filters{display:inline;width:100px;max-width:200px;padding:0}.wpmud .media-modal .media-frame .delete-attachment,.wpmud .media-modal .media-frame .trash-attachment,.wpmud .media-modal .media-frame .untrash-attachment{font-family:inherit;font-size:inherit;text-transform:none}.wpmud .media-modal .media-modal-close{background:transparent;border:none;color:#666;cursor:pointer;height:50px;margin:0;outline:medium none;padding:0;position:absolute;right:0;top:0;transition:color 0.1s ease-in-out 0s, background 0.1s ease-in-out 0s;width:50px;z-index:1000}.wpmud .media-modal .media-modal-close:hover:not(:focus):not(:active),.wpmud .media-modal .media-modal-close:hover{color:#00A0D2;background:transparent}.wpmud .notice,.wpmud div.error,.wpmud div.updated{text-align:left}.wpmud #wpbody-content>.error,.wpmud #wpbody-content>.updated{margin:30px 20px 30px 0}.wpmud .wds-image{display:block;height:auto;max-width:100%}.wpmud .wds-image-center{margin-right:auto;margin-left:auto}.wpmud .wds-image-standalone{margin-bottom:30px}.wpmud .wds-listing{margin:0}.wpmud .wds-listing li{font:400 15px/21px "Roboto",Arial,sans-serif;margin-top:20px;margin-bottom:0}.wpmud .wds-listing li:first-child{margin-top:0}.wpmud .wds-listing li strong{font-weight:500}.wpmud .wds-listing li.cta-alt:before{color:#BE1E2D}.wpmud .wds-listing.bold li{font-weight:500}.wpmud .wds-listing-ordered{padding-left:20px}.wpmud .wds-listing .wds-listing-label{color:#777771;font:400 20px/26px "Roboto Condensed","Roboto",Arial,sans-serif;margin-bottom:15px}.wpmud .wds-pre{border-left:none}.wpmud .wds-pre-inline{display:inline-block;margin:0;font-style:italic}.wpmud .wds-title-alt{font-size:30px;font-weight:400;line-height:40px;max-width:none;overflow:hidden;text-overflow:ellipsis;text-transform:none;white-space:nowrap}.wpmud .wds-page-desc{color:#444;font-family:'Open Sans', Arial, sans-serif;font-weight:400;font-size:14px;line-height:20px}.wpmud .uptime-message>*{float:left;line-height:40px;margin-right:10px}.wpmud .uptime-message .wds-dashicons-box-title{margin:0 10px 0 0;height:40px}.wpmud .uptime-message .uptime>span{display:block}.wpmud .uptime-message .uptime-result{font-size:22px;font-weight:700;line-height:26px}.wpmud .uptime-message .uptime-label{color:#bfbfbf;font:400 13px/14px "Roboto Condensed","Roboto",Arial,sans-serif;text-transform:uppercase}.wds-qtip{background:#0B2F3F;border-color:#0B2F3F;color:#FFF;padding:3px}.wpmud .wds-disabled-component{text-align:center}.wpmud .wds-disabled-component .wds-disabled-image{width:128px;height:auto}.wpmud .wds-disabled-component p{margin-bottom:30px}.wpmud .wds-disabled-component .wds-notice{margin-bottom:30px}.wpmud .wds-has-tooltip{cursor:pointer}.wpmud .button.large{padding:20px}.wpmud .button-light-wds{box-shadow:0 0 0 2px #BABABA inset}.wpmud .button-fields-trigger{background:transparent;border:1px solid transparent;color:#888888;font-size:12px;line-height:16px;font-weight:400;padding:12px 12px 9px 12px;transition:background .3s, color .3s, opacity .3s}.wpmud .button-fields-trigger:hover:not(:focus):not(:active),.wpmud .button-fields-trigger:hover,.wpmud .button-fields-trigger:active,.wpmud .button-fields-trigger:focus{background:#EAEAEA;border:1px solid transparent;color:#777771}.wpmud .button.button-cta-alt{background:#BE1E2D;box-shadow:0 3px 0 0 #991825}.wpmud .button.button-cta-alt:hover:not(:focus):not(:active){background:#991825;box-shadow:0 3px 0 0 #660000}.wpmud .button.button-cta-alt:active,.wpmud .button.button-cta-alt:focus{box-shadow:0 3px 0 0 #660000;background:#991825;background:linear-gradient(to bottom, #991825 0%, #BE1E2D 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#991825', endColorstr='#BE1E2D', GradientType=0)}.wpmud .button.button-cta-dark{background:#414042;box-shadow:0 3px 0 0 #231F20}.wpmud .button.button-cta-dark:hover:not(:focus):not(:active){background:#231F20;box-shadow:0 3px 0 0 #0E0D0F}.wpmud .button.button-cta-dark:active,.wpmud .button.button-cta-dark:focus{box-shadow:0 3px 0 0 #0E0D0F;background:#231F20;background:linear-gradient(to bottom, #231F20 0%, #414042 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#231F20', endColorstr='#414042', GradientType=0)}.wpmud .button-white{background:transparent;border:2px solid #fff;box-shadow:none;color:#fff;padding:8px 20px;transition:background .3s, border-color .3s, color .3s, opacity .3s}.wpmud .button-white:hover:not(:focus):not(:active){background:#fff;border-color:#fff;box-shadow:none;color:#4A4A4A}.wpmud .button-white:active,.wpmud .button-white:focus{color:#4A4A4A;box-shadow:none;border:2px solid #E6E6E6;background:#E6E6E6;background:linear-gradient(to bottom, #E6E6E6 0%, #fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#E6E6E6', endColorstr='#fff', GradientType=0);transform:inherit}.wpmud .button-yellow-alt{background:transparent;border:2px solid #FECF2F;box-shadow:none;color:#FECF2F;padding:8px 20px;transition:background .3s, border-color .3s, color .3s, opacity .3s}.wpmud .button-yellow-alt:hover:not(:focus):not(:active){background:#FECF2F;border-color:#FECF2F;box-shadow:none;color:#fff}.wpmud .button-yellow-alt:active,.wpmud .button-yellow-alt:focus{color:#FFFFFF;box-shadow:none;border-color:#E5B616;background:#E5B616;background:linear-gradient(to bottom, #E5B616 0%, #FECF2F 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#E5B616', endColorstr='#FECF2F', GradientType=0)}.wpmud .button-dark{background:#888;color:#ffffff}.wpmud .button-dark:hover:not(:focus):not(:active),.wpmud .button-dark:hover,.wpmud .button-dark:focus,.wpmud .button-dark:active{background:#6f6f6f;color:#ffffff}.wpmud .button-small.button{font-family:"Roboto",Arial,sans-serif;font-size:12px;line-height:16px;padding:7px 16px}.wpmud .button-dark-o{background:transparent;border:2px solid #666;box-shadow:none;color:#666;padding:8px 20px;font-family:"Roboto",Arial,sans-serif;font-weight:500}.wpmud .button-dark-o:hover:not(:focus):not(:active),.wpmud .button-dark-o:hover,.wpmud .button-dark-o:focus,.wpmud .button-dark-o:active{background:transparent;border:2px solid gray;color:gray}.wpmud .button-dark-o.button-small.button{padding:5px 16px}.wpmud .button-pro{border:2px solid #1ABC9C;border-radius:20px;color:#1ABC9C;font-family:"Roboto",Arial,sans-serif;font-size:12px;font-weight:500;line-height:16px;text-transform:uppercase;background:transparent}.wpmud .button-pro:hover:not(:focus):not(:active),.wpmud .button-pro:hover,.wpmud .button-pro:focus,.wpmud .button-pro:active{background:transparent;border:2px solid #148f77;color:#148f77}.wpmud .wds-button-with-loader.wds-item-loading::before{font-size:18px}.wpmud .wds-button-with-left-loader.wds-item-loading::before{right:110%}.wpmud .wds-button-with-right-loader.wds-item-loading::before{left:110%}.wpmud input[type="number"],.wpmud input[type="url"]{background:#FFF;border:1px solid #ddd;border-radius:4px;box-shadow:none;color:#999;display:block;font:500 15px/25px "Roboto",Arial,sans-serif;margin:0px 0px 15px 0px;max-width:100%;padding:7px 15px 6px;transition-property:background, color, border-color;transition-duration:0.3s;width:100%}.wpmud input[type="number"]:focus,.wpmud input[type="url"]:focus{border-color:#BBB;color:#3D464D}.wpmud input[type="number"]:focus::-webkit-input-placeholder,.wpmud input[type="url"]:focus::-webkit-input-placeholder{transition:opacity 0.3s 0.4s ease;opacity:0.25}.wpmud input[type="number"]:focus:-moz-placeholder,.wpmud input[type="url"]:focus:-moz-placeholder{transition:opacity 0.3s 0.4s ease;opacity:0.25}.wpmud input[type="number"]:focus::-moz-placeholder,.wpmud input[type="url"]:focus::-moz-placeholder{transition:opacity 0.3s 0.4s ease;opacity:0.25}.wpmud input[type="number"]:focus:-ms-input-placeholder,.wpmud input[type="url"]:focus:-ms-input-placeholder{transition:opacity 0.3s 0.4s ease;opacity:0.25}.wpmud input[type="number"]:hover:not(:focus),.wpmud input[type="url"]:hover:not(:focus){color:#3D464D}.wpmud input[type="number"]:disabled,.wpmud input[type="url"]:disabled{background:#F6F6F6 !important;color:#AAA !important;border-color:#ddd !important;cursor:default}.wpmud input[type="number"]::-webkit-input-placeholder,.wpmud input[type="url"]::-webkit-input-placeholder{position:relative;top:0}.wpmud input[type="number"]:-moz-placeholder,.wpmud input[type="url"]:-moz-placeholder{position:relative;top:0}.wpmud input[type="number"]::-moz-placeholder,.wpmud input[type="url"]::-moz-placeholder{position:relative;top:0}.wpmud input[type="number"]:-ms-input-placeholder,.wpmud input[type="url"]:-ms-input-placeholder{position:relative;top:0}.wpmud .wds-checkbox,.wpmud .wds-radio{box-shadow:none;line-height:20px;height:20px;min-width:20px;width:20px}.wpmud .wds-checkbox:focus,.wpmud .wds-radio:focus{border-color:#19B99A}.wpmud .wds-checkbox-width-label,.wpmud .wds-radio-width-label{margin-right:0}.wpmud .wds-checkbox{border-radius:4px}.wpmud .wds-checkbox:before{color:#19B99A;height:18px;line-height:20px;margin:0 0 0 -2px;width:18px}.wpmud .wds-checkbox:checked{border-color:#19B99A}.wpmud .wds-checkbox:checked:before{color:#19B99A;height:18px;line-height:20px;margin:0 0 0 -2px;width:18px}.wpmud .wds-checkbox-container input[type="checkbox"]{display:none}.wpmud .wds-checkbox-container label{height:16px;width:16px;padding:0;margin:0}.wpmud .wds-checkbox-container span{background:#FAFAFA;border:1px solid #ddd;height:16px;width:16px;border-radius:4px;display:block}.wpmud .wds-checkbox-container input[type="checkbox"]:checked+span{background:#17a8e3;border:#17a8e3}.wpmud .wds-checkbox-container input[type="checkbox"]:checked+span:before{color:#fff;content:"\7a";display:block;font-family:"WPMU-DEV-App-Icons";font-size:10px;line-height:1;padding:3px}.wpmud .wds-radio{margin-top:0}.wpmud .wds-radio:checked:before{background-color:#19B99A;height:10px;line-height:20px;width:10px}.wpmud .wds-fieldset-legend,.wpmud .wds-label{color:#333;display:block;font-size:15px;line-height:30px;margin-bottom:0;padding:0;text-transform:capitalize;transition:color .4s}.wpmud .wds-fieldset{margin-top:20px}.wpmud .wds-fieldset:first-child{margin-top:0}.wpmud .wds-fieldset-standalone{margin-bottom:20px}.wpmud .wds-fieldset-grey{color:#4A4A4A}.wpmud .wds-label:hover{color:#808080}.wpmud .wds-label.link{color:#19B4CF;display:inline-block;margin:0;text-transform:none}.wpmud .wds-label-inline{display:inline-block}.wpmud .wds-label-inline-left{margin:0 15px 0 0}.wpmud .wds-label-inline-right{margin:0 0 0 15px;max-width:450px}.wpmud .wds-label-description{color:#808080;display:block;font-size:13px;line-height:22px;margin-top:0;margin-bottom:20px}.wpmud .wds-label-radio{color:#4A4A4A}.wpmud .wds-field-legend{color:#808080;display:block;font-size:13px;line-height:18px;margin-top:10px}.wpmud .wds-group-field .wds-field,.wpmud .wds-group-field .wds-select,.wpmud .wds-group-field .wds-textarea{margin-bottom:5px}.wpmud .wds-group-field.has-field-label .wds-field{display:inline-block;width:auto}.wpmud .wds-group-field .wds-field-label{color:#808080;font:400 15px/20px "Roboto",Arial,sans-serif}.wpmud .wds-fieldset-fields{margin-top:15px}.wpmud .wds-fieldset-fields-group{margin:5px 0 0}.wpmud .wds-fieldset-fields-group>p{display:inline-block;margin:0 20px 10px 0 !important}.wpmud .wds-fieldset-fields-group>p:last-child{margin-right:0}.wpmud .wds-fieldset-fields-group .wds-label-inline-right{margin-left:5px}.wpmud .wds-table-fields-group{margin-top:20px}.wpmud .wds-table-fields-group:first-child{margin-top:0}.wpmud .wds-table-fields .label,.wpmud .wds-table-fields .fields{display:block;float:left}.wpmud .wds-table-fields .label{margin-top:5px;padding-right:30px;width:30%}.wpmud .wds-table-fields .label-width-options{margin-top:5px}.wpmud .wds-table-fields .label-long{margin-top:2px}.wpmud .wds-table-fields .label .wds-label{margin-bottom:0}.wpmud .wds-table-fields .fields{width:70%}.wpmud .wds-table-fields .fields .wds-label{color:#666}.wpmud .wds-table-fields .fields-with-legend .wds-field{margin-bottom:5px}.wpmud .wds-table-fields .fields-with-legend-large .wds-field{margin-bottom:10px}.wpmud .wds-table-fields .fields.has-trigger-button{position:relative}.wpmud .wds-table-fields .note{background-color:#f5f5f5;border-radius:3px;clear:both;padding:20px;text-align:center;width:100%}.wpmud .wds-table-fields .note p{color:#4A4A4A;font-weight:400;margin:0;line-height:20px}.wpmud .wds-table-fields .note .wdv-icon{color:#777771;font-size:20px;vertical-align:top}.wpmud .wds-table-fields.wds-table-fields-stacked .label{margin-top:0;padding-right:0;margin-bottom:5px;width:100%}.wpmud .wds-table-fields.wds-table-fields-stacked .label label{color:#888;font-size:12px;font-weight:500;line-height:22px}.wpmud .wds-table-fields.wds-table-fields-stacked .label label span{font-weight:400}.wpmud .wds-table-fields.wds-table-fields-stacked .fields{width:100%}.wpmud .wds-table-fields.wds-table-fields-stacked .select2{margin-bottom:15px}.wpmud .wds-separator-top{margin-top:30px;padding-top:30px;border-top:1px solid #EAEAEA}.wpmud .wds-code-label{display:block;margin-bottom:5px}.wpmud .wds-toggle-table{display:table;width:100%}.wpmud .wds-toggle-table.disabled{opacity:.5}.wpmud .wds-toggle-table .toggle.wds-toggle,.wpmud .wds-toggle-table .wds-toggle-description{display:table-cell;vertical-align:top}.wpmud .wds-toggle-table .wds-toggle-description .wds-label{margin-left:0}.wpmud .wds-toggle-table:last-child .wds-label-description{margin-bottom:0}.wpmud .wds-toggle-table .toggle.wds-toggle{padding-top:6px;width:60px}.wpmud .wds-dashicons{color:#808080;font-size:22px;height:22px;opacity:.5;width:22px}.wpmud .wds-dashicons-link{font-size:24px;height:24px;width:24px;transition:all .4s}.wpmud .wds-dashicons-link:hover{opacity:1}.wpmud .wds-dashicons-box-title{margin:-5px 10px 0 0;vertical-align:middle}.wpmud .wds-icon{background:url("../images/smartCrawl_sprite.png") no-repeat 0 0;background-image:url("../images/smartCrawl_sprite.svg"),none}.wpmud .wds-icon-inline{display:inline-block}.wpmud .wds-icon-inline-left{margin-right:15px}.wpmud .wds-icon-inline-right{margin-left:15px}.wpmud .wds-icon-redirect{background-position:-30px -30px;height:16px;width:18px}.wpmud .wds-icon-list{background-position:-30px -76px;height:16px;width:18px}@font-face{font-family:'wpmu-dev-seo-icons';src:url("../fonts/wpmu-dev-seo-icons.eot?gy02j9");src:url("../fonts/wpmu-dev-seo-icons.eot?gy02j9#iefix") format("embedded-opentype"),url("../fonts/wpmu-dev-seo-icons.woff2?gy02j9") format("woff2"),url("../fonts/wpmu-dev-seo-icons.ttf?gy02j9") format("truetype"),url("../fonts/wpmu-dev-seo-icons.woff?gy02j9") format("woff"),url("../fonts/wpmu-dev-seo-icons.svg?gy02j9#wpmu-dev-seo-icons") format("svg");font-weight:normal;font-style:normal}[class^="wds-icon-"],[class*=" wds-icon-"]{font-family:'wpmu-dev-seo-icons' !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wds-icon-icon-performance:before{content:"\e903"}.wds-icon-power-on-off:before{content:"\e904"}.wds-icon-update-arrow:before{content:"\e902"}.wds-icon-dashboard-settings:before{content:"\e901"}.wds-icon-icon-wpmu-logo-line:before{content:"\203a"}.wds-icon-icon-wpmu-logo-solid:before{content:"\2039"}.wds-icon-star-line:before{content:"\cf"}.wds-icon-notification-count:before{content:"\e900"}.wds-icon-24-hour-support:before{content:"\c1"}.wds-icon-speed-optimize:before{content:"\f8"}.wds-icon-cloudflare:before{content:"\d0"}.wds-icon-alert:before{content:"\58"}.wds-icon-align-center:before{content:"\5e"}.wds-icon-align-justify:before{content:"\23"}.wds-icon-align-left:before{content:"\25"}.wds-icon-align-right:before{content:"\26"}.wds-icon-annotate:before{content:"\b4"}.wds-icon-arrow-up:before{content:"\d4"}.wds-icon-arrow-right:before{content:"\af"}.wds-icon-arrow-down:before{content:"\c2"}.wds-icon-arrow-left:before{content:"\f8ff"}.wds-icon-more:before{content:"\2026"}.wds-icon-minus:before{content:"\2d"}.wds-icon-plus:before{content:"\3d"}.wds-icon-arrow-up-carats:before{content:"\2dd"}.wds-icon-arrow-down-carats:before{content:"\131"}.wds-icon-arrow-left-carats:before{content:"\d3"}.wds-icon-arrow-right-carats:before{content:"\2dc"}.wds-icon-arrows-compress:before{content:"\2265"}.wds-icon-arrows-expand:before{content:"\ac"}.wds-icon-arrows-in:before{content:"\2264"}.wds-icon-arrows-out:before{content:"\2da"}.wds-icon-check:before{content:"\28"}.wds-icon-close:before{content:"\29"}.wds-icon-at-sign:before{content:"\40"}.wds-icon-calendar:before{content:"\220f"}.wds-icon-camera:before{content:"\d8"}.wds-icon-clipboard-notes:before{content:"\bf"}.wds-icon-clock:before{content:"\2c"}.wds-icon-cloud:before{content:"\2122"}.wds-icon-download-cloud:before{content:"\a3"}.wds-icon-upload-cloud:before{content:"\a2"}.wds-icon-comment:before{content:"\a7"}.wds-icon-comments:before{content:"\b6"}.wds-icon-comment-3:before{content:"\aa"}.wds-icon-compass:before{content:"\2c6"}.wds-icon-credit-card:before{content:"\63"}.wds-icon-crop:before{content:"\43"}.wds-icon-crown:before{content:"\a1"}.wds-icon-italic:before{content:"\7b"}.wds-icon-bold:before{content:"\42"}.wds-icon-underline:before{content:"\55"}.wds-icon-text-color:before{content:"\a8"}.wds-icon-style-type:before{content:"\3c"}.wds-icon-quote-2:before{content:"\27"}.wds-icon-quote:before{content:"\3b"}.wds-icon-paperclip:before{content:"\41"}.wds-icon-indent-less:before{content:"\201d"}.wds-icon-indent-more:before{content:"\2019"}.wds-icon-list-bullet:before{content:"\38"}.wds-icon-list-number:before{content:"\37"}.wds-icon-list:before{content:"\60"}.wds-icon-link:before{content:"\35"}.wds-icon-unlink:before{content:"\36"}.wds-icon-color-pick-eyedropper:before{content:"\a5"}.wds-icon-wand-magic:before{content:"\5a"}.wds-icon-layers:before{content:"\e6"}.wds-icon-dislike:before{content:"\6b"}.wds-icon-like:before{content:"\6a"}.wds-icon-dollar:before{content:"\24"}.wds-icon-download:before{content:"\e93b"}.wds-icon-eye:before{content:"\65"}.wds-icon-eye-hide:before{content:"\71"}.wds-icon-arrow-return-back:before{content:"\52"}.wds-icon-first-aid:before{content:"\e93f"}.wds-icon-folder:before{content:"\2d8"}.wds-icon-map:before{content:"\34"}.wds-icon-graph-bar:before{content:"\c7"}.wds-icon-graph-bar_1:before{content:"\2db"}.wds-icon-heart:before{content:"\4b"}.wds-icon-home:before{content:"\4a"}.wds-icon-info:before{content:"\49"}.wds-icon-key:before{content:"\25ca"}.wds-icon-laptop:before{content:"\ab"}.wds-icon-lightbulb:before{content:"\4c"}.wds-icon-asterisk:before{content:"\2a"}.wds-icon-lock:before{content:"\39"}.wds-icon-unlock:before{content:"\30"}.wds-icon-mail:before{content:"\6d"}.wds-icon-location-marker:before{content:"\6c"}.wds-icon-microphone-audio:before{content:"\2030"}.wds-icon-mobile-signal:before{content:"\201b"}.wds-icon-mobile:before{content:"\201c"}.wds-icon-monitor:before{content:"\5c"}.wds-icon-magnifying-glass-search:before{content:"\ba"}.wds-icon-zoom-in:before{content:"\2260"}.wds-icon-zoom-out:before{content:"\2013"}.wds-icon-magnifying-search-glass-love:before{content:"\2022"}.wds-icon-price-tag:before{content:"\2c7"}.wds-icon-bookmark:before{content:"\221a"}.wds-icon-book-bookmark:before{content:"\2d9"}.wds-icon-book:before{content:"\2206"}.wds-icon-page-multiple:before{content:"\e7"}.wds-icon-page-pdf:before{content:"\c6"}.wds-icon-page-search:before{content:"\da"}.wds-icon-page:before{content:"\d2"}.wds-icon-paint-bucket:before{content:"\222b"}.wds-icon-paypal:before{content:"\59"}.wds-icon-pencil:before{content:"\2f"}.wds-icon-photo-picture:before{content:"\44"}.wds-icon-play:before{content:"\70"}.wds-icon-pause:before{content:"\6f"}.wds-icon-fast-forward:before{content:"\3e"}.wds-icon-refresh:before{content:"\45"}.wds-icon-update:before{content:"\ae"}.wds-icon-puzzle:before{content:"\7d"}.wds-icon-layout-grid:before{content:"\221e"}.wds-icon-sheild-badge:before{content:"\e96a"}.wds-icon-coffee-cup:before{content:"\e96b"}.wds-icon-skull:before{content:"\e96c"}.wds-icon-social-android:before{content:"\2e"}.wds-icon-social-apple:before{content:"\61"}.wds-icon-social-drive:before{content:"\76"}.wds-icon-social-dropbox:before{content:"\64"}.wds-icon-social-facebook:before{content:"\66"}.wds-icon-social-github:before{content:"\68"}.wds-icon-social-google-plus:before{content:"\67"}.wds-icon-social-linkedin:before{content:"\69"}.wds-icon-social-twitter:before{content:"\74"}.wds-icon-animation-video:before{content:"\46"}.wds-icon-social-youtube:before{content:"\79"}.wds-icon-white-label-video:before{content:"\75"}.wds-icon-star:before{content:"\53"}.wds-icon-tablet-landscape:before{content:"\5b"}.wds-icon-tablet-portrait:before{content:"\5d"}.wds-icon-thumbnails:before{content:"\47"}.wds-icon-ticket:before{content:"\e97d"}.wds-icon-profile-male:before{content:"\b5"}.wds-icon-profile-female:before{content:"\192"}.wds-icon-community-people:before{content:"\2018"}.wds-icon-trash:before{content:"\51"}.wds-icon-notification:before{content:"\6e"}.wds-icon-user-hero-points-trophy:before{content:"\31"}.wds-icon-megaphone:before{content:"\c5"}.wds-icon-flag:before{content:"\7c"}.wds-icon-stopwatch:before{content:"\e986"}.wds-icon-shopping-cart:before{content:"\cd"}.wds-icon-share:before{content:"\73"}.wds-icon-help-support:before{content:"\48"}.wds-icon-web-globe-world:before{content:"\57"}.wds-icon-widget-settings-config:before{content:"\78"}.wds-icon-wrench-tool:before{content:"\2044"}.wds-icon-settings-slider-control:before{content:"\153"}.wds-icon-filter:before{content:"\7a"}.wds-icon-reply:before{content:"\72"}.wds-icon-finger-point:before{content:"\2248"}.wds-icon-finger-swipe:before{content:"\2203"}.wds-icon-mouse-scroll:before{content:"\df"}.wds-icon-plugin-2:before{content:"\4f"}.wds-icon-brush:before{content:"\7e"}.wds-icon-themes:before{content:"\54"}.wds-icon-plugins:before{content:"\50"}.wds-icon-question:before{content:"\3f"}.wds-icon-warning-alert:before{content:"\21"}.wds-icon-check-tick:before{content:"\5f"}.wds-icon-cross-close:before{content:"\2b"}.wds-icon-user-reputation-points:before{content:"\32"}.wds-icon-user-star-level-up:before{content:"\33"}.wds-icon-icon-devman:before{content:"\20ac"}.wds-icon-icon-defender:before{content:"\b7"}.wds-icon-icon-hub:before{content:"\fb02"}.wds-icon-icon-hummingbird:before{content:"\b0"}.wds-icon-icon-hustle:before{content:"\2014"}.wds-icon-icon-smart-crawl:before{content:"\2202"}.wds-icon-icon-smush:before{content:"\2021"}.wds-icon-icon-snapshot:before{content:"\fb01"}.wds-icon-icon-upfront:before{content:"\201a"}.wds-icon-icon-uptime:before{content:"\b1"}.wds-icon-icon-pulse:before{content:"\201e"}.wds-icon-icon-automate:before{content:"\152"}.wds-icon-academy:before{content:"\3c0"}.wds-icon-wordpress:before{content:"\77"}.wds-icon-infinity:before{content:"\56"}.wds-icon-audio-sound:before{content:"\e9ae"}.wds-icon-sitemap:before{content:"\b8"}.wds-icon-google-analytics:before{content:"\e5"}.wds-icon-progress:before{content:"\e9b1"}.wds-icon-dashboard:before{content:"\e9b2"}.wds-icon-ab-testing:before{content:"\bb"}.wds-icon-testing-bottle-beaker:before{content:"\e9b4"}.wds-icon-archive:before{content:"\62"}.wds-icon-zip:before{content:"\3a9"}.wds-icon-arrow-location:before{content:"\4d"}.wds-icon-arrow-pointer-cursor:before{content:"\4e"}.wds-icon-code:before{content:"\3a"}.wds-icon-news-paper:before{content:"\2211"}.wds-icon-gallery-slider:before{content:"\f7"}.wds-icon-layout:before{content:"\a9"}.wds-icon-storage-server-data:before{content:"\ce"}.wds-icon-loader:before{content:"\e9be"}.wds-icon-rocket-launch:before{content:"\e9bf"}.wds-icon-target:before{content:"\2020"}.wpmud #page-header{margin-bottom:70px;text-align:center}.wpmud .dev-box .box-title .buttons-icon{margin-top:18px}.wpmud .dev-box .box-title .buttons-icon a{width:20px;height:20px;color:#888}.wpmud .wds-table{border:0;border-spacing:0;border-collapse:collapse;width:100%}.wpmud .wds-data-table{border:1px solid #E5E5E5;border-collapse:collapse;border-spacing:0;color:#777771;width:100%}.wpmud .wds-data-table>thead{border-bottom:1px solid #E5E5E5}.wpmud .wds-data-table>tfoot{border-top:1px solid #E5E5E5}.wpmud .wds-data-table>thead th,.wpmud .wds-data-table>tfoot th{font:700 15px/20px "Roboto Condensed","Roboto",Arial,sans-serif;padding:15px 10px;text-transform:uppercase}.wpmud .wds-data-table>tbody td{font-size:13px;line-height:20px;padding:20px 10px;vertical-align:top}.wpmud .wds-data-table th,.wpmud .wds-data-table td{text-align:left}.wpmud .wds-data-table .label{width:75%}.wpmud .wds-data-table .result{width:25%}.wpmud .wds-data-table .data-small{padding:10px}.wpmud .wds-data-table-inverse .label{width:25%}.wpmud .wds-data-table-inverse .result{width:75%}.wpmud .wds-data-table-inverse-large .label{width:40%}.wpmud .wds-data-table-inverse-large .result{width:60%}.wpmud .wds-list-table{width:100%;border:1px solid #EAEAEA;border-collapse:separate;border-spacing:unset;border-radius:5px;color:#888;font-size:13px}.wpmud .wds-list-table th{text-align:left;padding:20px 30px;font-weight:500;color:#333}.wpmud .wds-list-table tr th,.wpmud .wds-list-table tr td{border-bottom:1px solid #EAEAEA}.wpmud .wds-list-table tr td{padding:15px 30px}.wpmud .wds-list-table tr:last-child td{border-bottom:none}.wpmud .wds-list-table tfoot th{border-bottom:none;border-top:1px solid #EAEAEA}@media only screen and (max-width: 783px){.wpmud .list-table>thead>tr>th,.wpmud .list-table>thead>tr>td,.wpmud .list-table>tbody>tr>th,.wpmud .list-table>tbody>tr>td{width:100%}}.wpmud .wds-notice{border-radius:5px;color:#333;font:400 15px/18px "Roboto",Arial,sans-serif;margin:15px 0;padding:20px 30px;position:relative;text-align:left;display:table;width:100%}.wpmud .wds-notice-success{background-color:#D1F1EA}.wpmud .wds-notice-success::before{content:"_";color:#1ABC9C}.wpmud .wds-notice-error{background-color:#FFE5E9}.wpmud .wds-notice-error::before{content:"!";color:#FF6D6D}.wpmud .wds-notice-warning{background-color:#FFF5D5}.wpmud .wds-notice-warning::before{content:"!";color:#fecf2f}.wpmud .wds-notice-info{background-color:#D6EAF3}.wpmud .wds-notice-info::before{content:"!";color:#17a8e3}.wpmud .wds-notice::before{display:table-cell;font-family:"wpmu-dev-seo-icons";font-size:20px;vertical-align:top;width:30px;padding-top:8px}.wpmud .wds-notice p{color:#333;margin:0 0 10px;padding:0;vertical-align:top;display:table-cell}.wpmud .wds-notice p:last-of-type{margin:0}.wpmud .wds-notice p a{color:#333;font-weight:500;text-decoration:underline}.wpmud .wds-notice p a:hover{color:#333;text-decoration:none}.wpmud .wds-notice p a.wds-notice-dismiss{color:#808080;display:table;margin-top:5px;text-decoration:none;text-transform:uppercase}.wpmud .wds-notice .wds-icon,.wpmud .wds-notice .wds-icon .wdv-icon{font-size:22px;height:22px;line-height:22px;width:22px}.wpmud .wds-notice.can-close .close{cursor:pointer;display:block;height:22px;line-height:22px;margin:0;position:absolute;right:10px;text-shadow:none;top:10px;width:22px}.wpmud .wds-notice.can-close:after{bottom:0;color:#fff;content:"\79";font-style:normal;font-weight:normal;font-variant:normal;font-family:'WPMU-DEV-App-Icons';font-size:22px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;left:0;line-height:22px;opacity:0.8;position:absolute;right:0;speak:none;text-align:center;text-transform:none;top:0;transition:opacity 0.3s}.wpmud .wds-notice.can-close:hover:after{opacity:1}.wpmud .wds-notice-box{margin:20px 0 40px;padding:30px}.wpmud .wds-notice-box p a{font-weight:700;text-decoration:underline}.wpmud .wds-notice-floating{position:fixed;top:30px;right:0;left:0;margin:0 auto;border-top-left-radius:0;border-top-right-radius:0;max-width:600px;box-shadow:0 5px 25px 0 rgba(0,0,0,0.15);z-index:99998}.wpmud .wds-mascot-message{display:table}.wpmud .wds-mascot-message .wds-mascot,.wpmud .wds-mascot-message .wds-mascot-bubble-container{display:table-cell;vertical-align:top}.wpmud .wds-mascot-message .wds-mascot{height:148px;width:100px;background:url("../images/mascot-message.png") no-repeat;background-size:100px 148px}.wpmud .wds-mascot-message .wds-mascot-bubble-container{padding-left:30px}.wpmud .wds-mascot-message .wds-mascot-bubble-container .wds-mascot-bubble{position:relative;background:#E1F6FF;padding:15px 20px;border-radius:4px}.wpmud .wds-mascot-message .wds-mascot-bubble-container .wds-mascot-bubble:after{content:'';position:absolute;border-style:solid;border-width:8px 12px 8px 0;border-color:transparent #E1F6FF;display:block;width:0;z-index:1;left:-12px;top:38%}.wpmud .wds-mascot-message .wds-mascot-bubble-container .wds-mascot-bubble p{color:#333}.wpmud .wds-mascot-message .wds-mascot-bubble-container .wds-mascot-bubble p a{color:#333;text-decoration:underline;font-weight:500}.wpmud .wds-mascot-message .wds-mascot-bubble-container .wds-mascot-bubble-dismiss{float:right;font-size:16px;cursor:pointer;padding-left:10px}.wpmud .wds-keyword-pairs .wds-group-field{clear:none;float:left;margin-left:1%;width:48%}.wpmud .wds-keyword-pairs .wds-group-field:first-child{margin-left:0}.wpmud .wds-keyword-pairs .wds-keyword-pair{margin-top:20px;position:relative}.wpmud .wds-keyword-pairs .wds-keyword-pair:first-child{margin-top:0}.wpmud .wds-keyword-pairs .wds-keyword-pair-new{padding-top:20px}.wpmud .wds-keyword-pairs-existing{margin-top:30px}.wpmud .wds-keyword-pairs-existing tr td.wds-pair-actions{width:10%;text-align:right}.wpmud .wds-keyword-pairs-existing tr td.wds-pair-keyword,.wpmud .wds-keyword-pairs-existing tr td.wds-pair-url{width:45%}.wpmud .wds-keyword-pairs-existing tr td.wds-pair-hidden-fields{display:none}.wpmud .insert-macro{position:absolute;right:0;top:0}.wpmud .insert-macro .button-fields-trigger{border-radius:0 5px 5px 0;float:right;position:relative;font-size:16px;font-weight:300}.wpmud .insert-macro .button-fields-trigger:after{background:#fff;border-bottom:1px solid #fff;border-top:1px solid #fff;bottom:-2px;content:"";display:block;height:1px;left:0;margin:0;opacity:0;pointer-events:none;position:absolute;right:0;width:auto;z-index:11}.wpmud .insert-macro.is-open .button-fields-trigger,.wpmud .insert-macro.is-open .button-fields-trigger:hover:not(:focus):not(:active){background:#fff;border:1px solid #bfbfbf;color:#808080;padding:12px 12px 8px 12px;margin:0;border-radius:0 5px 0 0}.wpmud .insert-macro.is-open .button-fields-trigger:after{opacity:1}.wpmud .insert-macro .macro-list{background:#fff;border:1px solid #BFBFBF;clear:both;height:100%;max-height:260px;overflow-y:auto;padding:5px 0;position:relative;z-index:10}.wpmud .insert-macro .macro-list ul{margin:0;padding:0}.wpmud .insert-macro .macro-list li{cursor:pointer;font:400 13px/26px "Roboto",Arial,sans-serif;margin:0;padding:0 10px}.wpmud .insert-macro .macro-list li:hover{background:#F2F2F2;color:#333}@keyframes wds-metabox-icon-spin{100%{transform:rotate(360deg)}}.wpmud .wds-item-loading{position:relative}.wpmud .wds-item-loading::before{font-family:"wpmu-dev-seo-icons";color:#888;content:"";animation:wds-metabox-icon-spin 1s linear infinite;display:block;position:absolute}.wpmud .wds-strong-text{color:#333;font-size:15px;line-height:30px;font-weight:500;font-family:"Roboto",Arial,sans-serif}.wpmud .wds-small-text{font-size:13px;line-height:22px;color:#888}.wpmud .wds-small-text strong{color:#333}.wpmud .wds-issues{border-radius:13px;display:inline-block;font-size:13px;font-weight:500;line-height:1;padding:5px 16px;vertical-align:middle;margin-left:8px;color:#333;font-family:"Roboto",Arial,sans-serif}.wpmud .wds-issues a{color:#333}.wpmud .wds-issues-invalid{background:#E6E6E6}.wpmud .wds-issues-warning{background:#FECF2F}.wpmud .wds-issues-error{background:#FF7F83;color:#ffffff}.wpmud .wds-issues-error a{color:#ffffff}.wpmud .wds-issues-success-bg{background:#1ABC9C;color:#ffffff}.wpmud .wds-issues-success-bg a{color:#ffffff}.wpmud .wds-issues-success{background:transparent;padding:0}.wpmud .wds-issues-success::before{font-family:"wpmu-dev-seo-icons";content:"_";color:#1ABC9C;font-size:20px}.wpmud .wds-issues.wds-item-loading{background:transparent;padding:0}.wpmud .wds-issues.wds-item-loading span{display:none}.wpmud .wds-issues.wds-item-loading::before{font-size:20px;content:"";color:#888;position:relative}.wpmud .wds-report-stats{background:#ffffff;padding:30px 30px 30px 140px;display:table;width:100%;margin-bottom:30px;border-radius:4px;box-shadow:0 2px 0 0 #E6E6E6;background-repeat:no-repeat;background-position:30px bottom}.wpmud .wds-report-stats>div{display:table-cell;vertical-align:middle;text-align:center;width:40%}.wpmud .wds-report-stats .wds-report-score .wds-score{display:table;font-size:50px;line-height:55px;color:#333;position:relative;margin:0 auto}.wpmud .wds-report-stats .wds-report-score .wds-score::after{content:"!";font-size:20px;position:absolute;font-family:"wpmu-dev-seo-icons";bottom:15px;right:5px}.wpmud .wds-report-stats .wds-report-score .wds-score .wds-total{font-size:13px;line-height:22px;width:26px;display:inline-block}.wpmud .wds-report-stats .wds-report-score .wds-score.wds-score-invalid:after{color:#888}.wpmud .wds-report-stats .wds-report-score .wds-score.wds-score-error:after{color:#FF7F83}.wpmud .wds-report-stats .wds-report-score .wds-score.wds-score-warning:after{color:#FECF2F}.wpmud .wds-report-stats .wds-report-score .wds-score.wds-score-success:after{content:"_";color:#1ABC9C}.wpmud .wds-report-stats .wds-stacked-stats{display:table;width:100%}.wpmud .wds-report-stats .wds-stacked-stats>div{display:table-row}.wpmud .wds-report-stats .wds-stacked-stats>div .wds-stat-name,.wpmud .wds-report-stats .wds-stacked-stats>div .wds-stat-value{display:table-cell;border-bottom:1px solid #EAEAEA;line-height:30px;padding:15px 0}.wpmud .wds-report-stats .wds-stacked-stats>div:first-child .wds-stat-name,.wpmud .wds-report-stats .wds-stacked-stats>div:first-child .wds-stat-value{padding-top:0}.wpmud .wds-report-stats .wds-stacked-stats>div:last-child .wds-stat-name,.wpmud .wds-report-stats .wds-stacked-stats>div:last-child .wds-stat-value{border-bottom:none;padding-bottom:0}.wpmud .wds-report-stats .wds-stacked-stats .wds-stat-name{font-size:13px;color:#333;font-weight:500;text-align:left}.wpmud .wds-report-stats .wds-stacked-stats .wds-stat-value{font-size:18px;color:#888;font-family:"Roboto Condensed","Roboto",Arial,sans-serif;text-align:right}.wpmud .wds-report .wds-accordion{margin-left:-30px;width:calc(100% + 60px);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;border-top:1px solid #EAEAEA}.wpmud .wds-report .wds-accordion .wds-accordion-section{width:100%;display:block}.wpmud .wds-report .wds-accordion .wds-accordion-section:first-of-type{border-top:none}.wpmud .wds-report .wds-accordion .wds-accordion-section .wds-accordion-handle{display:table;width:100%}.wpmud .wds-report .wds-accordion .wds-accordion-section .wds-accordion-handle::after{display:table-cell;width:20px;float:none;padding-left:20px}.wpmud .wds-report .wds-accordion .wds-accordion-section .wds-accordion-handle::before{display:table-cell;font-family:"wpmu-dev-seo-icons";font-size:20px;margin-right:4px;vertical-align:middle;width:34px}.wpmud .wds-report .wds-accordion .wds-accordion-section .wds-accordion-handle .wds-accordion-handle-part{display:table-cell;vertical-align:middle}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-success{border-left:3px solid #1ABC9C}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-success .wds-accordion-handle::before{content:"_";color:#1ABC9C}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-warning{border-left:3px solid #FECF2F}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-warning .wds-accordion-handle::before{content:"!";color:#FECF2F}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-error{border-left:3px solid #FF7F83}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-error .wds-accordion-handle::before{content:"!";color:#FF7F83}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-invalid{border-left:3px solid #888}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-invalid .wds-accordion-handle:before{content:"!";color:#888}.wpmud .wds-report .wds-accordion .wds-accordion-section.open .wds-accordion-handle{border-bottom:1px solid #E6E6E6;margin-bottom:30px;padding-bottom:18px}.wpmud .wds-report .wds-check-item strong{color:#333}.wpmud .wds-report .wds-check-item p{margin-bottom:15px}.wpmud .wds-report .wds-check-item p:last-child{margin-bottom:0}.wpmud .wds-report .wds-check-item ul{margin:0}.wpmud .wds-report .wds-check-item .wds-recommendation{margin-bottom:15px}.wpmud .wds-report .wds-check-item .wds-more-info{padding-top:15px;border-top:1px solid #EAEAEA}.wpmud .wds-report .wds-check-item .wds-unignore-container{width:90px}.wpmud .wds-report .wds-check-item .wds-ignore-container{margin-top:30px;border:1px solid #EAEAEA;padding:30px;border-radius:7px}.wpmud .wds-report .wds-check-item .wds-check-item-indicator{border-radius:13px;font-size:13px;margin-left:6px;padding:5px 16px;vertical-align:top}.wpmud .wds-report .wds-check-item.wds-check-success .wds-check-item-indicator{color:#ffffff;background:#1ABC9C}.wpmud .wds-report .wds-check-item.wds-check-warning .wds-check-item-indicator{background:#FECF2F}.wpmud .wds-report .wds-check-item.wds-check-error .wds-check-item-indicator{color:#ffffff;background:#FF7F83}.wpmud .wds-report .wds-check-item.wds-check-invalid .wds-check-item-indicator{background:#f2f2f2}.wpmud .wds-report-vertical-tab.tab>label{position:relative}.wpmud .wds-report-vertical-tab.tab>label *{line-height:1}.wpmud .wds-report-vertical-tab.tab>label .wds-issues{display:none;line-height:1;position:absolute;top:2px;right:3px;font-family:"Roboto",Arial,sans-serif;font-weight:500;padding-top:6px;padding-bottom:6px}.wpmud .wds-report-vertical-tab .tab-title{display:table;width:100%}.wpmud .wds-report-vertical-tab .tab-title .wds-issues{display:none;font-family:"Roboto",Arial,sans-serif;font-weight:500}.wpmud .wds-report-vertical-tab .tab-title .wds-tab-title-part:nth-child(1){width:10px;white-space:nowrap}.wpmud .wds-report-vertical-tab .tab-title .wds-tab-title-part:nth-child(3){text-align:right}.wpmud .wds-report-vertical-tab .tab-title .wds-tab-title-part{vertical-align:middle;display:table-cell}.wpmud .wds-report-vertical-tab .tab-title .wds-button-with-left-loader.wds-item-loading::before{right:110%;font-size:18px}.wpmud .wds-report-vertical-tab .tab-title .wds-ignore-all{display:none}.wpmud .wds-report-vertical-tab .wds-seamless-footer{border-top:none;padding:0}.wpmud .wds-report-vertical-tab .wds-content-tabs-inner{padding-bottom:0}.wpmud.wds-metabox #container{margin:0}.wpmud.wds-metabox .wds-issues-invalid:not(.wds-item-loading)::before{content:"-"}.wpmud.wds-metabox a[href="#reload"]{display:none}.wpmud.wds-metabox .wds-analysis-working{background:#E6E6E6;padding:20px 30px}.wpmud.wds-metabox .wds-analysis-working p{margin-left:1.5em;position:relative}.wpmud.wds-metabox .wds-analysis-working p:before{font-family:"wpmu-dev-seo-icons";content:"";animation:wds-metabox-icon-spin 1s linear infinite;display:block;position:absolute;left:-1.5em}.wpmud.wds-metabox button.wds-refresh-analysis:before{font-family:"wpmu-dev-seo-icons";content:"E"}.wpmud.wds-metabox .wds-metabox-section{border-top:1px solid #EAEAEA;padding:30px}.wpmud.wds-metabox .wds-metabox-section:first-of-type{border-top:none}.wpmud.wds-metabox .wds_seo .wds-metabox-preview>.wds-label,.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container>.wds-label{margin-bottom:10px}.wpmud.wds-metabox .wds_seo .wds-preview-description{color:#888}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-seo-analysis-label{margin-bottom:20px}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-seo-analysis-label label{float:left}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-seo-analysis-label button{float:right}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-focus-keyword{border:1px solid #EAEAEA;padding:30px;border-radius:7px;margin-bottom:30px;position:relative}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-focus-keyword::before{display:none;bottom:40px;right:38px;font-size:20px;z-index:30}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-focus-keyword-invalid::before{display:table-cell;content:"!";font-family:"wpmu-dev-seo-icons";color:#888;position:absolute}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-focus-keyword-loaded::before{display:table-cell;content:"_";font-family:"wpmu-dev-seo-icons";color:#17a8e3;position:absolute}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-focus-keyword.wds-item-loading::before{display:table-cell;content:""}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-focus-keyword input{margin-bottom:0}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-notice{margin-top:0;margin-bottom:30px}.wpmud.wds-metabox .wds_seo .wds-edit-meta-toggleable .toggle-checkbox{display:none}.wpmud.wds-metabox .wds_seo .wds-edit-meta-toggleable>label{display:table;padding:0;margin:0}.wpmud.wds-metabox .wds_seo .wds-no-focus-keywords .wds-notice-warning{background:#F2F2F2}.wpmud.wds-metabox .wds_seo .wds-no-focus-keywords .wds-notice-warning::before{color:#888}.wpmud.wds-metabox .wds_readability .wds-readability-legend{color:#666666}.wpmud.wds-metabox .wds_readability .wds-readability-legend span{margin-left:30px}.wpmud.wds-metabox .wds_readability .wds-readability-legend span:first-child{margin-left:0}.wpmud.wds-metabox .wds_readability .wds-readability-stats{box-shadow:none;background-image:url("../images/readability-info.png");background-size:92px 107px;background-color:#F8F8F8}.wpmud.wds-metabox .wds_readability .wds-readability-stats .wds-readability-level-description strong{color:#333;font-weight:normal}.wpmud.wds-metabox .wds_readability .wds-list-table{margin-bottom:30px}.wpmud.wds-metabox .wds_readability .wds-list-table tr:nth-child(2n){background:#f8f8f8}.wpmud.wds-metabox .wds_readability .wds-readability-level{text-align:right}.wpmud.wds-metabox .wds-report .wds-accordion .wds-accordion-section.wds-check-error{-ms-flex-order:0;order:0}.wpmud.wds-metabox .wds-report .wds-accordion .wds-accordion-section.wds-check-warning{-ms-flex-order:5;order:5}.wpmud.wds-metabox .wds-report .wds-accordion .wds-accordion-section.wds-check-success{-ms-flex-order:10;order:10}.wpmud.wds-metabox .wds-report .wds-accordion .wds-accordion-section.wds-check-invalid{-ms-flex-order:15;order:15}.wpmud.wds-moz-url-metrics-metabox{padding:25px}#wds-wds-meta-box>h2 span{position:relative}#wds-wds-meta-box>h2 span::before,#wds-wds-meta-box>h2 span::after{border-radius:100%;content:"";display:inline-block;height:12px;position:absolute;top:3px;width:12px}#wds-wds-meta-box>h2 span::before{left:calc(100% + 6px)}#wds-wds-meta-box>h2 span::after{left:calc(100% + 25px)}#wds-wds-meta-box.wds-seo-success>h2 span::before{background:#1ABC9C}#wds-wds-meta-box.wds-seo-warning>h2 span::before{background:#FECF2F}#wds-wds-meta-box.wds-seo-invalid>h2 span::before{background:#E6E6E6}#wds-wds-meta-box.wds-readability-invalid>h2 span::after{background:#E6E6E6}#wds-wds-meta-box.wds-readability-error>h2 span::after{background:#FF7F83}#wds-wds-meta-box.wds-readability-warning>h2 span::after{background:#FECF2F}#wds-wds-meta-box.wds-readability-success>h2 span::after{background:#1ABC9C}#wds-wds-meta-box .inside{padding:0;margin:0;overflow:hidden !important}.misc-pub-section.seo-analysis>i,.misc-pub-section.readability-analysis>i{color:#82878c;font-size:16px;padding-right:5px;vertical-align:-1px}.misc-pub-section.seo-analysis.wds-status-success i,.misc-pub-section.readability-analysis.wds-status-success i{color:#1ABC9C}.misc-pub-section.seo-analysis.wds-status-warning i,.misc-pub-section.readability-analysis.wds-status-warning i{color:#fecf2f}.misc-pub-section.seo-analysis.wds-status-error i,.misc-pub-section.readability-analysis.wds-status-error i{color:#FF6D6D}@keyframes wds-loader-icon-spin{100%{transform:rotate(360deg)}}.wpmud .wds-progress{background-color:#F8F8F8;border-radius:5px;height:60px;overflow:hidden;padding:0 30px;width:100%;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;margin-bottom:10px}.wpmud .wds-progress::before{font-family:"wpmu-dev-seo-icons";color:#888;content:"";font-size:20px;animation:wds-loader-icon-spin 1.5s linear infinite}.wpmud .wds-progress-bar{-ms-flex-positive:3;flex-grow:3;height:10px;border-radius:10px;background:#E6E6E6;overflow:hidden}.wpmud .wds-progress-bar-current-percent{padding-right:10px;padding-left:10px;color:#333;font-size:13px;font-weight:bold;font-family:"Roboto Condensed","Roboto",Arial,sans-serif}.wpmud .wds-progress-bar-inside{background:#17a8e3;height:10px;border-radius:10px;min-width:10px;transition:width 2s}.wpmud .wds-preview{background:#fff;border:1px solid #DFDFDF;padding:30px;border-radius:7px}.wpmud .wds-preview-container{padding-bottom:20px}.wpmud .wds-preview-description{font-size:13px;line-height:22px;margin-top:10px}.wpmud .wds-preview *{font-family:Arial, sans-serif;font-weight:400;letter-spacing:initial;text-align:left}.wpmud .wds-preview-title h3{font-size:18px;line-height:21px;margin:0;text-transform:none}.wpmud .wds-preview-title h3 a{color:#1a0dab;text-decoration:none}.wpmud .wds-preview-url{font-size:14px;line-height:16px;margin-bottom:2px}.wpmud .wds-preview-url a{color:#006621;text-decoration:none}.wpmud .wds-preview-meta{color:#545454;font-size:13px;line-height:18px}.wds-toggleable .wds-toggleable-inside{display:block}.wds-toggleable .wds-toggleable-inside-box{border:1px solid #EAEAEA;border-radius:4px;margin-top:20px;padding:20px 30px}.wds-toggleable.inactive .wds-toggleable-inside{display:none}.wds-toggleable.inactive .wds-toggleable-inside-box{display:none}.wds-toggleable legend{cursor:pointer;color:#BABABA;font-size:15px;font-weight:500;font-family:'Roboto', sans-serif;transition:color .4s}.wds-toggleable legend:hover{color:#808080}.wds-conditional .wds-conditional-inside{display:none}.wds-conditional .wds-conditional-inside-box{border:1px solid #EAEAEA;border-radius:4px;margin-top:20px;padding:20px 30px}.wpmud .wds-links-dropdown{width:25px;position:relative;display:inline-block;text-align:left}.wpmud .wds-links-dropdown-anchor{display:inline-block;font-size:34px;line-height:10px;padding-bottom:20px;vertical-align:top;color:#888}.wpmud .wds-links-dropdown-anchor:hover:not(:focus):not(:active),.wpmud .wds-links-dropdown-anchor:hover,.wpmud .wds-links-dropdown-anchor:active,.wpmud .wds-links-dropdown-anchor:focus{color:#17a8e3}.wpmud .wds-links-dropdown.open .wds-links-dropdown-anchor{color:#17a8e3}.wpmud .wds-links-dropdown.open ul{display:block}.wpmud .wds-links-dropdown-label{color:#333;font-family:"Roboto Condensed","Roboto",Arial,sans-serif;font-size:13px;font-weight:bold;border-bottom:1px solid #E6E6E6;line-height:30px;margin-bottom:20px}.wpmud .wds-links-dropdown ul{border:1px solid #E6E6E6;padding:20px;box-shadow:0 3px 7px 0 rgba(0,0,0,0.05);width:180px;margin-bottom:0;margin-top:0;background:#fff;position:absolute;right:-20px;top:130%;z-index:10;border-radius:5px;display:none}.wpmud .wds-links-dropdown ul li:last-child{margin-bottom:0}.wpmud .wds-links-dropdown ul:after,.wpmud .wds-links-dropdown ul:before{content:'';position:absolute;border-style:solid;border-width:0 9px 9px;display:block;width:0;right:23px}.wpmud .wds-links-dropdown ul:after{border-color:#FFFFFF transparent;z-index:1;top:-8px}.wpmud .wds-links-dropdown ul:before{border-color:#d6d6d6 transparent;z-index:0;top:-9px}.wpmud .wds-styleable-file-input input[type="file"]{width:0.1px;height:0.1px;opacity:0;overflow:hidden;position:absolute;z-index:-1}.wpmud .wds-styleable-file-input input[readonly]{max-width:200px;float:left;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.wpmud .wds-styleable-file-input .button{float:left;border-top-left-radius:0;border-bottom-left-radius:0}.wpmud .wds-accordion{background:#f8f8f8}.wpmud .wds-accordion .wds-accordion-section{padding:0;margin:0;border-bottom:1px solid #EAEAEA;position:relative}.wpmud .wds-accordion .wds-accordion-section .wds-accordion-handle{line-height:24px;max-width:100%;margin:0;padding:18px 30px;text-align:left;font-size:15px;color:#333;font-family:"Roboto",Arial,sans-serif;font-weight:500;background:#FFF;cursor:pointer}.wpmud .wds-accordion .wds-accordion-section .wds-accordion-handle:after{font-family:"WPMU-DEV-App-Icons",sans-serif;content:"\65";float:right;font-size:20px;vertical-align:middle;color:#888;cursor:pointer}.wpmud .wds-accordion .wds-accordion-section .wds-accordion-content{padding:30px;background:#FFF;border-radius:7px;box-shadow:0 2px 0 #ddd;display:none}.wpmud .wds-accordion .wds-accordion-section:first-of-type{border-top:1px solid #EAEAEA}.wpmud .wds-accordion .wds-accordion-section.open{padding:18px 30px 30px 30px}.wpmud .wds-accordion .wds-accordion-section.open .wds-accordion-handle{background:transparent;padding:0 0 18px 0}.wpmud .wds-accordion .wds-accordion-section.open .wds-accordion-handle:after{content:"\72"}.wpmud .wds-accordion .wds-accordion-section.open .wds-accordion-content{display:block}.wpmud .wds-accordion .wds-accordion-section.disabled .wds-accordion-handle{cursor:default;color:#666}.wpmud .wds-accordion .wds-accordion-section.disabled .wds-accordion-handle:after{display:none}.wpmud .wds-horizontal-tabs .wds-horizontal-tab-nav{padding:0 20px;border-bottom:1px solid #E6E6E6}.wpmud .wds-horizontal-tabs .wds-horizontal-tab-nav label{padding:15px;margin:0;font-size:15px;font-weight:normal;color:#888;line-height:30px;display:inline-block;vertical-align:middle}.wpmud .wds-horizontal-tabs .wds-horizontal-tab-nav .wds-nav-item{display:inline-table;width:auto;letter-spacing:0.01em;cursor:pointer}.wpmud .wds-horizontal-tabs .wds-horizontal-tab-nav .wds-nav-item.active{border-bottom:2px solid #17a8e3;letter-spacing:0}.wpmud .wds-horizontal-tabs .wds-horizontal-tab-nav .wds-nav-item.active label{color:#333;font-weight:500}.wpmud .wds-horizontal-tabs .wds-horizontal-tab .wds-horizontal-tab-content{display:none}.wpmud .wds-horizontal-tabs .wds-horizontal-tab input[type="radio"]{display:none}.wpmud .wds-horizontal-tabs .wds-horizontal-tab input[type="radio"]:checked+.wds-horizontal-tab-content{display:block}.wds-optimum-length-indicator-field{margin-bottom:0 !important;position:relative;z-index:20}.wds-optimum-length-indicator-field+.wds-optimum-length-indicator{background:transparent;border-radius:4px;height:10px;margin-top:-8px;margin-bottom:15px;position:relative;z-index:10}.wds-optimum-length-indicator-field.over+.wds-optimum-length-indicator,.wds-optimum-length-indicator-field.under+.wds-optimum-length-indicator{background:red}.wds-optimum-length-indicator-field.almost-over+.wds-optimum-length-indicator,.wds-optimum-length-indicator-field.almost-under+.wds-optimum-length-indicator{background:#FECF2F}.wds-optimum-length-indicator-field.just-right+.wds-optimum-length-indicator{background:#1ABC9C}.wpmud .wds-user-search>ul li{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:100%}.wpmud .wds-user-search-user{font-size:15px}.wpmud .wds-user-search-user,.wpmud .wds-user-search-you{margin-left:10px;color:#666}.wpmud .wds-user-search-you{background:#F2F2F2;font-size:13px;padding:3px 15px;border-radius:20px;text-transform:uppercase;font-weight:500}.wpmud .wds-user-search-remove{-ms-flex-positive:10;flex-grow:10;text-align:right;font-size:13px}.wpmud .wds-user-search-avatar{width:40px}.wpmud .wds-user-search-avatar .avatar{border-radius:100%;height:auto;width:40px}.wpmud .wds-user-search-field{display:table;width:100%}.wpmud .wds-user-search-field .select2-selection--single{height:40px}.wpmud .wds-user-search-field .select2-selection{border-bottom-right-radius:0;border-top-right-radius:0}.wpmud .wds-user-search-field input[type="button"]{border-bottom-left-radius:0;border-top-left-radius:0}.wpmud .wds-user-search-field>div{display:table-cell;vertical-align:bottom}.wpmud .wds-user-search-field>div:nth-child(2){width:10px}.wpmud .wds-obfuscate-section{background:rgba(242,242,242,0.5);position:absolute;top:0;left:0;width:100%;height:100%;z-index:2}.wpmud .wds-upsell-modal .box{background-image:url("../images/modal-upsell.png");background-position:bottom center;background-repeat:no-repeat;background-size:499px auto;padding-bottom:180px}.wpmud .wds-upgrade-benefits-list li{margin-bottom:20px;margin-left:30px;position:relative}.wpmud .wds-upgrade-benefits-list li:before{position:absolute;content:"_";color:#17a8e3;font-family:"wpmu-dev-seo-icons";right:100%;font-size:18px;margin-right:10px;top:7px}.wpmud .dev-box .box-title h3>i{margin-right:5px;vertical-align:-1px}.wpmud .dev-box .box-content p.wds-small-text{margin-bottom:15px}.wpmud .dev-box .box-content .wds-separator-top{margin-top:20px;padding-top:20px}.wpmud .dev-box .wds-box-stat-value{float:right;font-size:18px;color:#666;font-family:"Roboto Condensed","Roboto",Arial,sans-serif}.wpmud .dev-box .wds-box-stat-value-success{color:#888;font-size:13px;font-family:"Roboto",Arial,sans-serif}.wpmud .dev-box .wds-box-stat-value-success:before{font-family:"wpmu-dev-seo-icons";content:"_";color:#17a8e3;font-size:20px;vertical-align:-4px;margin-right:10px}.wpmud .dev-box .wds-autolinking-section{margin-bottom:30px}.wpmud .dev-box .wds-autolinking-section.wds-box-blocked-area{margin-bottom:0}.wpmud .dev-box .wds-box-blocked-area{margin-left:-30px;padding-bottom:20px;padding-left:30px;padding-right:30px;width:calc(100% + 60px);position:relative}.wpmud .dev-box .wds-box-blocked-area::before{background:rgba(242,242,242,0.5);content:"";height:100%;left:0;position:absolute;top:0;width:100%}.wpmud .dev-box .wds-box-blocked-area .wds-upgrade-button{position:absolute;top:18px;right:30px;padding:5px 16px}.wpmud .dev-box .wds-box-blocked-area .wds-small-text{margin-top:15px}.wpmud .dev-box .box-content .wds-mascot-message.seo-checkup-upsell{margin-bottom:-30px;margin-top:30px}.wpmud .dev-box#wds-content-analysis-box .wds-issues{margin-left:0}.wpmud .dev-box#wds-content-analysis-box .wds-accordion{margin:0;width:100%;border:1px solid #EAEAEA}.wpmud .dev-box#wds-content-analysis-box .wds-accordion .wds-check-item{border:none}.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled .wds-accordion,.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled .wds-accordion .wds-accordion-handle,.wpmud .dev-box#wds-content-analysis-box.wds-readability-analysis-enabled .wds-accordion,.wpmud .dev-box#wds-content-analysis-box.wds-readability-analysis-enabled .wds-accordion .wds-accordion-handle{border-radius:7px}.wpmud .dev-box#wds-content-analysis-box.wds-readability-analysis-enabled .wds-accordion{margin-top:20px}.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled.wds-readability-analysis-enabled .wds-accordion{margin-top:0}.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled.wds-readability-analysis-enabled .wds-accordion:first-child,.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled.wds-readability-analysis-enabled .wds-accordion:first-child .wds-accordion-handle{border-top-right-radius:7px;border-top-left-radius:7px;border-bottom-right-radius:0;border-bottom-left-radius:0}.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled.wds-readability-analysis-enabled .wds-accordion:last-child{border-top:none}.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled.wds-readability-analysis-enabled .wds-accordion:last-child,.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled.wds-readability-analysis-enabled .wds-accordion:last-child .wds-accordion-handle{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:7px;border-bottom-left-radius:7px}.wpmud .dev-box#wds-content-analysis-box .wds-list-table tr th,.wpmud .dev-box#wds-content-analysis-box .wds-list-table tr td{padding-right:5px;padding-left:5px}.wpmud .dev-box#wds-content-analysis-box .wds-list-table tr th:first-child,.wpmud .dev-box#wds-content-analysis-box .wds-list-table tr td:first-child{padding-left:20px}.wpmud .dev-box#wds-sitemap-box .wds-box-crawl-stats{float:right}.wpmud .dev-box#wds-sitemap-box .wds-box-stat-value-success::before{color:#1ABC9C}.wpmud .dev-box#wds-seo-checkup .wds-report .wds-accordion .wds-check-success{display:none}.wpmud .dev-box#wds-seo-checkup .wds-box-report-details{padding-top:30px}.wpmud .dev-box#wds-seo-checkup .wds-box-report-details .wds-box-stat-value{padding-top:7px}.wpmud .dev-box#wds-seo-checkup .wds-mascot-message{margin-top:30px;margin-bottom:-30px}.wpmud .dev-box .wds-accordion-handle-part:nth-child(2){text-align:right}.wpmud .dev-box .wds-dash-configure-button::before,.wpmud .dev-box .wds-dash-edit-posts-button::before,.wpmud .dev-box .wds-dash-view-report-button::before,.wpmud .dev-box .wds-dash-view-report-button::before{font-family:"wpmu-dev-seo-icons";margin-right:4px;text-transform:none}.wpmud .dev-box .wds-dash-configure-button::before{content:"\2044"}.wpmud .dev-box .wds-dash-edit-posts-button::before{content:"\2f"}.wpmud .dev-box .wds-dash-view-report-button::before{content:"\e93b"}.wpmud .dev-box .wds-dash-view-report-button::before{content:'\65'}.wpmud .dev-box .wds-notice::before{padding-top:4px}.wpmud .dev-box .wds-notice p{font-size:13px;line-height:22px}.wpmud .wds-onboard-dialog .box{background-image:url("../images/url-crawler-stats.png");background-size:128px 121px;background-repeat:no-repeat;background-position:center bottom;padding-bottom:60px}.wpmud .wds-onboard-dialog .wds-notice::before{padding-top:2px}.wpmud .wds-onboard-dialog .wds-toggle-table{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.wpmud .wds-onboard-dialog .wds-toggle-table .toggle.wds-toggle{-ms-flex-order:2;order:2}.wpmud .wds-onboard-dialog .wds-onboarding-setup{float:right}.wpmud .wds-dash-stats.wds-seo-checkup-stats{margin-bottom:30px;background-size:141px 141px}.wpmud .wds-dash-stats.wds-seo-checkup-stats .wds-report-score .wds-score{margin-top:0}.wpmud .wds-dash-stats.wds-seo-checkup-stats .wds-last-checkup-never{margin:0 auto;max-width:280px;text-align:left;width:100%}.wpmud .wds-dash-stats.wds-seo-checkup-stats .wds-last-checkup-never .wds-small-text{margin-bottom:15px}.wpmud .wds-dash-stats.wds-seo-checkup-stats .wds-stat-value .wds-crawl-in-progress{color:#888;font-family:"Roboto",Arial,sans-serif;font-size:13px;font-weight:400}.wpmud .wds-dash-stats.wds-seo-checkup-stats .wds-stat-value .wds-crawl-in-progress:before{font-size:13px;color:#888;font-family:"wpmu-dev-seo-icons";content:"";display:inline-table;margin-right:5px;animation:wds-loader-icon-spin 1.5s linear infinite}#wds-show-supported-macros{max-height:520px;overflow-y:scroll}.wpmud .note{float:left;margin:20px 0}.wpmud .wds-preset-separators input[type="radio"]{display:none}.wpmud .wds-preset-separators .separator-selector{background:#f4f4f4;border:1px solid #ddd;border-radius:4px;float:left;margin-right:10px;margin-bottom:10px;min-width:40px;text-align:center;vertical-align:middle;height:40px;line-height:23px}.wpmud .vertical-tabs>.tab input[type="radio"]:checked+label.separator-selector{border:1px solid #17A8E3;background-color:#E1F6FF}.wpmud .wds-custom-separator-message{margin:10px 0 20px 0}.wds-preview-container.wds-preview-loading{opacity:.7}.wpmud .box-sitemaps-xml-sitemap-settings .box-content>p{margin-bottom:10px}.wpmud .wds-sitemap-part{display:table;width:100%;border-bottom:1px solid #EAEAEA;margin-bottom:15px;padding-bottom:15px}.wpmud .wds-sitemap-part:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0}.wpmud .wds-sitemap-part-label,.wpmud .wds-sitemap-part-name,.wpmud .wds-sitemap-part-toggle{display:table-cell;vertical-align:middle}.wpmud .wds-sitemap-part-name{color:#888;font-size:13px;width:150px}.wpmud .wds-sitemap-part-toggle{width:100px}.wpmud .wds-sitemap-part-toggle .toggle{float:right}.wpmud .wds-sitemap-section{border-bottom:1px solid #EAEAEA;margin-bottom:15px;padding-bottom:20px}.wpmud .wds-sitemap-section:last-child{border-bottom:none;padding-bottom:0;margin-bottom:0}.wpmud .wds-sitemap-section>.wds-sitemap-part{border-bottom:medium none;padding-bottom:0;margin-bottom:0}.wpmud .wds-disable-updates .wds-notice-warning{font-size:13px}.wpmud .wds-content-tabs.tab_url_crawler .wds-list-table td:last-child{text-align:right}.wpmud .wds-content-tabs.tab_url_crawler .wds-list-table td:last-child:first-child{text-align:inherit}.wpmud .wds-content-tabs.tab_url_crawler .wds-list-table tr.wds-controls-row td{padding:30px}.wpmud .wds-content-tabs.tab_url_crawler .wds-crawl-issues-table{margin-bottom:30px}.wpmud .wds-content-tabs.tab_url_crawler .wds-ignored-items-table tbody tr td{background:#F9F9F9}.wpmud .wds-content-tabs.tab_url_crawler .wds-links-dropdown.wds-item-loading{font-size:18px}.wpmud .wds-content-tabs.tab_url_crawler .wds-links-dropdown.wds-item-loading .wds-links-dropdown-anchor{visibility:hidden}.wpmud .wds-content-tabs.tab_url_crawler .wds-url-crawler-stats{display:none}.wpmud .wds-url-crawler-stats{background-image:url("../images/url-crawler-stats.png");background-size:128px 121px}.wpmud .wds-path-occurrences{padding-top:30px;border-top:1px solid #EAEAEA}.wpmud .wds-action-button{float:right}.wpmud .wds-issues-type-sitemap .wds-notice{margin-bottom:30px}.wpmud .wds-postlist-selector-modal .box{background:#F1F1F1;padding:0 10px}.wpmud .wds-postlist-selector-modal .box .title{border-bottom:none;margin:0;padding:15px 0 0 20px}.wpmud .wds-postlist-selector-modal .box .title h3{font-weight:400;padding:0}.wpmud .wds-postlist-selector-modal .box .title .close{color:#777771}.wpmud .wds-postlist-selector-modal .vertical-tabs{margin-bottom:0}.wpmud .wds-postlist-selector-modal .wds-postlist-list-items{margin:0;padding:0}.wpmud .wds-postlist-selector-modal .wds-postlist-list-item{margin:25px 0 0;padding:0}.wpmud .wds-postlist-selector-modal .wds-postlist-list-item-first-child{margin-top:0}.wpmud .wds-postlist-selector-modal .wds-postlist-list-item+label{color:#aaa;margin-left:5px}.wpmud .wds-postlist-selector-modal .wds-postlist-list-item:checked+label{color:#4A4A4A}.wpmud .wds-postlist-selector-modal .wds-postlist-list-pagination{margin-top:30px}.wpmud .wds-postlist-add-post{padding-top:20px}.wpmud .wds-postlist-item-title,.wpmud .wds-postlist-item-type{width:40%}.wpmud .wds-postlist-item-remove{text-align:right}.wpmud .wds-postlist-empty_list{display:none}.wpmud .wds-custom-keywords-modal .wds-action-button{float:right}.wpmud .wds-automatic-linking-insert-links,.wpmud .wds-automatic-linking-link-to{width:calc(50% - 10px);float:left;border:1px solid #EAEAEA;border-radius:5px}.wpmud .wds-automatic-linking-insert-links:last-child,.wpmud .wds-automatic-linking-link-to:last-child{margin-left:20px}.wpmud .wds-automatic-linking-insert-links .label,.wpmud .wds-automatic-linking-link-to .label{width:100%;padding:20px 30px}.wpmud .wds-automatic-linking-insert-links .label .wds-label,.wpmud .wds-automatic-linking-link-to .label .wds-label{font-size:13px}.wpmud .wds-automatic-linking-insert-links .fields,.wpmud .wds-automatic-linking-link-to .fields{width:100%}.wpmud .wds-automatic-linking-insert-links .fields .wds-toggle-table,.wpmud .wds-automatic-linking-link-to .fields .wds-toggle-table{padding:15px 30px;border-top:1px solid #EAEAEA}.wpmud .wds-automatic-linking-insert-links .fields .wds-toggle-table .toggle,.wpmud .wds-automatic-linking-link-to .fields .wds-toggle-table .toggle{width:40px;float:right}.wpmud .wds-automatic-linking-insert-links .fields .wds-toggle-table .wds-toggle-description,.wpmud .wds-automatic-linking-link-to .fields .wds-toggle-table .wds-toggle-description{float:left}.wpmud .wds-moz-table strong{font-size:15px;color:#666;line-height:30px}.wpmud .wds-moz-api-credentials{border:1px solid #EAEAEA;border-radius:4px;padding:30px}.wpmud .wds-moz-api-credentials .button{margin-top:20px;float:right}.wpmud [name="reset-moz-credentials"]{margin-bottom:30px;float:right}.wpmud .wds-redirects input{margin-bottom:0}.wpmud .wds-redirects-buttons-top{margin-bottom:10px}.wpmud .wds-redirects-buttons-bottom button{float:right}.wpmud .wds-redirects .wds-redirection_item-type select{width:200px}.wpmud .wds-redirects .wds-bulk-remove{display:none}.wpmud .wds-redirects .wds-redirects-unsaved-notice{display:none}.wpmud .wds-redirects .wds-redirects-table.wds-list-table th,.wpmud .wds-redirects .wds-redirects-table.wds-list-table td{padding:20px 5px}.wpmud .wds-redirects .wds-redirects-table.wds-list-table th:first-child,.wpmud .wds-redirects .wds-redirects-table.wds-list-table th:last-child,.wpmud .wds-redirects .wds-redirects-table.wds-list-table td:first-child,.wpmud .wds-redirects .wds-redirects-table.wds-list-table td:last-child{width:10px}.wpmud .wds-redirects .wds-redirects-table.wds-list-table th:first-child,.wpmud .wds-redirects .wds-redirects-table.wds-list-table td:first-child{padding-left:20px}.wpmud .wds-redirects .wds-redirects-table.wds-list-table th:last-child,.wpmud .wds-redirects .wds-redirects-table.wds-list-table td:last-child{padding-right:20px}.wpmud .wds-redirects .wds-redirects-table.wds-list-table tbody tr:last-child td{border-bottom:1px solid #EAEAEA}.wpmud .wds-bulk-update-redirects-modal .wds-action-button{float:right}.wpmud .wds-custom-meta-tags{margin-top:15px}.wpmud .wds-meta-tags-example{font-size:0.8em}.wpmud .wds-third-party-plugins{border-radius:7px;border:1px solid #EAEAEA;margin-bottom:20px}.wpmud .wds-third-party-plugins .wds-third-party-plugin{padding:15px 20px;display:table;width:100%}.wpmud .wds-third-party-plugins .wds-third-party-plugin-name,.wpmud .wds-third-party-plugins .wds-third-party-plugin-button{display:table-cell;vertical-align:middle}.wpmud .wds-third-party-plugins .wds-third-party-plugin-name{color:#333;font-size:13px;font-weight:500}.wpmud .wds-third-party-plugins .wds-third-party-plugin-button{text-align:right}.wpmud .wds-third-party-plugins .wds-third-party-plugin.wds-aioseop{border-top:1px solid #EAEAEA}.wpmud .fields{position:relative}.wpmud .fields.wds-twitter-username::before{color:#aaaaaa;content:"@";font-family:"Roboto",Arial,sans-serif;font-size:15px;position:absolute;right:100.8%;top:8px}.wpmud .wds-twitter-embed{margin-top:30px;height:320px}.wpmud .wds-twitter-embed-large{height:560px}.wpmud .wds-twitter-embed iframe{margin:0 auto}.wpmud .wds-seo-checkup-stats{background-image:url("../images/seo-checkup-stats.png");background-size:181px 182px}.wpmud .wds-seo-checkup-stats .wds-checkup-frequency{text-transform:capitalize}.wpmud .wds-seo-checkup-stats .wds-checkup-frequency-details{font-size:13px}.wpmud .wds-content-tabs.tab_checkup .wds-mascot-message.seo-checkup-upsell{margin-top:30px;margin-bottom:-30px}@media only screen and (max-width: 960px){.wpmud .row .col-third,.wpmud .row .col-two-third,.wpmud .row .col-half,.wpmud .row .col-quarter,.wpmud .row .col-three-quarters{display:block;margin-top:30px;padding:0;width:100%}.wpmud .row .col-third:first-child,.wpmud .row .col-two-third:first-child,.wpmud .row .col-half:first-child,.wpmud .row .col-quarter:first-child,.wpmud .row .col-three-quarters:first-child{margin-top:0}}@media only screen and (max-width: 600px){.wpmud .dev-box .box-title{padding:15px 30px}}@media only screen and (max-width: 783px){.wpmud .dev-box .box-title .toggle-troup{margin-top:0}}@media only screen and (max-width: 600px){.wpmud .dev-box .box-title h3,.wpmud .dev-box .box-title .buttons,.wpmud .dev-box .box-title .actions,.wpmud .dev-box .box-title .extra{float:none;display:block}}@media only screen and (max-width: 600px){.wpmud .dev-box .box-title .buttons,.wpmud .dev-box .box-title .actions,.wpmud .dev-box .box-title .extra{margin-top:15px}}@media only screen and (max-width: 600px){.wpmud .dev-box .box-title h3{line-height:1em}}@media only screen and (max-width: 960px){.wpmud .wrap-wds #header h1,.wpmud .wrap-wds #header .actions{display:block;float:none}.wpmud .wrap-wds #header .actions{margin-top:15px;margin-bottom:5px}}@media only screen and (max-width: 1100px){.wpmud .content-box-two-cols-image-left .wds-block-entry{text-align:center}.wpmud .content-box-two-cols-image-left .wds-block-entry-image{float:none;margin-bottom:30px}.wpmud .content-box-two-cols-image-left .wds-block-entry-image .wds-image{margin:0 auto}.wpmud .content-box-two-cols-image-left .wds-block-entry-content{margin:0}.wpmud .content-box-two-cols-image-left .wds-block-entry-content .title{text-align:center}}.wpmud button#collapse-button{font:inherit;text-transform:none}
1
+ .cf:after,.wpmud #header:after,.wpmud .dev-box .box-title:after,.wpmud .wds-box-footer:after,.wpmud .uptime-message:after,.wpmud .wds-table-fields:after,.wpmud .wds-keyword-pairs .wds-keyword-pair:after,.wpmud .wds-styleable-file-input:after,.wpmud .wds-preset-separators:after,.wpmud .wds-automatic-linking:after,.wpmud .wds-moz-api-credentials:after,.wpmud .wds-import-status-dialog .wds-advanced-import-options:after{content:"";display:table;clear:both}@media only screen and (max-width: 1200px){.hide-to-large{display:none}}@media only screen and (max-width: 1100px){.hide-to-desktop{display:none}}.wpmud .select2-container .select2-selection--single{background:#FAFAFA;border-color:#ddd;height:44px}.wpmud .select2-container .select2-selection--single .select2-selection__rendered{padding:8px 45px 8px 15px;line-height:1;font:500 15px/25px "Roboto"}.wpmud .select2-container .select2-selection--single .select2-selection__arrow{height:39px;width:45px}.wpmud .select2-container .select2-selection--single .select2-selection__arrow::before{content:"\65";display:block;font-family:"WPMU-DEV-App-Icons",sans-serif;font-size:20px;margin-top:9px;text-align:center}.wpmud .select2-container .select2-selection--single b[role="presentation"]{border-color:transparent}.wpmud .select2-container .select2-dropdown{background:#FAFAFA;border-color:#ddd}.wpmud .select2-container .select2-results__option{margin:0;font:500 15px/25px "Roboto";padding:8px 15px}.wpmud .select2-container .select2-results__option--highlighted[aria-selected]{background-color:rgba(0,0,0,0.05);color:#414042}.wpmud .select2-container .select2-results__option[aria-selected=true]{background-color:#17a8e3;color:#fff}.wpmud .select2-container.select2-container--open .select2-selection--single .select2-selection__arrow::before{content:"\72"}.wpmud .select2-container.select2-container--above .select2-selection--single .select2-selection__arrow::before{content:"\72"}.wpmud .select2-container.select2-container--above.select2-container--open .select2-selection--single .select2-selection__arrow::before{content:"\65"}.wpmud .select2-container.select2-container--above.select2-container--open .select2-selection--single .select2-selection__rendered{padding-top:9px}.wds-select2-dropdown-container .select2-selection--single{background:#FAFAFA;border-color:#ddd;height:44px}.wds-select2-dropdown-container .select2-selection--single .select2-selection__rendered{padding:8px 45px 8px 15px;line-height:1;font:500 15px/25px "Roboto"}.wds-select2-dropdown-container .select2-selection--single .select2-selection__arrow{height:39px;width:45px}.wds-select2-dropdown-container .select2-selection--single .select2-selection__arrow::before{content:"\65";display:block;font-family:"WPMU-DEV-App-Icons",sans-serif;font-size:20px;margin-top:9px;text-align:center}.wds-select2-dropdown-container .select2-selection--single b[role="presentation"]{border-color:transparent}.wds-select2-dropdown-container .select2-dropdown{background:#FAFAFA;border-color:#ddd}.wds-select2-dropdown-container .select2-results__option{margin:0;font:500 15px/25px "Roboto";padding:8px 15px}.wds-select2-dropdown-container .select2-results__option--highlighted[aria-selected]{background-color:rgba(0,0,0,0.05);color:#414042}.wds-select2-dropdown-container .select2-results__option[aria-selected=true]{background-color:#17a8e3;color:#fff}.wds-select2-dropdown-container.select2-container--open .select2-selection--single .select2-selection__arrow::before{content:"\72"}.wds-select2-dropdown-container.select2-container--above .select2-selection--single .select2-selection__arrow::before{content:"\72"}.wds-select2-dropdown-container.select2-container--above.select2-container--open .select2-selection--single .select2-selection__arrow::before{content:"\65"}.wds-select2-dropdown-container.select2-container--above.select2-container--open .select2-selection--single .select2-selection__rendered{padding-top:9px}.wpmud{-webkit-font-smoothing:antialiased}.wpmud-html{background-color:#f1f1f1}.wpmud *{box-sizing:border-box}.wpmud strong,.wpmud b{font-weight:500}.wpmud p{color:#666;line-height:30px;margin-bottom:30px}.wpmud #header{margin-bottom:30px}.wpmud #header h1{color:#333;margin:0 0 30px;display:table;float:left}.wpmud #header h1:last-child{margin-bottom:0}.wpmud #header h1 .wds-toggle{vertical-align:top;width:42px}.wpmud #header ~ .sub-header{margin-top:30px;margin-bottom:30px}.wpmud #header .actions{float:right}.wpmud #header .actions .button{vertical-align:middle;margin-left:20px}.wpmud #header .notice,.wpmud #header div.error,.wpmud #header div.updated{clear:both}.wpmud #wpbody{background:transparent}.wpmud #container{margin:30px 30px 0 10px}.wpmud .dev-box{padding:0}.wpmud .dev-box:last-child{margin-bottom:0}.wpmud .dev-box .box-title{clear:both;height:inherit;margin:0;padding:0 30px}.wpmud .dev-box .box-title h3{float:left;font-size:15px;color:#333}.wpmud .dev-box .box-title .buttons.left{float:left;margin:10px 0 0 20px}.wpmud .dev-box .box-content{padding:30px;word-wrap:break-word}.wpmud .dev-box .box-content.no-padding{padding:0}.wpmud .dev-box .box-content.no-vertical-padding{padding-top:0;padding-bottom:0}.wpmud .dev-box .box-content.no-side-padding{padding-right:0;padding-left:0}.wpmud .dev-box .box-content p{margin-bottom:20px}.wpmud .dev-box .box-content p:last-of-type:last-child{margin-bottom:0}.wpmud .dev-box .box-content .wds-standalone-bottom{margin-bottom:0}.wpmud .dev-box .box-content .buttons{margin-top:20px}.wpmud .dev-box .box-content .buttons.buttons-on-left{text-align:left}.wpmud .dev-box .box-content .buttons.buttons-on-right{text-align:right}.wpmud .dev-box .box-footer{margin-top:0;padding:0 30px 30px 30px}.wpmud .dev-box .box-footer.bordered-top{border-top:2px solid #f4f4f4;padding-top:30px}.wpmud .dev-box .box-footer.modal{margin-top:30px;padding:0}.wpmud .dev-box .box-footer.buttons .select-wrapper{display:inline-block}.wpmud .dev-box .box-footer.buttons .select-wrapper>*{display:inline-block}.wpmud .dev-box .box-footer.buttons .select-wrapper>label{float:left;line-height:43px;margin:0 15px 0 0;padding:0;vertical-align:middle}.wpmud .dev-box .box-footer.buttons .button,.wpmud .dev-box .box-footer.buttons input[type="submit"]{display:inline-block;margin-left:20px}.wpmud .dev-box .box-footer.buttons .button:first-child,.wpmud .dev-box .box-footer.buttons input[type="submit"]:first-child{margin-left:0}.wpmud .wds-modal *{box-sizing:border-box}.wpmud .wds-modal.dev-overlay .title h3{color:#333;font-family:"Roboto Condensed","Roboto",Arial,sans-serif;font-size:15px}.wpmud .wds-modal.dev-overlay .back{background:#333;opacity:0.95}.wpmud .wds-modal .box{padding:0}.wpmud .wds-modal .box .title{margin:0;padding:0 30px}.wpmud .wds-modal .box .content{padding:30px}.wpmud .wds-box-footer{border-top:1px solid #EAEAEA;margin:30px -30px -30px;padding:30px}.wpmud form>div.buttons{text-align:center}.wpmud form .vertical-tabs{padding:15px 0 0}.wpmud .vertical-tabs{margin-bottom:30px}.wpmud .vertical-tabs>.tab input[type="radio"]{display:none}.wpmud .vertical-tabs>.tab>.wds-content-tabs{padding:0;border-radius:7px;left:200px}.wpmud .vertical-tabs>.tab>label{color:#888;font:400 15px/20px "Roboto",Arial,sans-serif;padding:5px 15px;border-radius:20px;text-transform:inherit;width:170px;margin:0 0 10px}.wpmud .vertical-tabs>.tab>label:hover{color:#333}.wpmud .vertical-tabs>.tab>label:after{border-bottom:none}.wpmud .vertical-tabs>.tab input[type="radio"]:checked+label{color:#333;background:#eaeaea;box-shadow:none;padding-top:5px;font-weight:500}.wpmud .vertical-tabs .wds-content-tabs .tab-title{font-weight:600;line-height:24px;margin:0;max-width:100%;padding:18px 30px;border-bottom:1px solid #EAEAEA;text-align:left;font-size:15px;color:#333}.wpmud .vertical-tabs .wds-content-tabs .wds-content-tabs-inner{padding:30px;position:relative}.wpmud .vertical-tabs .wds-content-tabs.wds-accordion{background:#f9f9f9}.wpmud .vertical-tabs .wds-content-tabs.wds-accordion .tab-title{border-radius:7px 7px 0 0;background:#FFF;border-bottom:none}.wpmud .vertical-tabs .wds-content-tabs.wds-accordion .tab-sub-title .toggle{position:absolute;right:80px}.wpmud .vertical-tabs .wds-content-tabs.wds-accordion .tab-sub-title .wds-archive-disabled-label{background:#f2f2f2;border-radius:13px;color:#aaaaaa;display:none;font-size:13px;margin-left:6px;padding:5px 16px;vertical-align:top}.wpmud .vertical-tabs .wds-content-tabs.wds-accordion .tab-sub-title.wds-archive-disabled{color:#888}.wpmud .vertical-tabs .wds-content-tabs.wds-accordion .tab-sub-title.wds-archive-disabled .wds-archive-disabled-label{display:inline}.wpmud .row-inside-form{margin-bottom:30px;padding:0}.wpmud .wds-footer-text{margin-top:20px;text-align:left}.wpmud .wds-group{margin-bottom:15px}.wpmud .wds-group:last-child{margin-bottom:0}.wpmud .block-section-footer{margin-top:30px}.wpmud .wds-seamless-footer{background:#FFF;border-radius:0 0 7px 7px;padding:30px;border-top:1px solid #EAEAEA;text-align:right}.wpmud .wds-accordion .wds-seamless-footer{border-top:none}.wpmud .toggle.toggle{line-height:1}.wpmud .toggle.toggle .toggle-label{background:transparent;border:1px solid #ccc;height:18px;width:40px;margin-left:0}.wpmud .toggle.toggle .toggle-label::after{background:#777771;height:18px;width:18px;border-radius:100%;margin:0;box-shadow:none;position:relative;top:0}.wpmud .toggle.toggle .toggle-label::before{display:none}.wpmud .toggle.toggle .toggle-checkbox:hover+.toggle-label::after{background:#777771;box-shadow:none}.wpmud .toggle.toggle .toggle-checkbox+.toggle-label::after{margin-left:-1px;margin-top:-1px}.wpmud .toggle.toggle .toggle-checkbox:checked+.toggle-label{background:#f9f9f9}.wpmud .toggle.toggle .toggle-checkbox:checked+.toggle-label::after{background:#17a8e3;margin-left:22px}.wpmud .toggle.toggle.wds-inverted-toggle .toggle-label{background:#f9f9f9}.wpmud .toggle.toggle.wds-inverted-toggle .toggle-label::after{background:#17a8e3;margin-left:22px}.wpmud .toggle.toggle.wds-inverted-toggle .toggle-checkbox:hover+.toggle-label::after{background:#17a8e3}.wpmud .toggle.toggle.wds-inverted-toggle .toggle-checkbox:checked+.toggle-label{background:transparent}.wpmud .toggle.toggle.wds-inverted-toggle .toggle-checkbox:checked+.toggle-label::after{margin-left:-1px;background:#777771}.wpmud .wds-form .input,.wpmud .wds-form input[type="text"],.wpmud .wds-form input[type="email"],.wpmud .wds-form input[type="search"],.wpmud .wds-form input[type="password"],.wpmud .wds-form input[type="url"],.wpmud .wds-form select,.wpmud .wds-form textarea{background:#FAFAFA;border-color:#ddd;color:#333}.wpmud .wds-form .input:hover:not(:focus):not(:active),.wpmud .wds-form .input:focus,.wpmud .wds-form .input:active,.wpmud .wds-form input[type="text"]:hover:not(:focus):not(:active),.wpmud .wds-form input[type="text"]:focus,.wpmud .wds-form input[type="text"]:active,.wpmud .wds-form input[type="email"]:hover:not(:focus):not(:active),.wpmud .wds-form input[type="email"]:focus,.wpmud .wds-form input[type="email"]:active,.wpmud .wds-form input[type="search"]:hover:not(:focus):not(:active),.wpmud .wds-form input[type="search"]:focus,.wpmud .wds-form input[type="search"]:active,.wpmud .wds-form input[type="password"]:hover:not(:focus):not(:active),.wpmud .wds-form input[type="password"]:focus,.wpmud .wds-form input[type="password"]:active,.wpmud .wds-form input[type="url"]:hover:not(:focus):not(:active),.wpmud .wds-form input[type="url"]:focus,.wpmud .wds-form input[type="url"]:active,.wpmud .wds-form select:hover:not(:focus):not(:active),.wpmud .wds-form select:focus,.wpmud .wds-form select:active,.wpmud .wds-form textarea:hover:not(:focus):not(:active),.wpmud .wds-form textarea:focus,.wpmud .wds-form textarea:active{background:#ffffff;border-color:#ddd}.wpmud .wds-form .input:-ms-input-placeholder,.wpmud .wds-form input[type="text"]:-ms-input-placeholder,.wpmud .wds-form input[type="email"]:-ms-input-placeholder,.wpmud .wds-form input[type="search"]:-ms-input-placeholder,.wpmud .wds-form input[type="password"]:-ms-input-placeholder,.wpmud .wds-form input[type="url"]:-ms-input-placeholder,.wpmud .wds-form select:-ms-input-placeholder,.wpmud .wds-form textarea:-ms-input-placeholder{color:#aaaaaa}.wpmud .wds-form .input::placeholder,.wpmud .wds-form input[type="text"]::placeholder,.wpmud .wds-form input[type="email"]::placeholder,.wpmud .wds-form input[type="search"]::placeholder,.wpmud .wds-form input[type="password"]::placeholder,.wpmud .wds-form input[type="url"]::placeholder,.wpmud .wds-form select::placeholder,.wpmud .wds-form textarea::placeholder{color:#aaaaaa}.wpmud .wds-form .input:disabled,.wpmud .wds-form .input.disabled,.wpmud .wds-form input[type="text"]:disabled,.wpmud .wds-form input[type="text"].disabled,.wpmud .wds-form input[type="email"]:disabled,.wpmud .wds-form input[type="email"].disabled,.wpmud .wds-form input[type="search"]:disabled,.wpmud .wds-form input[type="search"].disabled,.wpmud .wds-form input[type="password"]:disabled,.wpmud .wds-form input[type="password"].disabled,.wpmud .wds-form input[type="url"]:disabled,.wpmud .wds-form input[type="url"].disabled,.wpmud .wds-form select:disabled,.wpmud .wds-form select.disabled,.wpmud .wds-form textarea:disabled,.wpmud .wds-form textarea.disabled{color:#aaaaaa !important;background-color:#ffffff !important;border:1px solid #ddd !important}.wpmud .wds-form .select-container{background:#FAFAFA;border-color:#ddd}.wpmud .wds-form .select-container-no-style{background:transparent;border-color:transparent}.wpmud .wds-form .select-container .dropdown-handle{background:#FAFAFA;border-color:#ddd;border-left-width:0}.wpmud .wds-form .select-container .dropdown-handle .wdv-icon:before{font-family:"WPMU-DEV-App-Icons",sans-serif;content:"\65";color:#A6A6A6;font-size:20px}.wpmud .wds-form .select-container .list-value{color:#333}.wpmud .wds-form .select-container.active:hover .list-value,.wpmud .wds-form .select-container.active .list-value:hover{color:#333}.wpmud .wds-form .select-container.active .dropdown-handle{background:#ffffff;border-left-width:1px}.wpmud button,.wpmud .button{border-radius:4px;padding:10px 20px;background:#17a8e3}.wpmud button:hover:not(:focus):not(:active),.wpmud .button:hover:not(:focus):not(:active){background:#41baec}.wpmud button:active,.wpmud button:focus,.wpmud .button:active,.wpmud .button:focus{background:#1286b5}.wpmud button.button-light,.wpmud .button.button-light{background:transparent}.wpmud button.button-light:hover:not(:focus):not(:active),.wpmud .button.button-light:hover:not(:focus):not(:active){background:#f4f4f4}.wpmud .media-modal .media-frame h2{max-width:100%;font-family:inherit}.wpmud .media-modal .media-frame .media-button{padding:0 12px;text-transform:none}.wpmud .media-modal .media-frame .search,.wpmud .media-modal .media-frame .setting input,.wpmud .media-modal .media-frame .setting textarea,.wpmud .media-modal .media-frame .attachment-filters{border-radius:0;box-shadow:0 1px 2px rgba(0,0,0,0.07) inset;font-size:12px;line-height:1.4em;padding:4px}.wpmud .media-modal .media-frame .search:not(:disabled):not([readonly]),.wpmud .media-modal .media-frame .setting input:not(:disabled):not([readonly]),.wpmud .media-modal .media-frame .setting textarea:not(:disabled):not([readonly]),.wpmud .media-modal .media-frame .attachment-filters:not(:disabled):not([readonly]){background-color:#fff;border:1px solid #ddd}.wpmud .media-modal .media-frame .search{margin-top:11px}.wpmud .media-modal .media-frame .setting{padding:0}.wpmud .media-modal .media-frame .attachment-filters{display:inline;width:100px;max-width:200px;padding:0}.wpmud .media-modal .media-frame .delete-attachment,.wpmud .media-modal .media-frame .trash-attachment,.wpmud .media-modal .media-frame .untrash-attachment{font-family:inherit;font-size:inherit;text-transform:none}.wpmud .media-modal .media-modal-close{background:transparent;border:none;color:#666;cursor:pointer;height:50px;margin:0;outline:medium none;padding:0;position:absolute;right:0;top:0;transition:color 0.1s ease-in-out 0s, background 0.1s ease-in-out 0s;width:50px;z-index:1000}.wpmud .media-modal .media-modal-close:hover:not(:focus):not(:active),.wpmud .media-modal .media-modal-close:hover{color:#00A0D2;background:transparent}.wpmud .notice,.wpmud div.error,.wpmud div.updated{text-align:left}.wpmud #wpbody-content>.error,.wpmud #wpbody-content>.updated{margin:30px 20px 30px 0}.wpmud .wds-image{display:block;height:auto;max-width:100%}.wpmud .wds-image-center{margin-right:auto;margin-left:auto}.wpmud .wds-image-standalone{margin-bottom:30px}.wpmud .wds-listing{margin:0}.wpmud .wds-listing li{font:400 15px/21px "Roboto",Arial,sans-serif;margin-top:20px;margin-bottom:0}.wpmud .wds-listing li:first-child{margin-top:0}.wpmud .wds-listing li strong{font-weight:500}.wpmud .wds-listing li.cta-alt:before{color:#BE1E2D}.wpmud .wds-listing.bold li{font-weight:500}.wpmud .wds-listing-ordered{padding-left:20px}.wpmud .wds-listing .wds-listing-label{color:#777771;font:400 20px/26px "Roboto Condensed","Roboto",Arial,sans-serif;margin-bottom:15px}.wpmud .wds-pre{border-left:none}.wpmud .wds-pre-inline{display:inline-block;margin:0;font-style:italic}.wpmud .wds-title-alt{font-size:30px;font-weight:400;line-height:40px;max-width:none;overflow:hidden;text-overflow:ellipsis;text-transform:none;white-space:nowrap}.wpmud .wds-page-desc{color:#444;font-family:'Open Sans', Arial, sans-serif;font-weight:400;font-size:14px;line-height:20px}.wpmud .uptime-message>*{float:left;line-height:40px;margin-right:10px}.wpmud .uptime-message .wds-dashicons-box-title{margin:0 10px 0 0;height:40px}.wpmud .uptime-message .uptime>span{display:block}.wpmud .uptime-message .uptime-result{font-size:22px;font-weight:700;line-height:26px}.wpmud .uptime-message .uptime-label{color:#bfbfbf;font:400 13px/14px "Roboto Condensed","Roboto",Arial,sans-serif;text-transform:uppercase}.wds-qtip{background:#0B2F3F;border-color:#0B2F3F;color:#FFF;padding:3px}.wpmud .wds-disabled-component{text-align:center}.wpmud .wds-disabled-component .wds-disabled-image{width:128px;height:auto}.wpmud .wds-disabled-component p{margin-bottom:30px}.wpmud .wds-disabled-component .wds-notice{margin-bottom:30px}.wpmud .wds-has-tooltip{cursor:pointer}.wpmud .button.large{padding:20px}.wpmud .button-light-wds{box-shadow:0 0 0 2px #BABABA inset}.wpmud .button-fields-trigger{background:transparent;border:1px solid transparent;color:#888888;font-size:12px;line-height:16px;font-weight:400;padding:12px 12px 9px 12px;transition:background .3s, color .3s, opacity .3s}.wpmud .button-fields-trigger:hover:not(:focus):not(:active),.wpmud .button-fields-trigger:hover,.wpmud .button-fields-trigger:active,.wpmud .button-fields-trigger:focus{background:#EAEAEA;border:1px solid transparent;color:#777771}.wpmud .button.button-cta-alt{background:#BE1E2D;box-shadow:0 3px 0 0 #991825}.wpmud .button.button-cta-alt:hover:not(:focus):not(:active){background:#991825;box-shadow:0 3px 0 0 #660000}.wpmud .button.button-cta-alt:active,.wpmud .button.button-cta-alt:focus{box-shadow:0 3px 0 0 #660000;background:#991825;background:linear-gradient(to bottom, #991825 0%, #BE1E2D 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#991825', endColorstr='#BE1E2D', GradientType=0)}.wpmud .button.button-cta-dark{background:#414042;box-shadow:0 3px 0 0 #231F20}.wpmud .button.button-cta-dark:hover:not(:focus):not(:active){background:#231F20;box-shadow:0 3px 0 0 #0E0D0F}.wpmud .button.button-cta-dark:active,.wpmud .button.button-cta-dark:focus{box-shadow:0 3px 0 0 #0E0D0F;background:#231F20;background:linear-gradient(to bottom, #231F20 0%, #414042 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#231F20', endColorstr='#414042', GradientType=0)}.wpmud .button-white{background:transparent;border:2px solid #fff;box-shadow:none;color:#fff;padding:8px 20px;transition:background .3s, border-color .3s, color .3s, opacity .3s}.wpmud .button-white:hover:not(:focus):not(:active){background:#fff;border-color:#fff;box-shadow:none;color:#4A4A4A}.wpmud .button-white:active,.wpmud .button-white:focus{color:#4A4A4A;box-shadow:none;border:2px solid #E6E6E6;background:#E6E6E6;background:linear-gradient(to bottom, #E6E6E6 0%, #fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#E6E6E6', endColorstr='#fff', GradientType=0);transform:inherit}.wpmud .button-yellow-alt{background:transparent;border:2px solid #FECF2F;box-shadow:none;color:#FECF2F;padding:8px 20px;transition:background .3s, border-color .3s, color .3s, opacity .3s}.wpmud .button-yellow-alt:hover:not(:focus):not(:active){background:#FECF2F;border-color:#FECF2F;box-shadow:none;color:#fff}.wpmud .button-yellow-alt:active,.wpmud .button-yellow-alt:focus{color:#FFFFFF;box-shadow:none;border-color:#E5B616;background:#E5B616;background:linear-gradient(to bottom, #E5B616 0%, #FECF2F 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#E5B616', endColorstr='#FECF2F', GradientType=0)}.wpmud .button-dark{background:#888;color:#ffffff}.wpmud .button-dark:hover:not(:focus):not(:active),.wpmud .button-dark:hover,.wpmud .button-dark:focus,.wpmud .button-dark:active{background:#6f6f6f;color:#ffffff}.wpmud .button-small.button{font-family:"Roboto",Arial,sans-serif;font-size:12px;line-height:16px;padding:7px 16px}.wpmud .button-dark-o{background:transparent;border:2px solid #666;box-shadow:none;color:#666;padding:8px 20px;font-family:"Roboto",Arial,sans-serif;font-weight:500}.wpmud .button-dark-o:hover:not(:focus):not(:active),.wpmud .button-dark-o:hover,.wpmud .button-dark-o:focus,.wpmud .button-dark-o:active{background:transparent;border:2px solid gray;color:gray}.wpmud .button-dark-o.button-small.button{padding:5px 16px}.wpmud .button-pro{border:2px solid #1ABC9C;border-radius:20px;color:#1ABC9C;font-family:"Roboto",Arial,sans-serif;font-size:12px;font-weight:500;line-height:16px;text-transform:uppercase;background:transparent}.wpmud .button-pro:hover:not(:focus):not(:active),.wpmud .button-pro:hover,.wpmud .button-pro:focus,.wpmud .button-pro:active{background:transparent;border:2px solid #148f77;color:#148f77}.wpmud .wds-button-with-loader.wds-item-loading::before{font-size:18px}.wpmud .wds-button-with-left-loader.wds-item-loading::before{right:110%}.wpmud .wds-button-with-right-loader.wds-item-loading::before{left:110%}.wpmud input[type="number"],.wpmud input[type="url"]{background:#FFF;border:1px solid #ddd;border-radius:4px;box-shadow:none;color:#999;display:block;font:500 15px/25px "Roboto",Arial,sans-serif;margin:0px 0px 15px 0px;max-width:100%;padding:7px 15px 6px;transition-property:background, color, border-color;transition-duration:0.3s;width:100%}.wpmud input[type="number"]:focus,.wpmud input[type="url"]:focus{border-color:#BBB;color:#3D464D}.wpmud input[type="number"]:focus::-webkit-input-placeholder,.wpmud input[type="url"]:focus::-webkit-input-placeholder{transition:opacity 0.3s 0.4s ease;opacity:0.25}.wpmud input[type="number"]:focus:-moz-placeholder,.wpmud input[type="url"]:focus:-moz-placeholder{transition:opacity 0.3s 0.4s ease;opacity:0.25}.wpmud input[type="number"]:focus::-moz-placeholder,.wpmud input[type="url"]:focus::-moz-placeholder{transition:opacity 0.3s 0.4s ease;opacity:0.25}.wpmud input[type="number"]:focus:-ms-input-placeholder,.wpmud input[type="url"]:focus:-ms-input-placeholder{transition:opacity 0.3s 0.4s ease;opacity:0.25}.wpmud input[type="number"]:hover:not(:focus),.wpmud input[type="url"]:hover:not(:focus){color:#3D464D}.wpmud input[type="number"]:disabled,.wpmud input[type="url"]:disabled{background:#F6F6F6 !important;color:#AAA !important;border-color:#ddd !important;cursor:default}.wpmud input[type="number"]::-webkit-input-placeholder,.wpmud input[type="url"]::-webkit-input-placeholder{position:relative;top:0}.wpmud input[type="number"]:-moz-placeholder,.wpmud input[type="url"]:-moz-placeholder{position:relative;top:0}.wpmud input[type="number"]::-moz-placeholder,.wpmud input[type="url"]::-moz-placeholder{position:relative;top:0}.wpmud input[type="number"]:-ms-input-placeholder,.wpmud input[type="url"]:-ms-input-placeholder{position:relative;top:0}.wpmud .wds-checkbox,.wpmud .wds-radio{box-shadow:none;line-height:20px;height:20px;min-width:20px;width:20px}.wpmud .wds-checkbox:focus,.wpmud .wds-radio:focus{border-color:#19B99A}.wpmud .wds-checkbox-width-label,.wpmud .wds-radio-width-label{margin-right:0}.wpmud .wds-checkbox{border-radius:4px}.wpmud .wds-checkbox:before{color:#19B99A;height:18px;line-height:20px;margin:0 0 0 -2px;width:18px}.wpmud .wds-checkbox:checked{border-color:#19B99A}.wpmud .wds-checkbox:checked:before{color:#19B99A;height:18px;line-height:20px;margin:0 0 0 -2px;width:18px}.wpmud .wds-checkbox-container input[type="checkbox"]{display:none}.wpmud .wds-checkbox-container label{height:16px;width:16px;padding:0;margin:0}.wpmud .wds-checkbox-container span{background:#FAFAFA;border:1px solid #ddd;height:16px;width:16px;border-radius:4px;display:block}.wpmud .wds-checkbox-container input[type="checkbox"]:checked+span{background:#17a8e3;border:#17a8e3}.wpmud .wds-checkbox-container input[type="checkbox"]:checked+span:before{color:#fff;content:"\7a";display:block;font-family:"WPMU-DEV-App-Icons";font-size:10px;line-height:1;padding:3px}.wpmud .wds-radio{margin-top:0}.wpmud .wds-radio:checked:before{background-color:#19B99A;height:10px;line-height:20px;width:10px}.wpmud .wds-fieldset-legend,.wpmud .wds-label{color:#333;display:block;font-size:15px;line-height:30px;margin-bottom:0;padding:0;text-transform:capitalize;transition:color .4s}.wpmud .wds-fieldset{margin-top:20px}.wpmud .wds-fieldset:first-child{margin-top:0}.wpmud .wds-fieldset-standalone{margin-bottom:20px}.wpmud .wds-fieldset-grey{color:#4A4A4A}.wpmud .wds-label:hover{color:#808080}.wpmud .wds-label.link{color:#19B4CF;display:inline-block;margin:0;text-transform:none}.wpmud .wds-label-inline{display:inline-block}.wpmud .wds-label-inline-left{margin:0 15px 0 0}.wpmud .wds-label-inline-right{margin:0 0 0 15px;max-width:450px}.wpmud .wds-label-description{color:#808080;display:block;font-size:13px;line-height:22px;margin-top:0;margin-bottom:20px}.wpmud .wds-label-radio{color:#4A4A4A}.wpmud .wds-field-legend{color:#808080;display:block;font-size:13px;line-height:18px;margin-top:10px}.wpmud .wds-group-field .wds-field,.wpmud .wds-group-field .wds-select,.wpmud .wds-group-field .wds-textarea{margin-bottom:5px}.wpmud .wds-group-field.has-field-label .wds-field{display:inline-block;width:auto}.wpmud .wds-group-field .wds-field-label{color:#808080;font:400 15px/20px "Roboto",Arial,sans-serif}.wpmud .wds-fieldset-fields{margin-top:15px}.wpmud .wds-fieldset-fields-group{margin:5px 0 0}.wpmud .wds-fieldset-fields-group>p{display:inline-block;margin:0 20px 10px 0 !important}.wpmud .wds-fieldset-fields-group>p:last-child{margin-right:0}.wpmud .wds-fieldset-fields-group .wds-label-inline-right{margin-left:5px}.wpmud .wds-table-fields-group{margin-top:20px}.wpmud .wds-table-fields-group:first-child{margin-top:0}.wpmud .wds-table-fields .label,.wpmud .wds-table-fields .fields{display:block;float:left}.wpmud .wds-table-fields .label{margin-top:5px;padding-right:30px;width:30%}.wpmud .wds-table-fields .label-width-options{margin-top:5px}.wpmud .wds-table-fields .label-long{margin-top:2px}.wpmud .wds-table-fields .label .wds-label{margin-bottom:0}.wpmud .wds-table-fields .fields{width:70%}.wpmud .wds-table-fields .fields .wds-label{color:#666}.wpmud .wds-table-fields .fields-with-legend .wds-field{margin-bottom:5px}.wpmud .wds-table-fields .fields-with-legend-large .wds-field{margin-bottom:10px}.wpmud .wds-table-fields .fields.has-trigger-button{position:relative}.wpmud .wds-table-fields .note{background-color:#f5f5f5;border-radius:3px;clear:both;padding:20px;text-align:center;width:100%}.wpmud .wds-table-fields .note p{color:#4A4A4A;font-weight:400;margin:0;line-height:20px}.wpmud .wds-table-fields .note .wdv-icon{color:#777771;font-size:20px;vertical-align:top}.wpmud .wds-table-fields.wds-table-fields-stacked .label{margin-top:0;padding-right:0;margin-bottom:5px;width:100%}.wpmud .wds-table-fields.wds-table-fields-stacked .label label{color:#888;font-size:12px;font-weight:500;line-height:22px}.wpmud .wds-table-fields.wds-table-fields-stacked .label label span{font-weight:400}.wpmud .wds-table-fields.wds-table-fields-stacked .fields{width:100%}.wpmud .wds-table-fields.wds-table-fields-stacked .select2{margin-bottom:15px}.wpmud .wds-separator-top{margin-top:30px;padding-top:30px;border-top:1px solid #EAEAEA}.wpmud .wds-code-label{display:block;margin-bottom:5px}.wpmud .wds-toggle-table{display:table;width:100%}.wpmud .wds-toggle-table.disabled{opacity:.5}.wpmud .wds-toggle-table .toggle.wds-toggle,.wpmud .wds-toggle-table .wds-toggle-description{display:table-cell;vertical-align:top}.wpmud .wds-toggle-table .wds-toggle-description .wds-label{margin-left:0}.wpmud .wds-toggle-table:last-child .wds-label-description{margin-bottom:0}.wpmud .wds-toggle-table .toggle.wds-toggle{padding-top:6px;width:60px}.wpmud .wds-dashicons{color:#808080;font-size:22px;height:22px;opacity:.5;width:22px}.wpmud .wds-dashicons-link{font-size:24px;height:24px;width:24px;transition:all .4s}.wpmud .wds-dashicons-link:hover{opacity:1}.wpmud .wds-dashicons-box-title{margin:-5px 10px 0 0;vertical-align:middle}.wpmud .wds-icon{background:url("../images/smartCrawl_sprite.png") no-repeat 0 0;background-image:url("../images/smartCrawl_sprite.svg"),none}.wpmud .wds-icon-inline{display:inline-block}.wpmud .wds-icon-inline-left{margin-right:15px}.wpmud .wds-icon-inline-right{margin-left:15px}.wpmud .wds-icon-redirect{background-position:-30px -30px;height:16px;width:18px}.wpmud .wds-icon-list{background-position:-30px -76px;height:16px;width:18px}@font-face{font-family:'wpmu-dev-seo-icons';src:url("../fonts/wpmu-dev-seo-icons.eot?gy02j9");src:url("../fonts/wpmu-dev-seo-icons.eot?gy02j9#iefix") format("embedded-opentype"),url("../fonts/wpmu-dev-seo-icons.woff2?gy02j9") format("woff2"),url("../fonts/wpmu-dev-seo-icons.ttf?gy02j9") format("truetype"),url("../fonts/wpmu-dev-seo-icons.woff?gy02j9") format("woff"),url("../fonts/wpmu-dev-seo-icons.svg?gy02j9#wpmu-dev-seo-icons") format("svg");font-weight:normal;font-style:normal}[class^="wds-icon-"],[class*=" wds-icon-"]{font-family:'wpmu-dev-seo-icons' !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wds-icon-icon-performance:before{content:"\e903"}.wds-icon-power-on-off:before{content:"\e904"}.wds-icon-update-arrow:before{content:"\e902"}.wds-icon-dashboard-settings:before{content:"\e901"}.wds-icon-icon-wpmu-logo-line:before{content:"\203a"}.wds-icon-icon-wpmu-logo-solid:before{content:"\2039"}.wds-icon-star-line:before{content:"\cf"}.wds-icon-notification-count:before{content:"\e900"}.wds-icon-24-hour-support:before{content:"\c1"}.wds-icon-speed-optimize:before{content:"\f8"}.wds-icon-cloudflare:before{content:"\d0"}.wds-icon-alert:before{content:"\58"}.wds-icon-align-center:before{content:"\5e"}.wds-icon-align-justify:before{content:"\23"}.wds-icon-align-left:before{content:"\25"}.wds-icon-align-right:before{content:"\26"}.wds-icon-annotate:before{content:"\b4"}.wds-icon-arrow-up:before{content:"\d4"}.wds-icon-arrow-right:before{content:"\af"}.wds-icon-arrow-down:before{content:"\c2"}.wds-icon-arrow-left:before{content:"\f8ff"}.wds-icon-more:before{content:"\2026"}.wds-icon-minus:before{content:"\2d"}.wds-icon-plus:before{content:"\3d"}.wds-icon-arrow-up-carats:before{content:"\2dd"}.wds-icon-arrow-down-carats:before{content:"\131"}.wds-icon-arrow-left-carats:before{content:"\d3"}.wds-icon-arrow-right-carats:before{content:"\2dc"}.wds-icon-arrows-compress:before{content:"\2265"}.wds-icon-arrows-expand:before{content:"\ac"}.wds-icon-arrows-in:before{content:"\2264"}.wds-icon-arrows-out:before{content:"\2da"}.wds-icon-check:before{content:"\28"}.wds-icon-close:before{content:"\29"}.wds-icon-at-sign:before{content:"\40"}.wds-icon-calendar:before{content:"\220f"}.wds-icon-camera:before{content:"\d8"}.wds-icon-clipboard-notes:before{content:"\bf"}.wds-icon-clock:before{content:"\2c"}.wds-icon-cloud:before{content:"\2122"}.wds-icon-download-cloud:before{content:"\a3"}.wds-icon-upload-cloud:before{content:"\a2"}.wds-icon-comment:before{content:"\a7"}.wds-icon-comments:before{content:"\b6"}.wds-icon-comment-3:before{content:"\aa"}.wds-icon-compass:before{content:"\2c6"}.wds-icon-credit-card:before{content:"\63"}.wds-icon-crop:before{content:"\43"}.wds-icon-crown:before{content:"\a1"}.wds-icon-italic:before{content:"\7b"}.wds-icon-bold:before{content:"\42"}.wds-icon-underline:before{content:"\55"}.wds-icon-text-color:before{content:"\a8"}.wds-icon-style-type:before{content:"\3c"}.wds-icon-quote-2:before{content:"\27"}.wds-icon-quote:before{content:"\3b"}.wds-icon-paperclip:before{content:"\41"}.wds-icon-indent-less:before{content:"\201d"}.wds-icon-indent-more:before{content:"\2019"}.wds-icon-list-bullet:before{content:"\38"}.wds-icon-list-number:before{content:"\37"}.wds-icon-list:before{content:"\60"}.wds-icon-link:before{content:"\35"}.wds-icon-unlink:before{content:"\36"}.wds-icon-color-pick-eyedropper:before{content:"\a5"}.wds-icon-wand-magic:before{content:"\5a"}.wds-icon-layers:before{content:"\e6"}.wds-icon-dislike:before{content:"\6b"}.wds-icon-like:before{content:"\6a"}.wds-icon-dollar:before{content:"\24"}.wds-icon-download:before{content:"\e93b"}.wds-icon-eye:before{content:"\65"}.wds-icon-eye-hide:before{content:"\71"}.wds-icon-arrow-return-back:before{content:"\52"}.wds-icon-first-aid:before{content:"\e93f"}.wds-icon-folder:before{content:"\2d8"}.wds-icon-map:before{content:"\34"}.wds-icon-graph-bar:before{content:"\c7"}.wds-icon-graph-bar_1:before{content:"\2db"}.wds-icon-heart:before{content:"\4b"}.wds-icon-home:before{content:"\4a"}.wds-icon-info:before{content:"\49"}.wds-icon-key:before{content:"\25ca"}.wds-icon-laptop:before{content:"\ab"}.wds-icon-lightbulb:before{content:"\4c"}.wds-icon-asterisk:before{content:"\2a"}.wds-icon-lock:before{content:"\39"}.wds-icon-unlock:before{content:"\30"}.wds-icon-mail:before{content:"\6d"}.wds-icon-location-marker:before{content:"\6c"}.wds-icon-microphone-audio:before{content:"\2030"}.wds-icon-mobile-signal:before{content:"\201b"}.wds-icon-mobile:before{content:"\201c"}.wds-icon-monitor:before{content:"\5c"}.wds-icon-magnifying-glass-search:before{content:"\ba"}.wds-icon-zoom-in:before{content:"\2260"}.wds-icon-zoom-out:before{content:"\2013"}.wds-icon-magnifying-search-glass-love:before{content:"\2022"}.wds-icon-price-tag:before{content:"\2c7"}.wds-icon-bookmark:before{content:"\221a"}.wds-icon-book-bookmark:before{content:"\2d9"}.wds-icon-book:before{content:"\2206"}.wds-icon-page-multiple:before{content:"\e7"}.wds-icon-page-pdf:before{content:"\c6"}.wds-icon-page-search:before{content:"\da"}.wds-icon-page:before{content:"\d2"}.wds-icon-paint-bucket:before{content:"\222b"}.wds-icon-paypal:before{content:"\59"}.wds-icon-pencil:before{content:"\2f"}.wds-icon-photo-picture:before{content:"\44"}.wds-icon-play:before{content:"\70"}.wds-icon-pause:before{content:"\6f"}.wds-icon-fast-forward:before{content:"\3e"}.wds-icon-refresh:before{content:"\45"}.wds-icon-update:before{content:"\ae"}.wds-icon-puzzle:before{content:"\7d"}.wds-icon-layout-grid:before{content:"\221e"}.wds-icon-sheild-badge:before{content:"\e96a"}.wds-icon-coffee-cup:before{content:"\e96b"}.wds-icon-skull:before{content:"\e96c"}.wds-icon-social-android:before{content:"\2e"}.wds-icon-social-apple:before{content:"\61"}.wds-icon-social-drive:before{content:"\76"}.wds-icon-social-dropbox:before{content:"\64"}.wds-icon-social-facebook:before{content:"\66"}.wds-icon-social-github:before{content:"\68"}.wds-icon-social-google-plus:before{content:"\67"}.wds-icon-social-linkedin:before{content:"\69"}.wds-icon-social-twitter:before{content:"\74"}.wds-icon-animation-video:before{content:"\46"}.wds-icon-social-youtube:before{content:"\79"}.wds-icon-white-label-video:before{content:"\75"}.wds-icon-star:before{content:"\53"}.wds-icon-tablet-landscape:before{content:"\5b"}.wds-icon-tablet-portrait:before{content:"\5d"}.wds-icon-thumbnails:before{content:"\47"}.wds-icon-ticket:before{content:"\e97d"}.wds-icon-profile-male:before{content:"\b5"}.wds-icon-profile-female:before{content:"\192"}.wds-icon-community-people:before{content:"\2018"}.wds-icon-trash:before{content:"\51"}.wds-icon-notification:before{content:"\6e"}.wds-icon-user-hero-points-trophy:before{content:"\31"}.wds-icon-megaphone:before{content:"\c5"}.wds-icon-flag:before{content:"\7c"}.wds-icon-stopwatch:before{content:"\e986"}.wds-icon-shopping-cart:before{content:"\cd"}.wds-icon-share:before{content:"\73"}.wds-icon-help-support:before{content:"\48"}.wds-icon-web-globe-world:before{content:"\57"}.wds-icon-widget-settings-config:before{content:"\78"}.wds-icon-wrench-tool:before{content:"\2044"}.wds-icon-settings-slider-control:before{content:"\153"}.wds-icon-filter:before{content:"\7a"}.wds-icon-reply:before{content:"\72"}.wds-icon-finger-point:before{content:"\2248"}.wds-icon-finger-swipe:before{content:"\2203"}.wds-icon-mouse-scroll:before{content:"\df"}.wds-icon-plugin-2:before{content:"\4f"}.wds-icon-brush:before{content:"\7e"}.wds-icon-themes:before{content:"\54"}.wds-icon-plugins:before{content:"\50"}.wds-icon-question:before{content:"\3f"}.wds-icon-warning-alert:before{content:"\21"}.wds-icon-check-tick:before{content:"\5f"}.wds-icon-cross-close:before{content:"\2b"}.wds-icon-user-reputation-points:before{content:"\32"}.wds-icon-user-star-level-up:before{content:"\33"}.wds-icon-icon-devman:before{content:"\20ac"}.wds-icon-icon-defender:before{content:"\b7"}.wds-icon-icon-hub:before{content:"\fb02"}.wds-icon-icon-hummingbird:before{content:"\b0"}.wds-icon-icon-hustle:before{content:"\2014"}.wds-icon-icon-smart-crawl:before{content:"\2202"}.wds-icon-icon-smush:before{content:"\2021"}.wds-icon-icon-snapshot:before{content:"\fb01"}.wds-icon-icon-upfront:before{content:"\201a"}.wds-icon-icon-uptime:before{content:"\b1"}.wds-icon-icon-pulse:before{content:"\201e"}.wds-icon-icon-automate:before{content:"\152"}.wds-icon-academy:before{content:"\3c0"}.wds-icon-wordpress:before{content:"\77"}.wds-icon-infinity:before{content:"\56"}.wds-icon-audio-sound:before{content:"\e9ae"}.wds-icon-sitemap:before{content:"\b8"}.wds-icon-google-analytics:before{content:"\e5"}.wds-icon-progress:before{content:"\e9b1"}.wds-icon-dashboard:before{content:"\e9b2"}.wds-icon-ab-testing:before{content:"\bb"}.wds-icon-testing-bottle-beaker:before{content:"\e9b4"}.wds-icon-archive:before{content:"\62"}.wds-icon-zip:before{content:"\3a9"}.wds-icon-arrow-location:before{content:"\4d"}.wds-icon-arrow-pointer-cursor:before{content:"\4e"}.wds-icon-code:before{content:"\3a"}.wds-icon-news-paper:before{content:"\2211"}.wds-icon-gallery-slider:before{content:"\f7"}.wds-icon-layout:before{content:"\a9"}.wds-icon-storage-server-data:before{content:"\ce"}.wds-icon-loader:before{content:"\e9be"}.wds-icon-rocket-launch:before{content:"\e9bf"}.wds-icon-target:before{content:"\2020"}.wpmud #page-header{margin-bottom:70px;text-align:center}.wpmud .dev-box .box-title .buttons-icon{margin-top:18px}.wpmud .dev-box .box-title .buttons-icon a{width:20px;height:20px;color:#888}.wpmud .wds-table{border:0;border-spacing:0;border-collapse:collapse;width:100%}.wpmud .wds-data-table{border:1px solid #E5E5E5;border-collapse:collapse;border-spacing:0;color:#777771;width:100%}.wpmud .wds-data-table>thead{border-bottom:1px solid #E5E5E5}.wpmud .wds-data-table>tfoot{border-top:1px solid #E5E5E5}.wpmud .wds-data-table>thead th,.wpmud .wds-data-table>tfoot th{font:700 15px/20px "Roboto Condensed","Roboto",Arial,sans-serif;padding:15px 10px;text-transform:uppercase}.wpmud .wds-data-table>tbody td{font-size:13px;line-height:20px;padding:20px 10px;vertical-align:top}.wpmud .wds-data-table th,.wpmud .wds-data-table td{text-align:left}.wpmud .wds-data-table .label{width:75%}.wpmud .wds-data-table .result{width:25%}.wpmud .wds-data-table .data-small{padding:10px}.wpmud .wds-data-table-inverse .label{width:25%}.wpmud .wds-data-table-inverse .result{width:75%}.wpmud .wds-data-table-inverse-large .label{width:40%}.wpmud .wds-data-table-inverse-large .result{width:60%}.wpmud .wds-list-table{width:100%;border:1px solid #EAEAEA;border-collapse:separate;border-spacing:unset;border-radius:5px;color:#888;font-size:13px}.wpmud .wds-list-table th{text-align:left;padding:20px 30px;font-weight:500;color:#333}.wpmud .wds-list-table tr th,.wpmud .wds-list-table tr td{border-bottom:1px solid #EAEAEA}.wpmud .wds-list-table tr td{padding:15px 30px}.wpmud .wds-list-table tr:last-child td{border-bottom:none}.wpmud .wds-list-table tfoot th{border-bottom:none;border-top:1px solid #EAEAEA}@media only screen and (max-width: 783px){.wpmud .list-table>thead>tr>th,.wpmud .list-table>thead>tr>td,.wpmud .list-table>tbody>tr>th,.wpmud .list-table>tbody>tr>td{width:100%}}.wpmud .wds-notice{border-radius:5px;color:#333;font:400 15px/18px "Roboto",Arial,sans-serif;margin:15px 0;padding:20px 30px;position:relative;text-align:left;display:table;width:100%}.wpmud .wds-notice-success{background-color:#D1F1EA}.wpmud .wds-notice-success::before{content:"_";color:#1ABC9C}.wpmud .wds-notice-error{background-color:#FFE5E9}.wpmud .wds-notice-error::before{content:"!";color:#FF6D6D}.wpmud .wds-notice-warning{background-color:#FFF5D5}.wpmud .wds-notice-warning::before{content:"!";color:#fecf2f}.wpmud .wds-notice-info{background-color:#D6EAF3}.wpmud .wds-notice-info::before{content:"!";color:#17a8e3}.wpmud .wds-notice::before{display:table-cell;font-family:"wpmu-dev-seo-icons";font-size:20px;vertical-align:top;width:30px;padding-top:8px}.wpmud .wds-notice p{color:#333;margin:0 0 10px;padding:0;vertical-align:top;display:table-cell}.wpmud .wds-notice p:last-of-type{margin:0}.wpmud .wds-notice p a{color:#333;font-weight:500;text-decoration:underline}.wpmud .wds-notice p a:hover{color:#333;text-decoration:none}.wpmud .wds-notice p a.wds-notice-dismiss{color:#808080;display:table;margin-top:5px;text-decoration:none;text-transform:uppercase}.wpmud .wds-notice .wds-icon,.wpmud .wds-notice .wds-icon .wdv-icon{font-size:22px;height:22px;line-height:22px;width:22px}.wpmud .wds-notice.can-close .close{cursor:pointer;display:block;height:22px;line-height:22px;margin:0;position:absolute;right:10px;text-shadow:none;top:10px;width:22px}.wpmud .wds-notice.can-close:after{bottom:0;color:#fff;content:"\79";font-style:normal;font-weight:normal;font-variant:normal;font-family:'WPMU-DEV-App-Icons';font-size:22px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;left:0;line-height:22px;opacity:0.8;position:absolute;right:0;speak:none;text-align:center;text-transform:none;top:0;transition:opacity 0.3s}.wpmud .wds-notice.can-close:hover:after{opacity:1}.wpmud .wds-notice-box{margin:20px 0 40px;padding:30px}.wpmud .wds-notice-box p a{font-weight:700;text-decoration:underline}.wpmud .wds-notice-floating{position:fixed;top:30px;right:0;left:0;margin:0 auto;border-top-left-radius:0;border-top-right-radius:0;max-width:600px;box-shadow:0 5px 25px 0 rgba(0,0,0,0.15);z-index:99998}.wpmud .wds-mascot-message{display:table}.wpmud .wds-mascot-message .wds-mascot,.wpmud .wds-mascot-message .wds-mascot-bubble-container{display:table-cell;vertical-align:top}.wpmud .wds-mascot-message .wds-mascot{height:148px;width:100px;background:url("../images/mascot-message.png") no-repeat;background-size:100px 148px}.wpmud .wds-mascot-message .wds-mascot-bubble-container{padding-left:30px}.wpmud .wds-mascot-message .wds-mascot-bubble-container .wds-mascot-bubble{position:relative;background:#E1F6FF;padding:15px 20px;border-radius:4px}.wpmud .wds-mascot-message .wds-mascot-bubble-container .wds-mascot-bubble:after{content:'';position:absolute;border-style:solid;border-width:8px 12px 8px 0;border-color:transparent #E1F6FF;display:block;width:0;z-index:1;left:-12px;top:38%}.wpmud .wds-mascot-message .wds-mascot-bubble-container .wds-mascot-bubble p{color:#333}.wpmud .wds-mascot-message .wds-mascot-bubble-container .wds-mascot-bubble p a{color:#333;text-decoration:underline;font-weight:500}.wpmud .wds-mascot-message .wds-mascot-bubble-container .wds-mascot-bubble-dismiss{float:right;font-size:16px;cursor:pointer;padding-left:10px}.wpmud .wds-keyword-pairs .wds-group-field{clear:none;float:left;margin-left:1%;width:48%}.wpmud .wds-keyword-pairs .wds-group-field:first-child{margin-left:0}.wpmud .wds-keyword-pairs .wds-keyword-pair{margin-top:20px;position:relative}.wpmud .wds-keyword-pairs .wds-keyword-pair:first-child{margin-top:0}.wpmud .wds-keyword-pairs .wds-keyword-pair-new{padding-top:20px}.wpmud .wds-keyword-pairs-existing{margin-top:30px}.wpmud .wds-keyword-pairs-existing tr td.wds-pair-actions{width:10%;text-align:right}.wpmud .wds-keyword-pairs-existing tr td.wds-pair-keyword,.wpmud .wds-keyword-pairs-existing tr td.wds-pair-url{width:45%}.wpmud .wds-keyword-pairs-existing tr td.wds-pair-hidden-fields{display:none}.wpmud .insert-macro{position:absolute;right:0;top:0}.wpmud .insert-macro .button-fields-trigger{border-radius:0 5px 5px 0;float:right;position:relative;font-size:16px;font-weight:300}.wpmud .insert-macro .button-fields-trigger:after{background:#fff;border-bottom:1px solid #fff;border-top:1px solid #fff;bottom:-2px;content:"";display:block;height:1px;left:0;margin:0;opacity:0;pointer-events:none;position:absolute;right:0;width:auto;z-index:11}.wpmud .insert-macro.is-open .button-fields-trigger,.wpmud .insert-macro.is-open .button-fields-trigger:hover:not(:focus):not(:active){background:#fff;border:1px solid #bfbfbf;color:#808080;padding:12px 12px 8px 12px;margin:0;border-radius:0 5px 0 0}.wpmud .insert-macro.is-open .button-fields-trigger:after{opacity:1}.wpmud .insert-macro .macro-list{background:#fff;border:1px solid #BFBFBF;clear:both;height:100%;max-height:260px;overflow-y:auto;padding:5px 0;position:relative;z-index:10}.wpmud .insert-macro .macro-list ul{margin:0;padding:0}.wpmud .insert-macro .macro-list li{cursor:pointer;font:400 13px/26px "Roboto",Arial,sans-serif;margin:0;padding:0 10px}.wpmud .insert-macro .macro-list li:hover{background:#F2F2F2;color:#333}@keyframes wds-metabox-icon-spin{100%{transform:rotate(360deg)}}.wpmud .wds-item-loading{position:relative}.wpmud .wds-item-loading::before{font-family:"wpmu-dev-seo-icons";color:#888;content:"";animation:wds-metabox-icon-spin 1s linear infinite;display:block;position:absolute}.wpmud .wds-strong-text{color:#333;font-size:15px;line-height:30px;font-weight:500;font-family:"Roboto",Arial,sans-serif}.wpmud .wds-small-text{font-size:13px;line-height:22px;color:#888}.wpmud .wds-small-text strong{color:#333}.wpmud .wds-issues{border-radius:13px;display:inline-block;font-size:13px;font-weight:500;line-height:1;padding:5px 16px;vertical-align:middle;margin-left:8px;color:#333;font-family:"Roboto",Arial,sans-serif}.wpmud .wds-issues a{color:#333}.wpmud .wds-issues-invalid{background:#E6E6E6}.wpmud .wds-issues-warning{background:#FECF2F}.wpmud .wds-issues-error{background:#FF7F83;color:#ffffff}.wpmud .wds-issues-error a{color:#ffffff}.wpmud .wds-issues-success-bg{background:#1ABC9C;color:#ffffff}.wpmud .wds-issues-success-bg a{color:#ffffff}.wpmud .wds-issues-success{background:transparent;padding:0}.wpmud .wds-issues-success::before{font-family:"wpmu-dev-seo-icons";content:"_";color:#1ABC9C;font-size:20px}.wpmud .wds-issues.wds-item-loading{background:transparent;padding:0}.wpmud .wds-issues.wds-item-loading span{display:none}.wpmud .wds-issues.wds-item-loading::before{font-size:20px;content:"";color:#888;position:relative}.wpmud .wds-report-stats{background:#ffffff;padding:30px 30px 30px 140px;display:table;width:100%;margin-bottom:30px;border-radius:4px;box-shadow:0 2px 0 0 #E6E6E6;background-repeat:no-repeat;background-position:30px bottom}.wpmud .wds-report-stats>div{display:table-cell;vertical-align:middle;text-align:center;width:40%}.wpmud .wds-report-stats .wds-report-score .wds-score{display:table;font-size:50px;line-height:55px;color:#333;position:relative;margin:0 auto}.wpmud .wds-report-stats .wds-report-score .wds-score::after{content:"!";font-size:20px;position:absolute;font-family:"wpmu-dev-seo-icons";bottom:15px;right:5px}.wpmud .wds-report-stats .wds-report-score .wds-score .wds-total{font-size:13px;line-height:22px;width:26px;display:inline-block}.wpmud .wds-report-stats .wds-report-score .wds-score.wds-score-invalid:after{color:#888}.wpmud .wds-report-stats .wds-report-score .wds-score.wds-score-error:after{color:#FF7F83}.wpmud .wds-report-stats .wds-report-score .wds-score.wds-score-warning:after{color:#FECF2F}.wpmud .wds-report-stats .wds-report-score .wds-score.wds-score-success:after{content:"_";color:#1ABC9C}.wpmud .wds-report-stats .wds-stacked-stats{display:table;width:100%}.wpmud .wds-report-stats .wds-stacked-stats>div{display:table-row}.wpmud .wds-report-stats .wds-stacked-stats>div .wds-stat-name,.wpmud .wds-report-stats .wds-stacked-stats>div .wds-stat-value{display:table-cell;border-bottom:1px solid #EAEAEA;line-height:30px;padding:15px 0}.wpmud .wds-report-stats .wds-stacked-stats>div:first-child .wds-stat-name,.wpmud .wds-report-stats .wds-stacked-stats>div:first-child .wds-stat-value{padding-top:0}.wpmud .wds-report-stats .wds-stacked-stats>div:last-child .wds-stat-name,.wpmud .wds-report-stats .wds-stacked-stats>div:last-child .wds-stat-value{border-bottom:none;padding-bottom:0}.wpmud .wds-report-stats .wds-stacked-stats .wds-stat-name{font-size:13px;color:#333;font-weight:500;text-align:left}.wpmud .wds-report-stats .wds-stacked-stats .wds-stat-value{font-size:18px;color:#888;font-family:"Roboto Condensed","Roboto",Arial,sans-serif;text-align:right}.wpmud .wds-report .wds-accordion{margin-left:-30px;width:calc(100% + 60px);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;border-top:1px solid #EAEAEA}.wpmud .wds-report .wds-accordion .wds-accordion-section{width:100%;display:block}.wpmud .wds-report .wds-accordion .wds-accordion-section:first-of-type{border-top:none}.wpmud .wds-report .wds-accordion .wds-accordion-section .wds-accordion-handle{display:table;width:100%}.wpmud .wds-report .wds-accordion .wds-accordion-section .wds-accordion-handle::after{display:table-cell;width:20px;float:none;padding-left:20px}.wpmud .wds-report .wds-accordion .wds-accordion-section .wds-accordion-handle::before{display:table-cell;font-family:"wpmu-dev-seo-icons";font-size:20px;margin-right:4px;vertical-align:middle;width:34px}.wpmud .wds-report .wds-accordion .wds-accordion-section .wds-accordion-handle .wds-accordion-handle-part{display:table-cell;vertical-align:middle}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-success{border-left:3px solid #1ABC9C}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-success .wds-accordion-handle::before{content:"_";color:#1ABC9C}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-warning{border-left:3px solid #FECF2F}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-warning .wds-accordion-handle::before{content:"!";color:#FECF2F}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-error{border-left:3px solid #FF7F83}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-error .wds-accordion-handle::before{content:"!";color:#FF7F83}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-invalid{border-left:3px solid #888}.wpmud .wds-report .wds-accordion .wds-accordion-section.wds-check-invalid .wds-accordion-handle:before{content:"!";color:#888}.wpmud .wds-report .wds-accordion .wds-accordion-section.open .wds-accordion-handle{border-bottom:1px solid #E6E6E6;margin-bottom:30px;padding-bottom:18px}.wpmud .wds-report .wds-check-item strong{color:#333}.wpmud .wds-report .wds-check-item p{margin-bottom:15px}.wpmud .wds-report .wds-check-item p:last-child{margin-bottom:0}.wpmud .wds-report .wds-check-item ul{margin:0}.wpmud .wds-report .wds-check-item .wds-recommendation{margin-bottom:15px}.wpmud .wds-report .wds-check-item .wds-more-info{padding-top:15px;border-top:1px solid #EAEAEA}.wpmud .wds-report .wds-check-item .wds-unignore-container{width:90px}.wpmud .wds-report .wds-check-item .wds-ignore-container{margin-top:30px;border:1px solid #EAEAEA;padding:30px;border-radius:7px}.wpmud .wds-report .wds-check-item .wds-check-item-indicator{border-radius:13px;font-size:13px;margin-left:6px;padding:5px 16px;vertical-align:top}.wpmud .wds-report .wds-check-item.wds-check-success .wds-check-item-indicator{color:#ffffff;background:#1ABC9C}.wpmud .wds-report .wds-check-item.wds-check-warning .wds-check-item-indicator{background:#FECF2F}.wpmud .wds-report .wds-check-item.wds-check-error .wds-check-item-indicator{color:#ffffff;background:#FF7F83}.wpmud .wds-report .wds-check-item.wds-check-invalid .wds-check-item-indicator{background:#f2f2f2}.wpmud .wds-report-vertical-tab.tab>label{position:relative}.wpmud .wds-report-vertical-tab.tab>label *{line-height:1}.wpmud .wds-report-vertical-tab.tab>label .wds-issues{display:none;line-height:1;position:absolute;top:2px;right:3px;font-family:"Roboto",Arial,sans-serif;font-weight:500;padding-top:6px;padding-bottom:6px}.wpmud .wds-report-vertical-tab .tab-title{display:table;width:100%}.wpmud .wds-report-vertical-tab .tab-title .wds-issues{display:none;font-family:"Roboto",Arial,sans-serif;font-weight:500}.wpmud .wds-report-vertical-tab .tab-title .wds-tab-title-part:nth-child(1){width:10px;white-space:nowrap}.wpmud .wds-report-vertical-tab .tab-title .wds-tab-title-part:nth-child(3){text-align:right}.wpmud .wds-report-vertical-tab .tab-title .wds-tab-title-part{vertical-align:middle;display:table-cell}.wpmud .wds-report-vertical-tab .tab-title .wds-button-with-left-loader.wds-item-loading::before{right:110%;font-size:18px}.wpmud .wds-report-vertical-tab .tab-title .wds-ignore-all{display:none}.wpmud .wds-report-vertical-tab .wds-seamless-footer{border-top:none;padding:0}.wpmud .wds-report-vertical-tab .wds-content-tabs-inner{padding-bottom:0}.wpmud.wds-metabox #container{margin:0}.wpmud.wds-metabox .wds-issues-invalid:not(.wds-item-loading)::before{content:"-"}.wpmud.wds-metabox a[href="#reload"]{display:none}.wpmud.wds-metabox .wds-analysis-working{background:#E6E6E6;padding:20px 30px}.wpmud.wds-metabox .wds-analysis-working p{margin-left:1.5em;position:relative}.wpmud.wds-metabox .wds-analysis-working p:before{font-family:"wpmu-dev-seo-icons";content:"";animation:wds-metabox-icon-spin 1s linear infinite;display:block;position:absolute;left:-1.5em}.wpmud.wds-metabox button.wds-refresh-analysis:before{font-family:"wpmu-dev-seo-icons";content:"E"}.wpmud.wds-metabox .wds-metabox-section{border-top:1px solid #EAEAEA;padding:30px}.wpmud.wds-metabox .wds-metabox-section:first-of-type{border-top:none}.wpmud.wds-metabox .wds_seo .wds-metabox-preview>.wds-label,.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container>.wds-label{margin-bottom:10px}.wpmud.wds-metabox .wds_seo .wds-preview-description{color:#888}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-seo-analysis-label{margin-bottom:20px}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-seo-analysis-label label{float:left}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-seo-analysis-label button{float:right}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-focus-keyword{border:1px solid #EAEAEA;padding:30px;border-radius:7px;margin-bottom:30px;position:relative}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-focus-keyword::before{display:none;bottom:40px;right:38px;font-size:20px;z-index:30}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-focus-keyword-invalid::before{display:table-cell;content:"!";font-family:"wpmu-dev-seo-icons";color:#888;position:absolute}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-focus-keyword-loaded::before{display:table-cell;content:"_";font-family:"wpmu-dev-seo-icons";color:#17a8e3;position:absolute}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-focus-keyword.wds-item-loading::before{display:table-cell;content:""}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-focus-keyword input{margin-bottom:0}.wpmud.wds-metabox .wds_seo .wds-seo-analysis-container .wds-notice{margin-top:0;margin-bottom:30px}.wpmud.wds-metabox .wds_seo .wds-edit-meta-toggleable .toggle-checkbox{display:none}.wpmud.wds-metabox .wds_seo .wds-edit-meta-toggleable>label{display:table;padding:0;margin:0}.wpmud.wds-metabox .wds_seo .wds-no-focus-keywords .wds-notice-warning{background:#F2F2F2}.wpmud.wds-metabox .wds_seo .wds-no-focus-keywords .wds-notice-warning::before{color:#888}.wpmud.wds-metabox .wds_readability .wds-readability-legend{color:#666666}.wpmud.wds-metabox .wds_readability .wds-readability-legend span{margin-left:30px}.wpmud.wds-metabox .wds_readability .wds-readability-legend span:first-child{margin-left:0}.wpmud.wds-metabox .wds_readability .wds-readability-stats{box-shadow:none;background-image:url("../images/readability-info.png");background-size:92px 107px;background-color:#F8F8F8}.wpmud.wds-metabox .wds_readability .wds-readability-stats .wds-readability-level-description strong{color:#333;font-weight:normal}.wpmud.wds-metabox .wds_readability .wds-list-table{margin-bottom:30px}.wpmud.wds-metabox .wds_readability .wds-list-table tr:nth-child(2n){background:#f8f8f8}.wpmud.wds-metabox .wds_readability .wds-readability-level{text-align:right}.wpmud.wds-metabox .wds-report .wds-accordion .wds-accordion-section.wds-check-error{-ms-flex-order:0;order:0}.wpmud.wds-metabox .wds-report .wds-accordion .wds-accordion-section.wds-check-warning{-ms-flex-order:5;order:5}.wpmud.wds-metabox .wds-report .wds-accordion .wds-accordion-section.wds-check-success{-ms-flex-order:10;order:10}.wpmud.wds-metabox .wds-report .wds-accordion .wds-accordion-section.wds-check-invalid{-ms-flex-order:15;order:15}.wpmud.wds-moz-url-metrics-metabox{padding:25px}#wds-wds-meta-box>h2 span{position:relative}#wds-wds-meta-box>h2 span::before,#wds-wds-meta-box>h2 span::after{border-radius:100%;content:"";display:inline-block;height:12px;position:absolute;top:3px;width:12px}#wds-wds-meta-box>h2 span::before{left:calc(100% + 6px)}#wds-wds-meta-box>h2 span::after{left:calc(100% + 25px)}#wds-wds-meta-box.wds-seo-success>h2 span::before{background:#1ABC9C}#wds-wds-meta-box.wds-seo-warning>h2 span::before{background:#FECF2F}#wds-wds-meta-box.wds-seo-invalid>h2 span::before{background:#E6E6E6}#wds-wds-meta-box.wds-readability-invalid>h2 span::after{background:#E6E6E6}#wds-wds-meta-box.wds-readability-error>h2 span::after{background:#FF7F83}#wds-wds-meta-box.wds-readability-warning>h2 span::after{background:#FECF2F}#wds-wds-meta-box.wds-readability-success>h2 span::after{background:#1ABC9C}#wds-wds-meta-box .inside{padding:0;margin:0;overflow:hidden !important}.misc-pub-section.seo-analysis>i,.misc-pub-section.readability-analysis>i{color:#82878c;font-size:16px;padding-right:5px;vertical-align:-1px}.misc-pub-section.seo-analysis.wds-status-success i,.misc-pub-section.readability-analysis.wds-status-success i{color:#1ABC9C}.misc-pub-section.seo-analysis.wds-status-warning i,.misc-pub-section.readability-analysis.wds-status-warning i{color:#fecf2f}.misc-pub-section.seo-analysis.wds-status-error i,.misc-pub-section.readability-analysis.wds-status-error i{color:#FF6D6D}@keyframes wds-loader-icon-spin{100%{transform:rotate(360deg)}}.wpmud .wds-progress{background-color:#F8F8F8;border-radius:5px;height:60px;overflow:hidden;padding:0 30px;width:100%;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;margin-bottom:10px}.wpmud .wds-progress::before{font-family:"wpmu-dev-seo-icons";color:#888;content:"";font-size:20px;animation:wds-loader-icon-spin 1.5s linear infinite}.wpmud .wds-progress-bar{-ms-flex-positive:3;flex-grow:3;height:10px;border-radius:10px;background:#E6E6E6;overflow:hidden}.wpmud .wds-progress-bar-current-percent{padding-right:10px;padding-left:10px;color:#333;font-size:13px;font-weight:bold;font-family:"Roboto Condensed","Roboto",Arial,sans-serif}.wpmud .wds-progress-bar-inside{background:#17a8e3;height:10px;border-radius:10px;min-width:10px;transition:width 2s}.wpmud .wds-preview{background:#fff;border:1px solid #DFDFDF;padding:30px;border-radius:7px}.wpmud .wds-preview-container{padding-bottom:20px}.wpmud .wds-preview-description{font-size:13px;line-height:22px;margin-top:10px}.wpmud .wds-preview *{font-family:Arial, sans-serif;font-weight:400;letter-spacing:initial;text-align:left}.wpmud .wds-preview-title h3{font-size:18px;line-height:21px;margin:0;text-transform:none}.wpmud .wds-preview-title h3 a{color:#1a0dab;text-decoration:none}.wpmud .wds-preview-url{font-size:14px;line-height:16px;margin-bottom:2px}.wpmud .wds-preview-url a{color:#006621;text-decoration:none}.wpmud .wds-preview-meta{color:#545454;font-size:13px;line-height:18px}.wds-toggleable .wds-toggleable-inside{display:block}.wds-toggleable .wds-toggleable-inside-box{border:1px solid #EAEAEA;border-radius:4px;margin-top:20px;padding:20px 30px}.wds-toggleable.inactive .wds-toggleable-inside{display:none}.wds-toggleable.inactive .wds-toggleable-inside-box{display:none}.wds-toggleable legend{cursor:pointer;color:#BABABA;font-size:15px;font-weight:500;font-family:'Roboto', sans-serif;transition:color .4s}.wds-toggleable legend:hover{color:#808080}.wds-conditional .wds-conditional-inside{display:none}.wds-conditional .wds-conditional-inside-box{border:1px solid #EAEAEA;border-radius:4px;margin-top:20px;padding:20px 30px}.wpmud .wds-links-dropdown{width:25px;position:relative;display:inline-block;text-align:left}.wpmud .wds-links-dropdown-anchor{display:inline-block;font-size:34px;line-height:10px;padding-bottom:20px;vertical-align:top;color:#888}.wpmud .wds-links-dropdown-anchor:hover:not(:focus):not(:active),.wpmud .wds-links-dropdown-anchor:hover,.wpmud .wds-links-dropdown-anchor:active,.wpmud .wds-links-dropdown-anchor:focus{color:#17a8e3}.wpmud .wds-links-dropdown.open .wds-links-dropdown-anchor{color:#17a8e3}.wpmud .wds-links-dropdown.open ul{display:block}.wpmud .wds-links-dropdown-label{color:#333;font-family:"Roboto Condensed","Roboto",Arial,sans-serif;font-size:13px;font-weight:bold;border-bottom:1px solid #E6E6E6;line-height:30px;margin-bottom:20px}.wpmud .wds-links-dropdown ul{border:1px solid #E6E6E6;padding:20px;box-shadow:0 3px 7px 0 rgba(0,0,0,0.05);width:180px;margin-bottom:0;margin-top:0;background:#fff;position:absolute;right:-20px;top:130%;z-index:10;border-radius:5px;display:none}.wpmud .wds-links-dropdown ul li:last-child{margin-bottom:0}.wpmud .wds-links-dropdown ul:after,.wpmud .wds-links-dropdown ul:before{content:'';position:absolute;border-style:solid;border-width:0 9px 9px;display:block;width:0;right:23px}.wpmud .wds-links-dropdown ul:after{border-color:#FFFFFF transparent;z-index:1;top:-8px}.wpmud .wds-links-dropdown ul:before{border-color:#d6d6d6 transparent;z-index:0;top:-9px}.wpmud .wds-styleable-file-input input[type="file"]{width:0.1px;height:0.1px;opacity:0;overflow:hidden;position:absolute;z-index:-1}.wpmud .wds-styleable-file-input input[readonly]{max-width:200px;float:left;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.wpmud .wds-styleable-file-input .button{float:left;border-top-left-radius:0;border-bottom-left-radius:0}.wpmud .wds-accordion{background:#f8f8f8}.wpmud .wds-accordion .wds-accordion-section{padding:0;margin:0;border-bottom:1px solid #EAEAEA;position:relative}.wpmud .wds-accordion .wds-accordion-section .wds-accordion-handle{line-height:24px;max-width:100%;margin:0;padding:18px 30px;text-align:left;font-size:15px;color:#333;font-family:"Roboto",Arial,sans-serif;font-weight:500;background:#FFF;cursor:pointer}.wpmud .wds-accordion .wds-accordion-section .wds-accordion-handle:after{font-family:"WPMU-DEV-App-Icons",sans-serif;content:"\65";float:right;font-size:20px;vertical-align:middle;color:#888;cursor:pointer}.wpmud .wds-accordion .wds-accordion-section .wds-accordion-content{padding:30px;background:#FFF;border-radius:7px;box-shadow:0 2px 0 #ddd;display:none}.wpmud .wds-accordion .wds-accordion-section:first-of-type{border-top:1px solid #EAEAEA}.wpmud .wds-accordion .wds-accordion-section.open{padding:18px 30px 30px 30px}.wpmud .wds-accordion .wds-accordion-section.open .wds-accordion-handle{background:transparent;padding:0 0 18px 0}.wpmud .wds-accordion .wds-accordion-section.open .wds-accordion-handle:after{content:"\72"}.wpmud .wds-accordion .wds-accordion-section.open .wds-accordion-content{display:block}.wpmud .wds-accordion .wds-accordion-section.disabled .wds-accordion-handle{cursor:default;color:#666}.wpmud .wds-accordion .wds-accordion-section.disabled .wds-accordion-handle:after{display:none}.wpmud .wds-horizontal-tabs .wds-horizontal-tab-nav{padding:0 20px;border-bottom:1px solid #E6E6E6}.wpmud .wds-horizontal-tabs .wds-horizontal-tab-nav label{padding:15px;margin:0;font-size:15px;font-weight:normal;color:#888;line-height:30px;display:inline-block;vertical-align:middle}.wpmud .wds-horizontal-tabs .wds-horizontal-tab-nav .wds-nav-item{display:inline-table;width:auto;letter-spacing:0.01em;cursor:pointer}.wpmud .wds-horizontal-tabs .wds-horizontal-tab-nav .wds-nav-item.active{border-bottom:2px solid #17a8e3;letter-spacing:0}.wpmud .wds-horizontal-tabs .wds-horizontal-tab-nav .wds-nav-item.active label{color:#333;font-weight:500}.wpmud .wds-horizontal-tabs .wds-horizontal-tab .wds-horizontal-tab-content{display:none}.wpmud .wds-horizontal-tabs .wds-horizontal-tab input[type="radio"]{display:none}.wpmud .wds-horizontal-tabs .wds-horizontal-tab input[type="radio"]:checked+.wds-horizontal-tab-content{display:block}.wds-optimum-length-indicator-field{margin-bottom:0 !important;position:relative;z-index:20}.wds-optimum-length-indicator-field+.wds-optimum-length-indicator{background:transparent;border-radius:4px;height:10px;margin-top:-8px;margin-bottom:15px;position:relative;z-index:10}.wds-optimum-length-indicator-field.over+.wds-optimum-length-indicator,.wds-optimum-length-indicator-field.under+.wds-optimum-length-indicator{background:red}.wds-optimum-length-indicator-field.almost-over+.wds-optimum-length-indicator,.wds-optimum-length-indicator-field.almost-under+.wds-optimum-length-indicator{background:#FECF2F}.wds-optimum-length-indicator-field.just-right+.wds-optimum-length-indicator{background:#1ABC9C}.wpmud .wds-user-search>ul li{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:100%}.wpmud .wds-user-search-user{font-size:15px}.wpmud .wds-user-search-user,.wpmud .wds-user-search-you{margin-left:10px;color:#666}.wpmud .wds-user-search-you{background:#F2F2F2;font-size:13px;padding:3px 15px;border-radius:20px;text-transform:uppercase;font-weight:500}.wpmud .wds-user-search-remove{-ms-flex-positive:10;flex-grow:10;text-align:right;font-size:13px}.wpmud .wds-user-search-avatar{width:40px}.wpmud .wds-user-search-avatar .avatar{border-radius:100%;height:auto;width:40px}.wpmud .wds-user-search-field{display:table;width:100%}.wpmud .wds-user-search-field .select2-selection--single{height:40px}.wpmud .wds-user-search-field .select2-selection{border-bottom-right-radius:0;border-top-right-radius:0}.wpmud .wds-user-search-field input[type="button"]{border-bottom-left-radius:0;border-top-left-radius:0}.wpmud .wds-user-search-field>div{display:table-cell;vertical-align:bottom}.wpmud .wds-user-search-field>div:nth-child(2){width:10px}.wpmud .wds-obfuscate-section{background:rgba(242,242,242,0.5);position:absolute;top:0;left:0;width:100%;height:100%;z-index:2}.wpmud .wds-upsell-modal .box{background-image:url("../images/modal-upsell.png");background-position:bottom center;background-repeat:no-repeat;background-size:499px auto;padding-bottom:180px}.wpmud .wds-upgrade-benefits-list li{margin-bottom:20px;margin-left:30px;position:relative}.wpmud .wds-upgrade-benefits-list li:before{position:absolute;content:"_";color:#17a8e3;font-family:"wpmu-dev-seo-icons";right:100%;font-size:18px;margin-right:10px;top:7px}.wpmud .dev-box .box-title h3>i{margin-right:5px;vertical-align:-1px}.wpmud .dev-box .box-content p.wds-small-text{margin-bottom:15px}.wpmud .dev-box .box-content .wds-separator-top{margin-top:20px;padding-top:20px}.wpmud .dev-box .wds-box-stat-value{float:right;font-size:18px;color:#666;font-family:"Roboto Condensed","Roboto",Arial,sans-serif}.wpmud .dev-box .wds-box-stat-value-success{color:#888;font-size:13px;font-family:"Roboto",Arial,sans-serif}.wpmud .dev-box .wds-box-stat-value-success:before{font-family:"wpmu-dev-seo-icons";content:"_";color:#17a8e3;font-size:20px;vertical-align:-4px;margin-right:10px}.wpmud .dev-box .wds-autolinking-section{margin-bottom:30px}.wpmud .dev-box .wds-autolinking-section.wds-box-blocked-area{margin-bottom:0}.wpmud .dev-box .wds-box-blocked-area{margin-left:-30px;padding-bottom:20px;padding-left:30px;padding-right:30px;width:calc(100% + 60px);position:relative}.wpmud .dev-box .wds-box-blocked-area::before{background:rgba(242,242,242,0.5);content:"";height:100%;left:0;position:absolute;top:0;width:100%}.wpmud .dev-box .wds-box-blocked-area .wds-upgrade-button{position:absolute;top:18px;right:30px;padding:5px 16px}.wpmud .dev-box .wds-box-blocked-area .wds-small-text{margin-top:15px}.wpmud .dev-box .box-content .wds-mascot-message.seo-checkup-upsell{margin-bottom:-30px;margin-top:30px}.wpmud .dev-box#wds-content-analysis-box .wds-issues{margin-left:0}.wpmud .dev-box#wds-content-analysis-box .wds-accordion{margin:0;width:100%;border:1px solid #EAEAEA}.wpmud .dev-box#wds-content-analysis-box .wds-accordion .wds-check-item{border:none}.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled .wds-accordion,.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled .wds-accordion .wds-accordion-handle,.wpmud .dev-box#wds-content-analysis-box.wds-readability-analysis-enabled .wds-accordion,.wpmud .dev-box#wds-content-analysis-box.wds-readability-analysis-enabled .wds-accordion .wds-accordion-handle{border-radius:7px}.wpmud .dev-box#wds-content-analysis-box.wds-readability-analysis-enabled .wds-accordion{margin-top:20px}.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled.wds-readability-analysis-enabled .wds-accordion{margin-top:0}.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled.wds-readability-analysis-enabled .wds-accordion:first-child,.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled.wds-readability-analysis-enabled .wds-accordion:first-child .wds-accordion-handle{border-top-right-radius:7px;border-top-left-radius:7px;border-bottom-right-radius:0;border-bottom-left-radius:0}.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled.wds-readability-analysis-enabled .wds-accordion:last-child{border-top:none}.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled.wds-readability-analysis-enabled .wds-accordion:last-child,.wpmud .dev-box#wds-content-analysis-box.wds-seo-analysis-enabled.wds-readability-analysis-enabled .wds-accordion:last-child .wds-accordion-handle{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:7px;border-bottom-left-radius:7px}.wpmud .dev-box#wds-content-analysis-box .wds-list-table tr th,.wpmud .dev-box#wds-content-analysis-box .wds-list-table tr td{padding-right:5px;padding-left:5px}.wpmud .dev-box#wds-content-analysis-box .wds-list-table tr th:first-child,.wpmud .dev-box#wds-content-analysis-box .wds-list-table tr td:first-child{padding-left:20px}.wpmud .dev-box#wds-sitemap-box .wds-box-crawl-stats{float:right}.wpmud .dev-box#wds-sitemap-box .wds-box-stat-value-success::before{color:#1ABC9C}.wpmud .dev-box#wds-seo-checkup .wds-report .wds-accordion .wds-check-success{display:none}.wpmud .dev-box#wds-seo-checkup .wds-box-report-details{padding-top:30px}.wpmud .dev-box#wds-seo-checkup .wds-box-report-details .wds-box-stat-value{padding-top:7px}.wpmud .dev-box#wds-seo-checkup .wds-mascot-message{margin-top:30px;margin-bottom:-30px}.wpmud .dev-box .wds-accordion-handle-part:nth-child(2){text-align:right}.wpmud .dev-box .wds-dash-configure-button::before,.wpmud .dev-box .wds-dash-edit-posts-button::before,.wpmud .dev-box .wds-dash-view-report-button::before,.wpmud .dev-box .wds-dash-view-report-button::before{font-family:"wpmu-dev-seo-icons";margin-right:4px;text-transform:none}.wpmud .dev-box .wds-dash-configure-button::before{content:"\2044"}.wpmud .dev-box .wds-dash-edit-posts-button::before{content:"\2f"}.wpmud .dev-box .wds-dash-view-report-button::before{content:"\e93b"}.wpmud .dev-box .wds-dash-view-report-button::before{content:'\65'}.wpmud .dev-box .wds-notice::before{padding-top:4px}.wpmud .dev-box .wds-notice p{font-size:13px;line-height:22px}.wpmud .wds-onboard-dialog .box{background-image:url("../images/url-crawler-stats.png");background-size:128px 121px;background-repeat:no-repeat;background-position:center bottom;padding-bottom:60px}.wpmud .wds-onboard-dialog .wds-notice::before{padding-top:2px}.wpmud .wds-onboard-dialog .wds-toggle-table{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.wpmud .wds-onboard-dialog .wds-toggle-table .toggle.wds-toggle{-ms-flex-order:2;order:2}.wpmud .wds-onboard-dialog .wds-onboarding-setup{float:right}.wpmud .wds-dash-stats.wds-seo-checkup-stats{margin-bottom:30px;background-size:141px 141px}.wpmud .wds-dash-stats.wds-seo-checkup-stats .wds-report-score .wds-score{margin-top:0}.wpmud .wds-dash-stats.wds-seo-checkup-stats .wds-last-checkup-never{margin:0 auto;max-width:280px;text-align:left;width:100%}.wpmud .wds-dash-stats.wds-seo-checkup-stats .wds-last-checkup-never .wds-small-text{margin-bottom:15px}.wpmud .wds-dash-stats.wds-seo-checkup-stats .wds-stat-value .wds-crawl-in-progress{color:#888;font-family:"Roboto",Arial,sans-serif;font-size:13px;font-weight:400}.wpmud .wds-dash-stats.wds-seo-checkup-stats .wds-stat-value .wds-crawl-in-progress:before{font-size:13px;color:#888;font-family:"wpmu-dev-seo-icons";content:"";display:inline-table;margin-right:5px;animation:wds-loader-icon-spin 1.5s linear infinite}#wds-show-supported-macros{max-height:520px;overflow-y:scroll}.wpmud .note{float:left;margin:20px 0}.wpmud .wds-preset-separators input[type="radio"]{display:none}.wpmud .wds-preset-separators .separator-selector{background:#f4f4f4;border:1px solid #ddd;border-radius:4px;float:left;margin-right:10px;margin-bottom:10px;min-width:40px;text-align:center;vertical-align:middle;height:40px;line-height:23px}.wpmud .vertical-tabs>.tab input[type="radio"]:checked+label.separator-selector{border:1px solid #17A8E3;background-color:#E1F6FF}.wpmud .wds-custom-separator-message{margin:10px 0 20px 0}.wds-preview-container.wds-preview-loading{opacity:.7}.wpmud .box-sitemaps-xml-sitemap-settings .box-content>p{margin-bottom:10px}.wpmud .wds-sitemap-part{display:table;width:100%;border-bottom:1px solid #EAEAEA;margin-bottom:15px;padding-bottom:15px}.wpmud .wds-sitemap-part:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0}.wpmud .wds-sitemap-part-label,.wpmud .wds-sitemap-part-name,.wpmud .wds-sitemap-part-toggle{display:table-cell;vertical-align:middle}.wpmud .wds-sitemap-part-name{color:#888;font-size:13px;width:150px}.wpmud .wds-sitemap-part-toggle{width:100px}.wpmud .wds-sitemap-part-toggle .toggle{float:right}.wpmud .wds-sitemap-section{border-bottom:1px solid #EAEAEA;margin-bottom:15px;padding-bottom:20px}.wpmud .wds-sitemap-section:last-child{border-bottom:none;padding-bottom:0;margin-bottom:0}.wpmud .wds-sitemap-section>.wds-sitemap-part{border-bottom:medium none;padding-bottom:0;margin-bottom:0}.wpmud .wds-disable-updates .wds-notice-warning{font-size:13px}.wpmud .wds-content-tabs.tab_url_crawler .wds-list-table td:last-child{text-align:right}.wpmud .wds-content-tabs.tab_url_crawler .wds-list-table td:last-child:first-child{text-align:inherit}.wpmud .wds-content-tabs.tab_url_crawler .wds-list-table tr.wds-controls-row td{padding:30px}.wpmud .wds-content-tabs.tab_url_crawler .wds-crawl-issues-table{margin-bottom:30px}.wpmud .wds-content-tabs.tab_url_crawler .wds-ignored-items-table tbody tr td{background:#F9F9F9}.wpmud .wds-content-tabs.tab_url_crawler .wds-links-dropdown.wds-item-loading{font-size:18px}.wpmud .wds-content-tabs.tab_url_crawler .wds-links-dropdown.wds-item-loading .wds-links-dropdown-anchor{visibility:hidden}.wpmud .wds-content-tabs.tab_url_crawler .wds-url-crawler-stats{display:none}.wpmud .wds-url-crawler-stats{background-image:url("../images/url-crawler-stats.png");background-size:128px 121px}.wpmud .wds-path-occurrences{padding-top:30px;border-top:1px solid #EAEAEA}.wpmud .wds-action-button{float:right}.wpmud .wds-issues-type-sitemap .wds-notice{margin-bottom:30px}.wpmud .wds-postlist-selector-modal .box{background:#F1F1F1;padding:0 10px}.wpmud .wds-postlist-selector-modal .box .title{border-bottom:none;margin:0;padding:15px 0 0 20px}.wpmud .wds-postlist-selector-modal .box .title h3{font-weight:400;padding:0}.wpmud .wds-postlist-selector-modal .box .title .close{color:#777771}.wpmud .wds-postlist-selector-modal .vertical-tabs{margin-bottom:0}.wpmud .wds-postlist-selector-modal .wds-postlist-list-items{margin:0;padding:0}.wpmud .wds-postlist-selector-modal .wds-postlist-list-item{margin:25px 0 0;padding:0}.wpmud .wds-postlist-selector-modal .wds-postlist-list-item-first-child{margin-top:0}.wpmud .wds-postlist-selector-modal .wds-postlist-list-item+label{color:#aaa;margin-left:5px}.wpmud .wds-postlist-selector-modal .wds-postlist-list-item:checked+label{color:#4A4A4A}.wpmud .wds-postlist-selector-modal .wds-postlist-list-pagination{margin-top:30px}.wpmud .wds-postlist-add-post{padding-top:20px}.wpmud .wds-postlist-item-title,.wpmud .wds-postlist-item-type{width:40%}.wpmud .wds-postlist-item-remove{text-align:right}.wpmud .wds-postlist-empty_list{display:none}.wpmud .wds-custom-keywords-modal .wds-action-button{float:right}.wpmud .wds-automatic-linking-insert-links,.wpmud .wds-automatic-linking-link-to{width:calc(50% - 10px);float:left;border:1px solid #EAEAEA;border-radius:5px}.wpmud .wds-automatic-linking-insert-links:last-child,.wpmud .wds-automatic-linking-link-to:last-child{margin-left:20px}.wpmud .wds-automatic-linking-insert-links .label,.wpmud .wds-automatic-linking-link-to .label{width:100%;padding:20px 30px}.wpmud .wds-automatic-linking-insert-links .label .wds-label,.wpmud .wds-automatic-linking-link-to .label .wds-label{font-size:13px}.wpmud .wds-automatic-linking-insert-links .fields,.wpmud .wds-automatic-linking-link-to .fields{width:100%}.wpmud .wds-automatic-linking-insert-links .fields .wds-toggle-table,.wpmud .wds-automatic-linking-link-to .fields .wds-toggle-table{padding:15px 30px;border-top:1px solid #EAEAEA}.wpmud .wds-automatic-linking-insert-links .fields .wds-toggle-table .toggle,.wpmud .wds-automatic-linking-link-to .fields .wds-toggle-table .toggle{width:40px;float:right}.wpmud .wds-automatic-linking-insert-links .fields .wds-toggle-table .wds-toggle-description,.wpmud .wds-automatic-linking-link-to .fields .wds-toggle-table .wds-toggle-description{float:left}.wpmud .wds-moz-table strong{font-size:15px;color:#666;line-height:30px}.wpmud .wds-moz-api-credentials{border:1px solid #EAEAEA;border-radius:4px;padding:30px}.wpmud .wds-moz-api-credentials .button{margin-top:20px;float:right}.wpmud [name="reset-moz-credentials"]{margin-bottom:30px;float:right}.wpmud .wds-redirects input{margin-bottom:0}.wpmud .wds-redirects-buttons-top{margin-bottom:10px}.wpmud .wds-redirects-buttons-bottom button{float:right}.wpmud .wds-redirects .wds-redirection_item-type select{width:200px}.wpmud .wds-redirects .wds-bulk-remove{display:none}.wpmud .wds-redirects .wds-redirects-unsaved-notice{display:none}.wpmud .wds-redirects .wds-redirects-table.wds-list-table th,.wpmud .wds-redirects .wds-redirects-table.wds-list-table td{padding:20px 5px}.wpmud .wds-redirects .wds-redirects-table.wds-list-table th:first-child,.wpmud .wds-redirects .wds-redirects-table.wds-list-table th:last-child,.wpmud .wds-redirects .wds-redirects-table.wds-list-table td:first-child,.wpmud .wds-redirects .wds-redirects-table.wds-list-table td:last-child{width:10px}.wpmud .wds-redirects .wds-redirects-table.wds-list-table th:first-child,.wpmud .wds-redirects .wds-redirects-table.wds-list-table td:first-child{padding-left:20px}.wpmud .wds-redirects .wds-redirects-table.wds-list-table th:last-child,.wpmud .wds-redirects .wds-redirects-table.wds-list-table td:last-child{padding-right:20px}.wpmud .wds-redirects .wds-redirects-table.wds-list-table tbody tr:last-child td{border-bottom:1px solid #EAEAEA}.wpmud .wds-bulk-update-redirects-modal .wds-action-button{float:right}.wpmud .wds-custom-meta-tags{margin-top:15px}.wpmud .wds-meta-tags-example{font-size:0.8em}.wpmud .wds-third-party-plugins{border-radius:7px;border:1px solid #EAEAEA;margin-bottom:20px}.wpmud .wds-third-party-plugins .wds-third-party-plugin{padding:15px 20px;display:table;width:100%}.wpmud .wds-third-party-plugins .wds-third-party-plugin-name,.wpmud .wds-third-party-plugins .wds-third-party-plugin-button{display:table-cell;vertical-align:middle}.wpmud .wds-third-party-plugins .wds-third-party-plugin-name{color:#333;font-size:13px;font-weight:500}.wpmud .wds-third-party-plugins .wds-third-party-plugin-button{text-align:right}.wpmud .wds-third-party-plugins .wds-third-party-plugin.wds-aioseop{border-top:1px solid #EAEAEA}.wpmud .wds-import-status-dialog .box{background-image:url("../images/url-crawler-stats.png");background-size:128px 121px;background-repeat:no-repeat;background-position:center bottom;padding-bottom:100px}.wpmud .wds-import-status-dialog .wds-separator-top.wds-import-item{margin-top:15px;padding-top:15px}.wpmud .wds-import-status-dialog .wds-toggle-table{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.wpmud .wds-import-status-dialog .wds-toggle-table .toggle.wds-toggle{-ms-flex-order:2;order:2;width:auto}.wpmud .wds-import-status-dialog .wds-box-footer-description{color:#888;font-size:13px;float:left}.wpmud .wds-import-status-dialog .wds-import-main-action{float:right;margin-left:20px}.wpmud .wds-import-status-dialog .wds-label{display:table}.wpmud .wds-import-status-dialog .wds-import-placeholder{visibility:hidden}.wpmud .wds-import-status-dialog .wds-site-progress label,.wpmud .wds-import-status-dialog .wds-post-progress label{color:#888;font-size:12px}.wpmud .wds-import-status-dialog .wds-advanced-import-options>span{background:#EAEAEA;padding:3px 7px 6px 6px;display:table;cursor:pointer;float:right;margin-top:20px;border-radius:3px}.wpmud .wds-import-status-dialog .wds-advanced-import-options>span:before{content:"+";margin-right:2px}.wpmud .wds-import-status-dialog .wds-advanced-import-options .wds-separator-top.wds-import-item:first-of-type{margin-top:0;padding-top:20px}.wpmud .wds-import-status-dialog .wds-advanced-import-options-inner{clear:both;display:none}.wpmud .wds-import-status-dialog .wds-advanced-import-options.open>span{border-radius:3px 3px 0 0}.wpmud .wds-import-status-dialog .wds-advanced-import-options.open>span:before{content:"-"}.wpmud .wds-import-status-dialog .wds-advanced-import-options.open .wds-advanced-import-options-inner{display:block}.wpmud .fields{position:relative}.wpmud .fields.wds-twitter-username::before{color:#aaaaaa;content:"@";font-family:"Roboto",Arial,sans-serif;font-size:15px;position:absolute;right:100.8%;top:8px}.wpmud .wds-twitter-embed{margin-top:30px;height:320px}.wpmud .wds-twitter-embed-large{height:560px}.wpmud .wds-twitter-embed iframe{margin:0 auto}.wpmud .wds-seo-checkup-stats{background-image:url("../images/seo-checkup-stats.png");background-size:181px 182px}.wpmud .wds-seo-checkup-stats .wds-checkup-frequency{text-transform:capitalize}.wpmud .wds-seo-checkup-stats .wds-checkup-frequency-details{font-size:13px}.wpmud .wds-content-tabs.tab_checkup .wds-mascot-message.seo-checkup-upsell{margin-top:30px;margin-bottom:-30px}@media only screen and (max-width: 960px){.wpmud .row .col-third,.wpmud .row .col-two-third,.wpmud .row .col-half,.wpmud .row .col-quarter,.wpmud .row .col-three-quarters{display:block;margin-top:30px;padding:0;width:100%}.wpmud .row .col-third:first-child,.wpmud .row .col-two-third:first-child,.wpmud .row .col-half:first-child,.wpmud .row .col-quarter:first-child,.wpmud .row .col-three-quarters:first-child{margin-top:0}}@media only screen and (max-width: 600px){.wpmud .dev-box .box-title{padding:15px 30px}}@media only screen and (max-width: 783px){.wpmud .dev-box .box-title .toggle-troup{margin-top:0}}@media only screen and (max-width: 600px){.wpmud .dev-box .box-title h3,.wpmud .dev-box .box-title .buttons,.wpmud .dev-box .box-title .actions,.wpmud .dev-box .box-title .extra{float:none;display:block}}@media only screen and (max-width: 600px){.wpmud .dev-box .box-title .buttons,.wpmud .dev-box .box-title .actions,.wpmud .dev-box .box-title .extra{margin-top:15px}}@media only screen and (max-width: 600px){.wpmud .dev-box .box-title h3{line-height:1em}}@media only screen and (max-width: 960px){.wpmud .wrap-wds #header h1,.wpmud .wrap-wds #header .actions{display:block;float:none}.wpmud .wrap-wds #header .actions{margin-top:15px;margin-bottom:5px}}@media only screen and (max-width: 1100px){.wpmud .content-box-two-cols-image-left .wds-block-entry{text-align:center}.wpmud .content-box-two-cols-image-left .wds-block-entry-image{float:none;margin-bottom:30px}.wpmud .content-box-two-cols-image-left .wds-block-entry-image .wds-image{margin:0 auto}.wpmud .content-box-two-cols-image-left .wds-block-entry-content{margin:0}.wpmud .content-box-two-cols-image-left .wds-block-entry-content .title{text-align:center}}.wpmud button#collapse-button{font:inherit;text-transform:none}
includes/css/wp-dashboard.css CHANGED
@@ -1 +1 @@
1
- .cf:after{content:"";display:table;clear:both}@media only screen and (max-width: 1200px){.hide-to-large{display:none}}@media only screen and (max-width: 1100px){.hide-to-desktop{display:none}}.wpmud .wds-table{border:0;border-spacing:0;border-collapse:collapse;width:100%}.wpmud .wds-data-table{border:1px solid #E5E5E5;border-collapse:collapse;border-spacing:0;color:#777771;width:100%}.wpmud .wds-data-table>thead{border-bottom:1px solid #E5E5E5}.wpmud .wds-data-table>tfoot{border-top:1px solid #E5E5E5}.wpmud .wds-data-table>thead th,.wpmud .wds-data-table>tfoot th{font:700 15px/20px "Roboto Condensed","Roboto",Arial,sans-serif;padding:15px 10px;text-transform:uppercase}.wpmud .wds-data-table>tbody td{font-size:13px;line-height:20px;padding:20px 10px;vertical-align:top}.wpmud .wds-data-table th,.wpmud .wds-data-table td{text-align:left}.wpmud .wds-data-table .label{width:75%}.wpmud .wds-data-table .result{width:25%}.wpmud .wds-data-table .data-small{padding:10px}.wpmud .wds-data-table-inverse .label{width:25%}.wpmud .wds-data-table-inverse .result{width:75%}.wpmud .wds-data-table-inverse-large .label{width:40%}.wpmud .wds-data-table-inverse-large .result{width:60%}.wpmud .wds-list-table{width:100%;border:1px solid #EAEAEA;border-collapse:separate;border-spacing:unset;border-radius:5px;color:#888;font-size:13px}.wpmud .wds-list-table th{text-align:left;padding:20px 30px;font-weight:500;color:#333}.wpmud .wds-list-table tr th,.wpmud .wds-list-table tr td{border-bottom:1px solid #EAEAEA}.wpmud .wds-list-table tr td{padding:15px 30px}.wpmud .wds-list-table tr:last-child td{border-bottom:none}.wpmud .wds-list-table tfoot th{border-bottom:none;border-top:1px solid #EAEAEA}
1
+ .cf:after,.wds-sitemaps-widget:after{content:"";display:table;clear:both}@media only screen and (max-width: 1200px){.hide-to-large{display:none}}@media only screen and (max-width: 1100px){.hide-to-desktop{display:none}}.wpmud .wds-table{border:0;border-spacing:0;border-collapse:collapse;width:100%}.wpmud .wds-data-table{border:1px solid #E5E5E5;border-collapse:collapse;border-spacing:0;color:#777771;width:100%}.wpmud .wds-data-table>thead{border-bottom:1px solid #E5E5E5}.wpmud .wds-data-table>tfoot{border-top:1px solid #E5E5E5}.wpmud .wds-data-table>thead th,.wpmud .wds-data-table>tfoot th{font:700 15px/20px "Roboto Condensed","Roboto",Arial,sans-serif;padding:15px 10px;text-transform:uppercase}.wpmud .wds-data-table>tbody td{font-size:13px;line-height:20px;padding:20px 10px;vertical-align:top}.wpmud .wds-data-table th,.wpmud .wds-data-table td{text-align:left}.wpmud .wds-data-table .label{width:75%}.wpmud .wds-data-table .result{width:25%}.wpmud .wds-data-table .data-small{padding:10px}.wpmud .wds-data-table-inverse .label{width:25%}.wpmud .wds-data-table-inverse .result{width:75%}.wpmud .wds-data-table-inverse-large .label{width:40%}.wpmud .wds-data-table-inverse-large .result{width:60%}.wpmud .wds-list-table{width:100%;border:1px solid #EAEAEA;border-collapse:separate;border-spacing:unset;border-radius:5px;color:#888;font-size:13px}.wpmud .wds-list-table th{text-align:left;padding:20px 30px;font-weight:500;color:#333}.wpmud .wds-list-table tr th,.wpmud .wds-list-table tr td{border-bottom:1px solid #EAEAEA}.wpmud .wds-list-table tr td{padding:15px 30px}.wpmud .wds-list-table tr:last-child td{border-bottom:none}.wpmud .wds-list-table tfoot th{border-bottom:none;border-top:1px solid #EAEAEA}.wds-sitemaps-widget-left{width:45%;float:left}.wds-sitemaps-widget-right{width:45%;float:right}
includes/front.php CHANGED
@@ -48,6 +48,8 @@ class Smartcrawl_Front {
48
  }
49
  }
50
 
 
 
51
  add_filter( 'the_content', array( $this, 'process_frontend_rendering' ), 999 );
52
 
53
  }
48
  }
49
  }
50
 
51
+ Smartcrawl_Compatibility::run();
52
+
53
  add_filter( 'the_content', array( $this, 'process_frontend_rendering' ), 999 );
54
 
55
  }
includes/js/wds-admin-onpage.js CHANGED
@@ -26,15 +26,39 @@
26
  var $section = $tab.find('.wds-accordion-section.open .wds-content-tabs-inner');
27
  $text = $section.find(':text[name*="title-"]');
28
  }
 
 
 
29
  else {
30
  $text = $tab.find(':text[name*="title-"]');
31
  }
32
 
33
- if ($text.length) {
34
  render_preview_change.apply($text.get(), arguments);
35
  }
36
  }
37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  /**
39
  * Handles change/keyup event title&meta preview update dispatch
40
  *
26
  var $section = $tab.find('.wds-accordion-section.open .wds-content-tabs-inner');
27
  $text = $section.find(':text[name*="title-"]');
28
  }
29
+ else if ($('[data-type="static-homepage"]', $tab).length) {
30
+ load_static_homepage_preview();
31
+ }
32
  else {
33
  $text = $tab.find(':text[name*="title-"]');
34
  }
35
 
36
+ if ($text && $text.length) {
37
  render_preview_change.apply($text.get(), arguments);
38
  }
39
  }
40
 
41
+ function load_static_homepage_preview() {
42
+ var $container = $('[data-type="static-homepage"]'),
43
+ $preview = $container.find(".wds-preview-container");
44
+
45
+ $preview.addClass("wds-preview-loading");
46
+ $.post(ajaxurl, {
47
+ action: "wds-onpage-preview",
48
+ type: $container.data("type"),
49
+ _wds_nonce: _wds_onpage.nonce
50
+ }, 'json').done(function (rsp) {
51
+ var status = (rsp || {}).status || false,
52
+ html = (rsp || {}).markup || false;
53
+
54
+ if (status && !!html) {
55
+ $preview.replaceWith(html);
56
+ }
57
+ }).always(function () {
58
+ $preview.removeClass("wds-preview-loading");
59
+ });
60
+ }
61
+
62
  /**
63
  * Handles change/keyup event title&meta preview update dispatch
64
  *
includes/js/wds-admin-pointers.js ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(document).ready(function ($) {
2
+ function open_pointer(id) {
3
+ var pointers = (_wds_pointers || {}).pointers;
4
+ if (!pointers || !pointers[id]) {
5
+ return;
6
+ }
7
+
8
+ var pointer = pointers[id],
9
+ options = $.extend(pointer.options, {
10
+ pointerClass: 'wp-pointer wds-pointer',
11
+ show: function (event, target) {
12
+ target.pointer.css({'position': 'fixed'});
13
+ target.pointer.data('target', pointer.target);
14
+ },
15
+ close: function () {
16
+ $.post(ajaxurl, {
17
+ pointer: pointer.pointer_id,
18
+ action: 'dismiss-wp-pointer'
19
+ });
20
+ }
21
+ });
22
+
23
+ var $target = $(pointer.target);
24
+ $target.pointer(options);
25
+ if ($target.is(':visible')) {
26
+ $target.pointer('open');
27
+ }
28
+ }
29
+
30
+ function reposition_all_pointers() {
31
+ $('.wds-pointer').each(function (index, element) {
32
+ var $target = $($(element).data('target'));
33
+ if ($target.is(':visible') && $target.pointer('instance')) {
34
+ $target.pointer('reposition');
35
+ }
36
+ });
37
+ }
38
+
39
+ $(document).on('wp-collapse-menu', reposition_all_pointers);
40
+ $(window).on('resize', _.debounce(reposition_all_pointers, 250));
41
+
42
+ open_pointer('wds-activation-pointer');
43
+ });
includes/js/wds-admin-settings.js CHANGED
@@ -10,75 +10,6 @@
10
  $new_input.find('input').val('').focus();
11
  }
12
 
13
- function import_yoast_data_button_clicked(e) {
14
- e.preventDefault();
15
-
16
- var $target = $(e.target),
17
- $importButtons = $('.wds-third-party-plugins .button');
18
-
19
- $target.html(_wds_setting.strings.importing);
20
- $importButtons.prop('disabled', true);
21
-
22
- import_yoast_data(function (data) {
23
- navigate_to_success_url(data.url);
24
- }, function (data) {
25
- alert(data.message);
26
- $target.html(_wds_setting.strings.import);
27
- $importButtons.prop('disabled', false);
28
- });
29
- }
30
-
31
- function import_aioseop_data_button_clicked(e) {
32
- e.preventDefault();
33
-
34
- var $target = $(e.target),
35
- $importButtons = $('.wds-third-party-plugins .button');
36
-
37
- $target.html(_wds_setting.strings.importing);
38
- $importButtons.prop('disabled', true);
39
-
40
- import_aioseop_data(function (data) {
41
- navigate_to_success_url(data.url);
42
- }, function (data) {
43
- alert(data.message);
44
- $target.html(_wds_setting.strings.import);
45
- $importButtons.prop('disabled', false);
46
- });
47
- }
48
-
49
- function navigate_to_success_url(url) {
50
- if (window.location.href == url) {
51
- window.location.reload();
52
- }
53
- else {
54
- window.location.href = url;
55
- }
56
- }
57
-
58
- function import_yoast_data(onComplete, onError) {
59
- import_data(onComplete, onError, 'import_yoast_data');
60
- }
61
-
62
- function import_aioseop_data(onComplete, onError) {
63
- import_data(onComplete, onError, 'import_aioseop_data');
64
- }
65
-
66
- function import_data(onComplete, onError, action) {
67
- $.post(ajaxurl, {
68
- action: action
69
- }, function (data) {
70
- if (data.success) {
71
- if (data.in_progress) {
72
- import_data(onComplete, onError, action);
73
- } else {
74
- onComplete(data);
75
- }
76
- } else {
77
- onError(data);
78
- }
79
- }, 'json');
80
- }
81
-
82
  function update_toggles() {
83
  var $sitewide_toggle = $('[name="wds_settings_options[wds_sitewide_mode]"]');
84
 
@@ -111,8 +42,6 @@
111
  minimumResultsForSearch: -1
112
  });
113
  $('.wpmud').on('click', '.wds-custom-meta-tags button', add_custom_meta_tag_field);
114
- $('.wds-yoast .button').on('click', import_yoast_data_button_clicked);
115
- $('.wds-aioseop .button').on('click', import_aioseop_data_button_clicked);
116
 
117
  update_toggles();
118
  }
10
  $new_input.find('input').val('').focus();
11
  }
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  function update_toggles() {
14
  var $sitewide_toggle = $('[name="wds_settings_options[wds_sitewide_mode]"]');
15
 
42
  minimumResultsForSearch: -1
43
  });
44
  $('.wpmud').on('click', '.wds-custom-meta-tags button', add_custom_meta_tag_field);
 
 
45
 
46
  update_toggles();
47
  }
includes/js/wds-admin.js CHANGED
@@ -447,6 +447,7 @@ window.Wds.update_progress_bar = function ($element, value) {
447
  return;
448
  }
449
 
 
450
  $element.find('.wds-progress-bar-current-percent').html(value + '%');
451
  $element.find('.wds-progress-bar-inside').width(value + '%');
452
  };
447
  return;
448
  }
449
 
450
+ $element.data('progress', value);
451
  $element.find('.wds-progress-bar-current-percent').html(value + '%');
452
  $element.find('.wds-progress-bar-inside').width(value + '%');
453
  };
includes/js/wds-metabox.js CHANGED
@@ -32,6 +32,11 @@
32
 
33
  }
34
 
 
 
 
 
 
35
  function init () {
36
  window.setTimeout( function() {
37
  var editor = typeof tinymce !== 'undefined' && tinymce.get('content');
@@ -61,13 +66,9 @@
61
  // Boot
62
  $(init);
63
 
64
- })(jQuery);
65
-
66
- /**
67
- * Deal with SEO analysis updates
68
- */
69
- ;(function ($, undefined) {
70
-
71
  function render_update(extended_data) {
72
  var $metabox = $("#wds-wds-meta-box"),
73
  $seo_report = $('.wds-seo-analysis', $metabox),
@@ -103,7 +104,7 @@
103
  );
104
 
105
  // Enable the refresh button.
106
- if (focus_keywords.length) {
107
  $(".wds-refresh-analysis", $metabox).attr('disabled', false);
108
  }
109
 
@@ -111,39 +112,53 @@
111
  });
112
  }
113
 
114
- function render_update_after_autosave() {
 
 
115
  render_update();
116
  }
117
 
118
- function render_update_refresh_click() {
119
- var $metabox = $("#wds-wds-meta-box"),
120
- $refresh_button = $(this),
121
- $seo_report = $('.wds-report .wds-accordion', $metabox),
122
- $seo_notification = $('.wds-nav-item.active label .wds-issues')
123
- ;
124
- if ($('.wds-analysis-working', $metabox).length) {
125
- // We're already working, pass.
126
- return false;
127
- }
128
- $seo_report.hide();
129
- $seo_notification.attr('class', 'wds-issues wds-item-loading');
130
- $seo_report.after('<div class="wds-analysis-working"><p>' + l10nWdsMetabox.content_analysis_working + '</p></div>');
131
- $refresh_button.prop('disabled', true);
132
-
133
- var cback = function() {
134
- render_update().always(function() {
135
- $refresh_button.prop('disabled', false);
136
- $seo_report.show();
137
- $('.wds-analysis-working', $metabox).remove();
138
- });
139
  };
 
 
 
 
140
  var save = (((wp || {}).autosave || {}).server || {}).triggerSave;
141
  if (save) {
142
- $(document).one('ajaxComplete', cback);
 
 
 
143
  wp.autosave.server.triggerSave();
144
  } else cback();
145
  }
146
 
 
 
 
 
 
 
 
147
  function before_ajax_request($target_element) {
148
  $target_element.addClass('wds-item-loading');
149
  $('.wds-disabled-during-request').prop('disabled', true);
@@ -181,6 +196,7 @@
181
  $readability_report = $('.wds-readability-report', $metabox),
182
  $readability_issues = $('label[for="wds_readability"]').find('.wds-issues'),
183
  $all_issues = $('.wds-issues'),
 
184
  was_metabox_closed = $metabox.is('.closed');
185
 
186
  $all_issues.find('span').html('');
@@ -198,7 +214,7 @@
198
  $metabox.addClass('wds-seo-warning');
199
  $seo_issues.addClass('wds-issues-warning').find('span').html(seo_errors);
200
  }
201
- else if (seo_errors == 0) {
202
  $metabox.addClass('wds-seo-success');
203
  $seo_issues.addClass('wds-issues-success');
204
  }
@@ -214,6 +230,9 @@
214
  $readability_issues.find('span').html('1');
215
  }
216
 
 
 
 
217
  update_focus_keyword_state();
218
  }
219
 
@@ -277,8 +296,8 @@
277
 
278
  $.post(ajaxurl, {
279
  action: "wds-metabox-preview",
280
- title: title,
281
- description: description,
282
  post_id: post_id,
283
  _wds_nonce: _wds_metabox.nonce
284
  }, 'json').done(function (data) {
@@ -286,28 +305,26 @@
286
  $('.wds-metabox-preview').replaceWith(
287
  $((data || {}).markup)
288
  );
289
- render_update();
290
  }
291
  }).always(function () {
292
  $('.wds-preview-container').removeClass("wds-preview-loading");
293
  });
294
  }
295
 
296
- function init () {
297
  window.render_update = render_update;
298
  window.Wds.dismissible_message();
299
 
300
  $(document)
301
- .on('after-autosave', render_update_after_autosave)
302
- .on('after-autosave', refresh_preview)
303
  .on('click', '#wds-wds-meta-box .wds-ignore', handle_ignore_toggle)
304
  .on('click', '#wds-wds-meta-box .wds-unignore', handle_ignore_toggle)
305
  .on('click', '#wds-wds-meta-box a[href="#reload"]', handle_update)
306
  .on('input propertychange', '.wds-focus-keyword input', _.debounce(save_focus_keywords, 2000))
307
- .on('input propertychange', '.wds-meta-field', _.debounce(refresh_preview, 2000))
308
 
309
  // Refresh analysis button handler (both SEO and readability)
310
- .on('click', '.wds-refresh-analysis', render_update_refresh_click)
311
  ;
312
  update_metabox_state();
313
  hook_select2();
@@ -322,6 +339,9 @@
322
  window.Wds.set_cookie('wds-seo-metabox', 'open');
323
  }
324
  });
 
 
 
325
  // Set metabox state on page load based on cookie value.
326
  // Fixes: https://app.asana.com/0/0/580085427092951/f
327
  if ('open' === window.Wds.get_cookie('wds-seo-metabox')) {
@@ -329,5 +349,5 @@
329
  }
330
  }
331
 
332
- $(init);
333
  })(jQuery);
32
 
33
  }
34
 
35
+ function refresh_meta_field_placeholders() {
36
+ // The following line will trigger a call to ajax wds_metabox_update
37
+ $('input#title').trigger('input');
38
+ }
39
+
40
  function init () {
41
  window.setTimeout( function() {
42
  var editor = typeof tinymce !== 'undefined' && tinymce.get('content');
66
  // Boot
67
  $(init);
68
 
69
+ /**
70
+ * Deal with SEO analysis updates
71
+ */
 
 
 
 
72
  function render_update(extended_data) {
73
  var $metabox = $("#wds-wds-meta-box"),
74
  $seo_report = $('.wds-seo-analysis', $metabox),
104
  );
105
 
106
  // Enable the refresh button.
107
+ if (focus_keywords && focus_keywords.length) {
108
  $(".wds-refresh-analysis", $metabox).attr('disabled', false);
109
  }
110
 
112
  });
113
  }
114
 
115
+ function handle_autosave() {
116
+ refresh_meta_field_placeholders();
117
+ refresh_preview();
118
  render_update();
119
  }
120
 
121
+ function handle_page_load() {
122
+ before_ajax_request_blocking();
123
+ refresh_meta_field_placeholders();
124
+ refresh_preview();
125
+ render_update();
126
+ }
127
+
128
+ function handle_meta_change() {
129
+ render_update();
130
+ refresh_preview();
131
+ }
132
+
133
+ function handle_refresh_click() {
134
+ before_ajax_request_blocking();
135
+
136
+ var cback = function () {
137
+ handle_autosave();
138
+ // Re-hook our regular autosave handler
139
+ $(document).on('after-autosave.smartcrawl', handle_autosave);
 
 
140
  };
141
+ var editorSync = (tinyMCE || {}).triggerSave;
142
+ if (editorSync) {
143
+ editorSync();
144
+ }
145
  var save = (((wp || {}).autosave || {}).server || {}).triggerSave;
146
  if (save) {
147
+ // We are already hooked to autosave so let's disable our regular autosave handler momentarily to avoid multiple calls ...
148
+ $(document).off('after-autosave.smartcrawl');
149
+ // hook a new handler to heartbeat-tick.autosave
150
+ $(document).one('heartbeat-tick.autosave', cback);
151
  wp.autosave.server.triggerSave();
152
  } else cback();
153
  }
154
 
155
+ function before_ajax_request_blocking() {
156
+ $('.wds-analysis-working').show();
157
+ $('.wds-report-inner').hide();
158
+ $('.wds-disabled-during-request').prop('disabled', true);
159
+ $('.wds-nav-item .wds-issues').addClass('wds-item-loading');
160
+ }
161
+
162
  function before_ajax_request($target_element) {
163
  $target_element.addClass('wds-item-loading');
164
  $('.wds-disabled-during-request').prop('disabled', true);
196
  $readability_report = $('.wds-readability-report', $metabox),
197
  $readability_issues = $('label[for="wds_readability"]').find('.wds-issues'),
198
  $all_issues = $('.wds-issues'),
199
+ $analysis_working_message = $('.wds-analysis-working', $metabox),
200
  was_metabox_closed = $metabox.is('.closed');
201
 
202
  $all_issues.find('span').html('');
214
  $metabox.addClass('wds-seo-warning');
215
  $seo_issues.addClass('wds-issues-warning').find('span').html(seo_errors);
216
  }
217
+ else if (seo_errors === 0) {
218
  $metabox.addClass('wds-seo-success');
219
  $seo_issues.addClass('wds-issues-success');
220
  }
230
  $readability_issues.find('span').html('1');
231
  }
232
 
233
+ $('.wds-report-inner').show();
234
+ $analysis_working_message.hide();
235
+
236
  update_focus_keyword_state();
237
  }
238
 
296
 
297
  $.post(ajaxurl, {
298
  action: "wds-metabox-preview",
299
+ wds_title: title,
300
+ wds_description: description,
301
  post_id: post_id,
302
  _wds_nonce: _wds_metabox.nonce
303
  }, 'json').done(function (data) {
305
  $('.wds-metabox-preview').replaceWith(
306
  $((data || {}).markup)
307
  );
 
308
  }
309
  }).always(function () {
310
  $('.wds-preview-container').removeClass("wds-preview-loading");
311
  });
312
  }
313
 
314
+ function init_analysis () {
315
  window.render_update = render_update;
316
  window.Wds.dismissible_message();
317
 
318
  $(document)
319
+ .on('after-autosave.smartcrawl', handle_autosave)
 
320
  .on('click', '#wds-wds-meta-box .wds-ignore', handle_ignore_toggle)
321
  .on('click', '#wds-wds-meta-box .wds-unignore', handle_ignore_toggle)
322
  .on('click', '#wds-wds-meta-box a[href="#reload"]', handle_update)
323
  .on('input propertychange', '.wds-focus-keyword input', _.debounce(save_focus_keywords, 2000))
324
+ .on('input propertychange', '.wds-meta-field', _.debounce(handle_meta_change, 2000))
325
 
326
  // Refresh analysis button handler (both SEO and readability)
327
+ .on('click', '.wds-refresh-analysis', handle_refresh_click)
328
  ;
329
  update_metabox_state();
330
  hook_select2();
339
  window.Wds.set_cookie('wds-seo-metabox', 'open');
340
  }
341
  });
342
+
343
+ handle_page_load();
344
+
345
  // Set metabox state on page load based on cookie value.
346
  // Fixes: https://app.asana.com/0/0/580085427092951/f
347
  if ('open' === window.Wds.get_cookie('wds-seo-metabox')) {
349
  }
350
  }
351
 
352
+ $(init_analysis);
353
  })(jQuery);
includes/js/wds-third-party-import.js ADDED
@@ -0,0 +1,213 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ;(function ($, undefined) {
2
+ Wds.ThirdPartyImport = function () {
3
+ var sourcePlugin = false,
4
+ sourcePluginName = false,
5
+ _templates = {
6
+ import_options: Wds.tpl_compile(Wds.template('import', 'import-options')),
7
+ import_error: Wds.tpl_compile(Wds.template('import', 'import-error')),
8
+ import_progress: Wds.tpl_compile(Wds.template('import', 'import-progress')),
9
+ import_progress_reset: Wds.tpl_compile(Wds.template('import', 'import-progress-reset')),
10
+ import_success: Wds.tpl_compile(Wds.template('import', 'import-success'))
11
+ };
12
+
13
+ function skip() {
14
+ WDP.closeOverlay();
15
+ }
16
+
17
+ function update_checkbox() {
18
+ var $label = $(this),
19
+ $dialog = $label.closest('.wds-modal'),
20
+ $checkbox = $dialog.find('#' + $label.attr('for')),
21
+ $dependent = $dialog.find('#' + $checkbox.data('dependent')),
22
+ newStatus = !$checkbox.is(':checked'); // Opposite of the previous value
23
+
24
+ if ($checkbox.is(':disabled')) {
25
+ return;
26
+ }
27
+
28
+ $checkbox.attr('checked', newStatus);
29
+ $checkbox.trigger('change');
30
+
31
+ $dependent.attr('disabled', !newStatus);
32
+ $dependent.closest('.wds-toggle-table').toggleClass('disabled', !newStatus);
33
+ if (!newStatus) {
34
+ $dependent.attr('checked', false);
35
+ $dependent.trigger('change');
36
+ }
37
+ }
38
+
39
+ function toggle_enabled_actions() {
40
+ var $all = $(this).closest(".wds-import-status-dialog").find(":checkbox"),
41
+ $button = $("button.wds-import-start"),
42
+ disabled = true;
43
+ $all.each(function () {
44
+ disabled = disabled && !$(this).is(":checked");
45
+ });
46
+ if (disabled) {
47
+ $button.attr("disabled", true).addClass("disabled");
48
+ } else {
49
+ $button.attr("disabled", false).removeClass("disabled");
50
+ }
51
+ }
52
+
53
+ function set_source_plugin(plugin) {
54
+ if (plugin === 'yoast') {
55
+ sourcePlugin = 'yoast';
56
+ sourcePluginName = Wds.l10n('import', 'Yoast');
57
+ } else if (plugin === 'aioseop') {
58
+ sourcePlugin = 'aioseop';
59
+ sourcePluginName = Wds.l10n('import', 'All In One SEO');
60
+ }
61
+ }
62
+
63
+ function show_import_options() {
64
+ var importOptionsHTML = _templates.import_options({plugin_name: sourcePluginName});
65
+ WDP.overlay.box_content.html(importOptionsHTML);
66
+ }
67
+
68
+ function show_dialog() {
69
+ WDP.showOverlay('#wds-import-status');
70
+ show_import_options();
71
+ }
72
+
73
+ function show_yoast_dialog(event) {
74
+ event.preventDefault();
75
+ set_source_plugin('yoast');
76
+ show_dialog();
77
+ }
78
+
79
+ function show_aioseop_dialog(event) {
80
+ event.preventDefault();
81
+ set_source_plugin('aioseop');
82
+ show_dialog();
83
+ }
84
+
85
+ function start_import() {
86
+ var progressHTML = _templates.import_progress({plugin_name: sourcePluginName}),
87
+ itemsToImport = get_items_to_import();
88
+ WDP.overlay.box_content.html(progressHTML);
89
+ import_data(itemsToImport, 1);
90
+ }
91
+
92
+ function get_items_to_import() {
93
+ var $all = WDP.overlay.box_content.find(':checkbox'),
94
+ items_to_import = {};
95
+
96
+ $all.each(function () {
97
+ var $checkbox = $(this),
98
+ name = $checkbox.attr('name');
99
+ items_to_import[name] = $checkbox.is(":checked") ? 1 : 0;
100
+ });
101
+
102
+ return items_to_import;
103
+ }
104
+
105
+ function reset_progress_bar($progress_bar) {
106
+ var $new_progress_bar = $(_templates.import_progress_reset({}));
107
+ $progress_bar.replaceWith($new_progress_bar);
108
+ return $new_progress_bar;
109
+ }
110
+
111
+ function update_site_progress(status) {
112
+ var $progress = WDP.overlay.box_content.find('.wds-site-progress .wds-progress');
113
+ if ($progress.length === 0) {
114
+ return;
115
+ }
116
+
117
+ var total_sites = status.total_sites || 0,
118
+ completed_sites = status.completed_sites || 0,
119
+ site_progress = total_sites > 0 ? (completed_sites / total_sites) * 100 : 0;
120
+
121
+ Wds.update_progress_bar($progress, site_progress);
122
+ }
123
+
124
+ function update_post_progress(status) {
125
+ var $progress_bar = WDP.overlay.box_content.find('.wds-post-progress .wds-progress');
126
+ if ($progress_bar.length === 0) {
127
+ return;
128
+ }
129
+
130
+ var remaining_posts = status.remaining_posts || 0,
131
+ completed_posts = status.completed_posts || 0,
132
+ prev_value = $progress_bar.data('progress'),
133
+ total_posts = remaining_posts + completed_posts,
134
+ post_progress = total_posts > 0 ? (completed_posts / total_posts) * 100 : 0;
135
+
136
+ if (prev_value >= post_progress) {
137
+ $progress_bar = reset_progress_bar($progress_bar);
138
+ }
139
+
140
+ Wds.update_progress_bar($progress_bar, post_progress);
141
+ }
142
+
143
+ function show_success_message(data) {
144
+ Wds.update_progress_bar(WDP.overlay.box_content.find(".wds-progress"), 100);
145
+ setTimeout(function () {
146
+ var successHTML = _templates.import_success({
147
+ plugin_name: sourcePluginName,
148
+ deactivation_url: data.deactivation_url
149
+ });
150
+ WDP.overlay.box_content.html(successHTML);
151
+ }, 2500);
152
+ }
153
+
154
+ function import_data(itemsToImport, restart) {
155
+ var action = sourcePlugin === 'yoast' ? 'import_yoast_data' : 'import_aioseop_data';
156
+
157
+ return $.post({
158
+ url: ajaxurl,
159
+ data: {
160
+ action: action,
161
+ restart: restart,
162
+ items_to_import: itemsToImport,
163
+ _wds_nonce: _wds_import.nonce
164
+ },
165
+ success: function (data) {
166
+ if (data.success) {
167
+ if (data.in_progress) {
168
+ update_site_progress(data.status);
169
+ update_post_progress(data.status);
170
+ import_data(itemsToImport, 0);
171
+ } else {
172
+ show_success_message(data);
173
+ }
174
+ } else {
175
+ handle_import_error(data.message);
176
+ }
177
+ },
178
+ error: function (jqXHR, textStatus, errorThrown) {
179
+ handle_import_error(errorThrown);
180
+ },
181
+ dataType: 'JSON'
182
+ });
183
+ }
184
+
185
+ function handle_import_error(errorString) {
186
+ var errorHTML = _templates.import_error({error: errorString});
187
+
188
+ WDP.overlay.box_content.html(errorHTML);
189
+ }
190
+
191
+ function toggle_advanced_options(event) {
192
+ var $this = $(event.target),
193
+ $advanced_options = $this.closest('.wds-advanced-import-options');
194
+
195
+ $advanced_options.toggleClass('open');
196
+ }
197
+
198
+ $(document).on("click", "button.wds-import-skip", skip);
199
+ $(document).on("click", "div.wds-import-status-dialog label", update_checkbox);
200
+ $(document).on("click", ".wds-yoast .button", show_yoast_dialog);
201
+ $(document).on("click", ".wds-aioseop .button", show_aioseop_dialog);
202
+ $(document).on("click", "button.wds-import-start", start_import);
203
+ $(document).on("click", "button.wds-reattempt-import", show_import_options);
204
+ $(document).on("click", ".wds-advanced-import-options > span", toggle_advanced_options);
205
+ $(document).on("change", "div.wds-import-status-dialog :checkbox", toggle_enabled_actions);
206
+ };
207
+
208
+ function init() {
209
+ var thirdPartyImport = Wds.ThirdPartyImport();
210
+ }
211
+
212
+ $(init);
213
+ })(jQuery);
includes/tools/class-wds-opengraph-printer.php CHANGED
@@ -64,9 +64,7 @@ class Smartcrawl_OpenGraph_Printer {
64
 
65
  $this->_is_done = true;
66
 
67
- return is_singular()
68
- ? $this->inject_specific_og_tags()
69
- : $this->inject_generic_og_tags();
70
  }
71
 
72
  /**
@@ -77,9 +75,6 @@ class Smartcrawl_OpenGraph_Printer {
77
  if ( ! empty( $settings['fb-app-id'] ) ) {
78
  $this->print_og_tag( 'fb:app_id', $settings['fb-app-id'] );
79
  }
80
-
81
- $this->inject_type();
82
- $this->inject_url();
83
  }
84
 
85
  /**
@@ -118,22 +113,6 @@ class Smartcrawl_OpenGraph_Printer {
118
  return false;
119
  }
120
 
121
- if ( is_array( $value ) ) {
122
- $results = array();
123
- foreach ( $value as $val ) {
124
- $tmp = $this->get_og_tag( $tag, $val );
125
- if ( ! empty( $tmp ) ) {
126
- $results[] = $tmp;
127
- }
128
- }
129
-
130
- return join( "\n", $results );
131
- }
132
-
133
- $tag = preg_replace( '/-/', ':', $tag );
134
- $value = smartcrawl_replace_vars( $value, get_queried_object() );
135
- $value = wp_strip_all_tags( $value );
136
-
137
  return '<meta property="' . esc_attr( $tag ) . '" content="' . esc_attr( $value ) . '" />' . "\n";
138
  }
139
 
@@ -164,90 +143,31 @@ class Smartcrawl_OpenGraph_Printer {
164
  *
165
  * @return bool
166
  */
167
- public function inject_specific_og_tags() {
168
- $post = get_post();
169
- if ( ! is_object( $post ) || empty( $post->ID ) ) {
170
  return false;
171
  }
172
 
173
- // Check custom values for OG disabled per post first
174
- $raw = smartcrawl_get_value( 'opengraph' );
175
- if ( ! is_array( $raw ) ) {
176
- $raw = array();
177
- }
178
- if ( ! empty( $raw['disabled'] ) ) {
179
- return false; // Bail out, no OG here
180
- }
181
- if ( isset( $raw['disabled'] ) ) {
182
- unset( $raw['disabled'] ); // So we can carry on with the logic
183
- }
184
- $image_urls = array();
185
-
186
- // Attempt to use featured image, if any
187
- // Do this first, so we can fall back to generic stuff
188
- // if needs be
189
- if ( has_post_thumbnail( $post ) ) {
190
- $url = get_the_post_thumbnail_url();
191
- if ( ! empty( $url ) ) {
192
- $this->print_og_images( $url );
193
- $image_urls[] = $url;
194
- }
195
- }
196
-
197
- $raw = array_filter( $raw );
198
- if ( empty( $raw ) ) {
199
- return $this->inject_generic_og_tags();
200
- }
201
-
202
- // Separately process any other images
203
- $images = $this->get_post_images();
204
- unset( $raw['images'] );
205
- foreach ( $images as $img ) {
206
- if ( in_array( $img, $image_urls, true ) ) {
207
- continue; // Do not double-print images
208
- }
209
- $this->print_og_images( $img );
210
- $image_urls[] = $img;
211
- }
212
-
213
- $supported_keys = array( 'title', 'description', 'images' );
214
- foreach ( $supported_keys as $key ) {
215
- $value = $this->get_tag_value( $key );
216
- if ( empty( $value ) ) {
217
- continue;
218
- }
219
-
220
- if ( 'images' === $key ) {
221
- if ( is_array( $value ) ) {
222
- $clean = array();
223
- foreach ( $value as $img ) {
224
- if ( in_array( $img, $image_urls, true ) ) {
225
- continue; // Do not double-print images
226
- }
227
- $clean[] = $img;
228
- $image_urls[] = $img;
229
- }
230
- $value = $clean;
231
- } elseif ( ! empty( $value ) ) {
232
- if ( in_array( $value, $image_urls, true ) ) {
233
- continue; // Do not double-print images
234
- }
235
- $image_urls[] = $value;
236
- }
237
- $this->print_og_images( $value );
238
- } else {
239
- $this->print_og_tag( "og:{$key}", $value );
240
  }
241
  }
242
 
243
- $date = get_the_date( 'Y-m-d\TH:i:s', $post );
244
- $this->print_og_tag( 'article:published_time', $date );
245
-
246
- $user_id = $post->post_author;
247
- if ( ! empty( $user_id ) ) {
248
- $user = Smartcrawl_Model_User::get( $user_id );
249
- $this->print_og_tag( 'article:author', $user->get_full_name() );
250
- }
251
  }
252
 
253
  public function print_og_images( $values ) {
@@ -268,136 +188,10 @@ class Smartcrawl_OpenGraph_Printer {
268
  $image_tags[] = $this->get_og_tag( 'og:image:height', $attachment['height'] );
269
  }
270
  }
271
- $markup = join( "\n", array_filter( $image_tags ) );
272
  echo wp_kses( $markup, $this->get_allowed_tags() );
273
  }
274
 
275
- /**
276
- * Use global setup to resolve tag values
277
- * @return boolean
278
- */
279
- public function inject_generic_og_tags() {
280
- $keys = array(
281
- 'og-title' => '',
282
- 'og-description' => '',
283
- 'og-images' => array(),
284
- );
285
- $type = false;
286
-
287
- if ( is_front_page() ) {
288
- $type = 'home';
289
- } elseif ( is_search() ) {
290
- $type = 'search';
291
- } elseif ( is_category() ) {
292
- $type = 'category';
293
- } elseif ( is_tag() ) {
294
- $type = 'post_tag';
295
- } elseif ( is_tax() ) {
296
- $term = get_queried_object();
297
- if ( ! empty( $term ) && is_object( $term ) && ! empty( $term->taxonomy ) ) {
298
- $type = $term->taxonomy;
299
- }
300
- } elseif ( is_singular() ) {
301
- $type = get_post_type();
302
- } elseif ( is_author() ) {
303
- $type = 'author';
304
- } elseif ( is_date() ) {
305
- $type = 'date';
306
- } elseif ( is_post_type_archive() ) {
307
- $post_type = get_queried_object();
308
- if ( is_a( $post_type, 'WP_Post_Type' ) ) {
309
- $type = Smartcrawl_Onpage_Settings::PT_ARCHIVE_PREFIX . $post_type->name;
310
- }
311
- }
312
-
313
- if ( empty( $type ) ) {
314
- return false; // We don't know what to do here
315
- }
316
-
317
- $smartcrawl_options = Smartcrawl_Settings::get_options();
318
- if ( empty( $smartcrawl_options["og-active-{$type}"] ) || ! $smartcrawl_options["og-active-{$type}"] ) {
319
- return false;
320
- }
321
-
322
- if ( is_category() || is_tag() || is_tax() ) {
323
- $term_obj = get_queried_object();
324
- $opengraph = smartcrawl_get_term_meta( $term_obj, $type, 'opengraph' );
325
- if ( ! empty( $opengraph ) ) {
326
- if ( ! empty( $opengraph['disabled'] ) ) {
327
- return false;
328
- }
329
- foreach ( $opengraph as $og_item => $value ) {
330
- if ( ! in_array( "og-{$og_item}", array_keys( $keys ), true ) ) {
331
- continue;
332
- }
333
- $keys["og-{$og_item}"] = $value;
334
- }
335
- }
336
- }
337
-
338
- foreach ( $keys as $key => $val ) {
339
- if ( 'og-images' === $key ) {
340
- $this->print_og_images(
341
- ! empty( $val ) ? $val : $this->get_generic_og_tag_value( $key, $type )
342
- );
343
- } else {
344
- $this->print_og_tag(
345
- $key,
346
- ! empty( $val ) ? $val : $this->get_generic_og_tag_value( $key, $type )
347
- );
348
- }
349
- }
350
-
351
- return true;
352
- }
353
-
354
- /**
355
- * Gets a generic OG tag value
356
- *
357
- * Value will be resolved to what's in OG settings, or
358
- * alternatively will fall back to title/description
359
- * resolution for those tags specifically.
360
- *
361
- * @param string $key OG tag internal key representation
362
- * @param string $type Entity type
363
- *
364
- * @return string|bool Either a resolved tag value, or false on failure
365
- */
366
- public function get_generic_og_tag_value( $key, $type ) {
367
- if ( empty( $key ) || empty( $type ) ) {
368
- return false;
369
- }
370
-
371
- $smartcrawl_options = Smartcrawl_Settings::get_options();
372
- if ( empty( $smartcrawl_options["{$key}-{$type}"] ) ) {
373
- $value = false;
374
- if ( class_exists( 'Smartcrawl_OnPage' ) && 'og-title' === $key ) {
375
- $value = Smartcrawl_OnPage::get()->get_title();
376
- } elseif ( class_exists( 'Smartcrawl_OnPage' ) && 'og-description' === $key ) {
377
- $value = Smartcrawl_OnPage::get()->get_description();
378
- }
379
-
380
- return $value;
381
- }
382
-
383
- return $smartcrawl_options["{$key}-{$type}"];
384
- }
385
-
386
- public function get_post_images() {
387
- $raw = smartcrawl_get_value( 'opengraph' );
388
-
389
- return ! empty( $raw['images'] ) ? $raw['images'] : array();
390
- }
391
-
392
- public function get_tag_value( $suffix ) {
393
- $raw = smartcrawl_get_value( 'opengraph' );
394
- $post = get_post();
395
-
396
- return empty( $raw[ $suffix ] )
397
- ? $this->get_generic_og_tag_value( "og-{$suffix}", get_post_type( $post ) )
398
- : $raw[ $suffix ];
399
- }
400
-
401
  /**
402
  * @return array
403
  */
64
 
65
  $this->_is_done = true;
66
 
67
+ return $this->inject_og_tags();
 
 
68
  }
69
 
70
  /**
75
  if ( ! empty( $settings['fb-app-id'] ) ) {
76
  $this->print_og_tag( 'fb:app_id', $settings['fb-app-id'] );
77
  }
 
 
 
78
  }
79
 
80
  /**
113
  return false;
114
  }
115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  return '<meta property="' . esc_attr( $tag ) . '" content="' . esc_attr( $value ) . '" />' . "\n";
117
  }
118
 
143
  *
144
  * @return bool
145
  */
146
+ public function inject_og_tags() {
147
+ $value_helper = new Smartcrawl_OpenGraph_Value_Helper();
148
+ if ( ! $value_helper->is_enabled() ) {
149
  return false;
150
  }
151
 
152
+ $this->inject_type();
153
+ $this->inject_url();
154
+ $this->print_og_tag( 'og:title', $value_helper->get_title() );
155
+ $this->print_og_tag( 'og:description', $value_helper->get_description() );
156
+ $this->print_og_images( $value_helper->get_images() );
157
+
158
+ if ( is_singular() ) {
159
+ $post = get_post();
160
+ $date = get_the_date( 'Y-m-d\TH:i:s', $post );
161
+ $this->print_og_tag( 'article:published_time', $date );
162
+
163
+ $user_id = $post->post_author;
164
+ if ( ! empty( $user_id ) ) {
165
+ $user = Smartcrawl_Model_User::get( $user_id );
166
+ $this->print_og_tag( 'article:author', $user->get_full_name() );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
167
  }
168
  }
169
 
170
+ return true;
 
 
 
 
 
 
 
171
  }
172
 
173
  public function print_og_images( $values ) {
188
  $image_tags[] = $this->get_og_tag( 'og:image:height', $attachment['height'] );
189
  }
190
  }
191
+ $markup = join( "", array_filter( $image_tags ) );
192
  echo wp_kses( $markup, $this->get_allowed_tags() );
193
  }
194
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
  /**
196
  * @return array
197
  */
includes/tools/class-wds-twitter-printer.php CHANGED
@@ -19,7 +19,7 @@ class Smartcrawl_Twitter_Printer extends Smartcrawl_WorkUnit {
19
  /**
20
  * Holds resolver instance
21
  *
22
- * @var object Smartcrawl_Entity_Resolver instance
23
  */
24
  private $_resolver;
25
 
@@ -103,9 +103,9 @@ class Smartcrawl_Twitter_Printer extends Smartcrawl_WorkUnit {
103
 
104
  private function get_twitter_meta( $key ) {
105
  $meta = array();
106
- $queried_object = get_queried_object();
107
  if ( is_a( $queried_object, 'WP_Post' ) ) {
108
- $meta = smartcrawl_get_value( 'twitter' );
109
  } elseif ( is_a( $queried_object, 'WP_Term' ) ) {
110
  $meta = smartcrawl_get_term_meta( $queried_object, $queried_object->taxonomy, 'twitter' );
111
  }
@@ -126,7 +126,7 @@ class Smartcrawl_Twitter_Printer extends Smartcrawl_WorkUnit {
126
  // @todo: make sure are location types from Smartcrawl_Endpoint_Resolver are handled
127
  $mapping = array(
128
  Smartcrawl_Endpoint_Resolver::L_BLOG_HOME => 'home',
129
- Smartcrawl_Endpoint_Resolver::L_STATIC_HOME => 'home',
130
  Smartcrawl_Endpoint_Resolver::L_SEARCH => 'search',
131
  Smartcrawl_Endpoint_Resolver::L_404 => '404',
132
  Smartcrawl_Endpoint_Resolver::L_AUTHOR_ARCHIVE => 'author',
@@ -135,7 +135,7 @@ class Smartcrawl_Twitter_Printer extends Smartcrawl_WorkUnit {
135
  Smartcrawl_Endpoint_Resolver::L_DATE_ARCHIVE => 'date',
136
  );
137
 
138
- $queried_object = get_queried_object();
139
  if ( is_a( $queried_object, 'WP_Post' ) ) {
140
  $mapping[ Smartcrawl_Endpoint_Resolver::L_SINGULAR ] = get_post_type( $queried_object );
141
  } elseif ( is_a( $queried_object, 'WP_Term' ) ) {
@@ -195,12 +195,19 @@ class Smartcrawl_Twitter_Printer extends Smartcrawl_WorkUnit {
195
  // Check the plugin settings for required value
196
  $value_from_settings = $this->get_twitter_setting( $key );
197
  if ( ! empty( $value_from_settings ) ) {
198
- return smartcrawl_replace_vars( $value_from_settings, get_queried_object() );
199
  }
200
 
201
  return $default;
202
  }
203
 
 
 
 
 
 
 
 
204
  /**
205
  * Gets HTML element ready for rendering
206
  *
19
  /**
20
  * Holds resolver instance
21
  *
22
+ * @var Smartcrawl_Endpoint_Resolver instance
23
  */
24
  private $_resolver;
25
 
103
 
104
  private function get_twitter_meta( $key ) {
105
  $meta = array();
106
+ $queried_object = $this->get_queried_object();
107
  if ( is_a( $queried_object, 'WP_Post' ) ) {
108
+ $meta = smartcrawl_get_value( 'twitter', $queried_object->ID );
109
  } elseif ( is_a( $queried_object, 'WP_Term' ) ) {
110
  $meta = smartcrawl_get_term_meta( $queried_object, $queried_object->taxonomy, 'twitter' );
111
  }
126
  // @todo: make sure are location types from Smartcrawl_Endpoint_Resolver are handled
127
  $mapping = array(
128
  Smartcrawl_Endpoint_Resolver::L_BLOG_HOME => 'home',
129
+ Smartcrawl_Endpoint_Resolver::L_STATIC_HOME => 'page',
130
  Smartcrawl_Endpoint_Resolver::L_SEARCH => 'search',
131
  Smartcrawl_Endpoint_Resolver::L_404 => '404',
132
  Smartcrawl_Endpoint_Resolver::L_AUTHOR_ARCHIVE => 'author',
135
  Smartcrawl_Endpoint_Resolver::L_DATE_ARCHIVE => 'date',
136
  );
137
 
138
+ $queried_object = $this->get_queried_object();
139
  if ( is_a( $queried_object, 'WP_Post' ) ) {
140
  $mapping[ Smartcrawl_Endpoint_Resolver::L_SINGULAR ] = get_post_type( $queried_object );
141
  } elseif ( is_a( $queried_object, 'WP_Term' ) ) {
195
  // Check the plugin settings for required value
196
  $value_from_settings = $this->get_twitter_setting( $key );
197
  if ( ! empty( $value_from_settings ) ) {
198
+ return smartcrawl_replace_vars( $value_from_settings, $this->get_queried_object() );
199
  }
200
 
201
  return $default;
202
  }
203
 
204
+ private function get_queried_object() {
205
+ $resolver = Smartcrawl_Endpoint_Resolver::resolve();
206
+ $query = $resolver->get_query_context();
207
+
208
+ return ! empty( $query ) ? $query->get_queried_object() : null;
209
+ }
210
+
211
  /**
212
  * Gets HTML element ready for rendering
213
  *
includes/tools/onpage.php CHANGED
@@ -64,9 +64,16 @@ class Smartcrawl_OnPage {
64
  add_action( 'wp_head', array( $this, 'smartcrawl_head' ), 10, 1 );
65
 
66
  // wp_title isn't enough. We'll do it anyway: suspenders and belt approach.
67
- add_filter( 'wp_title', array( $this, 'smartcrawl_title' ), 10, 3 );
 
 
 
 
68
  // Buffer the header output and process it instead.
69
- add_action( 'template_redirect', array( $this, 'smartcrawl_start_title_buffer' ), 99 );
 
 
 
70
  // This should now work with BuddyPress as well.
71
  add_filter( 'bp_page_title', array( $this, 'smartcrawl_title' ), 10, 3 );
72
 
@@ -155,15 +162,13 @@ class Smartcrawl_OnPage {
155
  * @return string Resolved title
156
  */
157
  public function get_title( $title = '' ) {
158
- $request_title = $this->get_request_param( 'wds_title' );
159
- if ( ! empty( $request_title ) ) {
160
- return $request_title;
161
- }
162
-
163
  $resolver = $this->get_resolver();
164
-
165
  $post = $resolver->get_context();
166
  $wp_query = $resolver->get_query_context();
 
 
 
 
167
 
168
  $smartcrawl_options = Smartcrawl_Settings::get_options();
169
 
@@ -182,7 +187,7 @@ class Smartcrawl_OnPage {
182
  $title = smartcrawl_replace_vars( $smartcrawl_options['title-home'], (array) $post );
183
  } elseif ( Smartcrawl_Endpoint_Resolver::L_STATIC_HOME === $location ) {
184
  $post = get_post( get_option( 'page_for_posts' ) );
185
- $fixed_title = smartcrawl_get_value( 'title' );
186
  if ( $fixed_title ) {
187
  $title = smartcrawl_replace_vars( $fixed_title, (array) $post );
188
  } elseif ( ! empty( $post->post_type ) && isset( $smartcrawl_options[ 'title-' . $post->post_type ] ) && ! empty( $smartcrawl_options[ 'title-' . $post->post_type ] ) ) {
@@ -234,10 +239,14 @@ class Smartcrawl_OnPage {
234
  $title = smartcrawl_replace_vars( $smartcrawl_options[ 'title-' . $post->post_type ], (array) $post );
235
  }
236
  } elseif ( Smartcrawl_Endpoint_Resolver::L_WOO_SHOP === $location ) { // WooCommerce shop page.
237
- $post_id = wc_get_page_id( 'shop' );
238
- $fixed_title = smartcrawl_get_value( 'title', $post_id );
239
- if ( $fixed_title ) {
240
- $title = smartcrawl_replace_vars( $fixed_title, (array) $post );
 
 
 
 
241
  }
242
  }
243
 
@@ -297,7 +306,9 @@ class Smartcrawl_OnPage {
297
  global $wp_query, $paged;
298
  $smartcrawl_options = Smartcrawl_Settings::get_options();
299
 
300
- $this->smartcrawl_stop_title_buffer(); // STOP processing the buffer.
 
 
301
 
302
  $robots = '';
303
 
@@ -326,7 +337,7 @@ class Smartcrawl_OnPage {
326
  }
327
 
328
  private function print_html_tag( $html ) {
329
- if (!preg_match('/\<(link|meta)/', $html)) {
330
  // Do not allow plaintext output.
331
  return false;
332
  }
@@ -417,70 +428,9 @@ class Smartcrawl_OnPage {
417
  * @return bool|mixed|string|WP_Error
418
  */
419
  public function get_canonical_url() {
420
- global $wp_query, $paged;
421
- $canonical = smartcrawl_get_value( 'canonical' );
422
-
423
- if ( empty( $canonical ) ) {
424
- if ( is_singular() ) {
425
- $canonical = $this->get_rel_canonical();
426
- } else {
427
- $canonical = '';
428
- if ( is_front_page() ) {
429
- $canonical = trailingslashit( get_bloginfo( 'url' ) );
430
- } elseif ( is_tax() || is_tag() || is_category() ) {
431
- $term = $wp_query->get_queried_object();
432
- $canonical = smartcrawl_get_term_meta( $term, $term->taxonomy, 'wds_canonical' );
433
- $canonical = $canonical ? $canonical : get_term_link( $term, $term->taxonomy );
434
- } elseif ( is_date() ) {
435
- $requested_year = get_query_var( 'year' );
436
- $requested_month = get_query_var( 'monthnum' );
437
- $date_callback = ! empty( $requested_year ) && empty( $requested_month )
438
- ? 'get_year_link'
439
- : 'get_month_link';
440
- $canonical = $date_callback( $requested_year, $requested_month );
441
- } elseif ( is_author() ) {
442
- $user = get_queried_object();
443
- $canonical = get_author_posts_url( $user->ID );
444
- }
445
 
446
- // only show id not error object.
447
- if ( $canonical && ! is_wp_error( $canonical ) ) {
448
- if ( $paged && ! is_wp_error( $paged ) ) {
449
- $canonical .= trailingslashit( 'page/' . $paged );
450
- }
451
- }
452
- }
453
- }
454
-
455
- $canonical = apply_filters( 'wds_filter_canonical', $canonical );
456
-
457
- return $canonical;
458
- }
459
-
460
- /**
461
- * Gets singular entity fallback canonical URL
462
- *
463
- * @return string|bool Canonical URL, or (bool)false
464
- */
465
- private function get_rel_canonical() {
466
- $link = false;
467
- if ( ! is_singular() ) {
468
- return $link;
469
- }
470
-
471
- global $wp_the_query;
472
- $id = $wp_the_query->get_queried_object_id();
473
- if ( ! $id ) {
474
- return;
475
- }
476
-
477
- $link = get_permalink( $id );
478
- $page = get_query_var( 'cpage' );
479
- if ( $page ) {
480
- $link = get_comments_pagenum_link( $page );
481
- }
482
-
483
- return $link;
484
  }
485
 
486
  /**
@@ -607,15 +557,13 @@ class Smartcrawl_OnPage {
607
  * @return string Resolved description
608
  */
609
  public function get_description( $metadesc = '' ) {
610
- $request_description = $this->get_request_param( 'wds_description' );
611
- if ( ! empty( $request_description ) ) {
612
- return $request_description;
613
- }
614
-
615
  $resolver = $this->get_resolver();
616
-
617
  $post = $resolver->get_context();
618
  $wp_query = $resolver->get_query_context();
 
 
 
 
619
 
620
  if ( empty( $metadesc ) && is_object( $post ) ) {
621
  $metadesc = smartcrawl_get_trimmed_excerpt( $post->post_excerpt, $post->post_content );
@@ -653,10 +601,14 @@ class Smartcrawl_OnPage {
653
  $metadesc = $stored;
654
  }
655
  } elseif ( Smartcrawl_Endpoint_Resolver::L_WOO_SHOP === $location ) { // WooCommerce shop page.
656
- $post_id = wc_get_page_id( 'shop' );
657
- $metadesc = smartcrawl_get_value( 'metadesc', $post_id );
658
- if ( is_object( $post ) ) {
659
- $metadesc = smartcrawl_replace_vars( $metadesc, (array) $post );
 
 
 
 
660
  }
661
  } elseif ( Smartcrawl_Endpoint_Resolver::L_BLOG_HOME === $location && isset( $smartcrawl_options['metadesc-home'] ) ) {
662
  $metadesc = smartcrawl_replace_vars( $smartcrawl_options['metadesc-home'], array() );
@@ -753,6 +705,15 @@ class Smartcrawl_OnPage {
753
  $metakey = smartcrawl_get_value( 'keywords', $post_id );
754
  $use_tags = smartcrawl_get_value( 'tags_to_keywords', $post_id );
755
  $metakey = $use_tags ? $this->_tags_to_keywords( $metakey ) : $metakey;
 
 
 
 
 
 
 
 
 
756
  } else {
757
  $metakey = $resolver->is_singular( $location ) ? smartcrawl_get_value( 'keywords', $post->ID ) : false;
758
  if ( $resolver->is_singular( $location ) ) {
@@ -908,4 +869,8 @@ class Smartcrawl_OnPage {
908
  exit;
909
  }
910
  }
 
 
 
 
911
  }
64
  add_action( 'wp_head', array( $this, 'smartcrawl_head' ), 10, 1 );
65
 
66
  // wp_title isn't enough. We'll do it anyway: suspenders and belt approach.
67
+ add_filter( 'wp_title', array( $this, 'smartcrawl_title' ), 100, 3 );
68
+
69
+ // For newer themes using wp_get_document_title()
70
+ add_filter( 'pre_get_document_title', array( $this, 'smartcrawl_title' ), 100 );
71
+
72
  // Buffer the header output and process it instead.
73
+ if ( $this->force_rewrite_title() ) {
74
+ add_action( 'template_redirect', array( $this, 'smartcrawl_start_title_buffer' ), 99 );
75
+ }
76
+
77
  // This should now work with BuddyPress as well.
78
  add_filter( 'bp_page_title', array( $this, 'smartcrawl_title' ), 10, 3 );
79
 
162
  * @return string Resolved title
163
  */
164
  public function get_title( $title = '' ) {
 
 
 
 
 
165
  $resolver = $this->get_resolver();
 
166
  $post = $resolver->get_context();
167
  $wp_query = $resolver->get_query_context();
168
+ $request_title = $this->get_request_param( 'wds_title' );
169
+ if ( ! empty( $request_title ) ) {
170
+ return smartcrawl_replace_vars( $request_title, $post );
171
+ }
172
 
173
  $smartcrawl_options = Smartcrawl_Settings::get_options();
174
 
187
  $title = smartcrawl_replace_vars( $smartcrawl_options['title-home'], (array) $post );
188
  } elseif ( Smartcrawl_Endpoint_Resolver::L_STATIC_HOME === $location ) {
189
  $post = get_post( get_option( 'page_for_posts' ) );
190
+ $fixed_title = smartcrawl_get_value( 'title', ! empty( $post->ID ) ? $post->ID : 0 );
191
  if ( $fixed_title ) {
192
  $title = smartcrawl_replace_vars( $fixed_title, (array) $post );
193
  } elseif ( ! empty( $post->post_type ) && isset( $smartcrawl_options[ 'title-' . $post->post_type ] ) && ! empty( $smartcrawl_options[ 'title-' . $post->post_type ] ) ) {
239
  $title = smartcrawl_replace_vars( $smartcrawl_options[ 'title-' . $post->post_type ], (array) $post );
240
  }
241
  } elseif ( Smartcrawl_Endpoint_Resolver::L_WOO_SHOP === $location ) { // WooCommerce shop page.
242
+ $shop_page = get_post( wc_get_page_id( 'shop' ) );
243
+ if ( is_a( $shop_page, 'WP_Post' ) ) {
244
+ $fixed_shop_title = smartcrawl_get_value( 'title', $shop_page->ID );
245
+ if ( $fixed_shop_title ) {
246
+ $title = smartcrawl_replace_vars( $fixed_shop_title, (array) $shop_page );
247
+ } elseif ( isset( $smartcrawl_options['title-page'] ) && ! empty( $smartcrawl_options['title-page'] ) ) {
248
+ $title = smartcrawl_replace_vars( $smartcrawl_options['title-page'], (array) $shop_page );
249
+ }
250
  }
251
  }
252
 
306
  global $wp_query, $paged;
307
  $smartcrawl_options = Smartcrawl_Settings::get_options();
308
 
309
+ if ( $this->force_rewrite_title() ) {
310
+ $this->smartcrawl_stop_title_buffer(); // STOP processing the buffer.
311
+ }
312
 
313
  $robots = '';
314
 
337
  }
338
 
339
  private function print_html_tag( $html ) {
340
+ if ( ! preg_match( '/\<(link|meta)/', $html ) ) {
341
  // Do not allow plaintext output.
342
  return false;
343
  }
428
  * @return bool|mixed|string|WP_Error
429
  */
430
  public function get_canonical_url() {
431
+ $helper = new Smartcrawl_Canonical_Value_Helper();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
432
 
433
+ return $helper->get_canonical();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
434
  }
435
 
436
  /**
557
  * @return string Resolved description
558
  */
559
  public function get_description( $metadesc = '' ) {
 
 
 
 
 
560
  $resolver = $this->get_resolver();
 
561
  $post = $resolver->get_context();
562
  $wp_query = $resolver->get_query_context();
563
+ $request_description = $this->get_request_param( 'wds_description' );
564
+ if ( ! empty( $request_description ) ) {
565
+ return smartcrawl_replace_vars( $request_description, $post );
566
+ }
567
 
568
  if ( empty( $metadesc ) && is_object( $post ) ) {
569
  $metadesc = smartcrawl_get_trimmed_excerpt( $post->post_excerpt, $post->post_content );
601
  $metadesc = $stored;
602
  }
603
  } elseif ( Smartcrawl_Endpoint_Resolver::L_WOO_SHOP === $location ) { // WooCommerce shop page.
604
+ $shop_page = get_post( wc_get_page_id( 'shop' ) );
605
+ if ( is_a( $shop_page, 'WP_Post' ) ) {
606
+ $fixed_shop_desc = smartcrawl_get_value( 'metadesc', $shop_page->ID );
607
+ if ( $fixed_shop_desc ) {
608
+ $metadesc = smartcrawl_replace_vars( $fixed_shop_desc, (array) $shop_page );
609
+ } elseif ( isset( $smartcrawl_options['metadesc-page'] ) && ! empty( $smartcrawl_options['metadesc-page'] ) ) {
610
+ $metadesc = smartcrawl_replace_vars( $smartcrawl_options['metadesc-page'], (array) $shop_page );
611
+ }
612
  }
613
  } elseif ( Smartcrawl_Endpoint_Resolver::L_BLOG_HOME === $location && isset( $smartcrawl_options['metadesc-home'] ) ) {
614
  $metadesc = smartcrawl_replace_vars( $smartcrawl_options['metadesc-home'], array() );
705
  $metakey = smartcrawl_get_value( 'keywords', $post_id );
706
  $use_tags = smartcrawl_get_value( 'tags_to_keywords', $post_id );
707
  $metakey = $use_tags ? $this->_tags_to_keywords( $metakey ) : $metakey;
708
+ } elseif ( Smartcrawl_Endpoint_Resolver::L_STATIC_HOME === $location ) {
709
+ $posts_page = get_post( get_option( 'page_for_posts' ) );
710
+ if ( is_object( $posts_page ) && ! empty( $posts_page->ID ) ) {
711
+ $metakey = smartcrawl_get_value( 'keywords', $posts_page->ID );
712
+ if ( smartcrawl_get_value( 'tags_to_keywords', $posts_page->ID ) ) {
713
+ $extra = array_merge( $extra, $this->get_tag_keywords( $posts_page ) );
714
+ }
715
+ $extra = array_merge( $extra, $this->get_focus_keywords( $posts_page ) );
716
+ }
717
  } else {
718
  $metakey = $resolver->is_singular( $location ) ? smartcrawl_get_value( 'keywords', $post->ID ) : false;
719
  if ( $resolver->is_singular( $location ) ) {
869
  exit;
870
  }
871
  }
872
+
873
+ private function force_rewrite_title() {
874
+ return smartcrawl_is_switch_active( 'SMARTCRAWL_FORCE_REWRITE_TITLE' );
875
+ }
876
  }
includes/tools/redirect.php CHANGED
@@ -57,16 +57,41 @@ class Smartcrawl_Redirection_Front {
57
  * @return string Safe redirection URL
58
  */
59
  private function _to_safe_redirection( $redirection, $source = false ) {
60
- $fallback = home_url();
61
-
62
  $status = $this->_get_redirection_status( $source );
 
 
 
63
 
64
  $redirection = wp_sanitize_redirect( $redirection );
65
- $redirection = wp_validate_redirect( $redirection, apply_filters( 'wp_safe_redirect_fallback', $fallback, $status ) );
 
 
66
 
67
  return $redirection;
68
  }
69
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  /**
71
  * Gets redirection status header code
72
  *
57
  * @return string Safe redirection URL
58
  */
59
  private function _to_safe_redirection( $redirection, $source = false ) {
 
 
60
  $status = $this->_get_redirection_status( $source );
61
+ $fallback = apply_filters( 'wp_safe_redirect_fallback', home_url(), $status );
62
+
63
+ add_filter( 'allowed_redirect_hosts', array( $this, 'allow_external_host' ), 10, 2 );
64
 
65
  $redirection = wp_sanitize_redirect( $redirection );
66
+ $redirection = wp_validate_redirect( $redirection, $fallback );
67
+
68
+ remove_filter( 'allowed_redirect_hosts', array( $this, 'allow_external_host' ) );
69
 
70
  return $redirection;
71
  }
72
 
73
+ public function allow_external_host( $allowed_hosts, $host_being_checked ) {
74
+ $source = $this->_model->get_current_url();
75
+ $destination = $this->_model->get_redirection( $source );
76
+ $destination_parts = wp_parse_url( $destination );
77
+
78
+ if (
79
+ empty( $destination_parts['host'] )
80
+ || $host_being_checked !== $destination_parts['host']
81
+ ) {
82
+ return $allowed_hosts;
83
+ }
84
+
85
+ if ( ! is_array( $allowed_hosts ) ) {
86
+ $allowed_hosts = array();
87
+ }
88
+
89
+ return array_unique( array_merge(
90
+ $allowed_hosts,
91
+ array( $destination_parts['host'] )
92
+ ) );
93
+ }
94
+
95
  /**
96
  * Gets redirection status header code
97
  *
includes/tools/sitemaps-dashboard-widget.php CHANGED
@@ -72,25 +72,32 @@ class Smartcrawl_Sitemaps_Dashboard_Widget {
72
  * Widget
73
  */
74
  public function widget() {
75
- $sitemap = get_option( 'wds_sitemap_options' );
76
- $opts = get_option( 'wds_sitemap_dashboard' );
77
  $engines = get_option( 'wds_engine_notification' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
 
79
- $date = ! empty( $opts['time'] ) ? date( get_option( 'date_format' ), $opts['time'] ) : false;
80
- $time = ! empty( $opts['time'] ) ? date( get_option( 'time_format' ), $opts['time'] ) : false;
81
-
82
- $datetime = ( $date && $time )
83
- ? sprintf( __( 'It was last updated on %1$s, at %2$s.', 'wds' ), $date, $time )
84
- : __( "Your sitemap hasn't been updated recently.", 'wds' );
85
- $update_sitemap = __( 'Update sitemap now', 'wds' );
86
- $update_engines = __( 'Force search engines notification', 'wds' );
87
- $working = __( 'Updating...', 'wds' );
88
- $done_msg = __( 'Done updating the sitemap, please hold on...', 'wds' );
89
-
90
- $sitemap_url = smartcrawl_get_sitemap_url();
91
-
92
- include SMARTCRAWL_PLUGIN_DIR . 'admin/templates/sitemaps-dashboard-widget.php';
93
-
94
  }
95
 
96
  }
72
  * Widget
73
  */
74
  public function widget() {
75
+ $sitemap_options = Smartcrawl_Settings::get_options();
76
+ $sitemap_stats = get_option( 'wds_sitemap_dashboard' );
77
  $engines = get_option( 'wds_engine_notification' );
78
+ $last_update_date = ! empty( $sitemap_stats['time'] ) ? date_i18n( get_option( 'date_format' ), $sitemap_stats['time'] ) : false;
79
+ $last_update_time = ! empty( $sitemap_stats['time'] ) ? date_i18n( get_option( 'time_format' ), $sitemap_stats['time'] ) : false;
80
+ $last_update_timestamp = ( $last_update_date && $last_update_time )
81
+ ? sprintf( esc_html__( 'It was last updated on %1$s, at %2$s.', 'wds' ), $last_update_date, $last_update_time )
82
+ : esc_html__( "Your sitemap hasn't been updated recently.", 'wds' );
83
+ $se_notifications_enabled = (boolean) smartcrawl_get_array_value( $sitemap_options, 'ping-google' )
84
+ || (boolean) smartcrawl_get_array_value( $sitemap_options, 'ping-bing' );
85
+
86
+ Smartcrawl_Simple_Renderer::render( 'wp-dashboard/sitemaps-widget', array(
87
+ 'engines' => $engines,
88
+ 'sitemap_stats' => $sitemap_stats,
89
+ 'last_update_date' => $last_update_date,
90
+ 'last_update_time' => $last_update_time,
91
+ 'last_update_timestamp' => $last_update_timestamp,
92
+ 'se_notifications_enabled' => $se_notifications_enabled,
93
+ ) );
94
 
95
+ Smartcrawl_Simple_Renderer::render( 'wp-dashboard/sitemaps-widget-js', array(
96
+ 'updating' => __( 'Updating...', 'wds' ),
97
+ 'updated' => __( 'Done updating the sitemap, please hold on...', 'wds' ),
98
+ 'notifying' => __( 'Notifying...', 'wds' ),
99
+ 'notified' => __( 'Done notifying search engines, please hold on...', 'wds' ),
100
+ ) );
 
 
 
 
 
 
 
 
 
101
  }
102
 
103
  }
includes/tools/sitemaps.php CHANGED
@@ -219,7 +219,7 @@ class Smartcrawl_Xml_Sitemap {
219
  $text = $image['title'] ? $image['title'] : $image['alt'];
220
  $map .= '<image:image>';
221
  $map .= '<image:loc>' . esc_url( $image['src'] ) . '</image:loc>';
222
- $map .= '<image:title>' . ent2ncr( $text ) . '</image:title>';
223
  $map .= "</image:image>\n";
224
  }
225
  } else {
@@ -286,7 +286,7 @@ class Smartcrawl_Xml_Sitemap {
286
  * Loads all items that will get into a sitemap.
287
  */
288
  private function _load_all_items() {
289
- $this->_add_item( home_url(), 1, 'daily' ); // Home URL.
290
  $this->_load_post_items();
291
  $this->_load_taxonomy_items();
292
  // Load BuddyPress-specific items.
@@ -678,8 +678,10 @@ class Smartcrawl_Xml_Sitemap {
678
  private function _get_stylesheet( $xsl ) {
679
  if ( is_multisite() && defined( 'SUBDOMAIN_INSTALL' ) && ! SUBDOMAIN_INSTALL ) {
680
  $plugin_host = wp_parse_url( SMARTCRAWL_PLUGIN_URL, PHP_URL_HOST );
681
- $protocol = ( is_ssl() || force_ssl_admin() ) ? 'https://' : 'http://';
682
- $xsl_host = preg_replace( '~' . preg_quote( $protocol . $plugin_host . '/' ) . '~', '', SMARTCRAWL_PLUGIN_URL );
 
 
683
  $xsl_host = '../' . $xsl_host;
684
 
685
  return "<?xml-stylesheet type='text/xml' href='{$xsl_host}admin/templates/xsl/{$xsl}.xsl'?>\n";
219
  $text = $image['title'] ? $image['title'] : $image['alt'];
220
  $map .= '<image:image>';
221
  $map .= '<image:loc>' . esc_url( $image['src'] ) . '</image:loc>';
222
+ $map .= '<image:title>' . ent2ncr( esc_attr( $text ) ) . '</image:title>';
223
  $map .= "</image:image>\n";
224
  }
225
  } else {
286
  * Loads all items that will get into a sitemap.
287
  */
288
  private function _load_all_items() {
289
+ $this->_add_item( home_url('/'), 1, 'daily' ); // Home URL.
290
  $this->_load_post_items();
291
  $this->_load_taxonomy_items();
292
  // Load BuddyPress-specific items.
678
  private function _get_stylesheet( $xsl ) {
679
  if ( is_multisite() && defined( 'SUBDOMAIN_INSTALL' ) && ! SUBDOMAIN_INSTALL ) {
680
  $plugin_host = wp_parse_url( SMARTCRAWL_PLUGIN_URL, PHP_URL_HOST );
681
+ $xsl_host = preg_replace(
682
+ '/^https?:\/\/' . preg_quote( $plugin_host . '/', '/' ) . '/',
683
+ '', SMARTCRAWL_PLUGIN_URL
684
+ );
685
  $xsl_host = '../' . $xsl_host;
686
 
687
  return "<?xml-stylesheet type='text/xml' href='{$xsl_host}admin/templates/xsl/{$xsl}.xsl'?>\n";
languages/{wpmu-dev-seo.pot → wds.pot} RENAMED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the SmartCrawl package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: SmartCrawl 2.2.2.5\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wpmu-dev-seo\n"
7
- "POT-Creation-Date: 2018-09-26 20:04:48+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -13,14 +13,14 @@ msgstr ""
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
  "X-Generator: grunt-wp-i18n1.0.2\n"
15
 
16
- #: includes/admin/admin.php:131 includes/admin/settings/settings.php:248
17
  #: includes/admin/settings/settings.php:319
18
  #: includes/admin/templates/advanced-tools/advanced-tools-settings.php:49
19
- #: includes/admin/templates/onpage/onpage-settings.php:246
20
  msgid "Settings"
21
  msgstr ""
22
 
23
- #: includes/admin/admin.php:166
24
  msgid "Error: options page not found."
25
  msgstr ""
26
 
@@ -28,18 +28,18 @@ msgstr ""
28
  msgid "SmartCrawl"
29
  msgstr ""
30
 
31
- #: includes/admin/admin.php:318 includes/admin/settings/dashboard.php:32
32
  #: includes/admin/templates/dashboard/dashboard.php:18
33
  msgid "Dashboard"
34
  msgstr ""
35
 
36
- #: includes/admin/admin.php:380
37
  msgid ""
38
  "This site discourages search engines from indexing the pages, which will "
39
  "affect your SEO efforts."
40
  msgstr ""
41
 
42
- #: includes/admin/admin.php:381
43
  msgid "You can fix this here"
44
  msgstr ""
45
 
@@ -57,68 +57,70 @@ msgid ""
57
  "shorter"
58
  msgstr ""
59
 
60
- #: includes/admin/metabox.php:134
 
 
61
  msgid "Analyzing content, please wait a few moments"
62
  msgstr ""
63
 
64
- #: includes/admin/metabox.php:168
65
  msgid "NO ODP (Block Open Directory Project description of the page)"
66
  msgstr ""
67
 
68
- #: includes/admin/metabox.php:169
69
  msgid "NO YDIR (Don't display the Yahoo! Directory titles and abstracts)"
70
  msgstr ""
71
 
72
- #: includes/admin/metabox.php:170 includes/admin/metabox.php:436
73
  msgid "No Archive"
74
  msgstr ""
75
 
76
- #: includes/admin/metabox.php:171 includes/admin/metabox.php:437
77
  msgid "No Snippet"
78
  msgstr ""
79
 
80
- #: includes/admin/metabox.php:174
81
  msgid "Automatic prioritization"
82
  msgstr ""
83
 
84
- #: includes/admin/metabox.php:175
85
  msgid "1 - Highest priority"
86
  msgstr ""
87
 
88
- #: includes/admin/metabox.php:177
89
  msgid "High priority (root pages default)"
90
  msgstr ""
91
 
92
- #: includes/admin/metabox.php:179
93
  msgid "Secondary priority (subpages default)"
94
  msgstr ""
95
 
96
- #: includes/admin/metabox.php:180
97
  msgid "Medium priority"
98
  msgstr ""
99
 
100
- #: includes/admin/metabox.php:184
101
  msgid "Lowest priority"
102
  msgstr ""
103
 
104
- #: includes/admin/metabox.php:392
105
  #: includes/admin/templates/quick-edit-title.php:5
106
  msgid "Title Tag"
107
  msgstr ""
108
 
109
- #: includes/admin/metabox.php:394
110
  msgid "Robots Meta"
111
  msgstr ""
112
 
113
- #: includes/admin/metabox.php:415
114
  msgid "Redirects to %s"
115
  msgstr ""
116
 
117
- #: includes/admin/metabox.php:434
118
  msgid "No ODP"
119
  msgstr ""
120
 
121
- #: includes/admin/metabox.php:435
122
  msgid "No YDIR"
123
  msgstr ""
124
 
@@ -232,162 +234,162 @@ msgstr ""
232
  msgid "Your description seems to be a bit on the long side, consider trimming it"
233
  msgstr ""
234
 
235
- #: includes/admin/settings/onpage.php:513
236
  #: includes/admin/templates/sitemap/sitemap-crawl-issues-group.php:41
237
  msgid "No"
238
  msgstr ""
239
 
240
- #: includes/admin/settings/onpage.php:514
241
  #: includes/admin/settings/sitemap.php:224
242
  #: includes/admin/settings/sitemap.php:351
243
  msgid "Yes"
244
  msgstr ""
245
 
246
- #: includes/admin/settings/onpage.php:518
247
  #: includes/admin/settings/sitemap.php:347
248
  msgid "Google"
249
  msgstr ""
250
 
251
- #: includes/admin/settings/onpage.php:519
252
  #: includes/admin/settings/sitemap.php:348
253
  msgid "Bing"
254
  msgstr ""
255
 
256
- #: includes/admin/settings/onpage.php:541
257
  #: includes/admin/templates/onpage/onpage-section-settings.php:5
258
  msgid "Separator"
259
  msgstr ""
260
 
261
- #: includes/admin/settings/onpage.php:542
262
  msgid "Date of the post/page"
263
  msgstr ""
264
 
265
- #: includes/admin/settings/onpage.php:543
266
  msgid "Title of the post/page"
267
  msgstr ""
268
 
269
- #: includes/admin/settings/onpage.php:544
270
  msgid "Site's name"
271
  msgstr ""
272
 
273
- #: includes/admin/settings/onpage.php:545
274
  msgid "Site's tagline / description"
275
  msgstr ""
276
 
277
- #: includes/admin/settings/onpage.php:546
278
  msgid "Post/page excerpt (or auto-generated if it does not exist)"
279
  msgstr ""
280
 
281
- #: includes/admin/settings/onpage.php:547
282
  msgid "Post/page excerpt (without auto-generation)"
283
  msgstr ""
284
 
285
- #: includes/admin/settings/onpage.php:548
286
  msgid "Current tag/tags"
287
  msgstr ""
288
 
289
- #: includes/admin/settings/onpage.php:549
290
  msgid "Post categories (comma separated)"
291
  msgstr ""
292
 
293
- #: includes/admin/settings/onpage.php:550
294
  msgid "Category description"
295
  msgstr ""
296
 
297
- #: includes/admin/settings/onpage.php:551
298
  msgid "Tag description"
299
  msgstr ""
300
 
301
- #: includes/admin/settings/onpage.php:552
302
  msgid "Term description"
303
  msgstr ""
304
 
305
- #: includes/admin/settings/onpage.php:553
306
  msgid "Term name"
307
  msgstr ""
308
 
309
- #: includes/admin/settings/onpage.php:554
310
  msgid "Post/page modified time"
311
  msgstr ""
312
 
313
- #: includes/admin/settings/onpage.php:555
314
  msgid "Post/page ID"
315
  msgstr ""
316
 
317
- #: includes/admin/settings/onpage.php:556
318
  msgid "Post/page author's 'nicename'"
319
  msgstr ""
320
 
321
- #: includes/admin/settings/onpage.php:557
322
  msgid "Post/page author's userid"
323
  msgstr ""
324
 
325
- #: includes/admin/settings/onpage.php:558
326
  msgid "Current search phrase"
327
  msgstr ""
328
 
329
- #: includes/admin/settings/onpage.php:559
330
  msgid "Current time"
331
  msgstr ""
332
 
333
- #: includes/admin/settings/onpage.php:560
334
  msgid "Current date"
335
  msgstr ""
336
 
337
- #: includes/admin/settings/onpage.php:561
338
  msgid "Current month"
339
  msgstr ""
340
 
341
- #: includes/admin/settings/onpage.php:562
342
  msgid "Current year"
343
  msgstr ""
344
 
345
- #: includes/admin/settings/onpage.php:563
346
  msgid "Current page number (i.e. page 2 of 4)"
347
  msgstr ""
348
 
349
- #: includes/admin/settings/onpage.php:564
350
  msgid "Current page total"
351
  msgstr ""
352
 
353
- #: includes/admin/settings/onpage.php:565
354
  msgid "Current page number"
355
  msgstr ""
356
 
357
- #: includes/admin/settings/onpage.php:566
358
  msgid "Attachment caption"
359
  msgstr ""
360
 
361
- #: includes/admin/settings/onpage.php:567
362
- #: includes/admin/settings/onpage.php:569
363
  msgid "Current page number, spelled out as numeral in English"
364
  msgstr ""
365
 
366
- #: includes/admin/settings/onpage.php:568
367
  msgid "Current page total, spelled out as numeral in English"
368
  msgstr ""
369
 
370
- #: includes/admin/settings/onpage.php:570
371
  msgid "Post type label plural"
372
  msgstr ""
373
 
374
- #: includes/admin/settings/onpage.php:571
375
  msgid "Post type label singular"
376
  msgstr ""
377
 
378
- #: includes/admin/settings/onpage.php:575
379
  msgid "BuddyPress group name"
380
  msgstr ""
381
 
382
- #: includes/admin/settings/onpage.php:576
383
  msgid "BuddyPress group description"
384
  msgstr ""
385
 
386
- #: includes/admin/settings/onpage.php:577
387
  msgid "BuddyPress username"
388
  msgstr ""
389
 
390
- #: includes/admin/settings/onpage.php:578
391
  msgid "BuddyPress user's full name"
392
  msgstr ""
393
 
@@ -450,33 +452,33 @@ msgstr ""
450
  msgid "Home page"
451
  msgstr ""
452
 
453
- #: includes/admin/settings/settings.php:468 includes/admin/settings.php:585
454
  #: includes/admin/templates/settings/settings-section-import-export.php:44
455
  msgid "Yoast SEO"
456
  msgstr ""
457
 
458
- #: includes/admin/settings/settings.php:475 includes/admin/settings.php:585
459
  #: includes/admin/templates/settings/settings-section-import-export.php:52
460
  msgid "All In One SEO"
461
  msgstr ""
462
 
463
- #: includes/admin/settings/settings.php:494
464
  msgid "auto-import"
465
  msgstr ""
466
 
467
- #: includes/admin/settings/settings.php:497
468
  msgid ""
469
- "We've detected you have %1$s, installed. Do you want to %2$s your "
470
  "configuration into SmartCrawl?"
471
  msgstr ""
472
 
473
- #: includes/admin/settings/settings.php:547
474
  msgid ""
475
  "We have spent countless hours developing this free plugin for you, and we "
476
  "would really appreciate it if you dropped us a quick rating."
477
  msgstr ""
478
 
479
- #: includes/admin/settings/settings.php:549
480
  msgid "Rate SmartCrawl"
481
  msgstr ""
482
 
@@ -570,6 +572,7 @@ msgstr ""
570
 
571
  #: includes/admin/settings.php:296 includes/admin/settings.php:360
572
  #: includes/admin/templates/advanced-tools/underscore-bulk-update-form.php:31
 
573
  #: includes/admin/templates/sitemap/sitemap-occurrences-overlay.php:39
574
  #: includes/admin/templates/sitemap/sitemap-redirect-overlay.php:59
575
  msgid "Cancel"
@@ -641,40 +644,22 @@ msgstr ""
641
  msgid "Please select some items to edit them."
642
  msgstr ""
643
 
644
- #: includes/admin/settings.php:432
645
- msgid "Importing"
646
  msgstr ""
647
 
648
- #: includes/admin/settings.php:433
649
- #: includes/admin/templates/settings/settings-section-import-export.php:16
650
- #: includes/admin/templates/settings/settings-section-import-export.php:34
651
- #: includes/admin/templates/settings/settings-section-import-export.php:47
652
- #: includes/admin/templates/settings/settings-section-import-export.php:55
653
- msgid "Import"
654
- msgstr ""
655
-
656
- #: includes/admin/settings.php:572
657
  msgid "Settings updated"
658
  msgstr ""
659
 
660
- #: includes/admin/settings.php:576
661
  msgid " &amp; W3 Total Cache Page Cache flushed"
662
  msgstr ""
663
 
664
- #: includes/admin/settings.php:579
665
  msgid " &amp; WP Super Cache flushed"
666
  msgstr ""
667
 
668
- #: includes/admin/settings.php:591
669
- msgid "deactivate %s"
670
- msgstr ""
671
-
672
- #: includes/admin/settings.php:597
673
- msgid ""
674
- "Your %1$s configuration has been successfully imported! We recommend you "
675
- "%2$s to avoid any potential conflicts."
676
- msgstr ""
677
-
678
  #: includes/admin/templates/advanced-tools/advanced-section-automatic-linking-settings.php:14
679
  msgid "Min lengths"
680
  msgstr ""
@@ -793,7 +778,7 @@ msgstr ""
793
 
794
  #: includes/admin/templates/advanced-tools/advanced-section-moz.php:21
795
  #: includes/admin/templates/onpage/onpage-og-disabled.php:10
796
- #: includes/admin/templates/onpage/onpage-section-homepage.php:82
797
  #: includes/admin/templates/onpage/onpage-twitter-disabled.php:10
798
  #: includes/admin/templates/progress-notice.php:27
799
  #: includes/core/checks/class-wds-check-keywords-used.php:99
@@ -898,22 +883,6 @@ msgstr ""
898
  msgid "View Documentation"
899
  msgstr ""
900
 
901
- #: includes/admin/templates/advanced-tools/advanced-tools-settings.php:26
902
- msgid ""
903
- "Configure SmartCrawl to automatically link certain key words to a page on "
904
- "your blog or even"
905
- msgstr ""
906
-
907
- #: includes/admin/templates/advanced-tools/advanced-tools-settings.php:27
908
- msgid ""
909
- "a whole new site all together. Internal linking can help boost SEO but "
910
- "giving search engines"
911
- msgstr ""
912
-
913
- #: includes/admin/templates/advanced-tools/advanced-tools-settings.php:28
914
- msgid "ample ways to index your site."
915
- msgstr ""
916
-
917
  #: includes/admin/templates/advanced-tools/advanced-tools-settings.php:33
918
  msgid "Activate Keyword Linking"
919
  msgstr ""
@@ -999,7 +968,7 @@ msgstr ""
999
 
1000
  #: includes/admin/templates/advanced-tools/advanced-tools-settings.php:99
1001
  #: includes/admin/templates/dashboard/dashboard-widget-advanced-tools.php:64
1002
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:148
1003
  #: includes/admin/templates/upsell-modal.php:18
1004
  msgid "Automatic Linking"
1005
  msgstr ""
@@ -1031,21 +1000,21 @@ msgid ""
1031
  msgstr ""
1032
 
1033
  #: includes/admin/templates/checkup/checkup-checkup-results.php:53
1034
- #: includes/admin/templates/metabox/analysis-seo-analysis.php:65
1035
  msgid "Recommendation"
1036
  msgstr ""
1037
 
1038
  #: includes/admin/templates/checkup/checkup-checkup-results.php:62
1039
- #: includes/admin/templates/metabox/analysis-seo-analysis.php:73
1040
  msgid "More Info"
1041
  msgstr ""
1042
 
1043
  #: includes/admin/templates/checkup/checkup-checkup-results.php:77
1044
  msgid ""
1045
  "Grab the Pro version of SmartCrawl to unlock unlimited SEO Checkups plus "
1046
- "automated scheduled reports to always stay on top of any issues.. These "
1047
- "features are included in a WPMU DEV membership along with 100+ plugins "
1048
- "&amp; themes, 24/7 support and lots of handy site management tools."
1049
  msgstr ""
1050
 
1051
  #: includes/admin/templates/checkup/checkup-checkup-results.php:78
@@ -1217,7 +1186,7 @@ msgstr ""
1217
  #: includes/admin/templates/dashboard/dashboard-content-analysis-seo-overview.php:32
1218
  #: includes/admin/templates/dashboard/dashboard-content-analysis-seo-overview.php:57
1219
  #: includes/admin/templates/post-list/post-seo-analysis-good.php:2
1220
- #: includes/core/class-wds-controller-analysis.php:632
1221
  msgid "Good"
1222
  msgstr ""
1223
 
@@ -1383,7 +1352,7 @@ msgid ""
1383
  msgstr ""
1384
 
1385
  #: includes/admin/templates/dashboard/dashboard-widget-content-analysis.php:40
1386
- #: includes/admin/templates/metabox/metabox-seo-analysis-container.php:8
1387
  msgid "SEO Analysis"
1388
  msgstr ""
1389
 
@@ -1411,7 +1380,7 @@ msgid "Edit Posts"
1411
  msgstr ""
1412
 
1413
  #: includes/admin/templates/dashboard/dashboard-widget-onpage.php:23
1414
- #: includes/admin/templates/metabox/metabox-tab-social.php:54
1415
  msgid "Titles & Meta"
1416
  msgstr ""
1417
 
@@ -1510,9 +1479,9 @@ msgstr ""
1510
 
1511
  #: includes/admin/templates/dashboard/dashboard-widget-social.php:38
1512
  #: includes/admin/templates/dashboard/onboarding.php:57
1513
- #: includes/admin/templates/metabox/metabox-tab-social.php:63
1514
  #: includes/admin/templates/social/social-settings.php:40
1515
- #: includes/admin/templates/term-additions-form.php:30
1516
  msgid "OpenGraph"
1517
  msgstr ""
1518
 
@@ -1564,7 +1533,7 @@ msgstr ""
1564
  #: includes/admin/templates/dashboard/onboarding.php:5
1565
  msgid ""
1566
  "Welcome to SmartCrawl, the hottest SEO plugin for WordPress! Let's quickly "
1567
- "set up the basics for you, then you can fine tweak each setting as you go - "
1568
  "our recommendations are on by default."
1569
  msgstr ""
1570
 
@@ -1690,151 +1659,145 @@ msgid "Readability score"
1690
  msgstr ""
1691
 
1692
  #: includes/admin/templates/metabox/analysis-readability.php:60
1693
- #: includes/admin/templates/metabox/metabox-seo-analysis-container.php:13
1694
  msgid "Refresh"
1695
  msgstr ""
1696
 
1697
- #: includes/admin/templates/metabox/analysis-readability.php:69
1698
  msgid "Flesch-Kincaid Test"
1699
  msgstr ""
1700
 
1701
- #: includes/admin/templates/metabox/analysis-readability.php:77
1702
- #: includes/admin/templates/metabox/analysis-seo-analysis.php:57
1703
  #: includes/admin/templates/sitemap/sitemap-crawl-issue-ignored.php:24
1704
  msgid "Restore"
1705
  msgstr ""
1706
 
1707
- #: includes/admin/templates/metabox/analysis-readability.php:87
1708
  #: includes/admin/templates/sitemap/sitemap-crawl-issues-group.php:45
1709
  msgid "Overview"
1710
  msgstr ""
1711
 
1712
- #: includes/admin/templates/metabox/analysis-readability.php:88
1713
  msgid ""
1714
  "The Flesch-Kincaid readability tests are readability tests designed to "
1715
  "indicate how difficult a passage in English is to understand. Here are the "
1716
  "benchmarks."
1717
  msgstr ""
1718
 
1719
- #: includes/admin/templates/metabox/analysis-readability.php:92
1720
  msgid "Score"
1721
  msgstr ""
1722
 
1723
- #: includes/admin/templates/metabox/analysis-readability.php:93
1724
- #: includes/admin/templates/metabox/metabox-meta-edit-form.php:41
1725
  #: includes/admin/templates/metabox/metabox-social-meta-tags.php:51
1726
  #: includes/admin/templates/onpage/onpage-social-meta-tags.php:64
1727
  #: includes/admin/templates/term-additions-form.php:88
1728
- #: includes/admin/templates/term-additions-form.php:181
1729
  msgid "Description"
1730
  msgstr ""
1731
 
1732
- #: includes/admin/templates/metabox/analysis-readability.php:111
1733
  msgid "How to fix"
1734
  msgstr ""
1735
 
1736
- #: includes/admin/templates/metabox/analysis-readability.php:112
1737
  msgid ""
1738
  "Try to use shorter sentences, with less difficult words to improve "
1739
  "readability."
1740
  msgstr ""
1741
 
1742
- #: includes/admin/templates/metabox/analysis-readability.php:118
1743
- #: includes/admin/templates/metabox/analysis-seo-analysis.php:85
1744
  #: includes/admin/templates/sitemap/sitemap-crawl-issue-generic.php:39
1745
  #: includes/admin/templates/sitemap/sitemap-crawl-issue-sitemap.php:29
1746
  msgid "Ignore"
1747
  msgstr ""
1748
 
1749
  #: includes/admin/templates/metabox/analysis-seo-analysis.php:14
1750
- #: includes/core/class-wds-controller-analysis.php:355
1751
  msgid "You need to add focus keywords to see recommendations for this article."
1752
  msgstr ""
1753
 
1754
- #: includes/admin/templates/metabox/analysis-seo-analysis.php:25
1755
  msgid ""
1756
  "You have %d SEO recommendations. We recommend you satisfy as many "
1757
  "improvements as possible to ensure your content gets found."
1758
  msgstr ""
1759
 
1760
- #: includes/admin/templates/metabox/analysis-seo-analysis.php:27
1761
  msgid "You have optimized your SEO to the max. Bravo!"
1762
  msgstr ""
1763
 
1764
  #: includes/admin/templates/metabox/analysis.php:2
1765
- #: includes/admin/templates/metabox/metabox-seo-analysis-container.php:43
1766
  #: includes/admin/templates/metabox/metabox-tab-readability.php:6
1767
  msgid "Reload"
1768
  msgstr ""
1769
 
 
 
 
 
 
1770
  #: includes/admin/templates/metabox/metabox-main.php:25
1771
- #: includes/core/class-wds-controller-analysis.php:295
1772
  msgid "SEO"
1773
  msgstr ""
1774
 
1775
  #: includes/admin/templates/metabox/metabox-main.php:26
1776
- #: includes/core/class-wds-controller-analysis.php:298
1777
  msgid "Readability"
1778
  msgstr ""
1779
 
1780
  #: includes/admin/templates/metabox/metabox-main.php:30
 
1781
  #: includes/admin/templates/sitemap/sitemap-settings.php:135
1782
  msgid "Advanced"
1783
  msgstr ""
1784
 
1785
- #: includes/admin/templates/metabox/metabox-meta-edit-form.php:3
1786
  msgid "Edit Meta"
1787
  msgstr ""
1788
 
1789
- #: includes/admin/templates/metabox/metabox-meta-edit-form.php:24
1790
- #: includes/admin/templates/term-additions-form.php:6
1791
  msgid "SEO Title"
1792
  msgstr ""
1793
 
1794
- #: includes/admin/templates/metabox/metabox-meta-edit-form.php:25
1795
  msgid "- Include your focus keywords. 50-%d characters recommended."
1796
  msgstr ""
1797
 
1798
- #: includes/admin/templates/metabox/metabox-meta-edit-form.php:42
1799
  msgid "- Recommended minimum of 135 characters, maximum %d."
1800
  msgstr ""
1801
 
1802
- #: includes/admin/templates/metabox/metabox-meta-edit-form.php:57
1803
  msgid "Keywords"
1804
  msgstr ""
1805
 
1806
- #: includes/admin/templates/metabox/metabox-meta-edit-form.php:58
1807
- #: includes/admin/templates/metabox/metabox-meta-edit-form.php:73
1808
  msgid "- Try to avoid stop words like ‘and’ and ‘the’ which search engines ignore."
1809
  msgstr ""
1810
 
1811
- #: includes/admin/templates/metabox/metabox-meta-edit-form.php:72
1812
  msgid "News Keywords"
1813
  msgstr ""
1814
 
1815
- #: includes/admin/templates/metabox/metabox-meta-edit-form.php:89
1816
  msgid "Tags As Keywords"
1817
  msgstr ""
1818
 
1819
- #: includes/admin/templates/metabox/metabox-meta-edit-form.php:90
1820
  msgid ""
1821
  "If you enable using tags, post tags will be merged in with any other "
1822
  "keywords you enter in the text box."
1823
  msgstr ""
1824
 
1825
- #: includes/admin/templates/metabox/metabox-preview.php:18
1826
- msgid "Dummy Title"
1827
- msgstr ""
1828
-
1829
- #: includes/admin/templates/metabox/metabox-preview.php:33
1830
- msgid "Dummy description"
1831
- msgstr ""
1832
-
1833
- #: includes/admin/templates/metabox/metabox-preview.php:43
1834
- msgid "Google Preview"
1835
- msgstr ""
1836
-
1837
- #: includes/admin/templates/metabox/metabox-seo-analysis-container.php:20
1838
  msgid ""
1839
  "This tool helps you optimize your content to give it the best chance of "
1840
  "being found in search engines when people are looking for it. Start by "
@@ -1843,17 +1806,17 @@ msgid ""
1843
  "highly optimized."
1844
  msgstr ""
1845
 
1846
- #: includes/admin/templates/metabox/metabox-seo-analysis-container.php:28
1847
  msgid "Focus keyword"
1848
  msgstr ""
1849
 
1850
- #: includes/admin/templates/metabox/metabox-seo-analysis-container.php:29
1851
  msgid ""
1852
  "- Choose a single word, phrase or part of a sentence that people will "
1853
  "likely search for."
1854
  msgstr ""
1855
 
1856
- #: includes/admin/templates/metabox/metabox-seo-analysis-container.php:38
1857
  msgid "E.g. broken iphone screen"
1858
  msgstr ""
1859
 
@@ -1866,12 +1829,12 @@ msgstr ""
1866
  #: includes/admin/templates/onpage/onpage-settings.php:28
1867
  #: includes/admin/templates/onpage/onpage-social-meta-tags.php:48
1868
  #: includes/admin/templates/term-additions-form.php:74
1869
- #: includes/admin/templates/term-additions-form.php:167
1870
  msgid "Title"
1871
  msgstr ""
1872
 
1873
  #: includes/admin/templates/metabox/metabox-social-meta-tags.php:64
1874
- #: includes/admin/templates/term-additions-form.php:193
1875
  msgid "Featured Image"
1876
  msgstr ""
1877
 
@@ -1883,7 +1846,7 @@ msgstr ""
1883
  #: includes/admin/templates/metabox/metabox-social-meta-tags.php:72
1884
  #: includes/admin/templates/onpage/onpage-social-meta-tags.php:94
1885
  #: includes/admin/templates/term-additions-form.php:105
1886
- #: includes/admin/templates/term-additions-form.php:199
1887
  msgid "Add image"
1888
  msgstr ""
1889
 
@@ -1897,100 +1860,100 @@ msgid ""
1897
  "the post is shared."
1898
  msgstr ""
1899
 
1900
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:18
1901
  #: includes/admin/templates/onpage/onpage-meta-robots.php:11
1902
  msgid "Indexing"
1903
  msgstr ""
1904
 
1905
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:20
1906
  msgid "Choose how search engines will index this particular page."
1907
  msgstr ""
1908
 
1909
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:30
1910
  msgid "Index - Override Post Type Setting"
1911
  msgstr ""
1912
 
1913
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:31
1914
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:40
1915
  msgid ""
1916
  "Instruct search engines whether or not you want this post to appear in "
1917
  "search results."
1918
  msgstr ""
1919
 
1920
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:39
1921
  msgid "Index"
1922
  msgstr ""
1923
 
1924
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:49
1925
  msgid "Follow - Override Post Type Setting"
1926
  msgstr ""
1927
 
1928
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:50
1929
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:59
1930
  msgid ""
1931
  "Tells search engines whether or not to follow the links on your page and "
1932
  "crawl them too."
1933
  msgstr ""
1934
 
1935
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:58
1936
  msgid "Follow"
1937
  msgstr ""
1938
 
1939
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:69
1940
  msgid "Archive"
1941
  msgstr ""
1942
 
1943
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:70
1944
  msgid "Instructs search engines to store a cached version of this page."
1945
  msgstr ""
1946
 
1947
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:79
1948
  msgid "Snippet"
1949
  msgstr ""
1950
 
1951
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:80
1952
  msgid ""
1953
  "Allows search engines to show a snippet of this page in the search results "
1954
  "and prevents them from caching the page."
1955
  msgstr ""
1956
 
1957
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:90
1958
- #: includes/admin/templates/term-additions-form.php:8
1959
  msgid "Canonical"
1960
  msgstr ""
1961
 
1962
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:92
1963
  msgid ""
1964
  "If you have several similar versions of this page you can point search "
1965
  "engines to the canonical or \"genuine\" version to avoid duplicate content "
1966
  "issues."
1967
  msgstr ""
1968
 
1969
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:99
1970
  msgid "Enter the full canonical URL including http:// or https://"
1971
  msgstr ""
1972
 
1973
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:107
1974
  msgid "301 Redirect"
1975
  msgstr ""
1976
 
1977
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:109
1978
  msgid "Send visitors to this URL to another page."
1979
  msgstr ""
1980
 
1981
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:116
1982
  msgid "Enter the URL to send traffic to including http:// or https://"
1983
  msgstr ""
1984
 
1985
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:125
1986
  msgid "Sitemap Priority"
1987
  msgstr ""
1988
 
1989
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:151
1990
  msgid "You can prevent this particular post from being auto-linked"
1991
  msgstr ""
1992
 
1993
- #: includes/admin/templates/metabox/metabox-tab-advanced.php:160
1994
  msgid "Enable automatic linking for this post"
1995
  msgstr ""
1996
 
@@ -2017,23 +1980,23 @@ msgstr ""
2017
  msgid "= 70+"
2018
  msgstr ""
2019
 
2020
- #: includes/admin/templates/metabox/metabox-tab-social.php:50
2021
  msgid ""
2022
  "Customize this posts title, description and featured images for social "
2023
  "shares. You can also configure the default settings for this post type in "
2024
  "SmartCrawl's %s area."
2025
  msgstr ""
2026
 
2027
- #: includes/admin/templates/metabox/metabox-tab-social.php:64
2028
  msgid "OpenGraph is used on many social networks such as Facebook."
2029
  msgstr ""
2030
 
2031
- #: includes/admin/templates/metabox/metabox-tab-social.php:81
2032
  #: includes/admin/templates/term-additions-form.php:133
2033
  msgid "Twitter"
2034
  msgstr ""
2035
 
2036
- #: includes/admin/templates/metabox/metabox-tab-social.php:82
2037
  msgid "These details will be used in Twitter cards."
2038
  msgstr ""
2039
 
@@ -2104,40 +2067,40 @@ msgstr ""
2104
  msgid "Date Archives Meta Description"
2105
  msgstr ""
2106
 
2107
- #: includes/admin/templates/onpage/onpage-section-homepage.php:25
2108
  msgid "Page Title"
2109
  msgstr ""
2110
 
2111
- #: includes/admin/templates/onpage/onpage-section-homepage.php:38
2112
  msgid "Page Description"
2113
  msgstr ""
2114
 
2115
- #: includes/admin/templates/onpage/onpage-section-homepage.php:52
2116
  msgid "Page Keywords"
2117
  msgstr ""
2118
 
2119
- #: includes/admin/templates/onpage/onpage-section-homepage.php:59
2120
  msgid "Comma-separated keywords, e.g."
2121
  msgstr ""
2122
 
2123
- #: includes/admin/templates/onpage/onpage-section-homepage.php:59
2124
  msgid "word1, word2"
2125
  msgstr ""
2126
 
2127
- #: includes/admin/templates/onpage/onpage-section-homepage.php:90
2128
  msgid ""
2129
  "Your homepage is set to a static page. Configure your homepage SEO via the "
2130
  "page itself %s."
2131
  msgstr ""
2132
 
2133
- #: includes/admin/templates/onpage/onpage-section-homepage.php:94
2134
  msgid ""
2135
  "Your homepage is set to a static page. Configure your homepage SEO via the "
2136
  "page itself."
2137
  msgstr ""
2138
 
2139
  #: includes/admin/templates/onpage/onpage-section-post-type-archive.php:20
2140
- #: includes/admin/templates/onpage/onpage-settings.php:186
2141
  msgid " Archive Title"
2142
  msgstr ""
2143
 
@@ -2194,87 +2157,87 @@ msgstr ""
2194
  msgid "Customize your homepage title, description and meta."
2195
  msgstr ""
2196
 
2197
- #: includes/admin/templates/onpage/onpage-settings.php:89
2198
  msgid "Customize your %s title, description and meta."
2199
  msgstr ""
2200
 
2201
- #: includes/admin/templates/onpage/onpage-settings.php:102
2202
  msgid "Post Types"
2203
  msgstr ""
2204
 
2205
- #: includes/admin/templates/onpage/onpage-settings.php:120
2206
  msgid "Customize the title, description and meta of %s."
2207
  msgstr ""
2208
 
2209
- #: includes/admin/templates/onpage/onpage-settings.php:132
2210
  msgid "Taxonomies"
2211
  msgstr ""
2212
 
2213
- #: includes/admin/templates/onpage/onpage-settings.php:140
2214
  msgid "Author Archive"
2215
  msgstr ""
2216
 
2217
- #: includes/admin/templates/onpage/onpage-settings.php:141
2218
  msgid ""
2219
  "If you are the only author of your website content Google may see your "
2220
  "author archives as duplicate content to your Blog Homepage. If this is the "
2221
  "case we recommend disabling author archives."
2222
  msgstr ""
2223
 
2224
- #: includes/admin/templates/onpage/onpage-settings.php:151
2225
  msgid "Date Archive"
2226
  msgstr ""
2227
 
2228
- #: includes/admin/templates/onpage/onpage-settings.php:152
2229
  msgid ""
2230
  "Google may see your date archives as duplicate content to your Blog "
2231
  "Homepage. For this reason we recommend disabling date archives."
2232
  msgstr ""
2233
 
2234
- #: includes/admin/templates/onpage/onpage-settings.php:162
2235
  msgid "Search Page"
2236
  msgstr ""
2237
 
2238
- #: includes/admin/templates/onpage/onpage-settings.php:163
2239
  msgid "Customize your search page title, description and meta."
2240
  msgstr ""
2241
 
2242
- #: includes/admin/templates/onpage/onpage-settings.php:172
2243
  msgid "404 Page"
2244
  msgstr ""
2245
 
2246
- #: includes/admin/templates/onpage/onpage-settings.php:173
2247
  msgid "Customize your 404 page title, description and meta."
2248
  msgstr ""
2249
 
2250
- #: includes/admin/templates/onpage/onpage-settings.php:188
2251
  msgid ""
2252
  "Customize title, description and meta for the archive page of custom post "
2253
  "type %s."
2254
  msgstr ""
2255
 
2256
- #: includes/admin/templates/onpage/onpage-settings.php:206
2257
  msgid "Archives"
2258
  msgstr ""
2259
 
2260
- #: includes/admin/templates/onpage/onpage-settings.php:215
2261
  #: includes/admin/templates/sitemap/sitemap-buddypress-settings.php:7
2262
  msgid "BuddyPress Groups"
2263
  msgstr ""
2264
 
2265
- #: includes/admin/templates/onpage/onpage-settings.php:216
2266
  msgid "Customize your BuddyPress group title, description and meta options."
2267
  msgstr ""
2268
 
2269
- #: includes/admin/templates/onpage/onpage-settings.php:225
2270
  msgid "BuddyPress Profile"
2271
  msgstr ""
2272
 
2273
- #: includes/admin/templates/onpage/onpage-settings.php:226
2274
  msgid "Customize your BuddyPress profile title, description and meta options."
2275
  msgstr ""
2276
 
2277
- #: includes/admin/templates/onpage/onpage-settings.php:236
2278
  msgid "BuddyPress"
2279
  msgstr ""
2280
 
@@ -2437,6 +2400,14 @@ msgstr ""
2437
  msgid "Homepage Authority"
2438
  msgstr ""
2439
 
 
 
 
 
 
 
 
 
2440
  #: includes/admin/templates/settings/settings-custom-meta-tag.php:5
2441
  msgid "Paste your meta tag here"
2442
  msgstr ""
@@ -2650,6 +2621,98 @@ msgstr ""
2650
  msgid "Import / Export"
2651
  msgstr ""
2652
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2653
  #: includes/admin/templates/settings-message-top.php:52
2654
  msgid "Settings successfully imported"
2655
  msgstr ""
@@ -2914,7 +2977,7 @@ msgid "Run regular URL crawls"
2914
  msgstr ""
2915
 
2916
  #: includes/admin/templates/sitemap/sitemap-section-settings.php:33
2917
- msgid "Unable to write to sitemap file: <code>%s</code>"
2918
  msgstr ""
2919
 
2920
  #: includes/admin/templates/sitemap/sitemap-section-settings.php:44
@@ -3023,26 +3086,6 @@ msgstr ""
3023
  msgid "You must activate the Sitemap feature to use the URL crawler."
3024
  msgstr ""
3025
 
3026
- #: includes/admin/templates/sitemaps-dashboard-widget.php:5
3027
- msgid "Your sitemap contains %s."
3028
- msgstr ""
3029
-
3030
- #: includes/admin/templates/sitemaps-dashboard-widget.php:10
3031
- msgid "items"
3032
- msgstr ""
3033
-
3034
- #: includes/admin/templates/sitemaps-dashboard-widget.php:27
3035
- msgid "Last notified on %1$s, at %2$s."
3036
- msgstr ""
3037
-
3038
- #: includes/admin/templates/sitemaps-dashboard-widget.php:27
3039
- msgid "Not notified"
3040
- msgstr ""
3041
-
3042
- #: includes/admin/templates/sitemaps-dashboard-widget.php:35
3043
- msgid "Search engines haven't been recently updated."
3044
- msgstr ""
3045
-
3046
  #: includes/admin/templates/social/social-section-accounts.php:7
3047
  msgid "Website name"
3048
  msgstr ""
@@ -3223,41 +3266,41 @@ msgstr ""
3223
  msgid "Add meta data to your pages to make them look great when shared on Twitter."
3224
  msgstr ""
3225
 
3226
- #: includes/admin/templates/term-additions-form.php:1
3227
  msgid "SmartCrawl Settings "
3228
  msgstr ""
3229
 
3230
- #: includes/admin/templates/term-additions-form.php:6
3231
  msgid "The SEO title is used on the archive page for this term."
3232
  msgstr ""
3233
 
3234
- #: includes/admin/templates/term-additions-form.php:7
3235
  msgid "SEO Description"
3236
  msgstr ""
3237
 
3238
- #: includes/admin/templates/term-additions-form.php:7
3239
  msgid ""
3240
  "The SEO description is used for the meta description on the archive page "
3241
  "for this term."
3242
  msgstr ""
3243
 
3244
- #: includes/admin/templates/term-additions-form.php:8
3245
  msgid "The canonical link is shown on the archive page for this term."
3246
  msgstr ""
3247
 
3248
- #: includes/admin/templates/term-additions-form.php:11
3249
  msgid "Index this %s"
3250
  msgstr ""
3251
 
3252
- #: includes/admin/templates/term-additions-form.php:13
3253
  msgid "Noindex this %s"
3254
  msgstr ""
3255
 
3256
- #: includes/admin/templates/term-additions-form.php:17
3257
  msgid "Follow this %s"
3258
  msgstr ""
3259
 
3260
- #: includes/admin/templates/term-additions-form.php:19
3261
  msgid "Nofollow this %s"
3262
  msgstr ""
3263
 
@@ -3271,11 +3314,11 @@ msgid ""
3271
  "the term page is shared."
3272
  msgstr ""
3273
 
3274
- #: includes/admin/templates/term-additions-form.php:159
3275
  msgid "Enable Twitter Cards for this term"
3276
  msgstr ""
3277
 
3278
- #: includes/admin/templates/term-additions-form.php:213
3279
  msgid ""
3280
  "This image will be available to use as the featured image when the term "
3281
  "page is shared."
@@ -3311,7 +3354,7 @@ msgstr ""
3311
 
3312
  #: includes/admin/templates/upsell-modal.php:23
3313
  msgid ""
3314
- "A membership for Hummingbird Pro also gets you the award winning Smush Pro "
3315
  "with unlimited advanced lossy compression that’ll give image heavy websites "
3316
  "a speed boost."
3317
  msgstr ""
@@ -3340,6 +3383,40 @@ msgstr ""
3340
  msgid "You"
3341
  msgstr ""
3342
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3343
  #: includes/core/checks/class-wds-check-content-length.php:16
3344
  msgid "There is no content"
3345
  msgstr ""
@@ -3676,7 +3753,7 @@ msgid ""
3676
  msgstr ""
3677
 
3678
  #: includes/core/checks/class-wds-check-metadesc-length.php:21
3679
- msgid "Description is a good length"
3680
  msgstr ""
3681
 
3682
  #: includes/core/checks/class-wds-check-metadesc-length.php:25
@@ -3846,7 +3923,7 @@ msgid ""
3846
  msgstr ""
3847
 
3848
  #: includes/core/checks/class-wds-check-title-length.php:15
3849
- msgid "Title is a good length"
3850
  msgstr ""
3851
 
3852
  #: includes/core/checks/class-wds-check-title-length.php:19
@@ -3906,23 +3983,23 @@ msgstr ""
3906
  msgid "We encountered an error fetching your content"
3907
  msgstr ""
3908
 
3909
- #: includes/core/class-wds-controller-analysis.php:343
3910
  msgid "N/A"
3911
  msgstr ""
3912
 
3913
- #: includes/core/class-wds-controller-analysis.php:626
3914
  msgid "No Focus Keyword"
3915
  msgstr ""
3916
 
3917
- #: includes/core/class-wds-controller-analysis.php:629
3918
  msgid "Needs Improvement"
3919
  msgstr ""
3920
 
3921
- #: includes/core/class-wds-controller-analysis.php:651
3922
  msgid "SEO:"
3923
  msgstr ""
3924
 
3925
- #: includes/core/class-wds-controller-analysis.php:658
3926
  msgid "Readability:"
3927
  msgstr ""
3928
 
@@ -3980,15 +4057,15 @@ msgid ""
3980
  "support if you need further assistance."
3981
  msgstr ""
3982
 
3983
- #: includes/core/class-wds-controller-io.php:301
3984
  msgid "You don't have permission to perform this operation."
3985
  msgstr ""
3986
 
3987
- #: includes/core/class-wds-controller-io.php:306
3988
  msgid "We couldn't find any compatible data to import."
3989
  msgstr ""
3990
 
3991
- #: includes/core/class-wds-controller-io.php:350
3992
  msgid "Invalid parameters. Try refreshing the page and attempting again."
3993
  msgstr ""
3994
 
@@ -3996,6 +4073,16 @@ msgstr ""
3996
  msgid "All done, please hold on..."
3997
  msgstr ""
3998
 
 
 
 
 
 
 
 
 
 
 
3999
  #: includes/core/class-wds-controller-sitemap.php:106
4000
  msgid "The missing items have been added to your sitemap as extra URLs."
4001
  msgstr ""
@@ -4091,6 +4178,10 @@ msgstr ""
4091
  msgid "Anonymous"
4092
  msgstr ""
4093
 
 
 
 
 
4094
  #: includes/core/class-wds-settings.php:284
4095
  msgid "Title & Meta Optimization"
4096
  msgstr ""
@@ -4131,28 +4222,28 @@ msgstr ""
4131
  msgid "Sitemaps - SmartCrawl"
4132
  msgstr ""
4133
 
4134
- #: includes/tools/sitemaps-dashboard-widget.php:83
4135
  msgid "It was last updated on %1$s, at %2$s."
4136
  msgstr ""
4137
 
4138
- #: includes/tools/sitemaps-dashboard-widget.php:84
4139
  msgid "Your sitemap hasn't been updated recently."
4140
  msgstr ""
4141
 
4142
- #: includes/tools/sitemaps-dashboard-widget.php:85
4143
- msgid "Update sitemap now"
4144
  msgstr ""
4145
 
4146
- #: includes/tools/sitemaps-dashboard-widget.php:86
4147
- msgid "Force search engines notification"
4148
  msgstr ""
4149
 
4150
- #: includes/tools/sitemaps-dashboard-widget.php:87
4151
- msgid "Updating..."
4152
  msgstr ""
4153
 
4154
- #: includes/tools/sitemaps-dashboard-widget.php:88
4155
- msgid "Done updating the sitemap, please hold on..."
4156
  msgstr ""
4157
 
4158
  #. Plugin URI of the plugin/theme
@@ -4169,4 +4260,23 @@ msgstr ""
4169
 
4170
  #. Author URI of the plugin/theme
4171
  msgid "http://premium.wpmudev.org"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4172
  msgstr ""
2
  # This file is distributed under the same license as the SmartCrawl package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: SmartCrawl 2.2.4\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wpmu-dev-seo\n"
7
+ "POT-Creation-Date: 2018-12-03 18:05:21+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
  "X-Generator: grunt-wp-i18n1.0.2\n"
15
 
16
+ #: includes/admin/admin.php:134 includes/admin/settings/settings.php:248
17
  #: includes/admin/settings/settings.php:319
18
  #: includes/admin/templates/advanced-tools/advanced-tools-settings.php:49
19
+ #: includes/admin/templates/onpage/onpage-settings.php:244
20
  msgid "Settings"
21
  msgstr ""
22
 
23
+ #: includes/admin/admin.php:169
24
  msgid "Error: options page not found."
25
  msgstr ""
26
 
28
  msgid "SmartCrawl"
29
  msgstr ""
30
 
31
+ #: includes/admin/admin.php:321 includes/admin/settings/dashboard.php:32
32
  #: includes/admin/templates/dashboard/dashboard.php:18
33
  msgid "Dashboard"
34
  msgstr ""
35
 
36
+ #: includes/admin/admin.php:383
37
  msgid ""
38
  "This site discourages search engines from indexing the pages, which will "
39
  "affect your SEO efforts."
40
  msgstr ""
41
 
42
+ #: includes/admin/admin.php:384
43
  msgid "You can fix this here"
44
  msgstr ""
45
 
57
  "shorter"
58
  msgstr ""
59
 
60
+ #: includes/admin/metabox.php:137
61
+ #: includes/admin/templates/metabox/analysis-readability.php:67
62
+ #: includes/admin/templates/metabox/analysis-seo-analysis.php:24
63
  msgid "Analyzing content, please wait a few moments"
64
  msgstr ""
65
 
66
+ #: includes/admin/metabox.php:170
67
  msgid "NO ODP (Block Open Directory Project description of the page)"
68
  msgstr ""
69
 
70
+ #: includes/admin/metabox.php:171
71
  msgid "NO YDIR (Don't display the Yahoo! Directory titles and abstracts)"
72
  msgstr ""
73
 
74
+ #: includes/admin/metabox.php:172 includes/admin/metabox.php:457
75
  msgid "No Archive"
76
  msgstr ""
77
 
78
+ #: includes/admin/metabox.php:173 includes/admin/metabox.php:458
79
  msgid "No Snippet"
80
  msgstr ""
81
 
82
+ #: includes/admin/metabox.php:176
83
  msgid "Automatic prioritization"
84
  msgstr ""
85
 
86
+ #: includes/admin/metabox.php:177
87
  msgid "1 - Highest priority"
88
  msgstr ""
89
 
90
+ #: includes/admin/metabox.php:179
91
  msgid "High priority (root pages default)"
92
  msgstr ""
93
 
94
+ #: includes/admin/metabox.php:181
95
  msgid "Secondary priority (subpages default)"
96
  msgstr ""
97
 
98
+ #: includes/admin/metabox.php:182
99
  msgid "Medium priority"
100
  msgstr ""
101
 
102
+ #: includes/admin/metabox.php:186
103
  msgid "Lowest priority"
104
  msgstr ""
105
 
106
+ #: includes/admin/metabox.php:413
107
  #: includes/admin/templates/quick-edit-title.php:5
108
  msgid "Title Tag"
109
  msgstr ""
110
 
111
+ #: includes/admin/metabox.php:415
112
  msgid "Robots Meta"
113
  msgstr ""
114
 
115
+ #: includes/admin/metabox.php:436
116
  msgid "Redirects to %s"
117
  msgstr ""
118
 
119
+ #: includes/admin/metabox.php:455
120
  msgid "No ODP"
121
  msgstr ""
122
 
123
+ #: includes/admin/metabox.php:456
124
  msgid "No YDIR"
125
  msgstr ""
126
 
234
  msgid "Your description seems to be a bit on the long side, consider trimming it"
235
  msgstr ""
236
 
237
+ #: includes/admin/settings/onpage.php:526
238
  #: includes/admin/templates/sitemap/sitemap-crawl-issues-group.php:41
239
  msgid "No"
240
  msgstr ""
241
 
242
+ #: includes/admin/settings/onpage.php:527
243
  #: includes/admin/settings/sitemap.php:224
244
  #: includes/admin/settings/sitemap.php:351
245
  msgid "Yes"
246
  msgstr ""
247
 
248
+ #: includes/admin/settings/onpage.php:531
249
  #: includes/admin/settings/sitemap.php:347
250
  msgid "Google"
251
  msgstr ""
252
 
253
+ #: includes/admin/settings/onpage.php:532
254
  #: includes/admin/settings/sitemap.php:348
255
  msgid "Bing"
256
  msgstr ""
257
 
258
+ #: includes/admin/settings/onpage.php:552
259
  #: includes/admin/templates/onpage/onpage-section-settings.php:5
260
  msgid "Separator"
261
  msgstr ""
262
 
263
+ #: includes/admin/settings/onpage.php:553
264
  msgid "Date of the post/page"
265
  msgstr ""
266
 
267
+ #: includes/admin/settings/onpage.php:554
268
  msgid "Title of the post/page"
269
  msgstr ""
270
 
271
+ #: includes/admin/settings/onpage.php:555
272
  msgid "Site's name"
273
  msgstr ""
274
 
275
+ #: includes/admin/settings/onpage.php:556
276
  msgid "Site's tagline / description"
277
  msgstr ""
278
 
279
+ #: includes/admin/settings/onpage.php:557
280
  msgid "Post/page excerpt (or auto-generated if it does not exist)"
281
  msgstr ""
282
 
283
+ #: includes/admin/settings/onpage.php:558
284
  msgid "Post/page excerpt (without auto-generation)"
285
  msgstr ""
286
 
287
+ #: includes/admin/settings/onpage.php:559
288
  msgid "Current tag/tags"
289
  msgstr ""
290
 
291
+ #: includes/admin/settings/onpage.php:560
292
  msgid "Post categories (comma separated)"
293
  msgstr ""
294
 
295
+ #: includes/admin/settings/onpage.php:561
296
  msgid "Category description"
297
  msgstr ""
298
 
299
+ #: includes/admin/settings/onpage.php:562
300
  msgid "Tag description"
301
  msgstr ""
302
 
303
+ #: includes/admin/settings/onpage.php:563
304
  msgid "Term description"
305
  msgstr ""
306
 
307
+ #: includes/admin/settings/onpage.php:564
308
  msgid "Term name"
309
  msgstr ""
310
 
311
+ #: includes/admin/settings/onpage.php:565
312
  msgid "Post/page modified time"
313
  msgstr ""
314
 
315
+ #: includes/admin/settings/onpage.php:566
316
  msgid "Post/page ID"
317
  msgstr ""
318
 
319
+ #: includes/admin/settings/onpage.php:567
320
  msgid "Post/page author's 'nicename'"
321
  msgstr ""
322
 
323
+ #: includes/admin/settings/onpage.php:568
324
  msgid "Post/page author's userid"
325
  msgstr ""
326
 
327
+ #: includes/admin/settings/onpage.php:569
328
  msgid "Current search phrase"
329
  msgstr ""
330
 
331
+ #: includes/admin/settings/onpage.php:570
332
  msgid "Current time"
333
  msgstr ""
334
 
335
+ #: includes/admin/settings/onpage.php:571
336
  msgid "Current date"
337
  msgstr ""
338
 
339
+ #: includes/admin/settings/onpage.php:572
340
  msgid "Current month"
341
  msgstr ""
342
 
343
+ #: includes/admin/settings/onpage.php:573
344
  msgid "Current year"
345
  msgstr ""
346
 
347
+ #: includes/admin/settings/onpage.php:574
348
  msgid "Current page number (i.e. page 2 of 4)"
349
  msgstr ""
350
 
351
+ #: includes/admin/settings/onpage.php:575
352
  msgid "Current page total"
353
  msgstr ""
354
 
355
+ #: includes/admin/settings/onpage.php:576
356
  msgid "Current page number"
357
  msgstr ""
358
 
359
+ #: includes/admin/settings/onpage.php:577
360
  msgid "Attachment caption"
361
  msgstr ""
362
 
363
+ #: includes/admin/settings/onpage.php:578
364
+ #: includes/admin/settings/onpage.php:580
365
  msgid "Current page number, spelled out as numeral in English"
366
  msgstr ""
367
 
368
+ #: includes/admin/settings/onpage.php:579
369
  msgid "Current page total, spelled out as numeral in English"
370
  msgstr ""
371
 
372
+ #: includes/admin/settings/onpage.php:581
373
  msgid "Post type label plural"
374
  msgstr ""
375
 
376
+ #: includes/admin/settings/onpage.php:582
377
  msgid "Post type label singular"
378
  msgstr ""
379
 
380
+ #: includes/admin/settings/onpage.php:586
381
  msgid "BuddyPress group name"
382
  msgstr ""
383
 
384
+ #: includes/admin/settings/onpage.php:587
385
  msgid "BuddyPress group description"
386
  msgstr ""
387
 
388
+ #: includes/admin/settings/onpage.php:588
389
  msgid "BuddyPress username"
390
  msgstr ""
391
 
392
+ #: includes/admin/settings/onpage.php:589
393
  msgid "BuddyPress user's full name"
394
  msgstr ""
395
 
452
  msgid "Home page"
453
  msgstr ""
454
 
455
+ #: includes/admin/settings/settings.php:468
456
  #: includes/admin/templates/settings/settings-section-import-export.php:44
457
  msgid "Yoast SEO"
458
  msgstr ""
459
 
460
+ #: includes/admin/settings/settings.php:474 includes/admin/settings.php:440
461
  #: includes/admin/templates/settings/settings-section-import-export.php:52
462
  msgid "All In One SEO"
463
  msgstr ""
464
 
465
+ #: includes/admin/settings/settings.php:492
466
  msgid "auto-import"
467
  msgstr ""
468
 
469
+ #: includes/admin/settings/settings.php:495
470
  msgid ""
471
+ "We've detected you have %1$s settings. Do you want to %2$s your "
472
  "configuration into SmartCrawl?"
473
  msgstr ""
474
 
475
+ #: includes/admin/settings/settings.php:545
476
  msgid ""
477
  "We have spent countless hours developing this free plugin for you, and we "
478
  "would really appreciate it if you dropped us a quick rating."
479
  msgstr ""
480
 
481
+ #: includes/admin/settings/settings.php:547
482
  msgid "Rate SmartCrawl"
483
  msgstr ""
484
 
572
 
573
  #: includes/admin/settings.php:296 includes/admin/settings.php:360
574
  #: includes/admin/templates/advanced-tools/underscore-bulk-update-form.php:31
575
+ #: includes/admin/templates/settings/underscore-import-error.php:10
576
  #: includes/admin/templates/sitemap/sitemap-occurrences-overlay.php:39
577
  #: includes/admin/templates/sitemap/sitemap-redirect-overlay.php:59
578
  msgid "Cancel"
644
  msgid "Please select some items to edit them."
645
  msgstr ""
646
 
647
+ #: includes/admin/settings.php:439
648
+ msgid "Yoast"
649
  msgstr ""
650
 
651
+ #: includes/admin/settings.php:587
 
 
 
 
 
 
 
 
652
  msgid "Settings updated"
653
  msgstr ""
654
 
655
+ #: includes/admin/settings.php:591
656
  msgid " &amp; W3 Total Cache Page Cache flushed"
657
  msgstr ""
658
 
659
+ #: includes/admin/settings.php:594
660
  msgid " &amp; WP Super Cache flushed"
661
  msgstr ""
662
 
 
 
 
 
 
 
 
 
 
 
663
  #: includes/admin/templates/advanced-tools/advanced-section-automatic-linking-settings.php:14
664
  msgid "Min lengths"
665
  msgstr ""
778
 
779
  #: includes/admin/templates/advanced-tools/advanced-section-moz.php:21
780
  #: includes/admin/templates/onpage/onpage-og-disabled.php:10
781
+ #: includes/admin/templates/onpage/onpage-section-homepage.php:73
782
  #: includes/admin/templates/onpage/onpage-twitter-disabled.php:10
783
  #: includes/admin/templates/progress-notice.php:27
784
  #: includes/core/checks/class-wds-check-keywords-used.php:99
883
  msgid "View Documentation"
884
  msgstr ""
885
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
886
  #: includes/admin/templates/advanced-tools/advanced-tools-settings.php:33
887
  msgid "Activate Keyword Linking"
888
  msgstr ""
968
 
969
  #: includes/admin/templates/advanced-tools/advanced-tools-settings.php:99
970
  #: includes/admin/templates/dashboard/dashboard-widget-advanced-tools.php:64
971
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:155
972
  #: includes/admin/templates/upsell-modal.php:18
973
  msgid "Automatic Linking"
974
  msgstr ""
1000
  msgstr ""
1001
 
1002
  #: includes/admin/templates/checkup/checkup-checkup-results.php:53
1003
+ #: includes/admin/templates/metabox/analysis-seo-analysis.php:72
1004
  msgid "Recommendation"
1005
  msgstr ""
1006
 
1007
  #: includes/admin/templates/checkup/checkup-checkup-results.php:62
1008
+ #: includes/admin/templates/metabox/analysis-seo-analysis.php:80
1009
  msgid "More Info"
1010
  msgstr ""
1011
 
1012
  #: includes/admin/templates/checkup/checkup-checkup-results.php:77
1013
  msgid ""
1014
  "Grab the Pro version of SmartCrawl to unlock unlimited SEO Checkups plus "
1015
+ "automated scheduled reports to always stay on top of any issues. These "
1016
+ "features are included in a WPMU DEV membership along with 100+ plugins, "
1017
+ "24/7 support and lots of handy site management tools."
1018
  msgstr ""
1019
 
1020
  #: includes/admin/templates/checkup/checkup-checkup-results.php:78
1186
  #: includes/admin/templates/dashboard/dashboard-content-analysis-seo-overview.php:32
1187
  #: includes/admin/templates/dashboard/dashboard-content-analysis-seo-overview.php:57
1188
  #: includes/admin/templates/post-list/post-seo-analysis-good.php:2
1189
+ #: includes/core/class-wds-controller-analysis.php:638
1190
  msgid "Good"
1191
  msgstr ""
1192
 
1352
  msgstr ""
1353
 
1354
  #: includes/admin/templates/dashboard/dashboard-widget-content-analysis.php:40
1355
+ #: includes/admin/templates/metabox/metabox-seo-analysis-container.php:13
1356
  msgid "SEO Analysis"
1357
  msgstr ""
1358
 
1380
  msgstr ""
1381
 
1382
  #: includes/admin/templates/dashboard/dashboard-widget-onpage.php:23
1383
+ #: includes/admin/templates/metabox/metabox-tab-social.php:58
1384
  msgid "Titles & Meta"
1385
  msgstr ""
1386
 
1479
 
1480
  #: includes/admin/templates/dashboard/dashboard-widget-social.php:38
1481
  #: includes/admin/templates/dashboard/onboarding.php:57
1482
+ #: includes/admin/templates/metabox/metabox-tab-social.php:67
1483
  #: includes/admin/templates/social/social-settings.php:40
1484
+ #: includes/admin/templates/term-additions-form.php:34
1485
  msgid "OpenGraph"
1486
  msgstr ""
1487
 
1533
  #: includes/admin/templates/dashboard/onboarding.php:5
1534
  msgid ""
1535
  "Welcome to SmartCrawl, the hottest SEO plugin for WordPress! Let's quickly "
1536
+ "set up the basics for you, then you can fine tune each setting as you go - "
1537
  "our recommendations are on by default."
1538
  msgstr ""
1539
 
1659
  msgstr ""
1660
 
1661
  #: includes/admin/templates/metabox/analysis-readability.php:60
1662
+ #: includes/admin/templates/metabox/metabox-seo-analysis-container.php:18
1663
  msgid "Refresh"
1664
  msgstr ""
1665
 
1666
+ #: includes/admin/templates/metabox/analysis-readability.php:76
1667
  msgid "Flesch-Kincaid Test"
1668
  msgstr ""
1669
 
1670
+ #: includes/admin/templates/metabox/analysis-readability.php:84
1671
+ #: includes/admin/templates/metabox/analysis-seo-analysis.php:64
1672
  #: includes/admin/templates/sitemap/sitemap-crawl-issue-ignored.php:24
1673
  msgid "Restore"
1674
  msgstr ""
1675
 
1676
+ #: includes/admin/templates/metabox/analysis-readability.php:94
1677
  #: includes/admin/templates/sitemap/sitemap-crawl-issues-group.php:45
1678
  msgid "Overview"
1679
  msgstr ""
1680
 
1681
+ #: includes/admin/templates/metabox/analysis-readability.php:95
1682
  msgid ""
1683
  "The Flesch-Kincaid readability tests are readability tests designed to "
1684
  "indicate how difficult a passage in English is to understand. Here are the "
1685
  "benchmarks."
1686
  msgstr ""
1687
 
1688
+ #: includes/admin/templates/metabox/analysis-readability.php:99
1689
  msgid "Score"
1690
  msgstr ""
1691
 
1692
+ #: includes/admin/templates/metabox/analysis-readability.php:100
1693
+ #: includes/admin/templates/metabox/metabox-meta-edit-form.php:37
1694
  #: includes/admin/templates/metabox/metabox-social-meta-tags.php:51
1695
  #: includes/admin/templates/onpage/onpage-social-meta-tags.php:64
1696
  #: includes/admin/templates/term-additions-form.php:88
1697
+ #: includes/admin/templates/term-additions-form.php:184
1698
  msgid "Description"
1699
  msgstr ""
1700
 
1701
+ #: includes/admin/templates/metabox/analysis-readability.php:118
1702
  msgid "How to fix"
1703
  msgstr ""
1704
 
1705
+ #: includes/admin/templates/metabox/analysis-readability.php:119
1706
  msgid ""
1707
  "Try to use shorter sentences, with less difficult words to improve "
1708
  "readability."
1709
  msgstr ""
1710
 
1711
+ #: includes/admin/templates/metabox/analysis-readability.php:125
1712
+ #: includes/admin/templates/metabox/analysis-seo-analysis.php:92
1713
  #: includes/admin/templates/sitemap/sitemap-crawl-issue-generic.php:39
1714
  #: includes/admin/templates/sitemap/sitemap-crawl-issue-sitemap.php:29
1715
  msgid "Ignore"
1716
  msgstr ""
1717
 
1718
  #: includes/admin/templates/metabox/analysis-seo-analysis.php:14
1719
+ #: includes/core/class-wds-controller-analysis.php:351
1720
  msgid "You need to add focus keywords to see recommendations for this article."
1721
  msgstr ""
1722
 
1723
+ #: includes/admin/templates/metabox/analysis-seo-analysis.php:32
1724
  msgid ""
1725
  "You have %d SEO recommendations. We recommend you satisfy as many "
1726
  "improvements as possible to ensure your content gets found."
1727
  msgstr ""
1728
 
1729
+ #: includes/admin/templates/metabox/analysis-seo-analysis.php:34
1730
  msgid "You have optimized your SEO to the max. Bravo!"
1731
  msgstr ""
1732
 
1733
  #: includes/admin/templates/metabox/analysis.php:2
1734
+ #: includes/admin/templates/metabox/metabox-seo-analysis-container.php:48
1735
  #: includes/admin/templates/metabox/metabox-tab-readability.php:6
1736
  msgid "Reload"
1737
  msgstr ""
1738
 
1739
+ #: includes/admin/templates/metabox/metabox-dummy-preview.php:2
1740
+ #: includes/admin/templates/metabox/metabox-preview.php:22
1741
+ msgid "Google Preview"
1742
+ msgstr ""
1743
+
1744
  #: includes/admin/templates/metabox/metabox-main.php:25
1745
+ #: includes/core/class-wds-controller-analysis.php:291
1746
  msgid "SEO"
1747
  msgstr ""
1748
 
1749
  #: includes/admin/templates/metabox/metabox-main.php:26
1750
+ #: includes/core/class-wds-controller-analysis.php:294
1751
  msgid "Readability"
1752
  msgstr ""
1753
 
1754
  #: includes/admin/templates/metabox/metabox-main.php:30
1755
+ #: includes/admin/templates/settings/underscore-import-options.php:37
1756
  #: includes/admin/templates/sitemap/sitemap-settings.php:135
1757
  msgid "Advanced"
1758
  msgstr ""
1759
 
1760
+ #: includes/admin/templates/metabox/metabox-meta-edit-form.php:11
1761
  msgid "Edit Meta"
1762
  msgstr ""
1763
 
1764
+ #: includes/admin/templates/metabox/metabox-meta-edit-form.php:21
1765
+ #: includes/admin/templates/term-additions-form.php:10
1766
  msgid "SEO Title"
1767
  msgstr ""
1768
 
1769
+ #: includes/admin/templates/metabox/metabox-meta-edit-form.php:22
1770
  msgid "- Include your focus keywords. 50-%d characters recommended."
1771
  msgstr ""
1772
 
1773
+ #: includes/admin/templates/metabox/metabox-meta-edit-form.php:38
1774
  msgid "- Recommended minimum of 135 characters, maximum %d."
1775
  msgstr ""
1776
 
1777
+ #: includes/admin/templates/metabox/metabox-meta-edit-form.php:52
1778
  msgid "Keywords"
1779
  msgstr ""
1780
 
1781
+ #: includes/admin/templates/metabox/metabox-meta-edit-form.php:53
1782
+ #: includes/admin/templates/metabox/metabox-meta-edit-form.php:68
1783
  msgid "- Try to avoid stop words like ‘and’ and ‘the’ which search engines ignore."
1784
  msgstr ""
1785
 
1786
+ #: includes/admin/templates/metabox/metabox-meta-edit-form.php:67
1787
  msgid "News Keywords"
1788
  msgstr ""
1789
 
1790
+ #: includes/admin/templates/metabox/metabox-meta-edit-form.php:84
1791
  msgid "Tags As Keywords"
1792
  msgstr ""
1793
 
1794
+ #: includes/admin/templates/metabox/metabox-meta-edit-form.php:85
1795
  msgid ""
1796
  "If you enable using tags, post tags will be merged in with any other "
1797
  "keywords you enter in the text box."
1798
  msgstr ""
1799
 
1800
+ #: includes/admin/templates/metabox/metabox-seo-analysis-container.php:25
 
 
 
 
 
 
 
 
 
 
 
 
1801
  msgid ""
1802
  "This tool helps you optimize your content to give it the best chance of "
1803
  "being found in search engines when people are looking for it. Start by "
1806
  "highly optimized."
1807
  msgstr ""
1808
 
1809
+ #: includes/admin/templates/metabox/metabox-seo-analysis-container.php:33
1810
  msgid "Focus keyword"
1811
  msgstr ""
1812
 
1813
+ #: includes/admin/templates/metabox/metabox-seo-analysis-container.php:34
1814
  msgid ""
1815
  "- Choose a single word, phrase or part of a sentence that people will "
1816
  "likely search for."
1817
  msgstr ""
1818
 
1819
+ #: includes/admin/templates/metabox/metabox-seo-analysis-container.php:43
1820
  msgid "E.g. broken iphone screen"
1821
  msgstr ""
1822
 
1829
  #: includes/admin/templates/onpage/onpage-settings.php:28
1830
  #: includes/admin/templates/onpage/onpage-social-meta-tags.php:48
1831
  #: includes/admin/templates/term-additions-form.php:74
1832
+ #: includes/admin/templates/term-additions-form.php:170
1833
  msgid "Title"
1834
  msgstr ""
1835
 
1836
  #: includes/admin/templates/metabox/metabox-social-meta-tags.php:64
1837
+ #: includes/admin/templates/term-additions-form.php:196
1838
  msgid "Featured Image"
1839
  msgstr ""
1840
 
1846
  #: includes/admin/templates/metabox/metabox-social-meta-tags.php:72
1847
  #: includes/admin/templates/onpage/onpage-social-meta-tags.php:94
1848
  #: includes/admin/templates/term-additions-form.php:105
1849
+ #: includes/admin/templates/term-additions-form.php:202
1850
  msgid "Add image"
1851
  msgstr ""
1852
 
1860
  "the post is shared."
1861
  msgstr ""
1862
 
1863
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:24
1864
  #: includes/admin/templates/onpage/onpage-meta-robots.php:11
1865
  msgid "Indexing"
1866
  msgstr ""
1867
 
1868
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:26
1869
  msgid "Choose how search engines will index this particular page."
1870
  msgstr ""
1871
 
1872
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:36
1873
  msgid "Index - Override Post Type Setting"
1874
  msgstr ""
1875
 
1876
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:37
1877
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:46
1878
  msgid ""
1879
  "Instruct search engines whether or not you want this post to appear in "
1880
  "search results."
1881
  msgstr ""
1882
 
1883
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:45
1884
  msgid "Index"
1885
  msgstr ""
1886
 
1887
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:55
1888
  msgid "Follow - Override Post Type Setting"
1889
  msgstr ""
1890
 
1891
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:56
1892
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:65
1893
  msgid ""
1894
  "Tells search engines whether or not to follow the links on your page and "
1895
  "crawl them too."
1896
  msgstr ""
1897
 
1898
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:64
1899
  msgid "Follow"
1900
  msgstr ""
1901
 
1902
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:75
1903
  msgid "Archive"
1904
  msgstr ""
1905
 
1906
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:76
1907
  msgid "Instructs search engines to store a cached version of this page."
1908
  msgstr ""
1909
 
1910
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:85
1911
  msgid "Snippet"
1912
  msgstr ""
1913
 
1914
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:86
1915
  msgid ""
1916
  "Allows search engines to show a snippet of this page in the search results "
1917
  "and prevents them from caching the page."
1918
  msgstr ""
1919
 
1920
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:96
1921
+ #: includes/admin/templates/term-additions-form.php:12
1922
  msgid "Canonical"
1923
  msgstr ""
1924
 
1925
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:98
1926
  msgid ""
1927
  "If you have several similar versions of this page you can point search "
1928
  "engines to the canonical or \"genuine\" version to avoid duplicate content "
1929
  "issues."
1930
  msgstr ""
1931
 
1932
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:106
1933
  msgid "Enter the full canonical URL including http:// or https://"
1934
  msgstr ""
1935
 
1936
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:114
1937
  msgid "301 Redirect"
1938
  msgstr ""
1939
 
1940
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:116
1941
  msgid "Send visitors to this URL to another page."
1942
  msgstr ""
1943
 
1944
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:123
1945
  msgid "Enter the URL to send traffic to including http:// or https://"
1946
  msgstr ""
1947
 
1948
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:132
1949
  msgid "Sitemap Priority"
1950
  msgstr ""
1951
 
1952
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:158
1953
  msgid "You can prevent this particular post from being auto-linked"
1954
  msgstr ""
1955
 
1956
+ #: includes/admin/templates/metabox/metabox-tab-advanced.php:167
1957
  msgid "Enable automatic linking for this post"
1958
  msgstr ""
1959
 
1980
  msgid "= 70+"
1981
  msgstr ""
1982
 
1983
+ #: includes/admin/templates/metabox/metabox-tab-social.php:54
1984
  msgid ""
1985
  "Customize this posts title, description and featured images for social "
1986
  "shares. You can also configure the default settings for this post type in "
1987
  "SmartCrawl's %s area."
1988
  msgstr ""
1989
 
1990
+ #: includes/admin/templates/metabox/metabox-tab-social.php:68
1991
  msgid "OpenGraph is used on many social networks such as Facebook."
1992
  msgstr ""
1993
 
1994
+ #: includes/admin/templates/metabox/metabox-tab-social.php:85
1995
  #: includes/admin/templates/term-additions-form.php:133
1996
  msgid "Twitter"
1997
  msgstr ""
1998
 
1999
+ #: includes/admin/templates/metabox/metabox-tab-social.php:86
2000
  msgid "These details will be used in Twitter cards."
2001
  msgstr ""
2002
 
2067
  msgid "Date Archives Meta Description"
2068
  msgstr ""
2069
 
2070
+ #: includes/admin/templates/onpage/onpage-section-homepage.php:16
2071
  msgid "Page Title"
2072
  msgstr ""
2073
 
2074
+ #: includes/admin/templates/onpage/onpage-section-homepage.php:29
2075
  msgid "Page Description"
2076
  msgstr ""
2077
 
2078
+ #: includes/admin/templates/onpage/onpage-section-homepage.php:43
2079
  msgid "Page Keywords"
2080
  msgstr ""
2081
 
2082
+ #: includes/admin/templates/onpage/onpage-section-homepage.php:50
2083
  msgid "Comma-separated keywords, e.g."
2084
  msgstr ""
2085
 
2086
+ #: includes/admin/templates/onpage/onpage-section-homepage.php:50
2087
  msgid "word1, word2"
2088
  msgstr ""
2089
 
2090
+ #: includes/admin/templates/onpage/onpage-section-homepage.php:81
2091
  msgid ""
2092
  "Your homepage is set to a static page. Configure your homepage SEO via the "
2093
  "page itself %s."
2094
  msgstr ""
2095
 
2096
+ #: includes/admin/templates/onpage/onpage-section-homepage.php:85
2097
  msgid ""
2098
  "Your homepage is set to a static page. Configure your homepage SEO via the "
2099
  "page itself."
2100
  msgstr ""
2101
 
2102
  #: includes/admin/templates/onpage/onpage-section-post-type-archive.php:20
2103
+ #: includes/admin/templates/onpage/onpage-settings.php:184
2104
  msgid " Archive Title"
2105
  msgstr ""
2106
 
2157
  msgid "Customize your homepage title, description and meta."
2158
  msgstr ""
2159
 
2160
+ #: includes/admin/templates/onpage/onpage-settings.php:87
2161
  msgid "Customize your %s title, description and meta."
2162
  msgstr ""
2163
 
2164
+ #: includes/admin/templates/onpage/onpage-settings.php:100
2165
  msgid "Post Types"
2166
  msgstr ""
2167
 
2168
+ #: includes/admin/templates/onpage/onpage-settings.php:118
2169
  msgid "Customize the title, description and meta of %s."
2170
  msgstr ""
2171
 
2172
+ #: includes/admin/templates/onpage/onpage-settings.php:130
2173
  msgid "Taxonomies"
2174
  msgstr ""
2175
 
2176
+ #: includes/admin/templates/onpage/onpage-settings.php:138
2177
  msgid "Author Archive"
2178
  msgstr ""
2179
 
2180
+ #: includes/admin/templates/onpage/onpage-settings.php:139
2181
  msgid ""
2182
  "If you are the only author of your website content Google may see your "
2183
  "author archives as duplicate content to your Blog Homepage. If this is the "
2184
  "case we recommend disabling author archives."
2185
  msgstr ""
2186
 
2187
+ #: includes/admin/templates/onpage/onpage-settings.php:149
2188
  msgid "Date Archive"
2189
  msgstr ""
2190
 
2191
+ #: includes/admin/templates/onpage/onpage-settings.php:150
2192
  msgid ""
2193
  "Google may see your date archives as duplicate content to your Blog "
2194
  "Homepage. For this reason we recommend disabling date archives."
2195
  msgstr ""
2196
 
2197
+ #: includes/admin/templates/onpage/onpage-settings.php:160
2198
  msgid "Search Page"
2199
  msgstr ""
2200
 
2201
+ #: includes/admin/templates/onpage/onpage-settings.php:161
2202
  msgid "Customize your search page title, description and meta."
2203
  msgstr ""
2204
 
2205
+ #: includes/admin/templates/onpage/onpage-settings.php:170
2206
  msgid "404 Page"
2207
  msgstr ""
2208
 
2209
+ #: includes/admin/templates/onpage/onpage-settings.php:171
2210
  msgid "Customize your 404 page title, description and meta."
2211
  msgstr ""
2212
 
2213
+ #: includes/admin/templates/onpage/onpage-settings.php:186
2214
  msgid ""
2215
  "Customize title, description and meta for the archive page of custom post "
2216
  "type %s."
2217
  msgstr ""
2218
 
2219
+ #: includes/admin/templates/onpage/onpage-settings.php:204
2220
  msgid "Archives"
2221
  msgstr ""
2222
 
2223
+ #: includes/admin/templates/onpage/onpage-settings.php:213
2224
  #: includes/admin/templates/sitemap/sitemap-buddypress-settings.php:7
2225
  msgid "BuddyPress Groups"
2226
  msgstr ""
2227
 
2228
+ #: includes/admin/templates/onpage/onpage-settings.php:214
2229
  msgid "Customize your BuddyPress group title, description and meta options."
2230
  msgstr ""
2231
 
2232
+ #: includes/admin/templates/onpage/onpage-settings.php:223
2233
  msgid "BuddyPress Profile"
2234
  msgstr ""
2235
 
2236
+ #: includes/admin/templates/onpage/onpage-settings.php:224
2237
  msgid "Customize your BuddyPress profile title, description and meta options."
2238
  msgstr ""
2239
 
2240
+ #: includes/admin/templates/onpage/onpage-settings.php:234
2241
  msgid "BuddyPress"
2242
  msgstr ""
2243
 
2400
  msgid "Homepage Authority"
2401
  msgstr ""
2402
 
2403
+ #: includes/admin/templates/settings/import-status-modal.php:3
2404
+ #: includes/admin/templates/settings/settings-section-import-export.php:16
2405
+ #: includes/admin/templates/settings/settings-section-import-export.php:34
2406
+ #: includes/admin/templates/settings/settings-section-import-export.php:47
2407
+ #: includes/admin/templates/settings/settings-section-import-export.php:55
2408
+ msgid "Import"
2409
+ msgstr ""
2410
+
2411
  #: includes/admin/templates/settings/settings-custom-meta-tag.php:5
2412
  msgid "Paste your meta tag here"
2413
  msgstr ""
2621
  msgid "Import / Export"
2622
  msgstr ""
2623
 
2624
+ #: includes/admin/templates/settings/underscore-import-error.php:1
2625
+ msgid ""
2626
+ "We have encountered an error while importing your data. You may retry the "
2627
+ "import or contact our support if the problem persists."
2628
+ msgstr ""
2629
+
2630
+ #: includes/admin/templates/settings/underscore-import-error.php:14
2631
+ msgid "Try Again"
2632
+ msgstr ""
2633
+
2634
+ #: includes/admin/templates/settings/underscore-import-options.php:2
2635
+ msgid "Choose what you'd like to import from %s."
2636
+ msgstr ""
2637
+
2638
+ #: includes/admin/templates/settings/underscore-import-options.php:8
2639
+ msgid "Plugin Options"
2640
+ msgstr ""
2641
+
2642
+ #: includes/admin/templates/settings/underscore-import-options.php:9
2643
+ msgid "Import %s settings that are relevant to SmartCrawl."
2644
+ msgstr ""
2645
+
2646
+ #: includes/admin/templates/settings/underscore-import-options.php:18
2647
+ msgid "Term Meta"
2648
+ msgstr ""
2649
+
2650
+ #: includes/admin/templates/settings/underscore-import-options.php:19
2651
+ msgid ""
2652
+ "Import your title & meta settings for categories, tags and custom "
2653
+ "taxonomies."
2654
+ msgstr ""
2655
+
2656
+ #: includes/admin/templates/settings/underscore-import-options.php:30
2657
+ msgid "Post Meta"
2658
+ msgstr ""
2659
+
2660
+ #: includes/admin/templates/settings/underscore-import-options.php:31
2661
+ msgid "Import your title & meta settings for posts and pages."
2662
+ msgstr ""
2663
+
2664
+ #: includes/admin/templates/settings/underscore-import-options.php:44
2665
+ msgid "Keep Existing Post Meta"
2666
+ msgstr ""
2667
+
2668
+ #: includes/admin/templates/settings/underscore-import-options.php:45
2669
+ msgid ""
2670
+ "If you have already set up SmartCrawl on some posts and pages then enable "
2671
+ "this option to keep those values from getting overwritten."
2672
+ msgstr ""
2673
+
2674
+ #: includes/admin/templates/settings/underscore-import-options.php:55
2675
+ msgid "Begin Import"
2676
+ msgstr ""
2677
+
2678
+ #: includes/admin/templates/settings/underscore-import-options.php:59
2679
+ msgid ""
2680
+ "Note: Importing can take a while if you have a large amount of content on "
2681
+ "your website."
2682
+ msgstr ""
2683
+
2684
+ #: includes/admin/templates/settings/underscore-import-progress.php:1
2685
+ msgid "Importing your %s settings, please keep this window open …"
2686
+ msgstr ""
2687
+
2688
+ #: includes/admin/templates/settings/underscore-import-progress.php:4
2689
+ msgid "Overall Progress"
2690
+ msgstr ""
2691
+
2692
+ #: includes/admin/templates/settings/underscore-import-progress.php:12
2693
+ msgid "Current Subsite"
2694
+ msgstr ""
2695
+
2696
+ #: includes/admin/templates/settings/underscore-import-success.php:1
2697
+ msgid "All done!"
2698
+ msgstr ""
2699
+
2700
+ #: includes/admin/templates/settings/underscore-import-success.php:4
2701
+ msgid "Your %s settings have been imported successfully and are now active."
2702
+ msgstr ""
2703
+
2704
+ #: includes/admin/templates/settings/underscore-import-success.php:6
2705
+ msgid "We highly recommend you deactivate %s to avoid potential conflicts."
2706
+ msgstr ""
2707
+
2708
+ #: includes/admin/templates/settings/underscore-import-success.php:13
2709
+ msgid "Close"
2710
+ msgstr ""
2711
+
2712
+ #: includes/admin/templates/settings/underscore-import-success.php:18
2713
+ msgid "Deactivate"
2714
+ msgstr ""
2715
+
2716
  #: includes/admin/templates/settings-message-top.php:52
2717
  msgid "Settings successfully imported"
2718
  msgstr ""
2977
  msgstr ""
2978
 
2979
  #: includes/admin/templates/sitemap/sitemap-section-settings.php:33
2980
+ msgid "Unable to write to sitemap file: %s"
2981
  msgstr ""
2982
 
2983
  #: includes/admin/templates/sitemap/sitemap-section-settings.php:44
3086
  msgid "You must activate the Sitemap feature to use the URL crawler."
3087
  msgstr ""
3088
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3089
  #: includes/admin/templates/social/social-section-accounts.php:7
3090
  msgid "Website name"
3091
  msgstr ""
3266
  msgid "Add meta data to your pages to make them look great when shared on Twitter."
3267
  msgstr ""
3268
 
3269
+ #: includes/admin/templates/term-additions-form.php:5
3270
  msgid "SmartCrawl Settings "
3271
  msgstr ""
3272
 
3273
+ #: includes/admin/templates/term-additions-form.php:10
3274
  msgid "The SEO title is used on the archive page for this term."
3275
  msgstr ""
3276
 
3277
+ #: includes/admin/templates/term-additions-form.php:11
3278
  msgid "SEO Description"
3279
  msgstr ""
3280
 
3281
+ #: includes/admin/templates/term-additions-form.php:11
3282
  msgid ""
3283
  "The SEO description is used for the meta description on the archive page "
3284
  "for this term."
3285
  msgstr ""
3286
 
3287
+ #: includes/admin/templates/term-additions-form.php:12
3288
  msgid "The canonical link is shown on the archive page for this term."
3289
  msgstr ""
3290
 
3291
+ #: includes/admin/templates/term-additions-form.php:15
3292
  msgid "Index this %s"
3293
  msgstr ""
3294
 
3295
+ #: includes/admin/templates/term-additions-form.php:17
3296
  msgid "Noindex this %s"
3297
  msgstr ""
3298
 
3299
+ #: includes/admin/templates/term-additions-form.php:21
3300
  msgid "Follow this %s"
3301
  msgstr ""
3302
 
3303
+ #: includes/admin/templates/term-additions-form.php:23
3304
  msgid "Nofollow this %s"
3305
  msgstr ""
3306
 
3314
  "the term page is shared."
3315
  msgstr ""
3316
 
3317
+ #: includes/admin/templates/term-additions-form.php:162
3318
  msgid "Enable Twitter Cards for this term"
3319
  msgstr ""
3320
 
3321
+ #: includes/admin/templates/term-additions-form.php:216
3322
  msgid ""
3323
  "This image will be available to use as the featured image when the term "
3324
  "page is shared."
3354
 
3355
  #: includes/admin/templates/upsell-modal.php:23
3356
  msgid ""
3357
+ "A membership for SmartCrawl Pro also gets you the award winning Smush Pro "
3358
  "with unlimited advanced lossy compression that’ll give image heavy websites "
3359
  "a speed boost."
3360
  msgstr ""
3383
  msgid "You"
3384
  msgstr ""
3385
 
3386
+ #: includes/admin/templates/wp-dashboard/sitemaps-widget.php:15
3387
+ msgid "Your sitemap contains %s."
3388
+ msgstr ""
3389
+
3390
+ #: includes/admin/templates/wp-dashboard/sitemaps-widget.php:20
3391
+ msgid "items"
3392
+ msgstr ""
3393
+
3394
+ #: includes/admin/templates/wp-dashboard/sitemaps-widget.php:29
3395
+ msgid "Update sitemap now"
3396
+ msgstr ""
3397
+
3398
+ #: includes/admin/templates/wp-dashboard/sitemaps-widget.php:41
3399
+ msgid "Last notified on %1$s, at %2$s."
3400
+ msgstr ""
3401
+
3402
+ #: includes/admin/templates/wp-dashboard/sitemaps-widget.php:41
3403
+ msgid "Not notified"
3404
+ msgstr ""
3405
+
3406
+ #: includes/admin/templates/wp-dashboard/sitemaps-widget.php:51
3407
+ msgid "Search engines haven't been recently updated."
3408
+ msgstr ""
3409
+
3410
+ #: includes/admin/templates/wp-dashboard/sitemaps-widget.php:57
3411
+ msgid "Force search engines notification"
3412
+ msgstr ""
3413
+
3414
+ #: includes/admin/templates/wp-dashboard/sitemaps-widget.php:61
3415
+ msgid ""
3416
+ "Search engine notifications are disabled. You can enable them in the "
3417
+ "sitemap settings."
3418
+ msgstr ""
3419
+
3420
  #: includes/core/checks/class-wds-check-content-length.php:16
3421
  msgid "There is no content"
3422
  msgstr ""
3753
  msgstr ""
3754
 
3755
  #: includes/core/checks/class-wds-check-metadesc-length.php:21
3756
+ msgid "Description has a good length"
3757
  msgstr ""
3758
 
3759
  #: includes/core/checks/class-wds-check-metadesc-length.php:25
3923
  msgstr ""
3924
 
3925
  #: includes/core/checks/class-wds-check-title-length.php:15
3926
+ msgid "Title has a good length"
3927
  msgstr ""
3928
 
3929
  #: includes/core/checks/class-wds-check-title-length.php:19
3983
  msgid "We encountered an error fetching your content"
3984
  msgstr ""
3985
 
3986
+ #: includes/core/class-wds-controller-analysis.php:339
3987
  msgid "N/A"
3988
  msgstr ""
3989
 
3990
+ #: includes/core/class-wds-controller-analysis.php:632
3991
  msgid "No Focus Keyword"
3992
  msgstr ""
3993
 
3994
+ #: includes/core/class-wds-controller-analysis.php:635
3995
  msgid "Needs Improvement"
3996
  msgstr ""
3997
 
3998
+ #: includes/core/class-wds-controller-analysis.php:657
3999
  msgid "SEO:"
4000
  msgstr ""
4001
 
4002
+ #: includes/core/class-wds-controller-analysis.php:664
4003
  msgid "Readability:"
4004
  msgstr ""
4005
 
4057
  "support if you need further assistance."
4058
  msgstr ""
4059
 
4060
+ #: includes/core/class-wds-controller-io.php:299
4061
  msgid "You don't have permission to perform this operation."
4062
  msgstr ""
4063
 
4064
+ #: includes/core/class-wds-controller-io.php:304
4065
  msgid "We couldn't find any compatible data to import."
4066
  msgstr ""
4067
 
4068
+ #: includes/core/class-wds-controller-io.php:347
4069
  msgid "Invalid parameters. Try refreshing the page and attempting again."
4070
  msgstr ""
4071
 
4073
  msgid "All done, please hold on..."
4074
  msgstr ""
4075
 
4076
+ #: includes/core/class-wds-controller-pointers.php:125
4077
+ msgid "Optimize your SEO"
4078
+ msgstr ""
4079
+
4080
+ #: includes/core/class-wds-controller-pointers.php:126
4081
+ msgid ""
4082
+ "Configure your SEO Titles & Meta, enable OpenGraph and activate readability "
4083
+ "analysis here."
4084
+ msgstr ""
4085
+
4086
  #: includes/core/class-wds-controller-sitemap.php:106
4087
  msgid "The missing items have been added to your sitemap as extra URLs."
4088
  msgstr ""
4178
  msgid "Anonymous"
4179
  msgstr ""
4180
 
4181
+ #: includes/core/class-wds-replacement-helper.php:116
4182
+ msgid "Page %1$s of %2$s"
4183
+ msgstr ""
4184
+
4185
  #: includes/core/class-wds-settings.php:284
4186
  msgid "Title & Meta Optimization"
4187
  msgstr ""
4222
  msgid "Sitemaps - SmartCrawl"
4223
  msgstr ""
4224
 
4225
+ #: includes/tools/sitemaps-dashboard-widget.php:81
4226
  msgid "It was last updated on %1$s, at %2$s."
4227
  msgstr ""
4228
 
4229
+ #: includes/tools/sitemaps-dashboard-widget.php:82
4230
  msgid "Your sitemap hasn't been updated recently."
4231
  msgstr ""
4232
 
4233
+ #: includes/tools/sitemaps-dashboard-widget.php:96
4234
+ msgid "Updating..."
4235
  msgstr ""
4236
 
4237
+ #: includes/tools/sitemaps-dashboard-widget.php:97
4238
+ msgid "Done updating the sitemap, please hold on..."
4239
  msgstr ""
4240
 
4241
+ #: includes/tools/sitemaps-dashboard-widget.php:98
4242
+ msgid "Notifying..."
4243
  msgstr ""
4244
 
4245
+ #: includes/tools/sitemaps-dashboard-widget.php:99
4246
+ msgid "Done notifying search engines, please hold on..."
4247
  msgstr ""
4248
 
4249
  #. Plugin URI of the plugin/theme
4260
 
4261
  #. Author URI of the plugin/theme
4262
  msgid "http://premium.wpmudev.org"
4263
+ msgstr ""
4264
+
4265
+ #: includes/admin/templates/advanced-tools/advanced-tools-settings.php:26
4266
+ msgctxt "part of a larger text"
4267
+ msgid ""
4268
+ "Configure SmartCrawl to automatically link certain key words to a page on "
4269
+ "your blog or even"
4270
+ msgstr ""
4271
+
4272
+ #: includes/admin/templates/advanced-tools/advanced-tools-settings.php:27
4273
+ msgctxt "part of a larger text"
4274
+ msgid ""
4275
+ "a whole new site all together. Internal linking can help boost SEO by "
4276
+ "giving search engines"
4277
+ msgstr ""
4278
+
4279
+ #: includes/admin/templates/advanced-tools/advanced-tools-settings.php:28
4280
+ msgctxt "part of a larger text"
4281
+ msgid "ample ways to index your site."
4282
  msgstr ""
readme.txt CHANGED
@@ -7,7 +7,7 @@ Author URI: https://premium.wpmudev.org/
7
  Author: WPMU DEV
8
  Requires at least: 4.6
9
  Tested up to: 4.9.8
10
- Stable tag: 2.2.2.5
11
 
12
  The SEO checker and optimization tool that helps you rank higher and get discovered in search engines.
13
 
@@ -86,6 +86,78 @@ SmartCrawl works with any normal WP content and page builders shouldn’t be an
86
 
87
  == Changelog ==
88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  = 2.2.2.5 =
90
 
91
  * Fix: reverted 2.2.2.4 changes causing WSOD on some sites
7
  Author: WPMU DEV
8
  Requires at least: 4.6
9
  Tested up to: 4.9.8
10
+ Stable tag: 2.2.4
11
 
12
  The SEO checker and optimization tool that helps you rank higher and get discovered in search engines.
13
 
86
 
87
  == Changelog ==
88
 
89
+ = 2.2.4 =
90
+
91
+ * New: URL redirection to external domains
92
+
93
+ * Fix: SEO and readability analysis of password-protected posts
94
+ * Fix: sitemap throws error if there's an image with ampersand sign
95
+ * Fix: metabox showing details from other posts when globals modified
96
+ * Fix: better autolinks compatibility with unicode languages
97
+ * Fix: code improvements for sitemap dashboard
98
+ * Fix: twitter and OG issues on static posts page
99
+ * Fix: third-party import notice appears for very old data
100
+ * Fix: conflicts on woocommerce shop page
101
+
102
+ = 2.2.3 =
103
+
104
+ * New: created new UI for Yoast and All In One SEO importers
105
+ * New: new option to keep existing post meta intact during import
106
+ * New: opengraph code optimizations and improvements
107
+ * New: made automatic sitemap updates less resource intensive
108
+ * New: made macros more extensible through new filters and actions
109
+ * New: support for dynamic placeholders prefixed with 'ct_' 'ct_desc_' and 'cf_'
110
+
111
+ * Fix: issues caused by shortcode execution (integration with Divi, Avada, WPBakery and Swift page builders)
112
+ * Fix: performance issues due to frequent analysis reruns
113
+ * Fix: minor conflict with Gutenberg
114
+ * Fix: autolinking module modifying inline scripts
115
+ * Fix: outdated meta title and meta description limits
116
+ * Fix: metabox conflict on media edit page
117
+ * Fix: saving menus taking too much time when analysis active
118
+ * Fix: post featured image printed as og:image before more specific images
119
+ * Fix: issues in Avada page builder integration
120
+ * Fix: log file not being written correctly
121
+ * Fix: issues caused by faulty packaging
122
+ * Fix: metabox preview showing raw HTML tags
123
+ * Fix: search engine update link unnecessarily shown on WP dashboard
124
+ * Fix: misnamed translation file
125
+ * Fix: missing trailing slash in sitemap home URL
126
+ * Fix: dates shown in sitemap dashboard widget not translatable
127
+ * Fix: sitemap creation error shows html tags
128
+ * Fix: format of date printed through %%currentdate%% placeholder not changeable
129
+ * Fix: miscellaneous typos and copy changes
130
+ * Fix: twitter placeholders on category edit page not accurate
131
+ * Fix: sitemap XSL stylesheet URL/path resolution issue
132
+ * Fix: twitter fields displayed unnecessarily on term edit page
133
+ * Fix: update plugin version constant to ensure cache busting
134
+ * Fix: untruncated title and description shown in Google previews
135
+ * Fix: typo in upsell modal
136
+ * Fix: metabox preview showing divi shortcodes
137
+ * Fix: issues caused by shortcode execution
138
+ * Fix: sub-headings check should pass if even one of the sub-headings contains our focus keywords
139
+ * Fix: twitter card preview not loading
140
+ * Fix: static front page handled as single post page
141
+ * Fix: static homepage does not show correct meta values in all scenarios
142
+ * Fix: static homepage built with builders shows shortcodes in 'Title & Meta' settings
143
+ * Fix: metabox preview showing WPBakery shortcodes
144
+ * Fix: warnings in autoloader
145
+ * Fix: importer support for yoast version 9
146
+ * Fix: metabox preview showing raw placeholders
147
+
148
+ = 2.2.2.7 =
149
+
150
+ * Fix: resolved conflict with swift framework mini product widget
151
+ * Fix: resolved styling conflicts with WPBakery and a few other plugins
152
+ * Fix: performance improvement for title and meta rewriting
153
+
154
+ = 2.2.2.6 =
155
+
156
+ * Fix: fixed issue causing WSOD on some sites
157
+ * Fix: don't show raw shortcodes in auto-generated meta description
158
+ * Fix: better compatibility of readability and SEO analysis with page builders
159
+ * Fix: made Google preview in the SC metabox more accurate
160
+
161
  = 2.2.2.5 =
162
 
163
  * Fix: reverted 2.2.2.4 changes causing WSOD on some sites
wpmu-dev-seo.php CHANGED
@@ -3,12 +3,11 @@
3
  * Plugin Name: SmartCrawl
4
  * Plugin URI: http://premium.wpmudev.org/project/wpmu-dev-seo/
5
  * Description: Every SEO option that a site requires, in one easy bundle.
6
- * Version: 2.2.2.5
7
  * Network: true
8
  * Text Domain: wds
9
  * Author: WPMU DEV
10
  * Author URI: http://premium.wpmudev.org
11
- * WDP ID: 167
12
  */
13
 
14
  /*
@@ -30,7 +29,7 @@
30
  */
31
 
32
 
33
- define( 'SMARTCRAWL_VERSION', '2.2.2.5' );
34
 
35
  class Smartcrawl_Loader {
36
 
3
  * Plugin Name: SmartCrawl
4
  * Plugin URI: http://premium.wpmudev.org/project/wpmu-dev-seo/
5
  * Description: Every SEO option that a site requires, in one easy bundle.
6
+ * Version: 2.2.4
7
  * Network: true
8
  * Text Domain: wds
9
  * Author: WPMU DEV
10
  * Author URI: http://premium.wpmudev.org
 
11
  */
12
 
13
  /*
29
  */
30
 
31
 
32
+ define( 'SMARTCRAWL_VERSION', '2.2.4' );
33
 
34
  class Smartcrawl_Loader {
35