SmartCrawl SEO - Version 2.8.1

Version Description

  • New: Option to disable the Test Schema button from admin bar
  • Fix: Incorrect URL in footer
  • Fix: Post list columns and SEO meta shown for non-public post types
  • Fix: Add schema for video and audio files directly uploaded and inserted into post content
  • Fix: Autolink linking to the page itself on custom post types
Download this release

Release Info

Developer rickjc89
Plugin Icon 128x128 SmartCrawl SEO
Version 2.8.1
Comparing to
See all releases

Code changes from version 2.8.0 to 2.8.1

changelog.txt CHANGED
@@ -1,6 +1,16 @@
1
  Plugin Name: SmartCrawl SEO
2
 
3
  Change Log:
 
 
 
 
 
 
 
 
 
 
4
  ----------------------------------------------------------------------
5
  2.8.0 - 2020-09-07
6
  ----------------------------------------------------------------------
1
  Plugin Name: SmartCrawl SEO
2
 
3
  Change Log:
4
+ ----------------------------------------------------------------------
5
+
6
+ 2.8.1 - 2020-09-24
7
+ ----------------------------------------------------------------------
8
+ - Add: Option to disable the Test Schema button from admin bar
9
+ - Fix: Incorrect URL in footer
10
+ - Fix: Post list columns and SEO meta shown for non-public post types
11
+ - Fix: Add schema for video and audio files directly uploaded and inserted into post content
12
+ - Fix: Autolink linking to the page itself on custom post types
13
+
14
  ----------------------------------------------------------------------
15
  2.8.0 - 2020-09-07
16
  ----------------------------------------------------------------------
includes/admin/admin.php CHANGED
@@ -269,8 +269,10 @@ class Smartcrawl_Admin extends Smartcrawl_Base_Controller {
269
  if ( is_multisite() ) {
270
  $is_sitewide = smartcrawl_is_switch_active( 'SMARTCRAWL_SITEWIDE' );
271
 
272
- return ( $is_sitewide && is_network_admin() )
273
- || ( ! $is_sitewide && ! is_network_admin() );
 
 
274
  }
275
 
276
  return true;
269
  if ( is_multisite() ) {
270
  $is_sitewide = smartcrawl_is_switch_active( 'SMARTCRAWL_SITEWIDE' );
271
 
272
+ return (
273
+ ( $is_sitewide && is_network_admin() ) ||
274
+ ( ! $is_sitewide && ! is_network_admin() )
275
+ ) && Smartcrawl_Settings_Admin::is_tab_allowed( $slug );
276
  }
277
 
278
  return true;
includes/admin/metabox.php CHANGED
@@ -203,19 +203,19 @@ class Smartcrawl_Metabox extends Smartcrawl_Base_Controller {
203
  }
204
 
205
  public function init_post_columns() {
206
- foreach (
207
- get_post_types( array(
208
- 'public' => true,
209
- 'show_ui' => true,
210
- ) ) as $type
211
- ) {
212
  add_filter( "manage_{$type}_posts_columns", array( $this, 'smartcrawl_meta_column_heading' ), 20 );
213
  add_action( "manage_{$type}_posts_custom_column", array( $this, 'smartcrawl_meta_column_content' ), 20, 2 );
214
  }
215
  }
216
 
217
  public function post_row_actions( $actions, $post ) {
218
- if ( ! empty( $actions ) ) {
 
 
 
 
 
219
  Smartcrawl_Simple_Renderer::render( 'post-list/meta-details', array(
220
  'post' => $post,
221
  ) );
203
  }
204
 
205
  public function init_post_columns() {
206
+ foreach ( smartcrawl_frontend_post_types() as $type ) {
 
 
 
 
 
207
  add_filter( "manage_{$type}_posts_columns", array( $this, 'smartcrawl_meta_column_heading' ), 20 );
208
  add_action( "manage_{$type}_posts_custom_column", array( $this, 'smartcrawl_meta_column_content' ), 20, 2 );
209
  }
210
  }
211
 
212
  public function post_row_actions( $actions, $post ) {
213
+ $onpage_active = Smartcrawl_Settings::get_setting( 'onpage' );
214
+ if (
215
+ $onpage_active
216
+ && ! empty( $actions )
217
+ && in_array( $post->post_type, smartcrawl_frontend_post_types() )
218
+ ) {
219
  Smartcrawl_Simple_Renderer::render( 'post-list/meta-details', array(
220
  'post' => $post,
221
  ) );
includes/admin/settings/autolinks.php CHANGED
@@ -475,33 +475,13 @@ class Smartcrawl_Autolinks_Settings extends Smartcrawl_Settings_Admin {
475
  parent::options_page();
476
 
477
  $smartcrawl_options = Smartcrawl_Settings::get_options();
478
- $arguments = array(
479
- 'insert' => array(),
480
- );
481
-
482
- $post_types = array();
483
- foreach ( self::get_post_types() as $post_type => $pt ) {
484
- $key = strtolower( $pt->name );
485
- $post_types["l{$key}"] = $pt->labels->name;
486
-
487
- $arguments['insert']["{$key}"] = $pt->labels->name;
488
- }
489
-
490
- $taxonomies = array();
491
- foreach ( get_taxonomies() as $taxonomy ) {
492
- if ( ! in_array( $taxonomy, array( 'nav_menu', 'link_category', 'post_format' ), true ) ) {
493
- $tax = get_taxonomy( $taxonomy );
494
- $key = strtolower( $tax->labels->name );
495
-
496
- $taxonomies["l{$key}"] = $tax->labels->name;
497
- }
498
- }
499
  $redirection_model = new Smartcrawl_Model_Redirection();
500
  $arguments['redirections'] = $redirection_model->get_all_redirections();
501
  $arguments['redirection_types'] = $redirection_model->get_all_redirection_types();
502
 
503
- $arguments['linkto'] = array_merge( $post_types, $taxonomies );
504
- $arguments['insert']['comment'] = __( 'Comments', 'wds' );
505
 
506
  $arguments['active_tab'] = $this->_get_active_tab( 'tab_automatic_linking' );
507
 
@@ -565,5 +545,64 @@ class Smartcrawl_Autolinks_Settings extends Smartcrawl_Settings_Admin {
565
  private function get_request_data() {
566
  return isset( $_POST['_wds_nonce'] ) && wp_verify_nonce( $_POST['_wds_nonce'], 'wds-autolinks-nonce' ) ? $_POST : array();
567
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
568
  }
569
 
475
  parent::options_page();
476
 
477
  $smartcrawl_options = Smartcrawl_Settings::get_options();
478
+ $arguments = array();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
479
  $redirection_model = new Smartcrawl_Model_Redirection();
480
  $arguments['redirections'] = $redirection_model->get_all_redirections();
481
  $arguments['redirection_types'] = $redirection_model->get_all_redirection_types();
482
 
483
+ $arguments['linkto'] = $this->get_linkto_keys();
484
+ $arguments['insert'] = $this->get_insert_keys();
485
 
486
  $arguments['active_tab'] = $this->_get_active_tab( 'tab_automatic_linking' );
487
 
545
  private function get_request_data() {
546
  return isset( $_POST['_wds_nonce'] ) && wp_verify_nonce( $_POST['_wds_nonce'], 'wds-autolinks-nonce' ) ? $_POST : array();
547
  }
548
+
549
+ public function get_insert_options() {
550
+ $options = Smartcrawl_Settings::get_component_options( self::COMP_AUTOLINKS );
551
+ $result = array();
552
+ foreach ( $this->get_insert_keys() as $key => $label ) {
553
+ $result[ $key ] = array(
554
+ 'label' => $label,
555
+ 'value' => empty( $options[ $key ] ) ? false : true,
556
+ );
557
+ }
558
+
559
+ return $result;
560
+ }
561
+
562
+ private function get_insert_keys() {
563
+ foreach ( self::get_post_types() as $post_type => $pt ) {
564
+ $key = strtolower( $pt->name );
565
+
566
+ $insert["{$key}"] = $pt->labels->name;
567
+ }
568
+ $insert['comment'] = __( 'Comments', 'wds' );
569
+
570
+ return $insert;
571
+ }
572
+
573
+ public function get_linkto_options() {
574
+ $options = Smartcrawl_Settings::get_component_options( self::COMP_AUTOLINKS );
575
+ $result = array();
576
+
577
+ foreach ( $this->get_linkto_keys() as $key => $label ) {
578
+ $result[ $key ] = array(
579
+ 'label' => $label,
580
+ 'value' => empty( $options[ $key ] ) ? false : true,
581
+ );
582
+ }
583
+
584
+ return $result;
585
+ }
586
+
587
+ private function get_linkto_keys() {
588
+ $post_types = array();
589
+ foreach ( self::get_post_types() as $post_type => $pt ) {
590
+ $key = strtolower( $pt->name );
591
+ $post_types["l{$key}"] = $pt->labels->name;
592
+ }
593
+
594
+ $taxonomies = array();
595
+ foreach ( get_taxonomies() as $taxonomy ) {
596
+ if ( ! in_array( $taxonomy, array( 'nav_menu', 'link_category', 'post_format' ), true ) ) {
597
+ $tax = get_taxonomy( $taxonomy );
598
+ $key = strtolower( $tax->labels->name );
599
+
600
+ $taxonomies["l{$key}"] = $tax->labels->name;
601
+ }
602
+ }
603
+
604
+ return array_merge( $post_types, $taxonomies );
605
+ }
606
+
607
  }
608
 
includes/admin/settings/schema.php CHANGED
@@ -203,6 +203,7 @@ class Smartcrawl_Schema_Settings extends Smartcrawl_Settings_Admin {
203
  'schema_enable_audio' => false,
204
  'schema_enable_video' => false,
205
  'schema_enable_yt_api' => false,
 
206
  );
207
  }
208
 
@@ -323,6 +324,7 @@ class Smartcrawl_Schema_Settings extends Smartcrawl_Settings_Admin {
323
  'schema_enable_audio',
324
  'schema_enable_video',
325
  'schema_enable_yt_api',
 
326
  );
327
  }
328
 
203
  'schema_enable_audio' => false,
204
  'schema_enable_video' => false,
205
  'schema_enable_yt_api' => false,
206
+ 'schema_enable_test_button' => true,
207
  );
208
  }
209
 
324
  'schema_enable_audio',
325
  'schema_enable_video',
326
  'schema_enable_yt_api',
327
+ 'schema_enable_test_button',
328
  );
329
  }
330
 
includes/admin/settings/sitemap.php CHANGED
@@ -373,7 +373,9 @@ class Smartcrawl_Sitemap_Settings extends Smartcrawl_Settings_Admin {
373
  if ( current_user_can( 'manage_options' ) ) {
374
  $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SEO );
375
  $response = $service->start();
376
- $error = $this->get_error( $response );
 
 
377
  }
378
  $url = add_query_arg(
379
  array(
@@ -387,14 +389,6 @@ class Smartcrawl_Sitemap_Settings extends Smartcrawl_Settings_Admin {
387
  die;
388
  }
389
 
390
- private function get_error( $response ) {
391
- if ( ! empty( $response['data']['status'] ) && (int) $response['data']['status'] > 399 ) {
392
- return (string) smartcrawl_get_array_value( $response, 'message' );
393
- }
394
-
395
- return '';
396
- }
397
-
398
  public function add_crawl_status_message() {
399
  $crawl_in_progress = smartcrawl_get_array_value( $_GET, 'crawl-in-progress' );
400
  if ( is_null( $crawl_in_progress ) ) {
373
  if ( current_user_can( 'manage_options' ) ) {
374
  $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SEO );
375
  $response = $service->start();
376
+ $error = is_wp_error( $response )
377
+ ? $response->get_error_message()
378
+ : '';
379
  }
380
  $url = add_query_arg(
381
  array(
389
  die;
390
  }
391
 
 
 
 
 
 
 
 
 
392
  public function add_crawl_status_message() {
393
  $crawl_in_progress = smartcrawl_get_array_value( $_GET, 'crawl-in-progress' );
394
  if ( is_null( $crawl_in_progress ) ) {
includes/admin/templates/footer.php CHANGED
@@ -45,7 +45,7 @@ $filtered_footer_text = Smartcrawl_White_Label::get()->get_wpmudev_footer_text(
45
  <li><a href="https://wordpress.org/support/plugin/smartcrawl-seo"
46
  target="_blank"><?php esc_html_e( 'Support', 'wds' ); ?></a></li>
47
  <li><a href="https://premium.wpmudev.org/docs/" target="_blank"><?php esc_html_e( 'Docs', 'wds' ); ?></a></li>
48
- <li><a href="https://premium.wpmudev.org/hub/" target="_blank"><?php esc_html_e( 'The Hub', 'wds' ); ?></a></li>
49
  <li><a href="https://premium.wpmudev.org/terms-of-service/"
50
  target="_blank"><?php esc_html_e( 'Terms of Service', 'wds' ); ?></a></li>
51
  <li><a href="https://incsub.com/privacy-policy/"
45
  <li><a href="https://wordpress.org/support/plugin/smartcrawl-seo"
46
  target="_blank"><?php esc_html_e( 'Support', 'wds' ); ?></a></li>
47
  <li><a href="https://premium.wpmudev.org/docs/" target="_blank"><?php esc_html_e( 'Docs', 'wds' ); ?></a></li>
48
+ <li><a href="https://premium.wpmudev.org/hub-welcome/" target="_blank"><?php esc_html_e( 'The Hub', 'wds' ); ?></a></li>
49
  <li><a href="https://premium.wpmudev.org/terms-of-service/"
50
  target="_blank"><?php esc_html_e( 'Terms of Service', 'wds' ); ?></a></li>
51
  <li><a href="https://incsub.com/privacy-policy/"
includes/admin/templates/post-list/quick-edit-onpage.php CHANGED
@@ -17,6 +17,9 @@
17
  </label>
18
  </div>
19
  </fieldset>
 
 
 
20
  <style>
21
  .inline-edit-col .title.metadesc {
22
  display: block;
17
  </label>
18
  </div>
19
  </fieldset>
20
+ <input type="hidden"
21
+ value="<?php echo esc_attr( wp_create_nonce( 'wds-metabox-nonce' ) ); ?>"
22
+ name="_wds_nonce"/>
23
  <style>
24
  .inline-edit-col .title.metadesc {
25
  display: block;
includes/admin/templates/schema/schema-section-advanced.php CHANGED
@@ -332,25 +332,3 @@ $taxonomies = empty( $taxonomies ) ? array() : $taxonomies;
332
  ) ); ?>
333
  </div>
334
  </div>
335
-
336
- <div class="sui-box-settings-row">
337
- <div class="sui-box-settings-col-1">
338
- <label class="sui-settings-label">
339
- <?php esc_html_e( 'Deactivate', 'wds' ); ?>
340
- </label>
341
-
342
- <p class="sui-description">
343
- <?php esc_html_e( 'If you no longer wish to add schema, you can deactivate it.', 'wds' ); ?>
344
- </p>
345
- </div>
346
-
347
- <div class="sui-box-settings-col-2">
348
- <button type="button"
349
- id="wds-deactivate-schema-component"
350
- class="sui-button sui-button-ghost">
351
- <i class="sui-icon-power-on-off" aria-hidden="true"></i>
352
-
353
- <?php esc_html_e( 'Deactivate', 'wds' ); ?>
354
- </button>
355
- </div>
356
- </div>
332
  ) ); ?>
333
  </div>
334
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/admin/templates/schema/schema-section-settings.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name'];
3
+ $options = empty( $options ) ? array() : $options;
4
+ $social_options = empty( $social_options ) ? array() : $social_options;
5
+
6
+ $schema_enable_test_button = (bool) smartcrawl_get_array_value( $options, 'schema_enable_test_button' );
7
+ ?>
8
+ <div class="sui-box-settings-row">
9
+ <div class="sui-box-settings-col-1">
10
+ <label class="sui-settings-label">
11
+ <?php esc_html_e( 'Test Schema Button', 'wds' ); ?>
12
+ </label>
13
+
14
+ <p class="sui-description">
15
+ <?php esc_html_e( 'This feature adds a Test Schema button to the WordPress admin bar.', 'wds' ); ?>
16
+ </p>
17
+ </div>
18
+
19
+ <div class="sui-box-settings-col-2">
20
+ <?php $this->_render( 'toggle-item', array(
21
+ 'field_name' => sprintf( '%s[%s]', $option_name, 'schema_enable_test_button' ),
22
+ 'field_id' => 'schema_enable_test_button',
23
+ 'checked' => $schema_enable_test_button,
24
+ 'item_label' => esc_html__( 'Show Test Schema button in admin bar', 'wds' ),
25
+ ) ); ?>
26
+ </div>
27
+ </div>
28
+
29
+ <div class="sui-box-settings-row">
30
+ <div class="sui-box-settings-col-1">
31
+ <label class="sui-settings-label">
32
+ <?php esc_html_e( 'Deactivate', 'wds' ); ?>
33
+ </label>
34
+
35
+ <p class="sui-description">
36
+ <?php esc_html_e( 'If you no longer wish to add schema, you can deactivate it.', 'wds' ); ?>
37
+ </p>
38
+ </div>
39
+
40
+ <div class="sui-box-settings-col-2">
41
+ <button type="button"
42
+ id="wds-deactivate-schema-component"
43
+ class="sui-button sui-button-ghost">
44
+ <i class="sui-icon-power-on-off" aria-hidden="true"></i>
45
+
46
+ <?php esc_html_e( 'Deactivate', 'wds' ); ?>
47
+ </button>
48
+ </div>
49
+ </div>
includes/admin/templates/schema/schema-settings.php CHANGED
@@ -70,6 +70,22 @@ $this->_render( 'before-page-container' );
70
  ),
71
  ),
72
  ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  ?>
74
  </div>
75
  </form>
70
  ),
71
  ),
72
  ) );
73
+
74
+ $this->_render( 'vertical-tab', array(
75
+ 'tab_id' => 'tab_settings',
76
+ 'tab_name' => esc_html__( 'Settings', 'wds' ),
77
+ 'is_active' => 'tab_settings' === $active_tab,
78
+ 'tab_sections' => array(
79
+ array(
80
+ 'section_description' => esc_html__( '', 'wds' ),
81
+ 'section_template' => 'schema/schema-section-settings',
82
+ 'section_args' => array(
83
+ 'options' => $options,
84
+ 'social_options' => $social_options,
85
+ ),
86
+ ),
87
+ ),
88
+ ) );
89
  ?>
90
  </div>
91
  </form>
includes/admin/templates/schema/schema-sidenav.php CHANGED
@@ -12,5 +12,9 @@ $this->_render( 'vertical-tabs-side-nav', array(
12
  'id' => 'tab_advanced',
13
  'name' => esc_html__( 'Advanced', 'wds' ),
14
  ),
 
 
 
 
15
  ),
16
  ) );
12
  'id' => 'tab_advanced',
13
  'name' => esc_html__( 'Advanced', 'wds' ),
14
  ),
15
+ array(
16
+ 'id' => 'tab_settings',
17
+ 'name' => esc_html__( 'Settings', 'wds' ),
18
+ ),
19
  ),
20
  ) );
includes/core/class-wds-controller-analysis.php CHANGED
@@ -197,11 +197,7 @@ class Smartcrawl_Controller_Analysis extends Smartcrawl_Base_Controller {
197
  */
198
  public function set_up_post_columns() {
199
  // Set up column filtering.
200
- $types = get_post_types( array(
201
- 'public' => true,
202
- 'show_ui' => true,
203
- ) );
204
- foreach ( $types as $type ) {
205
  add_filter( "manage_{$type}_posts_columns", array( $this, 'add_analysis_columns' ) );
206
  add_action( "manage_{$type}_posts_custom_column", array( $this, 'add_analysis_column_data' ), 10, 2 );
207
  }
197
  */
198
  public function set_up_post_columns() {
199
  // Set up column filtering.
200
+ foreach ( smartcrawl_frontend_post_types() as $type ) {
 
 
 
 
201
  add_filter( "manage_{$type}_posts_columns", array( $this, 'add_analysis_columns' ) );
202
  add_action( "manage_{$type}_posts_custom_column", array( $this, 'add_analysis_column_data' ), 10, 2 );
203
  }
includes/core/class-wds-controller-media-schema-data.php CHANGED
@@ -94,7 +94,6 @@ class Smartcrawl_Controller_Media_Schema_Data extends Smartcrawl_Base_Controller
94
  }
95
  }
96
 
97
- $video_data_saved = false;
98
  if ( $this->is_youtube_url( $url ) ) {
99
  $youtube_data_key = $this->get_item_data_key( $url );
100
  $youtube_data = smartcrawl_get_array_value( $previous_data, array( 'youtube', $youtube_data_key ) );
@@ -102,12 +101,11 @@ class Smartcrawl_Controller_Media_Schema_Data extends Smartcrawl_Base_Controller
102
  $youtube_data = Smartcrawl_Youtube_Data_Fetcher::get_video_info( $url );
103
  }
104
  if ( $youtube_data ) {
105
- $video_data_saved = true;
106
  $cache['youtube'][ $youtube_data_key ] = $youtube_data;
107
  }
108
  }
109
 
110
- if ( ! $video_data_saved && $this->is_supported_video( $url ) ) {
111
  $video_data_key = $this->get_item_data_key( $url );
112
  $video_data = smartcrawl_get_array_value( $previous_data, array( 'video', $video_data_key ) );
113
  if ( empty( $video_data ) ) {
94
  }
95
  }
96
 
 
97
  if ( $this->is_youtube_url( $url ) ) {
98
  $youtube_data_key = $this->get_item_data_key( $url );
99
  $youtube_data = smartcrawl_get_array_value( $previous_data, array( 'youtube', $youtube_data_key ) );
101
  $youtube_data = Smartcrawl_Youtube_Data_Fetcher::get_video_info( $url );
102
  }
103
  if ( $youtube_data ) {
 
104
  $cache['youtube'][ $youtube_data_key ] = $youtube_data;
105
  }
106
  }
107
 
108
+ if ( $this->is_supported_video( $url ) ) {
109
  $video_data_key = $this->get_item_data_key( $url );
110
  $video_data = smartcrawl_get_array_value( $previous_data, array( 'video', $video_data_key ) );
111
  if ( empty( $video_data ) ) {
includes/core/class-wds-schema-value-helper.php CHANGED
@@ -485,8 +485,7 @@ class Smartcrawl_Schema_Value_Helper extends Smartcrawl_Type_Traverser {
485
  );
486
 
487
  // Name
488
- $organization_name = $this->get_social_option( 'organization_name' );
489
- $schema["name"] = $organization_name ? $organization_name : get_bloginfo( 'name' );
490
 
491
  // Logo
492
  $org_logo = $this->get_organization_logo();
@@ -597,11 +596,7 @@ class Smartcrawl_Schema_Value_Helper extends Smartcrawl_Type_Traverser {
597
  );
598
 
599
  // Name
600
- $schema["name"] = $this->first_non_empty_string(
601
- $this->get_schema_option( 'person_brand_name' ),
602
- $this->get_social_option( 'override_name' ),
603
- $this->get_user_full_name( $this->owner )
604
- );
605
 
606
  // Logo
607
  $site_url = get_site_url();
@@ -835,11 +830,11 @@ class Smartcrawl_Schema_Value_Helper extends Smartcrawl_Type_Traverser {
835
  return $urls;
836
  }
837
 
838
- private function is_schema_type_person() {
839
  return $this->get_schema_type() === self::TYPE_PERSON;
840
  }
841
 
842
- private function is_schema_type_organization() {
843
  return $this->get_schema_type() === self::TYPE_ORGANIZATION;
844
  }
845
 
@@ -1040,6 +1035,13 @@ class Smartcrawl_Schema_Value_Helper extends Smartcrawl_Type_Traverser {
1040
  }
1041
 
1042
  private function add_media_schema( $schema, $post ) {
 
 
 
 
 
 
 
1043
  $schema_data_controller = Smartcrawl_Controller_Media_Schema_Data::get();
1044
  $schema_data_controller->maybe_refresh_wp_embeds_cache( $post );
1045
 
@@ -1058,19 +1060,15 @@ class Smartcrawl_Schema_Value_Helper extends Smartcrawl_Type_Traverser {
1058
 
1059
  $enable_youtube = (bool) $this->get_schema_option( 'schema_enable_yt_api' );
1060
  $youtube_data = smartcrawl_get_array_value( $cache, 'youtube' );
1061
- $youtube_videos = array();
1062
- if ( $enable_youtube && ! empty( $youtube_data ) && is_array( $youtube_data ) ) {
1063
- foreach ( $youtube_data as $youtube_id => $youtube_datum ) {
1064
- $youtube_videos[] = $youtube_id;
1065
- $schema[] = $this->get_youtube_schema( $youtube_datum );
1066
- }
1067
- }
1068
 
1069
  $enable_video = (bool) $this->get_schema_option( 'schema_enable_video' );
1070
  $video_data = smartcrawl_get_array_value( $cache, 'video' );
1071
  if ( $enable_video && ! empty( $video_data ) && is_array( $video_data ) ) {
1072
  foreach ( $video_data as $video_id => $video_datum ) {
1073
- if ( ! in_array( $video_id, $youtube_videos ) ) {
 
 
1074
  $schema[] = $this->get_video_schema( $video_datum );
1075
  }
1076
  }
@@ -1104,10 +1102,12 @@ class Smartcrawl_Schema_Value_Helper extends Smartcrawl_Type_Traverser {
1104
  $schema['duration'] = $duration;
1105
  }
1106
 
 
 
1107
  return $schema;
1108
  }
1109
 
1110
- private function get_youtube_schema( $data ) {
1111
  $schema = $this->media_data_to_schema( array(
1112
  'title' => "name",
1113
  'url' => "url",
@@ -1125,6 +1125,19 @@ class Smartcrawl_Schema_Value_Helper extends Smartcrawl_Type_Traverser {
1125
  $schema["keywords"] = join( ',', $tags );
1126
  }
1127
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1128
  return $schema;
1129
  }
1130
 
@@ -1251,4 +1264,107 @@ class Smartcrawl_Schema_Value_Helper extends Smartcrawl_Type_Traverser {
1251
 
1252
  return '';
1253
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1254
  }
485
  );
486
 
487
  // Name
488
+ $schema["name"] = $this->get_organization_name();
 
489
 
490
  // Logo
491
  $org_logo = $this->get_organization_logo();
596
  );
597
 
598
  // Name
599
+ $schema["name"] = $this->get_personal_brand_name();
 
 
 
 
600
 
601
  // Logo
602
  $site_url = get_site_url();
830
  return $urls;
831
  }
832
 
833
+ public function is_schema_type_person() {
834
  return $this->get_schema_type() === self::TYPE_PERSON;
835
  }
836
 
837
+ public function is_schema_type_organization() {
838
  return $this->get_schema_type() === self::TYPE_ORGANIZATION;
839
  }
840
 
1035
  }
1036
 
1037
  private function add_media_schema( $schema, $post ) {
1038
+ $schema = $this->add_oembed_schema( $post, $schema );
1039
+ $schema = $this->add_attachment_schema( $post, $schema );
1040
+
1041
+ return $schema;
1042
+ }
1043
+
1044
+ private function add_oembed_schema( $post, $schema ) {
1045
  $schema_data_controller = Smartcrawl_Controller_Media_Schema_Data::get();
1046
  $schema_data_controller->maybe_refresh_wp_embeds_cache( $post );
1047
 
1060
 
1061
  $enable_youtube = (bool) $this->get_schema_option( 'schema_enable_yt_api' );
1062
  $youtube_data = smartcrawl_get_array_value( $cache, 'youtube' );
1063
+ $youtube_data = empty( $youtube_data ) ? array() : $youtube_data;
 
 
 
 
 
 
1064
 
1065
  $enable_video = (bool) $this->get_schema_option( 'schema_enable_video' );
1066
  $video_data = smartcrawl_get_array_value( $cache, 'video' );
1067
  if ( $enable_video && ! empty( $video_data ) && is_array( $video_data ) ) {
1068
  foreach ( $video_data as $video_id => $video_datum ) {
1069
+ if ( $enable_youtube && array_key_exists( $video_id, $youtube_data ) ) {
1070
+ $schema[] = $this->get_youtube_schema( $youtube_data[ $video_id ], $video_datum );
1071
+ } else {
1072
  $schema[] = $this->get_video_schema( $video_datum );
1073
  }
1074
  }
1102
  $schema['duration'] = $duration;
1103
  }
1104
 
1105
+ $schema = $this->add_embed_url_property( $schema, $data );
1106
+
1107
  return $schema;
1108
  }
1109
 
1110
+ private function get_youtube_schema( $data, $embed_data ) {
1111
  $schema = $this->media_data_to_schema( array(
1112
  'title' => "name",
1113
  'url' => "url",
1125
  $schema["keywords"] = join( ',', $tags );
1126
  }
1127
 
1128
+ $schema = $this->add_embed_url_property( $schema, $embed_data );
1129
+
1130
+ return $schema;
1131
+ }
1132
+
1133
+ private function add_embed_url_property( $schema, $embed_data ) {
1134
+ if ( isset( $embed_data['html'] ) ) {
1135
+ $src_attribute = Smartcrawl_Html::find_attributes( 'iframe', 'src', $embed_data['html'] );
1136
+ if ( ! empty( $src_attribute ) ) {
1137
+ $schema['embedUrl'] = array_shift( $src_attribute );
1138
+ }
1139
+ }
1140
+
1141
  return $schema;
1142
  }
1143
 
1264
 
1265
  return '';
1266
  }
1267
+
1268
+ private function add_attachment_schema( $post, $schema ) {
1269
+ $src_attributes = Smartcrawl_Html::find_attributes( 'video, audio', 'src', $post->post_content );
1270
+ foreach ( $src_attributes as $html_element => $src_url ) {
1271
+ $attachment_id = attachment_url_to_postid( $src_url );
1272
+ if ( ! $attachment_id ) {
1273
+ continue;
1274
+ }
1275
+
1276
+ $attachment = get_post( $attachment_id );
1277
+
1278
+ if ( $this->is_mime_type_video( $attachment ) ) {
1279
+ $schema[] = $this->get_video_attachment_schema( $attachment, $html_element );
1280
+ }
1281
+
1282
+ if ( $this->is_mime_type_audio( $attachment ) ) {
1283
+ $schema[] = $this->get_audio_attachment_schema( $attachment );
1284
+ }
1285
+ }
1286
+
1287
+ return $schema;
1288
+ }
1289
+
1290
+ private function get_video_attachment_schema( $attachment, $video_element_html ) {
1291
+ $attachment_url = wp_get_attachment_url( $attachment->ID );
1292
+ $attachment_schema = $this->get_attachment_schema( self::TYPE_VIDEO_OBJECT, $attachment, $attachment_url );
1293
+
1294
+ // Video poster image
1295
+ $poster_image_url = $this->get_video_poster_attribute( $video_element_html );
1296
+ if ( $poster_image_url ) {
1297
+ $attachment_schema['thumbnailUrl'] = $poster_image_url;
1298
+ }
1299
+
1300
+ return $attachment_schema;
1301
+ }
1302
+
1303
+ private function get_video_poster_attribute( $video_element_html ) {
1304
+ $poster_values = Smartcrawl_Html::find_attributes( 'video', 'poster', $video_element_html );
1305
+ if ( count( $poster_values ) > 0 ) {
1306
+ return array_shift( $poster_values );
1307
+ }
1308
+
1309
+ return '';
1310
+ }
1311
+
1312
+ private function get_audio_attachment_schema( $attachment ) {
1313
+ return $this->get_attachment_schema(
1314
+ self::TYPE_AUDIO_OBJECT,
1315
+ $attachment,
1316
+ wp_get_attachment_url( $attachment->ID )
1317
+ );
1318
+ }
1319
+
1320
+ /**
1321
+ * @param $attachment WP_Post
1322
+ *
1323
+ * @return bool
1324
+ */
1325
+ private function is_mime_type_video( $attachment ) {
1326
+ return strpos( $attachment->post_mime_type, 'video/' ) !== false;
1327
+ }
1328
+
1329
+ /**
1330
+ * @param $attachment WP_Post
1331
+ *
1332
+ * @return bool
1333
+ */
1334
+ private function is_mime_type_audio( $attachment ) {
1335
+ return strpos( $attachment->post_mime_type, 'audio/' ) !== false;
1336
+ }
1337
+
1338
+ /**
1339
+ * @param $attachment WP_Post
1340
+ * @param $attachment_url
1341
+ *
1342
+ * @return array
1343
+ */
1344
+ private function get_attachment_schema( $type, $attachment, $attachment_url ) {
1345
+ $description = $attachment->post_excerpt
1346
+ ? $attachment->post_excerpt
1347
+ : $attachment->post_content;
1348
+
1349
+ return array(
1350
+ '@type' => $type,
1351
+ 'name' => $attachment->post_title,
1352
+ 'description' => wp_strip_all_tags( $description ),
1353
+ 'uploadDate' => $attachment->post_date,
1354
+ 'contentUrl' => $attachment_url,
1355
+ );
1356
+ }
1357
+
1358
+ public function get_personal_brand_name() {
1359
+ return $this->first_non_empty_string(
1360
+ $this->get_schema_option( 'person_brand_name' ),
1361
+ $this->get_social_option( 'override_name' ),
1362
+ $this->get_user_full_name( $this->owner )
1363
+ );
1364
+ }
1365
+
1366
+ public function get_organization_name() {
1367
+ $organization_name = $this->get_social_option( 'organization_name' );
1368
+ return $organization_name ? $organization_name : get_bloginfo( 'name' );
1369
+ }
1370
  }
includes/core/core.php CHANGED
@@ -1032,3 +1032,13 @@ function smartcrawl_is_build_type_full() {
1032
  return defined( 'SMARTCRAWL_BUILD_TYPE' )
1033
  && SMARTCRAWL_BUILD_TYPE === 'full';
1034
  }
 
 
 
 
 
 
 
 
 
 
1032
  return defined( 'SMARTCRAWL_BUILD_TYPE' )
1033
  && SMARTCRAWL_BUILD_TYPE === 'full';
1034
  }
1035
+
1036
+ function smartcrawl_frontend_post_types() {
1037
+ $types = get_post_types( array(
1038
+ 'public' => true,
1039
+ 'publicly_queryable' => true,
1040
+ ) );
1041
+ $types[] = 'page';
1042
+
1043
+ return $types;
1044
+ }
includes/tools/class-wds-schema-printer.php CHANGED
@@ -43,8 +43,7 @@ class Smartcrawl_Schema_Printer extends Smartcrawl_WorkUnit {
43
  return false;
44
  }
45
 
46
- $social = Smartcrawl_Settings::get_component_options( Smartcrawl_Settings::COMP_SOCIAL );
47
- if ( ! empty( $social['disable-schema'] ) ) {
48
  $this->_is_done = true;
49
 
50
  return false; // Disabled
@@ -72,9 +71,12 @@ class Smartcrawl_Schema_Printer extends Smartcrawl_WorkUnit {
72
  }
73
 
74
  public function admin_bar_menu_items( $admin_bar ) {
 
75
  if (
76
  is_admin()
77
  || ! current_user_can( 'publish_posts' )
 
 
78
  ) {
79
  return $admin_bar;
80
  }
@@ -105,4 +107,12 @@ class Smartcrawl_Schema_Printer extends Smartcrawl_WorkUnit {
105
 
106
  $this->_is_running = true;
107
  }
 
 
 
 
 
 
 
 
108
  }
43
  return false;
44
  }
45
 
46
+ if ( $this->is_schema_disabled() ) {
 
47
  $this->_is_done = true;
48
 
49
  return false; // Disabled
71
  }
72
 
73
  public function admin_bar_menu_items( $admin_bar ) {
74
+ $schema_options = Smartcrawl_Settings::get_component_options( Smartcrawl_Settings::COMP_SCHEMA );
75
  if (
76
  is_admin()
77
  || ! current_user_can( 'publish_posts' )
78
+ || $this->is_schema_disabled()
79
+ || empty( $schema_options['schema_enable_test_button'] )
80
  ) {
81
  return $admin_bar;
82
  }
107
 
108
  $this->_is_running = true;
109
  }
110
+
111
+ /**
112
+ * @return mixed
113
+ */
114
+ private function is_schema_disabled() {
115
+ $social = Smartcrawl_Settings::get_component_options( Smartcrawl_Settings::COMP_SOCIAL );
116
+ return ! empty( $social['disable-schema'] );
117
+ }
118
  }
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: 5.5
10
- Stable tag: 2.8.0
11
 
12
  SEO checker, content analysis & SEO optimizer. Rank higher on search engines with 301 redirects, XML sitemaps & one-click setup.
13
 
@@ -28,6 +28,7 @@ Create clear, bold, targeted content and rank at the top of your favorite search
28
  * Smart Page Analyzer – SmartCrawl has an SEO checker that scans pages and posts for readability and keyword density and makes suggestions for optimizing your content.
29
  * SEO Crawl – Every time you add new content to your site, SmartCrawl will let Google know it’s time to re-crawl your site.
30
  * 301 Redirect – Use SmartCrawl to redirect traffic from one URL to another to protect your hard work and take advantage of high producing links.
 
31
  * Integrate With Moz SEO Tools – Already using Moz? Connect your Moz reports and comparison analysis, including rank and links.
32
  * Quick Setup Import/Export – Quickly add your custom SmartCrawl SEO settings to all your sites with included import.
33
 
@@ -55,6 +56,9 @@ SmartCrawl gives you options to control SEO settings across an entire network as
55
  ###301 URL Redirect
56
  Automatically redirect traffic from one URL to another. Use this tool if you have changed a page’s URL and wish to keep traffic flowing to the new page.
57
 
 
 
 
58
  ###The Rank-Higher Convert-Better SEO Tool
59
  Search Engine Optimization is not a trick, it’s all about following best practices.
60
 
@@ -128,6 +132,14 @@ SmartCrawl works with any normal WP content and page builders shouldn’t be an
128
 
129
  == Changelog ==
130
 
 
 
 
 
 
 
 
 
131
  = 2.8.0 =
132
 
133
  * New: Full support for default Schema types
@@ -251,277 +263,7 @@ SmartCrawl works with any normal WP content and page builders shouldn’t be an
251
  * Fix: Deactivating onpage module affecting unrelated functionality
252
  * Fix: Version 3.x of AIOSEO not supported by importer
253
 
254
- = 2.3 =
255
-
256
- * New: New, exciting, mobile-friendly UI in the admin area
257
- * New: Support for whitelabel features
258
- * New: Improved performance and reliability of SEO checkup and sitemap crawler
259
- * New: Code improvements for the display of meta values
260
- * New: New filter for addition of extra SEO and readability content
261
- * New: Yoast importer now less likely to show "No compatible data ..." error
262
- * New: New BuddyPress settings on Title & Meta page
263
-
264
- * Fix: Redirect attachment settings getting overwritten
265
- * Fix: Errors on Woocommerce shop page
266
- * Fix: Category titles incorrect in certain situations
267
- * Fix: Port matching issues in redirection module
268
- * Fix: Multisite always showing "Homepage set to static page" message
269
- * Fix: Sitewide sitemap settings not applied to network sub-sites
270
- * Fix: Branda not able to change Smartcrawl admin bar text
271
- * Fix: Non-public taxonomies listed on Title & Meta page
272
- * Fix: Autolinks module causing styling issues
273
- * Fix: Readability analysis compatibility issue with PHP 5.3
274
- * Fix: Macros can not be added to term title and description
275
- * Fix: JS console error on WP attachment editor page
276
- * Fix: UI bugs when focus keyword ignored in SEO analysis
277
- * Fix: Autolinking module showing self-links
278
- * Fix: SEO analysis not working with autosaves disabled
279
- * Fix: Sitemap showing invalid timestamps for certain post types
280
- * Fix: Links on Title & Meta page pointing to incorrect tab on the social page
281
- * Fix: Google plus field on social accounts page
282
- * Fix: Visual issue (tooltip getting cut off) on sitemap reporting page
283
- * Fix: Social account URLs with whitespaces not saved
284
- * Fix: Untranslatable string in separator settings on Title & Meta page
285
- * Fix: Fields losing focus while typing
286
- * Fix: Visual issues on small screens
287
- * Fix: Settings pages pointing to old documentation
288
-
289
- = 2.2.6 =
290
-
291
- * New: Support for Yoast v10 and AIOSEO v2.12 in third-party importer
292
- * Fix: Redirects added from sitemap crawl report not converted to absolute
293
- * Fix: Sitemap can't be removed while SC is active
294
- * Fix: Import not working for Automatic linking settings
295
- * Fix: Metabox conflict in classic editor
296
-
297
- = 2.2.5 =
298
-
299
- * New: New filters for modifying OpenGraph values
300
- * New: Improved accuracy of readability analysis
301
-
302
- * Fix: Missing columns on the post list page
303
- * Fix: Certain websites throwing 404 error on redirection
304
- * Fix: SEO metabox shown for non-public posts
305
- * Fix: Better Gutenberg compatibility
306
- * Fix: Warning on sitemap settings page
307
- * Fix: Added ability to increase analysis request timeout
308
- * Fix: Improved autoloader performance
309
- * Fix: Warning in metabox placeholder loader
310
- * Fix: Inaccurate preview when more recent post revision available
311
- * Fix: Update the AIOSEOP importer to include the latest version
312
- * Fix: Stylesheet URL incorrect in sub-site sitemaps
313
-
314
- = 2.2.4.1 =
315
-
316
- * Fix: Show the WP.org rating request to admins only
317
-
318
- = 2.2.4 =
319
-
320
- * New: URL redirection to external domains
321
-
322
- * Fix: SEO and readability analysis of password-protected posts
323
- * Fix: sitemap throws error if there's an image with ampersand sign
324
- * Fix: metabox showing details from other posts when globals modified
325
- * Fix: better autolinks compatibility with unicode languages
326
- * Fix: code improvements for sitemap dashboard
327
- * Fix: twitter and OG issues on static posts page
328
- * Fix: third-party import notice appears for very old data
329
- * Fix: conflicts on woocommerce shop page
330
-
331
- = 2.2.3 =
332
-
333
- * New: created new UI for Yoast and All In One SEO importers
334
- * New: new option to keep existing post meta intact during import
335
- * New: opengraph code optimizations and improvements
336
- * New: made automatic sitemap updates less resource intensive
337
- * New: made macros more extensible through new filters and actions
338
- * New: support for dynamic placeholders prefixed with 'ct_' 'ct_desc_' and 'cf_'
339
-
340
- * Fix: issues caused by shortcode execution (integration with Divi, Avada, WPBakery and Swift page builders)
341
- * Fix: performance issues due to frequent analysis reruns
342
- * Fix: minor conflict with Gutenberg
343
- * Fix: autolinking module modifying inline scripts
344
- * Fix: outdated meta title and meta description limits
345
- * Fix: metabox conflict on media edit page
346
- * Fix: saving menus taking too much time when analysis active
347
- * Fix: post featured image printed as og:image before more specific images
348
- * Fix: issues in Avada page builder integration
349
- * Fix: log file not being written correctly
350
- * Fix: issues caused by faulty packaging
351
- * Fix: metabox preview showing raw HTML tags
352
- * Fix: search engine update link unnecessarily shown on WP dashboard
353
- * Fix: misnamed translation file
354
- * Fix: missing trailing slash in sitemap home URL
355
- * Fix: dates shown in sitemap dashboard widget not translatable
356
- * Fix: sitemap creation error shows html tags
357
- * Fix: format of date printed through %%currentdate%% placeholder not changeable
358
- * Fix: miscellaneous typos and copy changes
359
- * Fix: twitter placeholders on category edit page not accurate
360
- * Fix: sitemap XSL stylesheet URL/path resolution issue
361
- * Fix: twitter fields displayed unnecessarily on term edit page
362
- * Fix: update plugin version constant to ensure cache busting
363
- * Fix: untruncated title and description shown in Google previews
364
- * Fix: typo in upsell modal
365
- * Fix: metabox preview showing divi shortcodes
366
- * Fix: issues caused by shortcode execution
367
- * Fix: sub-headings check should pass if even one of the sub-headings contains our focus keywords
368
- * Fix: twitter card preview not loading
369
- * Fix: static front page handled as single post page
370
- * Fix: static homepage does not show correct meta values in all scenarios
371
- * Fix: static homepage built with builders shows shortcodes in 'Title & Meta' settings
372
- * Fix: metabox preview showing WPBakery shortcodes
373
- * Fix: warnings in autoloader
374
- * Fix: importer support for yoast version 9
375
- * Fix: metabox preview showing raw placeholders
376
-
377
- = 2.2.2.7 =
378
-
379
- * Fix: resolved conflict with swift framework mini product widget
380
- * Fix: resolved styling conflicts with WPBakery and a few other plugins
381
- * Fix: performance improvement for title and meta rewriting
382
-
383
- = 2.2.2.6 =
384
-
385
- * Fix: fixed issue causing WSOD on some sites
386
- * Fix: don't show raw shortcodes in auto-generated meta description
387
- * Fix: better compatibility of readability and SEO analysis with page builders
388
- * Fix: made Google preview in the SC metabox more accurate
389
-
390
- = 2.2.2.5 =
391
-
392
- * Fix: reverted 2.2.2.4 changes causing WSOD on some sites
393
-
394
- = 2.2.2.4 =
395
-
396
- * Fix: don't show raw shortcodes in auto-generated meta description
397
- * Fix: better compatibility of readability and SEO analysis with page builders
398
- * Fix: made Google preview in the SC metabox more accurate
399
-
400
- = 2.2.2.3 =
401
-
402
- * Fix: fixed SEO checkup for free version
403
-
404
- = 2.2.2.2 =
405
-
406
- * Fix: fixed edge case autolinks issue
407
-
408
- = 2.2.2.1 =
409
-
410
- * Fix: Allow data import from Yoast 8.x
411
- * Fix: Updated plugin version constant to latest version for cache busting
412
-
413
- = 2.2.2 =
414
-
415
- * New: support for custom post type archives
416
- * New: noindex/nofollow for post types
417
- * New: new OpenGraph tags og:url, og:type, og:image:width and og:image:height
418
- * New: code optimization
419
- * New: integration test suite for quality assurance
420
- * New: link each page to the relevant documentation section on the plugin website
421
- * New: import social profile links from AIOSEOP
422
- * New: dynamically adjust the toggles under "Site Owner Permissions"
423
- * New: update Google result preview when content is changed
424
- * New: prompt requesting reviews on WP.org
425
-
426
- * Fix: hide settings for disabled modules from plugin dashboard
427
- * Fix: BuddyPress group titles missing
428
- * Fix: links to enable OpenGraph and Twitter settings pointing to inaccessible pages
429
- * Fix: duplicate text in SEO Checkup section of metabox
430
- * Fix: plugin css conflicting with some WP admin components
431
- * Fix: analysis indicators not displaying correct colors in WP post list
432
- * Fix: settings need to be saved before reports for SEO Checkup are sent
433
- * Fix: on WP dashboard, 'update sitemap' link in the sitemap widget not working
434
- * Fix: typo in opengraph settings
435
- * Fix: when new URL scan is run, the URL Crawler section not loaded automatically
436
- * Fix: google/bing verification codes from yoast not imported correctly
437
- * Fix: columns in the post tables take more space then they should
438
- * Fix: google verification meta can't be removed once added
439
- * Fix: meta description not working on WooCommerce shop page
440
- * Fix: redundant save settings button under URL Crawler report
441
- * Fix: typo in the upgrade popup
442
- * Fix: when import from yoast notice dismissed, it comes back on page load
443
- * Fix: seo column in post list shows wrong color indicator when focus keyword missing
444
- * Fix: google/bing verification tags disappear when sitemap settings saved
445
- * Fix: XML sitemap opened in the current tab
446
- * Fix: when "Upgrade to Pro" clicked, pro version details opened in the current tab
447
- * Fix: values under "Site Owner Permissions" not saved when everything turned off
448
- * Fix: last checked time on SEO Checkup inconsistent
449
- * Fix: if modules disabled by network admin, site admin can still see them in settings
450
- * Fix: autolinks page has "TBC" as the description of a setting
451
- * Fix: author archive meta description not saved
452
- * Fix: dashboard sections display number of issues even if the corresponding module is disabled
453
- * Fix: on network sub-sites, disabled modules not behaving properly
454
- * Fix: previews are not refreshing on title and meta admin page
455
- * Fix: url crawler not always listing the URLs resulting in errors
456
- * Fix: hide SEO Checkup on network sub-sites
457
- * Fix: remove code for old google site verification settings
458
- * Fix: date archive settings not respected
459
- * Fix: admin bar menu should always match the admin menu
460
- * Fix: in url crawler, no message is shown when all missing urls added to sitemap
461
- * Fix: MOZ metabox not styled
462
- * Fix: Redirect Attachments options in Advanced Tools not saved when in off state
463
- * Fix: automatic linking toggle in post metabox displays wrong state
464
- * Fix: redundant MarketPress options
465
- * Fix: autolinks "Exclusions" don't work when "Case Sensitive Matching" is off
466
- * Fix: autolinks "Min Lengths" setting not working consistently
467
- * Fix: twitter settings for date archives not working consistently
468
- * Fix: meta description settings for search and 404 pages not working consistently
469
- * Fix: google verification meta settings not working consistently
470
- * Fix: quick edit fields not loading values
471
- * Fix: unwanted space before date archive title
472
- * Fix: minor inconsistencies in SEO analysis
473
- * Fix: no error message displayed when default user removed in reporting section under SEO Checkup
474
- * Fix: statistics on dashboard not refreshed when checkup completes in SEO Checkup section
475
- * Fix: MOZ data displayed even when wrong credentials added
476
-
477
- = 2.2.1 =
478
-
479
- * Fix: post list pages performance issue.
480
-
481
- = 2.2 =
482
-
483
- * New: Yoast & All-In-One SEO importers.
484
- * New: 'Refresh' button for content & readability analysis modules.
485
- * New: ability to set twitter cards details on post and type level.
486
-
487
- * Fix: compatibility with New Blog Templates plugin.
488
- * Fix: spelling and grammar issues.
489
- * Fix: duplicate info text in "No Image Alts" section of seo analysis.
490
- * Fix: support for Themify themes.
491
- * Fix: readability analysis summary outputting html tags.
492
- * Fix: saving draft or publishing posts closes the smartcrawl module.
493
- * Fix: problems in "Add All to Sitemap" button.
494
- * Fix: incorrect number of missing url's on main dashboard.
495
-
496
- = 2.1.1 =
497
-
498
- * Initial SmartCrawl Free Release
499
- * New: make Analysis dash widget results numeric and items clickable.
500
- * New: add OpenGraph and Twitter options for taxonomies.
501
- * New: exclude full URLs from sitemap.
502
- * New: grey out deactivated modules in site owner permissions.
503
- * New: enable styled sitemap on fresh setups.
504
-
505
- * Fix: increase recommended description length from 160 to 230 chars.
506
- * Fix: redirection resolution on archive pages.
507
- * Fix: spelling and grammar issues.
508
- * Fix: UI and styling issues.
509
- * Fix: checkup scan tracking auto-update.
510
- * Fix: update option label copies.
511
- * Fix: update info links.
512
- * Fix: admin menu style issues in Firefox.
513
- * Fix: background color style issues.
514
- * Fix: conflict with Divi theme.
515
- * Fix: configuring links destinations when sitewide mode is active.
516
- * Fix: unifiy analysis status results.
517
- * Fix: BBPress compatibility issue with generated URLs.
518
- * Fix: update error strings on import/export issues.
519
- * Fix: sitemap items listed twice in audit report.
520
- * Fix: title tag on custom post type archives issue.
521
- * Fix: conflict with Movedo theme.
522
- * Fix: do not calculate disabled analysis results.
523
- * Fix: empty ignore URLs list clears sitemaps.
524
- * Fix: user name not shown for reporting.
525
 
526
  == About Us ==
527
  WPMU DEV is a premium supplier of quality WordPress plugins, services and support. Join us here:
7
  Author: WPMU DEV
8
  Requires at least: 4.6
9
  Tested up to: 5.5
10
+ Stable tag: 2.8.1
11
 
12
  SEO checker, content analysis & SEO optimizer. Rank higher on search engines with 301 redirects, XML sitemaps & one-click setup.
13
 
28
  * Smart Page Analyzer – SmartCrawl has an SEO checker that scans pages and posts for readability and keyword density and makes suggestions for optimizing your content.
29
  * SEO Crawl – Every time you add new content to your site, SmartCrawl will let Google know it’s time to re-crawl your site.
30
  * 301 Redirect – Use SmartCrawl to redirect traffic from one URL to another to protect your hard work and take advantage of high producing links.
31
+ * Schema Support – Let search engines know who you are and add your social profiles so search engines know which social profiles to attribute your web content to.
32
  * Integrate With Moz SEO Tools – Already using Moz? Connect your Moz reports and comparison analysis, including rank and links.
33
  * Quick Setup Import/Export – Quickly add your custom SmartCrawl SEO settings to all your sites with included import.
34
 
56
  ###301 URL Redirect
57
  Automatically redirect traffic from one URL to another. Use this tool if you have changed a page’s URL and wish to keep traffic flowing to the new page.
58
 
59
+ ### Full Schema Support
60
+ SmartCrawl has full support for default schema types and makes it easy for you to let search engines know what your data means, not just what it says. Soon you'll also be able to edit the properties of Article, Web Page, Rating & Review, Products, Local Business, and other schema types.
61
+
62
  ###The Rank-Higher Convert-Better SEO Tool
63
  Search Engine Optimization is not a trick, it’s all about following best practices.
64
 
132
 
133
  == Changelog ==
134
 
135
+ = 2.8.1 =
136
+
137
+ * New: Option to disable the Test Schema button from admin bar
138
+ * Fix: Incorrect URL in footer
139
+ * Fix: Post list columns and SEO meta shown for non-public post types
140
+ * Fix: Add schema for video and audio files directly uploaded and inserted into post content
141
+ * Fix: Autolink linking to the page itself on custom post types
142
+
143
  = 2.8.0 =
144
 
145
  * New: Full support for default Schema types
263
  * Fix: Deactivating onpage module affecting unrelated functionality
264
  * Fix: Version 3.x of AIOSEO not supported by importer
265
 
266
+ [Changelog for previous versions](https://premium.wpmudev.org/project/smartcrawl-wordpress-seo/#view-changelog).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
267
 
268
  == About Us ==
269
  WPMU DEV is a premium supplier of quality WordPress plugins, services and support. Join us here:
wpmu-dev-seo.php CHANGED
@@ -3,7 +3,7 @@
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.8.0
7
  * Network: true
8
  * Text Domain: wds
9
  * Author: WPMU DEV
@@ -29,7 +29,7 @@
29
  */
30
 
31
  if ( ! defined( 'SMARTCRAWL_VERSION' ) ) {
32
- define( 'SMARTCRAWL_VERSION', '2.8.0' );
33
  }
34
 
35
  if ( ! defined( 'SMARTCRAWL_SUI_VERSION' ) ) {
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.8.1
7
  * Network: true
8
  * Text Domain: wds
9
  * Author: WPMU DEV
29
  */
30
 
31
  if ( ! defined( 'SMARTCRAWL_VERSION' ) ) {
32
+ define( 'SMARTCRAWL_VERSION', '2.8.1' );
33
  }
34
 
35
  if ( ! defined( 'SMARTCRAWL_SUI_VERSION' ) ) {