All in One SEO Pack - Version 2.4.5

Version Description

Download this release

Release Info

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

Code changes from version 2.4.4.1 to 2.4.5

admin/aioseop_module_class.php CHANGED
@@ -2190,15 +2190,16 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
2190
  return apply_filters( "{$prefix}output_option", '', $args );
2191
  }
2192
  if ( in_array( $options['type'], array(
2193
- 'multiselect',
2194
- 'select',
2195
- 'multicheckbox',
2196
- 'radio',
2197
- 'checkbox',
2198
- 'textarea',
2199
- 'text',
2200
- 'submit',
2201
- 'hidden',
 
2202
  ) ) && is_string( $value )
2203
  ) {
2204
  $value = esc_attr( $value );
@@ -2213,6 +2214,9 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
2213
  if ( isset( $opts['id'] ) ) {
2214
  $attr .= " id=\"{$opts['id']}\" ";
2215
  }
 
 
 
2216
  switch ( $options['type'] ) {
2217
  case 'multiselect':
2218
  $attr .= ' MULTIPLE';
@@ -2249,6 +2253,10 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
2249
  case 'esc_html':
2250
  $buf .= "<pre>" . esc_html( $value ) . "</pre>\n";
2251
  break;
 
 
 
 
2252
  default:
2253
  $buf .= "<input name='$name' type='{$options['type']}' $attr value='$value'>\n";
2254
  }
2190
  return apply_filters( "{$prefix}output_option", '', $args );
2191
  }
2192
  if ( in_array( $options['type'], array(
2193
+ 'multiselect',
2194
+ 'select',
2195
+ 'multicheckbox',
2196
+ 'radio',
2197
+ 'checkbox',
2198
+ 'textarea',
2199
+ 'text',
2200
+ 'submit',
2201
+ 'hidden',
2202
+ 'date',
2203
  ) ) && is_string( $value )
2204
  ) {
2205
  $value = esc_attr( $value );
2214
  if ( isset( $opts['id'] ) ) {
2215
  $attr .= " id=\"{$opts['id']}\" ";
2216
  }
2217
+ if ( isset( $options['required'] ) && true === $options['required'] ) {
2218
+ $attr .= ' required';
2219
+ }
2220
  switch ( $options['type'] ) {
2221
  case 'multiselect':
2222
  $attr .= ' MULTIPLE';
2253
  case 'esc_html':
2254
  $buf .= "<pre>" . esc_html( $value ) . "</pre>\n";
2255
  break;
2256
+ case 'date':
2257
+ // firefox and IE < 11 do not have support for HTML5 date, so we will fall back to the datepicker.
2258
+ wp_enqueue_script( 'jquery-ui-datepicker' );
2259
+ // fall through.
2260
  default:
2261
  $buf .= "<input name='$name' type='{$options['type']}' $attr value='$value'>\n";
2262
  }
admin/aioseop_module_manager.php CHANGED
@@ -65,6 +65,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module_Manager' ) ) {
65
  */
66
  function return_module( $class ) {
67
  global $aiosp;
 
68
  if ( get_class( $aiosp ) === $class ) {
69
  return $aiosp;
70
  }
@@ -164,8 +165,13 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module_Manager' ) ) {
164
  return false;
165
  }
166
  $mod_enable = false;
167
- $fm_page = ( $this->module_settings_update && wp_verify_nonce( $_POST['nonce-aioseop'], 'aioseop-nonce' ) &&
168
- isset( $_REQUEST['page'] ) && trailingslashit( AIOSEOP_PLUGIN_DIRNAME ) . 'modules/aioseop_feature_manager.php' === $_REQUEST['page'] );
 
 
 
 
 
169
  if ( $fm_page && ! $this->settings_reset ) {
170
  if ( isset( $_POST["aiosp_feature_manager_enable_$mod"] ) ) {
171
  $mod_enable = $_POST["aiosp_feature_manager_enable_$mod"];
65
  */
66
  function return_module( $class ) {
67
  global $aiosp;
68
+ /* This is such a strange comparison! Don't know what the intent is. */
69
  if ( get_class( $aiosp ) === $class ) {
70
  return $aiosp;
71
  }
165
  return false;
166
  }
167
  $mod_enable = false;
168
+
169
+ $is_module_page = isset( $_REQUEST['page'] ) && trailingslashit( AIOSEOP_PLUGIN_DIRNAME ) . 'modules/aioseop_feature_manager.php' === $_REQUEST['page'];
170
+ if ( defined( 'AIOSEOP_UNIT_TESTING' ) ) {
171
+ // using $_REQUEST does not work because even if the parameter is set in $_POST or $_GET, it does not percolate to $_REQUEST.
172
+ $is_module_page = ( isset( $_GET['page'] ) && trailingslashit( AIOSEOP_PLUGIN_DIRNAME ) . 'modules/aioseop_feature_manager.php' === $_GET['page'] ) || ( isset( $_POST['page'] ) && trailingslashit( AIOSEOP_PLUGIN_DIRNAME ) . 'modules/aioseop_feature_manager.php' === $_POST['page'] );
173
+ }
174
+ $fm_page = $this->module_settings_update && wp_verify_nonce( $_POST['nonce-aioseop'], 'aioseop-nonce' ) && $is_module_page;
175
  if ( $fm_page && ! $this->settings_reset ) {
176
  if ( isset( $_POST["aiosp_feature_manager_enable_$mod"] ) ) {
177
  $mod_enable = $_POST["aiosp_feature_manager_enable_$mod"];
aioseop_class.php CHANGED
@@ -1405,7 +1405,7 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
1405
  $url = apply_filters( 'aioseop_canonical_url', $url );
1406
  }
1407
  if ( ! $url ) {
1408
- $url = get_permalink();
1409
  }
1410
 
1411
  $title = $this->apply_cf_fields( $title );
@@ -2675,7 +2675,7 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
2675
  return false;
2676
  }
2677
  } elseif ( $query->is_home && ( get_option( 'show_on_front' ) == 'page' ) && ( $pageid = get_option( 'page_for_posts' ) ) ) {
2678
- $link = get_permalink( $pageid );
2679
  } elseif ( is_front_page() || ( $query->is_home && ( get_option( 'show_on_front' ) != 'page' || ! get_option( 'page_for_posts' ) ) ) ) {
2680
  if ( function_exists( 'icl_get_home_url' ) ) {
2681
  $link = icl_get_home_url();
@@ -2684,7 +2684,7 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
2684
  }
2685
  } elseif ( ( $query->is_single || $query->is_page ) && $haspost ) {
2686
  $post = $query->posts[0];
2687
- $link = get_permalink( $post->ID );
2688
  } elseif ( $query->is_author && $haspost ) {
2689
  $author = get_userdata( get_query_var( 'author' ) );
2690
  if ( false === $author ) {
1405
  $url = apply_filters( 'aioseop_canonical_url', $url );
1406
  }
1407
  if ( ! $url ) {
1408
+ $url = aioseop_get_permalink();
1409
  }
1410
 
1411
  $title = $this->apply_cf_fields( $title );
2675
  return false;
2676
  }
2677
  } elseif ( $query->is_home && ( get_option( 'show_on_front' ) == 'page' ) && ( $pageid = get_option( 'page_for_posts' ) ) ) {
2678
+ $link = aioseop_get_permalink( $pageid );
2679
  } elseif ( is_front_page() || ( $query->is_home && ( get_option( 'show_on_front' ) != 'page' || ! get_option( 'page_for_posts' ) ) ) ) {
2680
  if ( function_exists( 'icl_get_home_url' ) ) {
2681
  $link = icl_get_home_url();
2684
  }
2685
  } elseif ( ( $query->is_single || $query->is_page ) && $haspost ) {
2686
  $post = $query->posts[0];
2687
+ $link = aioseop_get_permalink( $post->ID );
2688
  } elseif ( $query->is_author && $haspost ) {
2689
  $author = get_userdata( get_query_var( 'author' ) );
2690
  if ( false === $author ) {
all_in_one_seo_pack.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: All In One SEO Pack
4
  Plugin URI: https://semperplugins.com/all-in-one-seo-pack-pro-version/
5
  Description: Out-of-the-box SEO for your WordPress blog. Features like XML Sitemaps, SEO for custom post types, SEO for blogs or business sites, SEO for ecommerce sites, and much more. More than 30 million downloads since 2007.
6
- Version: 2.4.4.1
7
  Author: Michael Torbert
8
  Author URI: https://semperplugins.com/all-in-one-seo-pack-pro-version/
9
  Text Domain: all-in-one-seo-pack
@@ -31,14 +31,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
31
  * The original WordPress SEO plugin.
32
  *
33
  * @package All-in-One-SEO-Pack
34
- * @version 2.4.4.1
35
  */
36
 
37
  if ( ! defined( 'AIOSEOPPRO' ) ) {
38
  define( 'AIOSEOPPRO', false );
39
  }
40
  if ( ! defined( 'AIOSEOP_VERSION' ) ) {
41
- define( 'AIOSEOP_VERSION', '2.4.4.1' );
42
  }
43
  global $aioseop_plugin_name;
44
  $aioseop_plugin_name = 'All in One SEO Pack';
3
  Plugin Name: All In One SEO Pack
4
  Plugin URI: https://semperplugins.com/all-in-one-seo-pack-pro-version/
5
  Description: Out-of-the-box SEO for your WordPress blog. Features like XML Sitemaps, SEO for custom post types, SEO for blogs or business sites, SEO for ecommerce sites, and much more. More than 30 million downloads since 2007.
6
+ Version: 2.4.5
7
  Author: Michael Torbert
8
  Author URI: https://semperplugins.com/all-in-one-seo-pack-pro-version/
9
  Text Domain: all-in-one-seo-pack
31
  * The original WordPress SEO plugin.
32
  *
33
  * @package All-in-One-SEO-Pack
34
+ * @version 2.4.5
35
  */
36
 
37
  if ( ! defined( 'AIOSEOPPRO' ) ) {
38
  define( 'AIOSEOPPRO', false );
39
  }
40
  if ( ! defined( 'AIOSEOP_VERSION' ) ) {
41
+ define( 'AIOSEOP_VERSION', '2.4.5' );
42
  }
43
  global $aioseop_plugin_name;
44
  $aioseop_plugin_name = 'All in One SEO Pack';
inc/aioseop_functions.php CHANGED
@@ -8,6 +8,22 @@
8
  * @version 2.3.13
9
  */
10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  if ( ! function_exists( 'aioseop_load_modules' ) ) {
12
  /**
13
  * Load the module manager.
@@ -406,39 +422,50 @@ function aioseop_ajax_update_oembed() {
406
  if ( ! function_exists( 'aioseop_ajax_save_url' ) ) {
407
 
408
  function aioseop_ajax_save_url() {
 
409
  aioseop_ajax_init();
410
  $options = Array();
411
  parse_str( $_POST['options'], $options );
412
  foreach ( $options as $k => $v ) {
 
 
 
 
 
 
413
  $_POST[ $k ] = $v;
414
  }
415
- $_POST['action'] = 'aiosp_update_module';
416
- global $aiosp, $aioseop_modules;
417
- aioseop_load_modules();
418
- $aiosp->admin_menu();
419
- if ( ! empty( $_POST['settings'] ) && ( $_POST['settings'] === 'video_sitemap_addl_pages' ) ) {
420
- $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_Video_Sitemap' );
421
- } elseif ( ! empty( $_POST['settings'] ) && ( $_POST['settings'] === 'news_sitemap_addl_pages' ) ) {
422
- $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_News_Sitemap' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
423
  } else {
424
- $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_Sitemap' );
425
  }
426
- $_POST['location'] = null;
427
- $_POST['Submit'] = 'ajax';
428
- $module->add_page_hooks();
429
- $prefix = $module->get_prefix();
430
- $_POST = $module->get_current_options( $_POST, null );
431
- $module->handle_settings_updates( null );
432
- $options = $module->get_current_options( Array(), null );
433
- $output = $module->display_custom_options( '', Array(
434
- 'name' => $prefix . 'addl_pages',
435
- 'type' => 'custom',
436
- 'save' => true,
437
- 'value' => $options[ $prefix . 'addl_pages' ],
438
- 'attr' => '',
439
- ) );
440
- $output = str_replace( "'", "\'", $output );
441
- $output = str_replace( "\n", '\n', $output );
442
  die( sprintf( AIOSEOP_AJAX_MSG_TMPL, $output ) );
443
  }
444
  }
@@ -604,6 +631,10 @@ if ( ! function_exists( 'aioseop_ajax_save_settings' ) ) {
604
  $output = '<div id="aioseop_settings_header"><div id="message" class="updated fade"><p>' . $output . '</p></div></div><style>body.all-in-one-seo_page_all-in-one-seo-pack-aioseop_feature_manager .aioseop_settings_left { margin-top: 45px !important; }</style>';
605
  }
606
 
 
 
 
 
607
  die( sprintf( AIOSEOP_AJAX_MSG_TMPL, $output ) );
608
  }
609
  }
8
  * @version 2.3.13
9
  */
10
 
11
+ if ( ! function_exists( 'aioseop_get_permalink' ) ) {
12
+ /**
13
+ * Support UTF8 URLs.
14
+ *
15
+ * @param int|object|null $post_id The post.
16
+ */
17
+ function aioseop_get_permalink( $post_id = null ) {
18
+ if ( is_null( $post_id ) ) {
19
+ global $post;
20
+ $post_id = $post;
21
+ }
22
+
23
+ return urldecode( get_permalink( $post_id ) );
24
+ }
25
+ }
26
+
27
  if ( ! function_exists( 'aioseop_load_modules' ) ) {
28
  /**
29
  * Load the module manager.
422
  if ( ! function_exists( 'aioseop_ajax_save_url' ) ) {
423
 
424
  function aioseop_ajax_save_url() {
425
+ $valid = true;
426
  aioseop_ajax_init();
427
  $options = Array();
428
  parse_str( $_POST['options'], $options );
429
  foreach ( $options as $k => $v ) {
430
+ // all values are mandatory while adding to the sitemap.
431
+ // this should work in the same way for news and video sitemaps too, but tackling only regular sitemaps for now.
432
+ if ( 'sitemap_addl_pages' === $_POST['settings'] && empty( $v ) ) {
433
+ $valid = false;
434
+ break;
435
+ }
436
  $_POST[ $k ] = $v;
437
  }
438
+ if ( $valid ) {
439
+ $_POST['action'] = 'aiosp_update_module';
440
+ global $aiosp, $aioseop_modules;
441
+ aioseop_load_modules();
442
+ $aiosp->admin_menu();
443
+ if ( ! empty( $_POST['settings'] ) && ( $_POST['settings'] === 'video_sitemap_addl_pages' ) ) {
444
+ $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_Video_Sitemap' );
445
+ } elseif ( ! empty( $_POST['settings'] ) && ( $_POST['settings'] === 'news_sitemap_addl_pages' ) ) {
446
+ $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_News_Sitemap' );
447
+ } else {
448
+ $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_Sitemap' );
449
+ }
450
+ $_POST['location'] = null;
451
+ $_POST['Submit'] = 'ajax';
452
+ $module->add_page_hooks();
453
+ $prefix = $module->get_prefix();
454
+ $_POST = $module->get_current_options( $_POST, null );
455
+ $module->handle_settings_updates( null );
456
+ $options = $module->get_current_options( Array(), null );
457
+ $output = $module->display_custom_options( '', Array(
458
+ 'name' => $prefix . 'addl_pages',
459
+ 'type' => 'custom',
460
+ 'save' => true,
461
+ 'value' => $options[ $prefix . 'addl_pages' ],
462
+ 'attr' => '',
463
+ ) );
464
+ $output = str_replace( "'", "\'", $output );
465
+ $output = str_replace( "\n", '\n', $output );
466
  } else {
467
+ $output = __( 'All values are mandatory.', 'all-in-one-seo-pack' );
468
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
469
  die( sprintf( AIOSEOP_AJAX_MSG_TMPL, $output ) );
470
  }
471
  }
631
  $output = '<div id="aioseop_settings_header"><div id="message" class="updated fade"><p>' . $output . '</p></div></div><style>body.all-in-one-seo_page_all-in-one-seo-pack-aioseop_feature_manager .aioseop_settings_left { margin-top: 45px !important; }</style>';
632
  }
633
 
634
+ if ( defined( 'AIOSEOP_UNIT_TESTING' ) ) {
635
+ return;
636
+ }
637
+
638
  die( sprintf( AIOSEOP_AJAX_MSG_TMPL, $output ) );
639
  }
640
  }
js/modules/aioseop_module.js CHANGED
@@ -708,3 +708,17 @@ jQuery( document ).ready(function() {
708
  return false;
709
  });
710
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
708
  return false;
709
  });
710
  });
711
+
712
+
713
+ jQuery(document).ready( function() {
714
+ // TODO: consider moving EVERYTHING that needs ready() to this function
715
+ initAll(jQuery);
716
+ });
717
+
718
+ function initAll($){
719
+ if($('.aiseop-date').eq(0).prop('type').toLowerCase() === 'text'){
720
+ $('.aiseop-date').datepicker({
721
+ dateFormat: "yy-mm-dd"
722
+ });
723
+ }
724
+ }
modules/aioseop_opengraph.php CHANGED
@@ -640,7 +640,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Opengraph' ) ) {
640
 
641
  // Only ping Facebook if Social SEO is enabled on this post type.
642
  if ( $this->option_isset( 'types' ) && is_array( $this->options['aiosp_opengraph_types'] ) && in_array( $current_post_type, $this->options['aiosp_opengraph_types'] ) ) {
643
- $post_url = get_permalink( $post->ID );
644
  $endpoint = sprintf( 'https://graph.facebook.com/?%s', http_build_query( array(
645
  'id' => $post_url,
646
  'scrape' => true,
@@ -652,19 +652,19 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Opengraph' ) ) {
652
  /**
653
  * Forces FaceBook OpenGraph refresh on update.
654
  *
655
- * @param $post_ID
656
  * @param $post_after
657
  *
658
  * @see https://developers.facebook.com/docs/sharing/opengraph/using-objects#update
659
  * @since 2.3.11
660
  */
661
- function force_fb_refresh_update( $post_ID, $post_after ) {
662
 
663
  $current_post_type = get_post_type();
664
 
665
  // Only ping Facebook if Social SEO is enabled on this post type.
666
  if ( 'publish' === $post_after->post_status && $this->option_isset( 'types' ) && is_array( $this->options['aiosp_opengraph_types'] ) && in_array( $current_post_type, $this->options['aiosp_opengraph_types'] ) ) {
667
- $post_url = get_permalink( $post_ID );
668
  $endpoint = sprintf( 'https://graph.facebook.com/?%s', http_build_query( array(
669
  'id' => $post_url,
670
  'scrape' => true,
640
 
641
  // Only ping Facebook if Social SEO is enabled on this post type.
642
  if ( $this->option_isset( 'types' ) && is_array( $this->options['aiosp_opengraph_types'] ) && in_array( $current_post_type, $this->options['aiosp_opengraph_types'] ) ) {
643
+ $post_url = aioseop_get_permalink( $post->ID );
644
  $endpoint = sprintf( 'https://graph.facebook.com/?%s', http_build_query( array(
645
  'id' => $post_url,
646
  'scrape' => true,
652
  /**
653
  * Forces FaceBook OpenGraph refresh on update.
654
  *
655
+ * @param $post_id
656
  * @param $post_after
657
  *
658
  * @see https://developers.facebook.com/docs/sharing/opengraph/using-objects#update
659
  * @since 2.3.11
660
  */
661
+ function force_fb_refresh_update( $post_id, $post_after ) {
662
 
663
  $current_post_type = get_post_type();
664
 
665
  // Only ping Facebook if Social SEO is enabled on this post type.
666
  if ( 'publish' === $post_after->post_status && $this->option_isset( 'types' ) && is_array( $this->options['aiosp_opengraph_types'] ) && in_array( $current_post_type, $this->options['aiosp_opengraph_types'] ) ) {
667
+ $post_url = aioseop_get_permalink( $post_id );
668
  $endpoint = sprintf( 'https://graph.facebook.com/?%s', http_build_query( array(
669
  'id' => $post_url,
670
  'scrape' => true,
modules/aioseop_sitemap.php CHANGED
@@ -248,9 +248,10 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Sitemap' ) ) {
248
  ),
249
  'addl_mod' => array(
250
  'name' => __( 'Last Modified', 'all-in-one-seo-pack' ),
251
- 'type' => 'text',
252
  'label' => 'top',
253
  'save' => false,
 
254
  ),
255
  'addl_pages' => array(
256
  'name' => __( 'Additional Pages', 'all-in-one-seo-pack' ),
@@ -332,6 +333,8 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Sitemap' ) ) {
332
  $sitemap_max_url_notice_dismissed = get_user_meta( get_current_user_id(), 'aioseop_sitemap_max_url_notice_dismissed', true );
333
  if ( ! empty( $sitemap_max_url_notice_dismissed ) ) {
334
  return;
 
 
335
  }
336
 
337
  $options = $this->options;
@@ -1248,6 +1251,8 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Sitemap' ) ) {
1248
  // Always follow and noindex the sitemap.
1249
  header( 'X-Robots-Tag: noindex, follow', true );
1250
 
 
 
1251
  if ( $gzipped ) {
1252
  ob_start();
1253
  }
@@ -1404,6 +1409,11 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Sitemap' ) ) {
1404
  * @param string $message
1405
  */
1406
  function do_sitemaps( $message = '' ) {
 
 
 
 
 
1407
  if ( ! empty( $this->options["{$this->prefix}indexes"] ) ) {
1408
  if ( $this->options["{$this->prefix}max_posts"] && ( $this->options["{$this->prefix}max_posts"] > 0 ) && ( $this->options["{$this->prefix}max_posts"] < 50000 ) ) {
1409
  $this->max_posts = $this->options["{$this->prefix}max_posts"];
@@ -1617,9 +1627,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Sitemap' ) ) {
1617
  'post_type' => $options["{$this->prefix}posttypes"],
1618
  'post_status' => 'publish',
1619
  ) );
1620
- if ( ! is_array( $post_counts ) && is_array( $options["{$this->prefix}posttypes"] ) && count( $options["{$this->prefix}posttypes"] ) == 1 ) {
1621
- $post_counts = array( $options["{$this->prefix}posttypes"][0] => $post_counts );
1622
- }
1623
  foreach ( $options["{$this->prefix}posttypes"] as $sm ) {
1624
  if ( 0 == $post_counts[ $sm ] ) {
1625
  continue;
@@ -2717,6 +2725,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Sitemap' ) ) {
2717
  * @return array
2718
  */
2719
  private function get_images_from_post( $post ) {
 
2720
 
2721
  if ( ! aiosp_include_images() ) {
2722
  return array();
@@ -2746,8 +2755,16 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Sitemap' ) ) {
2746
  return $images;
2747
  }
2748
 
 
2749
  // Check featured image.
2750
- $attached_url = get_the_post_thumbnail_url( $post->ID );
 
 
 
 
 
 
 
2751
  if ( false !== $attached_url ) {
2752
  $images[] = $attached_url;
2753
  }
@@ -2811,6 +2828,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Sitemap' ) ) {
2811
  * @param string $image The image src.
2812
  *
2813
  * @since 2.4.1
 
2814
  *
2815
  * @return bool
2816
  */
@@ -2820,10 +2838,21 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Sitemap' ) ) {
2820
  return false;
2821
  }
2822
 
 
 
 
 
 
 
 
 
 
 
 
2823
  // make the url absolute, if its relative.
2824
  $image = aiosp_common::absolutize_url( $image );
2825
 
2826
- $extn = pathinfo( wp_parse_url( $image, PHP_URL_PATH ), PATHINFO_EXTENSION );
2827
  $allowed = apply_filters( 'aioseop_allowed_image_extensions', self::$image_extensions );
2828
  // Bail if image does not refer to an image file otherwise google webmaster tools might reject the sitemap.
2829
  if ( ! in_array( $extn, $allowed, true ) ) {
@@ -3074,7 +3103,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Sitemap' ) ) {
3074
  $start = false;
3075
  }
3076
 
3077
- return get_permalink( $post );
3078
  }
3079
 
3080
  /**
@@ -3107,42 +3136,32 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Sitemap' ) ) {
3107
  }
3108
 
3109
  /**
3110
- * Return post counts using wp_count_posts().
3111
  *
 
3112
  * @param $args
3113
  *
3114
- * @return mixed|null|void
3115
  */
3116
  function get_all_post_counts( $args ) {
3117
- $post_counts = null;
3118
  $status = 'inherit';
3119
  if ( ! empty( $args['post_status'] ) ) {
3120
  $status = $args['post_status'];
3121
  }
3122
  if ( ! empty( $args ) && ! empty( $args['post_type'] ) ) {
3123
- if ( ! is_array( $args['post_type'] ) || ( count( $args['post_type'] ) == 1 ) ) {
3124
- if ( is_array( $args['post_type'] ) ) {
3125
- $args['post_type'] = array_shift( $args['post_type'] );
 
 
3126
  }
3127
- $count = (Array) wp_count_posts( $args['post_type'] );
3128
- $post_counts = $count[ $status ];
3129
- } else {
3130
- foreach ( $args['post_type'] as $post_type ) {
3131
- if ( 'all' === $post_type ) {
3132
- continue;
3133
- }
3134
- $count = (Array) wp_count_posts( $post_type );
3135
-
3136
- if ( empty( $count ) ) {
3137
- $post_counts[ $post_type ] = 0;
3138
- } else {
3139
- if ( 'attachment' === $post_type ) {
3140
- $post_counts[ $post_type ] = $count['inherit'];
3141
- } else {
3142
- $post_counts[ $post_type ] = $count[ $status ];
3143
- }
3144
- }
3145
  }
 
 
 
3146
  }
3147
  }
3148
  $post_counts = apply_filters( $this->prefix . 'post_counts', $post_counts, $args );
@@ -3150,23 +3169,56 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Sitemap' ) ) {
3150
  return $post_counts;
3151
  }
3152
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3153
  /**
3154
  * Get total post count.
3155
  *
3156
  * @param $args
3157
  *
3158
- * @return int|mixed|null|void
3159
  */
3160
  function get_total_post_count( $args ) {
3161
  $total = 0;
3162
  $counts = $this->get_all_post_counts( $args );
3163
  if ( ! empty( $counts ) ) {
3164
- if ( is_array( $counts ) ) {
3165
- foreach ( $counts as $count ) {
3166
- $total += $count;
3167
- }
3168
- } else {
3169
- $total = $counts;
3170
  }
3171
  }
3172
 
@@ -3197,9 +3249,8 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Sitemap' ) ) {
3197
  'cache_results' => false,
3198
  'no_found_rows' => true,
3199
  );
3200
- if ( defined( 'ICL_SITEPRESS_VERSION' ) ) {
3201
- $defaults['suppress_filters'] = false;
3202
- }
3203
 
3204
  /*
3205
  * Filter to exclude password protected posts.
@@ -3245,6 +3296,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Sitemap' ) ) {
3245
  }
3246
  $this->excludes = array_merge( $args['exclude'] , $exclude_slugs ); // Add excluded slugs and IDs to class var.
3247
 
 
3248
  $posts = get_posts( apply_filters( $this->prefix . 'post_query', $args ) );
3249
  if ( ! empty( $exclude_slugs ) ) {
3250
  foreach ( $posts as $k => $v ) {
248
  ),
249
  'addl_mod' => array(
250
  'name' => __( 'Last Modified', 'all-in-one-seo-pack' ),
251
+ 'type' => 'date',
252
  'label' => 'top',
253
  'save' => false,
254
+ 'class' => 'aiseop-date',
255
  ),
256
  'addl_pages' => array(
257
  'name' => __( 'Additional Pages', 'all-in-one-seo-pack' ),
333
  $sitemap_max_url_notice_dismissed = get_user_meta( get_current_user_id(), 'aioseop_sitemap_max_url_notice_dismissed', true );
334
  if ( ! empty( $sitemap_max_url_notice_dismissed ) ) {
335
  return;
336
+ } elseif ( ! current_user_can( 'aiosp_manage_seo' ) ) {
337
+ return;
338
  }
339
 
340
  $options = $this->options;
1251
  // Always follow and noindex the sitemap.
1252
  header( 'X-Robots-Tag: noindex, follow', true );
1253
 
1254
+ do_action( $this->prefix . 'add_headers', $query, $this->options );
1255
+
1256
  if ( $gzipped ) {
1257
  ob_start();
1258
  }
1409
  * @param string $message
1410
  */
1411
  function do_sitemaps( $message = '' ) {
1412
+ if ( defined( 'AIOSEOP_UNIT_TESTING' ) ) {
1413
+ $aioseop_options = aioseop_get_options();
1414
+ $this->options = $aioseop_options['modules'][ "{$this->prefix}options" ];
1415
+ }
1416
+
1417
  if ( ! empty( $this->options["{$this->prefix}indexes"] ) ) {
1418
  if ( $this->options["{$this->prefix}max_posts"] && ( $this->options["{$this->prefix}max_posts"] > 0 ) && ( $this->options["{$this->prefix}max_posts"] < 50000 ) ) {
1419
  $this->max_posts = $this->options["{$this->prefix}max_posts"];
1627
  'post_type' => $options["{$this->prefix}posttypes"],
1628
  'post_status' => 'publish',
1629
  ) );
1630
+
 
 
1631
  foreach ( $options["{$this->prefix}posttypes"] as $sm ) {
1632
  if ( 0 == $post_counts[ $sm ] ) {
1633
  continue;
2725
  * @return array
2726
  */
2727
  private function get_images_from_post( $post ) {
2728
+ global $wp_version;
2729
 
2730
  if ( ! aiosp_include_images() ) {
2731
  return array();
2755
  return $images;
2756
  }
2757
 
2758
+ $attached_url = false;
2759
  // Check featured image.
2760
+ if ( version_compare( $wp_version, '4.4.0', '>=' ) ) {
2761
+ $attached_url = get_the_post_thumbnail_url( $post->ID );
2762
+ } else {
2763
+ $post_thumbnail_id = get_post_thumbnail_id( $post->ID );
2764
+ if ( $post_thumbnail_id ) {
2765
+ $attached_url = wp_get_attachment_image_src( $post_thumbnail_id );
2766
+ }
2767
+ }
2768
  if ( false !== $attached_url ) {
2769
  $images[] = $attached_url;
2770
  }
2828
  * @param string $image The image src.
2829
  *
2830
  * @since 2.4.1
2831
+ * @since 2.4.3 Compatibility with Pre v4.7 wp_parse_url().
2832
  *
2833
  * @return bool
2834
  */
2838
  return false;
2839
  }
2840
 
2841
+ global $wp_version;
2842
+ if ( version_compare( $wp_version, '4.7', '<' ) ) {
2843
+ // Compatability for older WP version that don't have 4.7 changes.
2844
+ // @link https://core.trac.wordpress.org/changeset/38726
2845
+ $p_url = wp_parse_url( $image );
2846
+ $url = $p_url['scheme'] . $p_url['host'] . $p_url['path'];
2847
+ } else {
2848
+ $component = PHP_URL_PATH;
2849
+ $url = wp_parse_url( $image, $component );
2850
+ }
2851
+
2852
  // make the url absolute, if its relative.
2853
  $image = aiosp_common::absolutize_url( $image );
2854
 
2855
+ $extn = pathinfo( $url, PATHINFO_EXTENSION );
2856
  $allowed = apply_filters( 'aioseop_allowed_image_extensions', self::$image_extensions );
2857
  // Bail if image does not refer to an image file otherwise google webmaster tools might reject the sitemap.
2858
  if ( ! in_array( $extn, $allowed, true ) ) {
3103
  $start = false;
3104
  }
3105
 
3106
+ return aioseop_get_permalink( $post );
3107
  }
3108
 
3109
  /**
3136
  }
3137
 
3138
  /**
3139
+ * Return post counts.
3140
  *
3141
+ * @since 2.4.3 Refactored to use get_post_count() instead of wp_count_posts().
3142
  * @param $args
3143
  *
3144
+ * @return array
3145
  */
3146
  function get_all_post_counts( $args ) {
3147
+ $post_counts = array();
3148
  $status = 'inherit';
3149
  if ( ! empty( $args['post_status'] ) ) {
3150
  $status = $args['post_status'];
3151
  }
3152
  if ( ! empty( $args ) && ! empty( $args['post_type'] ) ) {
3153
+ // #884: removed hard-to-understand code here which suspected $args['post_type'] to NOT be an array. Do not see any case in which this is likely to happen.
3154
+ foreach ( $args['post_type'] as $post_type ) {
3155
+ $count_args = $args;
3156
+ if ( 'all' === $post_type ) {
3157
+ continue;
3158
  }
3159
+ if ( 'attachment' === $post_type ) {
3160
+ $count_args['post_status'] = 'inherit';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3161
  }
3162
+
3163
+ $count_args['post_type'] = $post_type;
3164
+ $post_counts[ $post_type ] = $this->get_post_count( $count_args );
3165
  }
3166
  }
3167
  $post_counts = apply_filters( $this->prefix . 'post_counts', $post_counts, $args );
3169
  return $post_counts;
3170
  }
3171
 
3172
+ /**
3173
+ * Modify the post arguments in case third-party plugins are being used e.g. WPML.
3174
+ *
3175
+ * @param $args
3176
+ */
3177
+ function modify_post_params_for_external_plugins( &$args ) {
3178
+ // if WPML is being used, do not suppress filters.
3179
+ if ( defined( 'ICL_SITEPRESS_VERSION' ) ) {
3180
+ $args['suppress_filters'] = false;
3181
+ }
3182
+
3183
+ $args = apply_filters( $this->prefix . 'modify_post_params', $args );
3184
+ }
3185
+
3186
+ /**
3187
+ * Return post counts for the specified arguments.
3188
+ *
3189
+ * @param $args
3190
+ *
3191
+ * @return int
3192
+ */
3193
+ function get_post_count( $args ) {
3194
+ $this->modify_post_params_for_external_plugins( $args );
3195
+
3196
+ // we will use WP_Query instead of get_posts here as that is more efficient.
3197
+ // BEWARE: since we are using WP_Query, suppress_filters is false.
3198
+ $args['posts_per_page'] = -1;
3199
+ $args['fields'] = 'ids';
3200
+ $args['update_post_meta_cache'] = false;
3201
+ $args['update_post_term_cache'] = false;
3202
+ $query = new WP_Query( $args );
3203
+ if ( $query->have_posts() ) {
3204
+ return $query->post_count;
3205
+ }
3206
+ return 0;
3207
+ }
3208
+
3209
  /**
3210
  * Get total post count.
3211
  *
3212
  * @param $args
3213
  *
3214
+ * @return int
3215
  */
3216
  function get_total_post_count( $args ) {
3217
  $total = 0;
3218
  $counts = $this->get_all_post_counts( $args );
3219
  if ( ! empty( $counts ) ) {
3220
+ foreach ( $counts as $count ) {
3221
+ $total += $count;
 
 
 
 
3222
  }
3223
  }
3224
 
3249
  'cache_results' => false,
3250
  'no_found_rows' => true,
3251
  );
3252
+
3253
+ $this->modify_post_params_for_external_plugins( $defaults );
 
3254
 
3255
  /*
3256
  * Filter to exclude password protected posts.
3296
  }
3297
  $this->excludes = array_merge( $args['exclude'] , $exclude_slugs ); // Add excluded slugs and IDs to class var.
3298
 
3299
+ // TODO: consider using WP_Query instead of get_posts to improve efficiency.
3300
  $posts = get_posts( apply_filters( $this->prefix . 'post_query', $args ) );
3301
  if ( ! empty( $exclude_slugs ) ) {
3302
  foreach ( $posts as $k => $v ) {
public/front.php CHANGED
@@ -42,7 +42,6 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Front' ) ) {
42
  * @since 2.3.9
43
  */
44
  function redirect_attachment() {
45
-
46
  global $aioseop_options;
47
  if ( ! isset( $aioseop_options['aiosp_redirect_attachement_parent'] ) || $aioseop_options['aiosp_redirect_attachement_parent'] !== 'on' ) {
48
  return false;
@@ -50,7 +49,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Front' ) ) {
50
 
51
  global $post;
52
  if ( is_attachment() && ( ( is_object( $post ) && isset( $post->post_parent ) ) && ( is_numeric( $post->post_parent ) && $post->post_parent != 0 ) ) ) {
53
- wp_safe_redirect( get_permalink( $post->post_parent ), 301 );
54
  exit;
55
  }
56
  }
42
  * @since 2.3.9
43
  */
44
  function redirect_attachment() {
 
45
  global $aioseop_options;
46
  if ( ! isset( $aioseop_options['aiosp_redirect_attachement_parent'] ) || $aioseop_options['aiosp_redirect_attachement_parent'] !== 'on' ) {
47
  return false;
49
 
50
  global $post;
51
  if ( is_attachment() && ( ( is_object( $post ) && isset( $post->post_parent ) ) && ( is_numeric( $post->post_parent ) && $post->post_parent != 0 ) ) ) {
52
+ wp_safe_redirect( aioseop_get_permalink( $post->post_parent ), 301 );
53
  exit;
54
  }
55
  }
public/google-analytics.php CHANGED
@@ -64,7 +64,7 @@ if ( ! class_exists( 'aioseop_google_analytics' ) ) {
64
  ) ) {
65
  $autotrack = apply_filters(
66
  'aiosp_google_autotrack',
67
- 'https://cdnjs.cloudflare.com/ajax/libs/autotrack/2.4.0/autotrack.js'
68
  );
69
  ?><script async src="<?php echo $autotrack ?>"></script>
70
  <?php // Requested indent #921
64
  ) ) {
65
  $autotrack = apply_filters(
66
  'aiosp_google_autotrack',
67
+ AIOSEOP_PLUGIN_URL . 'public/js/autotrack.js'
68
  );
69
  ?><script async src="<?php echo $autotrack ?>"></script>
70
  <?php // Requested indent #921
public/js/autotrack.js ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function(){var f,aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(c.get||c.set)throw new TypeError("ES3 does not support getters and setters.");a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)},k="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this;function l(){l=function(){};k.Symbol||(k.Symbol=ba)}var ca=0;function ba(a){return"jscomp_symbol_"+(a||"")+ca++}
2
+ function m(){l();var a=k.Symbol.iterator;a||(a=k.Symbol.iterator=k.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&aa(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return da(this)}});m=function(){}}function da(a){var b=0;return ea(function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}})}function ea(a){m();a={next:a};a[k.Symbol.iterator]=function(){return this};return a}function fa(a){m();l();m();var b=a[Symbol.iterator];return b?b.call(a):da(a)}
3
+ function n(a){if(!(a instanceof Array)){a=fa(a);for(var b,c=[];!(b=a.next()).done;)c.push(b.value);a=c}return a}function ha(a,b){function c(){}c.prototype=b.prototype;a.ha=b.prototype;a.prototype=new c;a.prototype.constructor=a;for(var d in b)if(Object.defineProperties){var e=Object.getOwnPropertyDescriptor(b,d);e&&Object.defineProperty(a,d,e)}else a[d]=b[d]}var p=window.Element.prototype,ia=p.matches||p.matchesSelector||p.webkitMatchesSelector||p.mozMatchesSelector||p.msMatchesSelector||p.oMatchesSelector;
4
+ function ja(a,b){if(a&&1==a.nodeType&&b){if("string"==typeof b||1==b.nodeType)return a==b||ka(a,b);if("length"in b)for(var c=0,d;d=b[c];c++)if(a==d||ka(a,d))return!0}return!1}function ka(a,b){if("string"!=typeof b)return!1;if(ia)return ia.call(a,b);b=a.parentNode.querySelectorAll(b);for(var c=0,d;d=b[c];c++)if(d==a)return!0;return!1}function la(a){for(var b=[];a&&a.parentNode&&1==a.parentNode.nodeType;)a=a.parentNode,b.push(a);return b}
5
+ function q(a,b,c){function d(a){var d;if(h.composed&&"function"==typeof a.composedPath)for(var e=a.composedPath(),g=0,F;F=e[g];g++)1==F.nodeType&&ja(F,b)&&(d=F);else a:{if((d=a.target)&&1==d.nodeType&&b)for(d=[d].concat(la(d)),e=0;g=d[e];e++)if(ja(g,b)){d=g;break a}d=void 0}d&&c.call(d,a,d)}var e=document,h={composed:!0,S:!0},h=void 0===h?{}:h;e.addEventListener(a,d,h.S);return{j:function(){e.removeEventListener(a,d,h.S)}}}
6
+ function ma(a){var b={};if(!a||1!=a.nodeType)return b;a=a.attributes;if(!a.length)return{};for(var c=0,d;d=a[c];c++)b[d.name]=d.value;return b}var na=/:(80|443)$/,r=document.createElement("a"),t={};
7
+ function u(a){a=a&&"."!=a?a:location.href;if(t[a])return t[a];r.href=a;if("."==a.charAt(0)||"/"==a.charAt(0))return u(r.href);var b="80"==r.port||"443"==r.port?"":r.port,b="0"==b?"":b,c=r.host.replace(na,"");return t[a]={hash:r.hash,host:c,hostname:r.hostname,href:r.href,origin:r.origin?r.origin:r.protocol+"//"+c,pathname:"/"==r.pathname.charAt(0)?r.pathname:"/"+r.pathname,port:b,protocol:r.protocol,search:r.search}}var v=[];
8
+ function oa(a,b){var c=this;this.context=a;this.P=b;this.f=(this.c=/Task$/.test(b))?a.get(b):a[b];this.b=[];this.a=[];this.g=function(a){for(var b=[],d=0;d<arguments.length;++d)b[d-0]=arguments[d];return c.a[c.a.length-1].apply(null,[].concat(n(b)))};this.c?a.set(b,this.g):a[b]=this.g}function w(a,b,c){a=pa(a,b);a.b.push(c);qa(a)}function x(a,b,c){a=pa(a,b);c=a.b.indexOf(c);-1<c&&(a.b.splice(c,1),0<a.b.length?qa(a):a.j())}
9
+ function qa(a){a.a=[];for(var b,c=0;b=a.b[c];c++){var d=a.a[c-1]||a.f.bind(a.context);a.a.push(b(d))}}oa.prototype.j=function(){var a=v.indexOf(this);-1<a&&(v.splice(a,1),this.c?this.context.set(this.P,this.f):this.context[this.P]=this.f)};function pa(a,b){var c=v.filter(function(c){return c.context==a&&c.P==b})[0];c||(c=new oa(a,b),v.push(c));return c}
10
+ function y(a,b,c,d,e,h){if("function"==typeof d){var g=c.get("buildHitTask");return{buildHitTask:function(c){c.set(a,null,!0);c.set(b,null,!0);d(c,e,h);g(c)}}}return z({},a,b)}function A(a,b){var c=ma(a),d={};Object.keys(c).forEach(function(a){if(!a.indexOf(b)&&a!=b+"on"){var e=c[a];"true"==e&&(e=!0);"false"==e&&(e=!1);a=ra(a.slice(b.length));d[a]=e}});return d}
11
+ function sa(a){"loading"==document.readyState?document.addEventListener("DOMContentLoaded",function c(){document.removeEventListener("DOMContentLoaded",c);a()}):a()}function ta(a,b){var c;return function(d){for(var e=[],h=0;h<arguments.length;++h)e[h-0]=arguments[h];clearTimeout(c);c=setTimeout(function(){return a.apply(null,[].concat(n(e)))},b)}}function ua(a){function b(){c||(c=!0,a())}var c=!1;setTimeout(b,2E3);return b}var B={};
12
+ function va(a,b){function c(){clearTimeout(e.timeout);e.send&&x(a,"send",e.send);delete B[d];e.R.forEach(function(a){return a()})}var d=a.get("trackingId"),e=B[d]=B[d]||{};clearTimeout(e.timeout);e.timeout=setTimeout(c,0);e.R=e.R||[];e.R.push(b);e.send||(e.send=function(a){return function(b){for(var d=[],e=0;e<arguments.length;++e)d[e-0]=arguments[e];c();a.apply(null,[].concat(n(d)))}},w(a,"send",e.send))}
13
+ var z=Object.assign||function(a,b){for(var c=[],d=1;d<arguments.length;++d)c[d-1]=arguments[d];for(var d=0,e=c.length;d<e;d++){var h=Object(c[d]),g;for(g in h)Object.prototype.hasOwnProperty.call(h,g)&&(a[g]=h[g])}return a};function ra(a){return a.replace(/[\-\_]+(\w?)/g,function(a,c){return c.toUpperCase()})}function C(a){return"object"==typeof a&&null!==a}var D=function wa(b){return b?(b^16*Math.random()>>b/4).toString(16):"10000000-1000-4000-8000-100000000000".replace(/[018]/g,wa)};
14
+ function G(a,b){var c=window.GoogleAnalyticsObject||"ga";window[c]=window[c]||function(a){for(var b=[],d=0;d<arguments.length;++d)b[d-0]=arguments[d];(window[c].q=window[c].q||[]).push(b)};window.gaDevIds=window.gaDevIds||[];0>window.gaDevIds.indexOf("i5iSjo")&&window.gaDevIds.push("i5iSjo");window[c]("provide",a,b);window.gaplugins=window.gaplugins||{};window.gaplugins[a.charAt(0).toUpperCase()+a.slice(1)]=b}var H={T:1,U:2,V:3,X:4,Y:5,Z:6,$:7,aa:8,ba:9,W:10},I=Object.keys(H).length;
15
+ function J(a,b){a.set("\x26_av","2.4.0");var c=a.get("\x26_au"),c=parseInt(c||"0",16).toString(2);if(c.length<I)for(var d=I-c.length;d;)c="0"+c,d--;b=I-b;c=c.substr(0,b)+1+c.substr(b+1);a.set("\x26_au",parseInt(c||"0",2).toString(16))}function K(a,b){J(a,H.T);this.a=z({},b);this.g=a;this.b=this.a.stripQuery&&this.a.queryDimensionIndex?"dimension"+this.a.queryDimensionIndex:null;this.f=this.f.bind(this);this.c=this.c.bind(this);w(a,"get",this.f);w(a,"buildHitTask",this.c)}
16
+ K.prototype.f=function(a){var b=this;return function(c){if("page"==c||c==b.b){var d={location:a("location"),page:a("page")};return xa(b,d)[c]}return a(c)}};K.prototype.c=function(a){var b=this;return function(c){var d=xa(b,{location:c.get("location"),page:c.get("page")});c.set(d,null,!0);a(c)}};
17
+ function xa(a,b){var c=u(b.page||b.location),d=c.pathname;if(a.a.indexFilename){var e=d.split("/");a.a.indexFilename==e[e.length-1]&&(e[e.length-1]="",d=e.join("/"))}"remove"==a.a.trailingSlash?d=d.replace(/\/+$/,""):"add"==a.a.trailingSlash&&(/\.\w+$/.test(d)||"/"==d.substr(-1)||(d+="/"));d={page:d+(a.a.stripQuery?ya(a,c.search):c.search)};b.location&&(d.location=b.location);a.b&&(d[a.b]=c.search.slice(1)||"(not set)");return"function"==typeof a.a.urlFieldsFilter?(b=a.a.urlFieldsFilter(d,u),c={page:b.page,
18
+ location:b.location},a.b&&(c[a.b]=b[a.b]),c):d}function ya(a,b){if(Array.isArray(a.a.queryParamsWhitelist)){var c=[];b.slice(1).split("\x26").forEach(function(b){var d=fa(b.split("\x3d"));b=d.next().value;d=d.next().value;-1<a.a.queryParamsWhitelist.indexOf(b)&&d&&c.push([b,d])});return c.length?"?"+c.map(function(a){return a.join("\x3d")}).join("\x26"):""}return""}K.prototype.remove=function(){x(this.g,"get",this.f);x(this.g,"buildHitTask",this.c)};G("cleanUrlTracker",K);
19
+ function L(a,b){var c=this;J(a,H.U);if(window.addEventListener){this.a=z({events:["click"],fieldsObj:{},attributePrefix:"ga-"},b);this.f=a;this.c=this.c.bind(this);var d="["+this.a.attributePrefix+"on]";this.b={};this.a.events.forEach(function(a){c.b[a]=q(a,d,c.c)})}}
20
+ L.prototype.c=function(a,b){var c=this.a.attributePrefix;if(!(0>b.getAttribute(c+"on").split(/\s*,\s*/).indexOf(a.type))){var c=A(b,c),d=z({},this.a.fieldsObj,c);this.f.send(c.hitType||"event",y({transport:"beacon"},d,this.f,this.a.hitFilter,b,a))}};L.prototype.remove=function(){var a=this;Object.keys(this.b).forEach(function(b){a.b[b].j()})};G("eventTracker",L);
21
+ function za(a,b){var c=this;J(a,H.V);window.IntersectionObserver&&window.MutationObserver&&(this.a=z({rootMargin:"0px",fieldsObj:{},attributePrefix:"ga-"},b),this.c=a,this.M=this.M.bind(this),this.O=this.O.bind(this),this.K=this.K.bind(this),this.L=this.L.bind(this),this.b=null,this.items=[],this.i={},this.h={},sa(function(){c.a.elements&&c.observeElements(c.a.elements)}))}f=za.prototype;
22
+ f.observeElements=function(a){var b=this;a=M(this,a);this.items=this.items.concat(a.items);this.i=z({},a.i,this.i);this.h=z({},a.h,this.h);a.items.forEach(function(a){var c=b.h[a.threshold]=b.h[a.threshold]||new IntersectionObserver(b.O,{rootMargin:b.a.rootMargin,threshold:[+a.threshold]});(a=b.i[a.id]||(b.i[a.id]=document.getElementById(a.id)))&&c.observe(a)});this.b||(this.b=new MutationObserver(this.M),this.b.observe(document.body,{childList:!0,subtree:!0}));requestAnimationFrame(function(){})};
23
+ f.unobserveElements=function(a){var b=[],c=[];this.items.forEach(function(d){a.some(function(a){a=Aa(a);return a.id===d.id&&a.threshold===d.threshold&&a.trackFirstImpressionOnly===d.trackFirstImpressionOnly})?c.push(d):b.push(d)});if(b.length){var d=M(this,b),e=M(this,c);this.items=d.items;this.i=d.i;this.h=d.h;c.forEach(function(a){if(!d.i[a.id]){var b=e.h[a.threshold],c=e.i[a.id];c&&b.unobserve(c);d.h[a.threshold]||e.h[a.threshold].disconnect()}})}else this.unobserveAllElements()};
24
+ f.unobserveAllElements=function(){var a=this;Object.keys(this.h).forEach(function(b){a.h[b].disconnect()});this.b.disconnect();this.b=null;this.items=[];this.i={};this.h={}};function M(a,b){var c=[],d={},e={};b.length&&b.forEach(function(b){b=Aa(b);c.push(b);e[b.id]=a.i[b.id]||null;d[b.threshold]=a.h[b.threshold]||null});return{items:c,i:e,h:d}}f.M=function(a){for(var b=0,c;c=a[b];b++){for(var d=0,e;e=c.removedNodes[d];d++)N(this,e,this.L);for(d=0;e=c.addedNodes[d];d++)N(this,e,this.K)}};
25
+ function N(a,b,c){1==b.nodeType&&b.id in a.i&&c(b.id);for(var d=0,e;e=b.childNodes[d];d++)N(a,e,c)}
26
+ f.O=function(a){for(var b=[],c=0,d;d=a[c];c++)for(var e=0,h;h=this.items[e];e++){var g;if(g=d.target.id===h.id)(g=h.threshold)?g=d.intersectionRatio>=g:(g=d.intersectionRect,g=0<g.top||0<g.bottom||0<g.left||0<g.right);if(g){var E=h.id;g=document.getElementById(E);var E={transport:"beacon",eventCategory:"Viewport",eventAction:"impression",eventLabel:E,nonInteraction:!0},Na=z({},this.a.fieldsObj,A(g,this.a.attributePrefix));this.c.send("event",y(E,Na,this.c,this.a.hitFilter,g));h.trackFirstImpressionOnly&&
27
+ b.push(h)}}b.length&&this.unobserveElements(b)};f.K=function(a){var b=this,c=this.i[a]=document.getElementById(a);this.items.forEach(function(d){a==d.id&&b.h[d.threshold].observe(c)})};f.L=function(a){var b=this,c=this.i[a];this.items.forEach(function(d){a==d.id&&b.h[d.threshold].unobserve(c)});this.i[a]=null};f.remove=function(){this.unobserveAllElements()};G("impressionTracker",za);function Aa(a){"string"==typeof a&&(a={id:a});return z({threshold:0,trackFirstImpressionOnly:!0},a)}
28
+ function Ba(){this.a={}}function Ca(a,b){(a.a.externalSet=a.a.externalSet||[]).push(b)}Ba.prototype.ca=function(a,b){for(var c=[],d=1;d<arguments.length;++d)c[d-1]=arguments[d];(this.a[a]=this.a[a]||[]).forEach(function(a){return a.apply(null,[].concat(n(c)))})};var O={},P=!1,Q;function R(a,b){b=void 0===b?{}:b;this.a={};this.b=a;this.w=b;this.l=null}ha(R,Ba);function S(a,b,c){a=["autotrack",a,b].join(":");O[a]||(O[a]=new R(a,c),P||(window.addEventListener("storage",Da),P=!0));return O[a]}
29
+ function Ea(){if(null!=Q)return Q;try{window.localStorage.setItem("autotrack","autotrack"),window.localStorage.removeItem("autotrack"),Q=!0}catch(a){Q=!1}return Q}R.prototype.get=function(){if(this.l)return this.l;if(Ea())try{this.l=Fa(window.localStorage.getItem(this.b))}catch(a){}return this.l=z({},this.w,this.l)};R.prototype.set=function(a){this.l=z({},this.w,this.l,a);if(Ea())try{var b=JSON.stringify(this.l);window.localStorage.setItem(this.b,b)}catch(c){}};
30
+ function Ga(a){a.l={};if(Ea())try{window.localStorage.removeItem(a.b)}catch(b){}}R.prototype.j=function(){delete O[this.b];Object.keys(O).length||(window.removeEventListener("storage",Da),P=!1)};function Da(a){var b=O[a.key];if(b){var c=z({},b.w,Fa(a.oldValue));a=z({},b.w,Fa(a.newValue));b.l=a;b.ca("externalSet",a,c)}}function Fa(a){var b={};if(a)try{b=JSON.parse(a)}catch(c){}return b}var T={};
31
+ function U(a,b,c){this.f=a;this.timeout=b||Ha;this.timeZone=c;this.b=this.b.bind(this);w(a,"sendHitTask",this.b);try{this.c=new Intl.DateTimeFormat("en-US",{timeZone:this.timeZone})}catch(d){}this.a=S(a.get("trackingId"),"session",{hitTime:0,isExpired:!1});this.a.get().id||this.a.set({id:D()})}function Ia(a,b,c){var d=a.get("trackingId");return T[d]?T[d]:T[d]=new U(a,b,c)}function V(a){return a.a.get().id}
32
+ U.prototype.isExpired=function(a){a=void 0===a?V(this):a;if(a!=V(this))return!0;a=this.a.get();if(a.isExpired)return!0;var b=a.hitTime;return b&&(a=new Date,b=new Date(b),a-b>6E4*this.timeout||this.c&&this.c.format(a)!=this.c.format(b))?!0:!1};U.prototype.b=function(a){var b=this;return function(c){a(c);var d=c.get("sessionControl");c="start"==d||b.isExpired();var d="end"==d,e=b.a.get();e.hitTime=+new Date;c&&(e.isExpired=!1,e.id=D());d&&(e.isExpired=!0);b.a.set(e)}};
33
+ U.prototype.j=function(){x(this.f,"sendHitTask",this.b);this.a.j();delete T[this.f.get("trackingId")]};var Ha=30;function W(a,b){J(a,H.W);window.addEventListener&&(this.b=z({increaseThreshold:20,sessionTimeout:Ha,fieldsObj:{}},b),this.f=a,this.c=Ja(this),this.g=ta(this.g.bind(this),500),this.o=this.o.bind(this),this.a=S(a.get("trackingId"),"plugins/max-scroll-tracker"),this.m=Ia(a,this.b.sessionTimeout,this.b.timeZone),w(a,"set",this.o),Ka(this))}
34
+ function Ka(a){100>(a.a.get()[a.c]||0)&&window.addEventListener("scroll",a.g)}
35
+ W.prototype.g=function(){var a=document.documentElement,b=document.body,a=Math.min(100,Math.max(0,Math.round(window.pageYOffset/(Math.max(a.offsetHeight,a.scrollHeight,b.offsetHeight,b.scrollHeight)-window.innerHeight)*100))),b=V(this.m);b!=this.a.get().sessionId&&(Ga(this.a),this.a.set({sessionId:b}));if(this.m.isExpired(this.a.get().sessionId))Ga(this.a);else if(b=this.a.get()[this.c]||0,a>b&&(100!=a&&100!=b||window.removeEventListener("scroll",this.g),b=a-b,100==a||b>=this.b.increaseThreshold)){var c=
36
+ {};this.a.set((c[this.c]=a,c.sessionId=V(this.m),c));a={transport:"beacon",eventCategory:"Max Scroll",eventAction:"increase",eventValue:b,eventLabel:String(a),nonInteraction:!0};this.b.maxScrollMetricIndex&&(a["metric"+this.b.maxScrollMetricIndex]=b);this.f.send("event",y(a,this.b.fieldsObj,this.f,this.b.hitFilter))}};W.prototype.o=function(a){var b=this;return function(c,d){a(c,d);var e={};(C(c)?c:(e[c]=d,e)).page&&(c=b.c,b.c=Ja(b),b.c!=c&&Ka(b))}};
37
+ function Ja(a){a=u(a.f.get("page")||a.f.get("location"));return a.pathname+a.search}W.prototype.remove=function(){this.m.j();window.removeEventListener("scroll",this.g);x(this.f,"set",this.o)};G("maxScrollTracker",W);var La={};function Ma(a,b){J(a,H.X);window.matchMedia&&(this.a=z({changeTemplate:this.changeTemplate,changeTimeout:1E3,fieldsObj:{}},b),C(this.a.definitions)&&(b=this.a.definitions,this.a.definitions=Array.isArray(b)?b:[b],this.b=a,this.c=[],Oa(this)))}
38
+ function Oa(a){a.a.definitions.forEach(function(b){if(b.name&&b.dimensionIndex){var c=Pa(b);a.b.set("dimension"+b.dimensionIndex,c);Qa(a,b)}})}function Pa(a){var b;a.items.forEach(function(a){Ra(a.media).matches&&(b=a)});return b?b.name:"(not set)"}
39
+ function Qa(a,b){b.items.forEach(function(c){c=Ra(c.media);var d=ta(function(){var c=Pa(b),d=a.b.get("dimension"+b.dimensionIndex);c!==d&&(a.b.set("dimension"+b.dimensionIndex,c),c={transport:"beacon",eventCategory:b.name,eventAction:"change",eventLabel:a.a.changeTemplate(d,c),nonInteraction:!0},a.b.send("event",y(c,a.a.fieldsObj,a.b,a.a.hitFilter)))},a.a.changeTimeout);c.addListener(d);a.c.push({fa:c,da:d})})}Ma.prototype.remove=function(){for(var a=0,b;b=this.c[a];a++)b.fa.removeListener(b.da)};
40
+ Ma.prototype.changeTemplate=function(a,b){return a+" \x3d\x3e "+b};G("mediaQueryTracker",Ma);function Ra(a){return La[a]||(La[a]=window.matchMedia(a))}function X(a,b){J(a,H.Y);window.addEventListener&&(this.a=z({formSelector:"form",shouldTrackOutboundForm:this.shouldTrackOutboundForm,fieldsObj:{},attributePrefix:"ga-"},b),this.b=a,this.c=q("submit",this.a.formSelector,this.f.bind(this)))}
41
+ X.prototype.f=function(a,b){var c={transport:"beacon",eventCategory:"Outbound Form",eventAction:"submit",eventLabel:u(b.action).href};if(this.a.shouldTrackOutboundForm(b,u)){navigator.sendBeacon||(a.preventDefault(),c.hitCallback=ua(function(){b.submit()}));var d=z({},this.a.fieldsObj,A(b,this.a.attributePrefix));this.b.send("event",y(c,d,this.b,this.a.hitFilter,b,a))}};
42
+ X.prototype.shouldTrackOutboundForm=function(a,b){a=b(a.action);return a.hostname!=location.hostname&&"http"==a.protocol.slice(0,4)};X.prototype.remove=function(){this.c.j()};G("outboundFormTracker",X);
43
+ function Y(a,b){var c=this;J(a,H.Z);window.addEventListener&&(this.a=z({events:["click"],linkSelector:"a, area",shouldTrackOutboundLink:this.shouldTrackOutboundLink,fieldsObj:{},attributePrefix:"ga-"},b),this.f=a,this.c=this.c.bind(this),this.b={},this.a.events.forEach(function(a){c.b[a]=q(a,c.a.linkSelector,c.c)}))}
44
+ Y.prototype.c=function(a,b){if(this.a.shouldTrackOutboundLink(b,u)){var c=b.getAttribute("href")||b.getAttribute("xlink:href"),d=u(c),e={transport:"beacon",eventCategory:"Outbound Link",eventAction:a.type,eventLabel:d.href};navigator.sendBeacon||"click"!=a.type||"_blank"==b.target||a.metaKey||a.ctrlKey||a.shiftKey||a.altKey||1<a.which||window.addEventListener("click",function(a){a.defaultPrevented||(a.preventDefault(),e.hitCallback=ua(function(){location.href=c}))});d=z({},this.a.fieldsObj,A(b,this.a.attributePrefix));
45
+ this.f.send("event",y(e,d,this.f,this.a.hitFilter,b,a))}};Y.prototype.shouldTrackOutboundLink=function(a,b){a=a.getAttribute("href")||a.getAttribute("xlink:href");b=b(a);return b.hostname!=location.hostname&&"http"==b.protocol.slice(0,4)};Y.prototype.remove=function(){var a=this;Object.keys(this.b).forEach(function(b){a.b[b].j()})};G("outboundLinkTracker",Y);var Z=D();
46
+ function Sa(a,b){var c=this;J(a,H.$);document.visibilityState&&(this.a=z({sessionTimeout:Ha,visibleThreshold:5E3,sendInitialPageview:!1,fieldsObj:{}},b),this.b=a,this.g=document.visibilityState,this.m=null,this.o=!1,this.v=this.v.bind(this),this.s=this.s.bind(this),this.G=this.G.bind(this),this.N=this.N.bind(this),this.c=S(a.get("trackingId"),"plugins/page-visibility-tracker"),Ca(this.c,this.N),this.f=Ia(a,this.a.sessionTimeout,this.a.timeZone),w(a,"set",this.v),window.addEventListener("unload",this.G),
47
+ document.addEventListener("visibilitychange",this.s),va(this.b,function(){if("visible"==document.visibilityState)c.a.sendInitialPageview&&(Ta(c,{ea:!0}),c.o=!0),c.c.set({time:+new Date,state:"visible",pageId:Z,sessionId:V(c.f)});else if(c.a.sendInitialPageview&&c.a.pageLoadsMetricIndex){var a={},a=(a.transport="beacon",a.eventCategory="Page Visibility",a.eventAction="page load",a.eventLabel="(not set)",a["metric"+c.a.pageLoadsMetricIndex]=1,a.nonInteraction=!0,a);c.b.send("event",y(a,c.a.fieldsObj,
48
+ c.b,c.a.hitFilter))}}))}f=Sa.prototype;
49
+ f.s=function(){var a=this;if("visible"==document.visibilityState||"hidden"==document.visibilityState){var b=Ua(this),c={time:+new Date,state:document.visibilityState,pageId:Z,sessionId:V(this.f)};"visible"==document.visibilityState&&this.a.sendInitialPageview&&!this.o&&(Ta(this),this.o=!0);"hidden"==document.visibilityState&&this.m&&clearTimeout(this.m);this.f.isExpired(b.sessionId)?(Ga(this.c),"hidden"==this.g&&"visible"==document.visibilityState&&(clearTimeout(this.m),this.m=setTimeout(function(){a.c.set(c);
50
+ Ta(a,{hitTime:c.time})},this.a.visibleThreshold))):(b.pageId==Z&&"visible"==b.state&&Va(this,b),this.c.set(c));this.g=document.visibilityState}};function Ua(a){var b=a.c.get();"visible"==a.g&&"hidden"==b.state&&b.pageId!=Z&&(b.state="visible",b.pageId=Z,a.c.set(b));return b}
51
+ function Va(a,b,c){c=(c?c:{}).hitTime;var d={hitTime:c},d=(d?d:{}).hitTime;(b=b.time?(d||+new Date)-b.time:0)&&b>=a.a.visibleThreshold&&(b=Math.round(b/1E3),d={transport:"beacon",nonInteraction:!0,eventCategory:"Page Visibility",eventAction:"track",eventValue:b,eventLabel:"(not set)"},c&&(d.queueTime=+new Date-c),a.a.visibleMetricIndex&&(d["metric"+a.a.visibleMetricIndex]=b),a.b.send("event",y(d,a.a.fieldsObj,a.b,a.a.hitFilter)))}
52
+ function Ta(a,b){var c=b?b:{};b=c.hitTime;var c=c.ea,d={transport:"beacon"};b&&(d.queueTime=+new Date-b);c&&a.a.pageLoadsMetricIndex&&(d["metric"+a.a.pageLoadsMetricIndex]=1);a.b.send("pageview",y(d,a.a.fieldsObj,a.b,a.a.hitFilter))}f.v=function(a){var b=this;return function(c,d){var e={},e=C(c)?c:(e[c]=d,e);e.page&&e.page!==b.b.get("page")&&"visible"==b.g&&b.s();a(c,d)}};f.N=function(a,b){a.time!=b.time&&(b.pageId!=Z||"visible"!=b.state||this.f.isExpired(b.sessionId)||Va(this,b,{hitTime:a.time}))};
53
+ f.G=function(){"hidden"!=this.g&&this.s()};f.remove=function(){this.c.j();this.f.j();x(this.b,"set",this.v);window.removeEventListener("unload",this.G);document.removeEventListener("visibilitychange",this.s)};G("pageVisibilityTracker",Sa);
54
+ function Wa(a,b){J(a,H.aa);window.addEventListener&&(this.a=z({fieldsObj:{},hitFilter:null},b),this.b=a,this.u=this.u.bind(this),this.J=this.J.bind(this),this.D=this.D.bind(this),this.A=this.A.bind(this),this.B=this.B.bind(this),this.F=this.F.bind(this),"complete"!=document.readyState?window.addEventListener("load",this.u):this.u())}f=Wa.prototype;
55
+ f.u=function(){if(window.FB)try{window.FB.Event.subscribe("edge.create",this.B),window.FB.Event.subscribe("edge.remove",this.F)}catch(a){}window.twttr&&this.J()};f.J=function(){var a=this;try{window.twttr.ready(function(){window.twttr.events.bind("tweet",a.D);window.twttr.events.bind("follow",a.A)})}catch(b){}};function Xa(a){try{window.twttr.ready(function(){window.twttr.events.unbind("tweet",a.D);window.twttr.events.unbind("follow",a.A)})}catch(b){}}
56
+ f.D=function(a){if("tweet"==a.region){var b={transport:"beacon",socialNetwork:"Twitter",socialAction:"tweet",socialTarget:a.data.url||a.target.getAttribute("data-url")||location.href};this.b.send("social",y(b,this.a.fieldsObj,this.b,this.a.hitFilter,a.target,a))}};
57
+ f.A=function(a){if("follow"==a.region){var b={transport:"beacon",socialNetwork:"Twitter",socialAction:"follow",socialTarget:a.data.screen_name||a.target.getAttribute("data-screen-name")};this.b.send("social",y(b,this.a.fieldsObj,this.b,this.a.hitFilter,a.target,a))}};f.B=function(a){this.b.send("social",y({transport:"beacon",socialNetwork:"Facebook",socialAction:"like",socialTarget:a},this.a.fieldsObj,this.b,this.a.hitFilter))};
58
+ f.F=function(a){this.b.send("social",y({transport:"beacon",socialNetwork:"Facebook",socialAction:"unlike",socialTarget:a},this.a.fieldsObj,this.b,this.a.hitFilter))};f.remove=function(){window.removeEventListener("load",this.u);try{window.FB.Event.unsubscribe("edge.create",this.B),window.FB.Event.unsubscribe("edge.remove",this.F)}catch(a){}Xa(this)};G("socialWidgetTracker",Wa);
59
+ function Ya(a,b){J(a,H.ba);history.pushState&&window.addEventListener&&(this.a=z({shouldTrackUrlChange:this.shouldTrackUrlChange,trackReplaceState:!1,fieldsObj:{},hitFilter:null},b),this.b=a,this.c=location.pathname+location.search,this.H=this.H.bind(this),this.I=this.I.bind(this),this.C=this.C.bind(this),w(history,"pushState",this.H),w(history,"replaceState",this.I),window.addEventListener("popstate",this.C))}f=Ya.prototype;
60
+ f.H=function(a){var b=this;return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e-0]=arguments[e];a.apply(null,[].concat(n(d)));Za(b,!0)}};f.I=function(a){var b=this;return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e-0]=arguments[e];a.apply(null,[].concat(n(d)));Za(b,!1)}};f.C=function(){Za(this,!0)};
61
+ function Za(a,b){setTimeout(function(){var c=a.c,d=location.pathname+location.search;c!=d&&a.a.shouldTrackUrlChange.call(a,d,c)&&(a.c=d,a.b.set({page:d,title:document.title}),(b||a.a.trackReplaceState)&&a.b.send("pageview",y({transport:"beacon"},a.a.fieldsObj,a.b,a.a.hitFilter)))},0)}f.shouldTrackUrlChange=function(a,b){return!(!a||!b)};f.remove=function(){x(history,"pushState",this.H);x(history,"replaceState",this.I);window.removeEventListener("popstate",this.C)};G("urlChangeTracker",Ya);})();
62
+ //# sourceMappingURL=autotrack.js.map
readme.txt CHANGED
@@ -2,9 +2,9 @@
2
  Contributors: hallsofmontezuma, wpsmort, dougal, pbaylies, arnaudbroes
3
  Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=mrtorbert%40gmail%2ecom&item_name=All%20In%20One%20SEO%20Pack&item_number=Support%20Open%20Source&no_shipping=0&no_note=1&tax=0&currency_code=USD&lc=US&bn=PP%2dDonationsBF&charset=UTF%2d8
4
  Tags: seo, all in one seo, google, twitter, page, image seo, social, search engine optimization, sitemap, WordPress SEO, meta, meta description, xml sitemap, google sitemap, sitemaps, robots meta, yahoo, bing, news sitemaps, multisite, canonical, nofollow, noindex, keywords, description, webmaster tools, google webmaster tools, google analytics
5
- Requires at least: 4.0
6
  Tested up to: 4.9
7
- Stable tag: 2.4.4.1
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
2
  Contributors: hallsofmontezuma, wpsmort, dougal, pbaylies, arnaudbroes
3
  Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=mrtorbert%40gmail%2ecom&item_name=All%20In%20One%20SEO%20Pack&item_number=Support%20Open%20Source&no_shipping=0&no_note=1&tax=0&currency_code=USD&lc=US&bn=PP%2dDonationsBF&charset=UTF%2d8
4
  Tags: seo, all in one seo, google, twitter, page, image seo, social, search engine optimization, sitemap, WordPress SEO, meta, meta description, xml sitemap, google sitemap, sitemaps, robots meta, yahoo, bing, news sitemaps, multisite, canonical, nofollow, noindex, keywords, description, webmaster tools, google webmaster tools, google analytics
5
+ Requires at least: 4.4
6
  Tested up to: 4.9
7
+ Stable tag: 2.4.5
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10