The SEO Framework - Version 2.9.2

Version Description

  • Diminutive Consolidation =

Release date:

  • May 8th, 2017

Summarized:

  • Now, Polylang is officially supported by The SEO Framework.
  • The sitemap now supports plain permalinks. That means it now literally works for every website.
  • The robots.txt file has been enhanced, so it now informs you when the output location is incorrect.
  • Moreover, various bugs have been fixed, mainly concerning third party plugins.

We're looking for translation editors:

  • First, thank you so much to all the translation contributors.
  • Now, if you want to see The SEO Framework in your language, head over to this page and feel free to contribute.
  • If you wish to easily maintain and keep a close eye on all the contributions for your language, ask us to ask WordPress Polyglots to add you as a contributor.
  • Ultimately, it's up to the WordPress Polyglots team to fulfill your request. It generally depends on how well you've submitted translations for you to be accepted.

A few notes about translations:

  • If you use a machine to translate for you, note that they can generate out-of-context strings. So keep an eye out for those!
  • If you notice that strings are very hard to translate, e.g. because of grammatical gender, let us know!
  • Please don't translate "The SEO Framework", it's a registered brand-name.
  • Be sure not to add spaces if you see backticks, asterisks, or brackets. They're used for Markdown language construction.
  • In TSF, you generally can't use UTF character codes like ♡, as they're automatically removed or rendered unreadable for added security. Add them as displayed instead: ****.

Detailed log:

If you are a friend, speak the password, and the doors will open, and you can enter.

Download this release

Release Info

Developer Cybr
Plugin Icon 128x128 The SEO Framework
Version 2.9.2
Comparing to
See all releases

Code changes from version 2.9.1 to 2.9.2

Files changed (52) hide show
  1. autodescription.php +29 -10
  2. inc/classes/admin-init.class.php +60 -7
  3. inc/classes/admin-pages.class.php +10 -2
  4. inc/classes/cache.class.php +9 -5
  5. inc/classes/compat.class.php +10 -2
  6. inc/classes/core.class.php +33 -21
  7. inc/classes/debug.class.php +1 -1
  8. inc/classes/deprecated.class.php +2 -2
  9. inc/classes/detect.class.php +8 -3
  10. inc/classes/doing-it-right.class.php +3 -3
  11. inc/classes/feed.class.php +1 -1
  12. inc/classes/generate-description.class.php +38 -10
  13. inc/classes/generate-image.class.php +3 -2
  14. inc/classes/generate-ldjson.class.php +3 -2
  15. inc/classes/generate-title.class.php +17 -7
  16. inc/classes/generate-url.class.php +148 -104
  17. inc/classes/generate.class.php +1 -1
  18. inc/classes/init.class.php +31 -66
  19. inc/classes/inpost.class.php +1 -1
  20. inc/classes/load.class.php +1 -1
  21. inc/classes/metaboxes.class.php +1 -1
  22. inc/classes/post-data.class.php +1 -1
  23. inc/classes/query.class.php +23 -1
  24. inc/classes/render.class.php +82 -4
  25. inc/classes/sanitize.class.php +1 -3
  26. inc/classes/site-options.class.php +13 -6
  27. inc/classes/sitemaps.class.php +87 -15
  28. inc/classes/term-data.class.php +1 -1
  29. inc/compat/php-mbstring.php +4 -4
  30. inc/compat/plugin-polylang.php +187 -0
  31. inc/compat/plugin-wpforo.php +82 -0
  32. inc/compat/plugin-wpml.php +63 -37
  33. inc/functions/deprecated.php +2 -68
  34. inc/functions/optionsapi.php +1 -1
  35. inc/functions/plugin-test-server.php +1 -1
  36. inc/functions/upgrade.php +1 -1
  37. inc/interfaces/debug.interface.php +1 -1
  38. inc/views/metaboxes/general-metabox.php +34 -34
  39. inc/views/metaboxes/schema-metabox.php +10 -9
  40. inc/views/metaboxes/sitemaps-metabox.php +73 -79
  41. inc/views/sitemap/xsl-stylesheet.php +8 -6
  42. language/autodescription.pot +262 -243
  43. lib/css/tsf-rtl.css +2 -0
  44. lib/css/tsf-rtl.min.css +1 -1
  45. lib/css/tsf.css +2 -0
  46. lib/css/tsf.min.css +1 -1
  47. lib/js/tsf.externs.js +1 -1
  48. lib/js/tsf.externs.protected.js +1 -1
  49. lib/js/tsf.js +56 -47
  50. lib/js/tsf.min.js +32 -32
  51. load.php +53 -1
  52. readme.txt +135 -108
autodescription.php CHANGED
@@ -3,9 +3,9 @@
3
  * Plugin Name: The SEO Framework
4
  * Plugin URI: https://theseoframework.com/
5
  * Description: An automated, advanced, accessible, unbranded and extremely fast SEO solution for any WordPress website.
6
- * Version: 2.9.1
7
  * Author: Sybre Waaijer
8
- * Author URI: https://cyberwire.nl/
9
  * License: GPLv3
10
  * Text Domain: autodescription
11
  * Domain Path: /language
@@ -15,7 +15,7 @@ defined( 'ABSPATH' ) or die;
15
 
16
  /**
17
  * The SEO Framework plugin
18
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
19
  *
20
  * This program is free software: you can redistribute it and/or modify
21
  * it under the terms of the GNU General Public License version 3 as published
@@ -42,26 +42,43 @@ defined( 'ABSPATH' ) or die;
42
  //}},0);
43
 
44
  /**
45
- * CDN Cache buster. 3 to 4 point.
46
- * Not many caching plugins use CDN in dashboard. What a shame. Firefox does cache.
 
 
 
 
 
47
  * @since 1.0.0
48
  */
49
- define( 'THE_SEO_FRAMEWORK_VERSION', '2.9.1' );
50
 
51
  /**
52
- * Plugin Database version for lightweight version upgrade comparing.
 
 
 
53
  * @since 2.7.0
54
  */
55
  define( 'THE_SEO_FRAMEWORK_DB_VERSION', '2903' );
56
 
57
  /**
58
- * Plugin options filter.
 
 
 
 
 
59
  * @since 2.2.2
60
  */
61
  define( 'THE_SEO_FRAMEWORK_SITE_OPTIONS', (string) apply_filters( 'the_seo_framework_site_options', 'autodescription-site-settings' ) );
62
 
63
  /**
64
- * Plugin options filter.
 
 
 
 
65
  * @since 2.2.2
66
  */
67
  define( 'THE_SEO_FRAMEWORK_NETWORK_OPTIONS', (string) apply_filters( 'the_seo_framework_network_settings', 'autodescription-network-settings' ) );
@@ -139,6 +156,7 @@ the_seo_framework_pre_load();
139
  * Determines whether we can "just" load the plugin, or require verification beforehand.
140
  *
141
  * @since 2.8.0
 
142
  */
143
  function the_seo_framework_pre_load() {
144
  if ( get_site_option( 'the_seo_framework_tested_upgrade_version' ) >= THE_SEO_FRAMEWORK_DB_VERSION ) {
@@ -180,9 +198,10 @@ function the_seo_framework_load_base_files() {
180
  * Load deprecated functions.
181
  *
182
  * @since 2.7.0
 
183
  * @uses THE_SEO_FRAMEWORK_DIR_PATH_FUNCT
184
  */
185
- require_once( THE_SEO_FRAMEWORK_DIR_PATH_FUNCT . 'deprecated.php' );
186
 
187
  /**
188
  * Load API files.
3
  * Plugin Name: The SEO Framework
4
  * Plugin URI: https://theseoframework.com/
5
  * Description: An automated, advanced, accessible, unbranded and extremely fast SEO solution for any WordPress website.
6
+ * Version: 2.9.2
7
  * Author: Sybre Waaijer
8
+ * Author URI: https://theseoframework.com/
9
  * License: GPLv3
10
  * Text Domain: autodescription
11
  * Domain Path: /language
15
 
16
  /**
17
  * The SEO Framework plugin
18
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
19
  *
20
  * This program is free software: you can redistribute it and/or modify
21
  * it under the terms of the GNU General Public License version 3 as published
42
  //}},0);
43
 
44
  /**
45
+ * The plugin version.
46
+ *
47
+ * Used as a CDN and Browser Cache buster.
48
+ * Chrome and Firefox cache admin scripts.
49
+ *
50
+ * 3 point: x.x.y; x.x is major; y is minor.
51
+ *
52
  * @since 1.0.0
53
  */
54
+ define( 'THE_SEO_FRAMEWORK_VERSION', '2.9.2' );
55
 
56
  /**
57
+ * The plugin Database version.
58
+ *
59
+ * Used for lightweight version upgrade comparing.
60
+ *
61
  * @since 2.7.0
62
  */
63
  define( 'THE_SEO_FRAMEWORK_DB_VERSION', '2903' );
64
 
65
  /**
66
+ * The plugin options database option_name.
67
+ *
68
+ * Used for storing the SEO options array.
69
+ *
70
+ * @todo document filter.
71
+ *
72
  * @since 2.2.2
73
  */
74
  define( 'THE_SEO_FRAMEWORK_SITE_OPTIONS', (string) apply_filters( 'the_seo_framework_site_options', 'autodescription-site-settings' ) );
75
 
76
  /**
77
+ * The plugin network options.
78
+ *
79
+ * @todo document filter.
80
+ * Unused. @todo remove
81
+ *
82
  * @since 2.2.2
83
  */
84
  define( 'THE_SEO_FRAMEWORK_NETWORK_OPTIONS', (string) apply_filters( 'the_seo_framework_network_settings', 'autodescription-network-settings' ) );
156
  * Determines whether we can "just" load the plugin, or require verification beforehand.
157
  *
158
  * @since 2.8.0
159
+ * @uses get_site_option(), so it will only test once per WordPress installation; multisite included.
160
  */
161
  function the_seo_framework_pre_load() {
162
  if ( get_site_option( 'the_seo_framework_tested_upgrade_version' ) >= THE_SEO_FRAMEWORK_DB_VERSION ) {
198
  * Load deprecated functions.
199
  *
200
  * @since 2.7.0
201
+ * @since 2.9.2 No longer called to improve performance.
202
  * @uses THE_SEO_FRAMEWORK_DIR_PATH_FUNCT
203
  */
204
+ // require_once( THE_SEO_FRAMEWORK_DIR_PATH_FUNCT . 'deprecated.php' );
205
 
206
  /**
207
  * Load API files.
inc/classes/admin-init.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -162,6 +162,8 @@ class Admin_Init extends Init {
162
  * @since 2.6.0
163
  * @staticvar bool $registered : Prevents Re-registering of the style.
164
  * @access private
 
 
165
  */
166
  public function _register_admin_javascript() {
167
 
@@ -433,7 +435,7 @@ class Admin_Init extends Init {
433
  /**
434
  * Checks ajax referred set by set_js_nonces based on capability.
435
  *
436
- * Performs die() on fail.
437
  *
438
  * @since 2.9.0
439
  * @access private
@@ -521,6 +523,7 @@ class Admin_Init extends Init {
521
  * for alerts, etc.
522
  *
523
  * @since 2.2.2
 
524
  *
525
  * @param string $page Menu slug.
526
  * @param array $query_args Optional. Associative array of query string arguments
@@ -539,12 +542,62 @@ class Admin_Init extends Init {
539
  unset( $query_args[ $key ] );
540
  }
541
 
542
- $url = \add_query_arg( $query_args, $url );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
543
 
544
- \wp_safe_redirect( \esc_url_raw( $url ), 302 );
545
  exit;
546
  }
547
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
548
  /**
549
  * Handles counter option update on AJAX request.
550
  *
@@ -561,7 +614,7 @@ class Admin_Init extends Init {
561
  //* If current user isn't allowed to edit posts, don't do anything and kill PHP.
562
  if ( ! \current_user_can( 'edit_posts' ) ) {
563
  //* Remove output buffer.
564
- $this->clean_reponse_header();
565
 
566
  //* Encode and echo results. Requires JSON decode within JS.
567
  echo json_encode( array( 'type' => 'failure', 'value' => '' ) );
@@ -587,7 +640,7 @@ class Admin_Init extends Init {
587
  );
588
 
589
  //* Remove output buffer.
590
- $this->clean_reponse_header();
591
 
592
  //* Encode and echo results. Requires JSON decode within JS.
593
  echo json_encode( $results );
@@ -617,7 +670,7 @@ class Admin_Init extends Init {
617
 
618
  $attachment_id = \absint( $_POST['id'] );
619
 
620
- $context = str_replace( '_', '-', $_POST['context'] );
621
  $data = array_map( 'absint', $_POST['cropDetails'] );
622
  $cropped = \wp_crop_image( $attachment_id, $data['x1'], $data['y1'], $data['width'], $data['height'], $data['dst_width'], $data['dst_height'] );
623
 
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
162
  * @since 2.6.0
163
  * @staticvar bool $registered : Prevents Re-registering of the style.
164
  * @access private
165
+ *
166
+ * @return void Early if already registered.
167
  */
168
  public function _register_admin_javascript() {
169
 
435
  /**
436
  * Checks ajax referred set by set_js_nonces based on capability.
437
  *
438
+ * Performs die() on failure.
439
  *
440
  * @since 2.9.0
441
  * @access private
523
  * for alerts, etc.
524
  *
525
  * @since 2.2.2
526
+ * @since 2.9.2 : Added user-friendly exception handling.
527
  *
528
  * @param string $page Menu slug.
529
  * @param array $query_args Optional. Associative array of query string arguments
542
  unset( $query_args[ $key ] );
543
  }
544
 
545
+ $target = \add_query_arg( $query_args, $url );
546
+ $target = \esc_url_raw( $url );
547
+
548
+ //* Predict white screen:
549
+ $headers_sent = headers_sent();
550
+
551
+ /**
552
+ * Dev debug:
553
+ * 1. Change 302 to 500 if you wish to test headers.
554
+ * 2. Also force handle_admin_redirect_error() to run.
555
+ */
556
+ \wp_safe_redirect( $target, 302 );
557
+
558
+ //* White screen of death for non-debugging users. Let's make it friendlier.
559
+ if ( $headers_sent ) {
560
+ $this->handle_admin_redirect_error( $target );
561
+ }
562
 
 
563
  exit;
564
  }
565
 
566
+ /**
567
+ * Provides an accessible error for when redirecting fails.
568
+ *
569
+ * @since 2.9.2
570
+ * @link https://developer.wordpress.org/reference/functions/wp_redirect/
571
+ *
572
+ * @param string $target The redirect target location. Should be escaped.
573
+ * @return void
574
+ */
575
+ protected function handle_admin_redirect_error( $target = '' ) {
576
+
577
+ if ( empty( $target ) )
578
+ return;
579
+
580
+ $headers_list = headers_list();
581
+ $location = sprintf( 'Location: %s', \wp_sanitize_redirect( $target ) );
582
+
583
+ //* Test if WordPress' redirect header is sent. Bail if true.
584
+ if ( in_array( $location, $headers_list, true ) )
585
+ return;
586
+
587
+ //* Output message:
588
+ printf( '<p><strong>%s</strong></p>',
589
+ //* Markdown escapes.
590
+ $this->convert_markdown(
591
+ sprintf(
592
+ /* translators: %s = Redirect URL markdown */
593
+ \esc_html__( 'There has been an error redirecting. Refresh the page or follow [this link](%s).', 'autodescription' ),
594
+ $target
595
+ ),
596
+ array( 'a' )
597
+ )
598
+ );
599
+ }
600
+
601
  /**
602
  * Handles counter option update on AJAX request.
603
  *
614
  //* If current user isn't allowed to edit posts, don't do anything and kill PHP.
615
  if ( ! \current_user_can( 'edit_posts' ) ) {
616
  //* Remove output buffer.
617
+ $this->clean_response_header();
618
 
619
  //* Encode and echo results. Requires JSON decode within JS.
620
  echo json_encode( array( 'type' => 'failure', 'value' => '' ) );
640
  );
641
 
642
  //* Remove output buffer.
643
+ $this->clean_response_header();
644
 
645
  //* Encode and echo results. Requires JSON decode within JS.
646
  echo json_encode( $results );
670
 
671
  $attachment_id = \absint( $_POST['id'] );
672
 
673
+ $context = \sanitize_key( str_replace( '_', '-', $_POST['context'] ) );
674
  $data = array_map( 'absint', $_POST['cropDetails'] );
675
  $cropped = \wp_crop_image( $attachment_id, $data['x1'], $data['y1'], $data['width'], $data['height'], $data['dst_width'], $data['dst_height'] );
676
 
inc/classes/admin-pages.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -93,11 +93,18 @@ class Admin_Pages extends Inpost {
93
  * Adds menu links under "settings" in the wp-admin dashboard
94
  *
95
  * @since 2.2.2
 
 
96
  *
97
- * @return void
98
  */
99
  public function add_menu_link() {
100
 
 
 
 
 
 
101
  $menu = array(
102
  'page_title' => \esc_html__( 'SEO Settings', 'autodescription' ),
103
  'menu_title' => \esc_html__( 'SEO', 'autodescription' ),
@@ -137,6 +144,7 @@ class Admin_Pages extends Inpost {
137
  //* Enqueue scripts
138
  \add_action( 'admin_print_scripts-' . $this->seo_settings_page_hook, array( $this, 'enqueue_admin_javascript' ), 11 );
139
 
 
140
  }
141
 
142
  /**
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
93
  * Adds menu links under "settings" in the wp-admin dashboard
94
  *
95
  * @since 2.2.2
96
+ * @since 2.9.2 Added static cache so the method can only run once.
97
+ * @staticvar bool $run True if already run.
98
  *
99
+ * @return void Early if method is already called.
100
  */
101
  public function add_menu_link() {
102
 
103
+ static $run = false;
104
+
105
+ if ( $run )
106
+ return;
107
+
108
  $menu = array(
109
  'page_title' => \esc_html__( 'SEO Settings', 'autodescription' ),
110
  'menu_title' => \esc_html__( 'SEO', 'autodescription' ),
144
  //* Enqueue scripts
145
  \add_action( 'admin_print_scripts-' . $this->seo_settings_page_hook, array( $this, 'enqueue_admin_javascript' ), 11 );
146
 
147
+ $run = true;
148
  }
149
 
150
  /**
inc/classes/cache.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -476,7 +476,7 @@ class Cache extends Sitemaps {
476
  * When the caching mechanism changes. Change this value.
477
  * Use hex. e.g. 0, 1, 2, 9, a, b
478
  */
479
- $sitemap_revision = '2';
480
  $theme_dir_revision = '0';
481
 
482
  $this->sitemap_transient = $this->is_option_checked( 'cache_sitemap' ) ? $this->add_cache_key_suffix( 'tsf_sitemap_' . $sitemap_revision ) : '';
@@ -656,8 +656,9 @@ class Cache extends Sitemaps {
656
  } elseif ( $this->is_search() ) {
657
  $query = '';
658
 
 
659
  if ( function_exists( 'get_search_query' ) ) {
660
- $search_query = \get_search_query();
661
 
662
  if ( $search_query )
663
  $query = str_replace( ' ', '', $search_query );
@@ -714,7 +715,7 @@ class Cache extends Sitemaps {
714
  static $unix = null;
715
 
716
  if ( ! isset( $unix ) )
717
- $unix = date( 'U' );
718
 
719
  //* Temporarily disable caches to prevent database spam.
720
  $this->the_seo_framework_use_transients = false;
@@ -769,6 +770,7 @@ class Cache extends Sitemaps {
769
  * Use this method if you wish to evade the query usage.
770
  *
771
  * @since 2.9.1
 
772
  * @staticvar array $cached_id : contains cache strings.
773
  * @see $this->generate_cache_key().
774
  * @see $this->generate_cache_key_by_query() to get cache key from the query.
@@ -776,7 +778,7 @@ class Cache extends Sitemaps {
776
  * @param int|string|bool $page_id the Taxonomy or Post ID.
777
  * @param string $taxonomy The term taxonomy.
778
  * @param string $type The Post Type.
779
- * @return string The generated cache key by type.
780
  */
781
  public function generate_cache_key_by_type( $page_id, $taxonomy = '', $type = '' ) {
782
 
@@ -807,6 +809,8 @@ class Cache extends Sitemaps {
807
  return $this->add_cache_key_suffix( \esc_sql( $type . '_' . $page_id . '_' . $taxonomy ) );
808
  break;
809
  endswitch;
 
 
810
  }
811
 
812
  /**
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
476
  * When the caching mechanism changes. Change this value.
477
  * Use hex. e.g. 0, 1, 2, 9, a, b
478
  */
479
+ $sitemap_revision = '3';
480
  $theme_dir_revision = '0';
481
 
482
  $this->sitemap_transient = $this->is_option_checked( 'cache_sitemap' ) ? $this->add_cache_key_suffix( 'tsf_sitemap_' . $sitemap_revision ) : '';
656
  } elseif ( $this->is_search() ) {
657
  $query = '';
658
 
659
+ //* TODO figure out why this check is here... admin compat maybe?
660
  if ( function_exists( 'get_search_query' ) ) {
661
+ $search_query = \get_search_query( $_escaped = true );
662
 
663
  if ( $search_query )
664
  $query = str_replace( ' ', '', $search_query );
715
  static $unix = null;
716
 
717
  if ( ! isset( $unix ) )
718
+ $unix = time();
719
 
720
  //* Temporarily disable caches to prevent database spam.
721
  $this->the_seo_framework_use_transients = false;
770
  * Use this method if you wish to evade the query usage.
771
  *
772
  * @since 2.9.1
773
+ * @since 2.9.2 Now returns false when an incorrect $type is supplied.
774
  * @staticvar array $cached_id : contains cache strings.
775
  * @see $this->generate_cache_key().
776
  * @see $this->generate_cache_key_by_query() to get cache key from the query.
778
  * @param int|string|bool $page_id the Taxonomy or Post ID.
779
  * @param string $taxonomy The term taxonomy.
780
  * @param string $type The Post Type.
781
+ * @return string|bool String the generated cache key. Bool false on failure.
782
  */
783
  public function generate_cache_key_by_type( $page_id, $taxonomy = '', $type = '' ) {
784
 
809
  return $this->add_cache_key_suffix( \esc_sql( $type . '_' . $page_id . '_' . $taxonomy ) );
810
  break;
811
  endswitch;
812
+
813
+ return false;
814
  }
815
 
816
  /**
inc/classes/compat.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -54,6 +54,8 @@ class Compat extends Core {
54
  * rather than common paths. As they can require manual FTP upload.
55
  *
56
  * @since 2.8.0
 
 
57
  */
58
  protected function load_early_compat_files() {
59
 
@@ -76,7 +78,10 @@ class Compat extends Core {
76
  }
77
  }
78
 
79
- if ( $this->detect_plugin( array( 'constants' => array( 'ICL_LANGUAGE_CODE' ) ) ) ) {
 
 
 
80
  //* WPML
81
  $this->_include_compat( 'wpml', 'plugin' );
82
  } elseif ( $this->detect_plugin( array( 'constants' => array( 'QTX_VERSION' ) ) ) ) {
@@ -92,6 +97,9 @@ class Compat extends Core {
92
  if ( $this->detect_plugin( array( 'functions' => array( 'bbpress' ) ) ) ) {
93
  //* bbPress
94
  $this->_include_compat( 'bbpress', 'plugin' );
 
 
 
95
  }
96
  }
97
 
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
54
  * rather than common paths. As they can require manual FTP upload.
55
  *
56
  * @since 2.8.0
57
+ * @TODO Add transients that will bypass all these checks.
58
+ * Careful, recheck on each activation -- and even FTP deletion.
59
  */
60
  protected function load_early_compat_files() {
61
 
78
  }
79
  }
80
 
81
+ if ( $this->detect_plugin( array( 'globals' => array( 'polylang' ) ) ) ) {
82
+ //* PolyLang... it includes compat for WPML, but let's see how this works for now.
83
+ $this->_include_compat( 'polylang', 'plugin' );
84
+ } elseif ( $this->detect_plugin( array( 'constants' => array( 'ICL_LANGUAGE_CODE' ) ) ) ) {
85
  //* WPML
86
  $this->_include_compat( 'wpml', 'plugin' );
87
  } elseif ( $this->detect_plugin( array( 'constants' => array( 'QTX_VERSION' ) ) ) ) {
97
  if ( $this->detect_plugin( array( 'functions' => array( 'bbpress' ) ) ) ) {
98
  //* bbPress
99
  $this->_include_compat( 'bbpress', 'plugin' );
100
+ } elseif ( $this->detect_plugin( array( 'constants' => array( 'WPFORO_BASENAME' ) ) ) ) {
101
+ //* wpForo
102
+ $this->_include_compat( 'wpforo', 'plugin' );
103
  }
104
  }
105
 
inc/classes/core.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -137,7 +137,7 @@ class Core {
137
  *
138
  * @return bool True on clear. False otherwise.
139
  */
140
- protected function clean_reponse_header() {
141
 
142
  if ( $level = ob_get_level() ) {
143
  while ( $level ) {
@@ -223,7 +223,7 @@ class Core {
223
  'jetpack-portfolio',
224
  );
225
 
226
- /*
227
  * Applies filters the_seo_framework_supported_post_types : Array The supported post types.
228
  * @since 2.3.1
229
  */
@@ -231,17 +231,19 @@ class Core {
231
 
232
  $types = \wp_parse_args( $defaults, $post_types );
233
 
234
- foreach ( $types as $type )
235
  \add_post_type_support( $type, array( 'autodescription-meta' ) );
236
-
237
  }
238
 
239
  /**
240
  * Adds link from plugins page to SEO Settings page.
241
  *
242
- * @param array $links The current links.
243
- *
244
  * @since 2.2.8
 
 
 
 
245
  */
246
  public function plugin_action_links( $links = array() ) {
247
 
@@ -250,7 +252,17 @@ class Core {
250
  if ( $this->load_options )
251
  $tsf_links['settings'] = '<a href="' . \esc_url( \admin_url( 'admin.php?page=' . $this->seo_settings_page_slug ) ) . '">' . \esc_html__( 'SEO Settings', 'autodescription' ) . '</a>';
252
 
253
- $tsf_links['home'] = '<a href="' . \esc_url( 'https://theseoframework.com/' ) . '" target="_blank">' . \esc_html_x( 'Plugin Home', 'As in: The Plugin Home Page', 'autodescription' ) . '</a>';
 
 
 
 
 
 
 
 
 
 
254
 
255
  return array_merge( $tsf_links, $links );
256
  }
@@ -450,13 +462,7 @@ class Core {
450
  * @return bool Option is checked.
451
  */
452
  public function is_option_checked( $option ) {
453
-
454
- $option = $this->get_option( $option );
455
-
456
- if ( $this->is_checked( $option ) )
457
- return true;
458
-
459
- return false;
460
  }
461
 
462
  /**
@@ -592,7 +598,7 @@ class Core {
592
  //* Try Daylight savings.
593
  $tzstring = timezone_name_from_abbr( '', $seconds, 1 );
594
  /**
595
- * PHP bug workaround.
596
  * @link https://bugs.php.net/bug.php?id=44780
597
  */
598
  if ( false === $tzstring )
@@ -665,9 +671,14 @@ class Core {
665
  * @since 2.7.0
666
  *
667
  * @param string $string Required. The string to count words in.
668
- * @param int $amount Minimum amount of words to encounter in the string. Set to 0 to count all words longer than $bother_length.
669
- * @param int $amount_bother Minimum amount of words to encounter in the string that fall under the $bother_length. Set to 0 to count all words shorter than $bother_length.
670
- * @param int $bother_length The maximum string length of a word to pass for $amount_bother instead of $amount. Set to 0 to pass all words through $amount_bother
 
 
 
 
 
671
  * @return array Containing arrays of words with their count.
672
  */
673
  public function get_word_count( $string, $amount = 3, $amount_bother = 5, $bother_length = 3 ) {
@@ -725,11 +736,12 @@ class Core {
725
  *
726
  * @since 2.8.0
727
  * @since 2.9.0 Now adds a little more relative softness based on rel_lum.
 
728
  *
729
  * @param string $hex The 3 to 6 character RGB hex. '#' prefix is supported.
730
  * @return string The hexadecimal RGB relative font color, without '#' prefix.
731
  */
732
- public function get_relatitve_fontcolor( $hex = '' ) {
733
 
734
  $hex = ltrim( $hex, '#' );
735
 
@@ -893,7 +905,7 @@ class Core {
893
  for ( $i = 0; $i < $count; $i++ ) {
894
  $text = str_replace(
895
  $matches[0][ $i ],
896
- sprintf( '<a href="%s" rel="nofollow">%s</a>', \esc_url( $matches[2][ $i ] ), \esc_html( $matches[1][ $i ] ) ),
897
  $text
898
  );
899
  }
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
137
  *
138
  * @return bool True on clear. False otherwise.
139
  */
140
+ protected function clean_response_header() {
141
 
142
  if ( $level = ob_get_level() ) {
143
  while ( $level ) {
223
  'jetpack-portfolio',
224
  );
225
 
226
+ /**
227
  * Applies filters the_seo_framework_supported_post_types : Array The supported post types.
228
  * @since 2.3.1
229
  */
231
 
232
  $types = \wp_parse_args( $defaults, $post_types );
233
 
234
+ foreach ( $types as $type ) {
235
  \add_post_type_support( $type, array( 'autodescription-meta' ) );
236
+ }
237
  }
238
 
239
  /**
240
  * Adds link from plugins page to SEO Settings page.
241
  *
 
 
242
  * @since 2.2.8
243
+ * @since 2.9.2 : Added TSFEM link.
244
+ *
245
+ * @param array $links The current links.
246
+ * @return array The plugin links.
247
  */
248
  public function plugin_action_links( $links = array() ) {
249
 
252
  if ( $this->load_options )
253
  $tsf_links['settings'] = '<a href="' . \esc_url( \admin_url( 'admin.php?page=' . $this->seo_settings_page_slug ) ) . '">' . \esc_html__( 'SEO Settings', 'autodescription' ) . '</a>';
254
 
255
+ $tsf_links['home'] = '<a href="' . \esc_url( 'https://theseoframework.com/' ) . '" rel="noopener" target="_blank">' . \esc_html_x( 'Plugin Home', 'As in: The Plugin Home Page', 'autodescription' ) . '</a>';
256
+
257
+ /**
258
+ * These are weak checks.
259
+ * But it has minimum to no UX/performance impact on failure.
260
+ */
261
+ if ( ! defined( 'TSF_EXTENSION_MANAGER_VERSION' ) ) {
262
+ $tsfem = \get_plugins( '/the-seo-framework-extension-manager' );
263
+ if ( empty( $tsfem ) )
264
+ $tsf_links['tsfem'] = '<a href="' . \esc_url( \__( 'https://wordpress.org/plugins/the-seo-framework-extension-manager/', 'autodescription' ) ) . '" rel="noopener" target="_blank">' . \esc_html_x( 'Extensions', 'Plugin extensions', 'autodescription' ) . '</a>';
265
+ }
266
 
267
  return array_merge( $tsf_links, $links );
268
  }
462
  * @return bool Option is checked.
463
  */
464
  public function is_option_checked( $option ) {
465
+ return $this->is_checked( $this->get_option( $option ) );
 
 
 
 
 
 
466
  }
467
 
468
  /**
598
  //* Try Daylight savings.
599
  $tzstring = timezone_name_from_abbr( '', $seconds, 1 );
600
  /**
601
+ * PHP bug workaround. Disable the DST check.
602
  * @link https://bugs.php.net/bug.php?id=44780
603
  */
604
  if ( false === $tzstring )
671
  * @since 2.7.0
672
  *
673
  * @param string $string Required. The string to count words in.
674
+ * @param int $amount Minimum amount of words to encounter in the string.
675
+ * Set to 0 to count all words longer than $bother_length.
676
+ * @param int $amount_bother Minimum amount of words to encounter in the string
677
+ * that fall under the $bother_length. Set to 0 to count all words
678
+ * shorter than $bother_length.
679
+ * @param int $bother_length The maximum string length of a word to pass for
680
+ * $amount_bother instead of $amount. Set to 0 to pass all words
681
+ * through $amount_bother
682
  * @return array Containing arrays of words with their count.
683
  */
684
  public function get_word_count( $string, $amount = 3, $amount_bother = 5, $bother_length = 3 ) {
736
  *
737
  * @since 2.8.0
738
  * @since 2.9.0 Now adds a little more relative softness based on rel_lum.
739
+ * @since 2.9.2 (Typo): Renamed from 'get_relatitve_fontcolor' to 'get_relative_fontcolor'.
740
  *
741
  * @param string $hex The 3 to 6 character RGB hex. '#' prefix is supported.
742
  * @return string The hexadecimal RGB relative font color, without '#' prefix.
743
  */
744
+ public function get_relative_fontcolor( $hex = '' ) {
745
 
746
  $hex = ltrim( $hex, '#' );
747
 
905
  for ( $i = 0; $i < $count; $i++ ) {
906
  $text = str_replace(
907
  $matches[0][ $i ],
908
+ sprintf( '<a href="%s" rel="nofollow noreferrer noopener">%s</a>', \esc_url( $matches[2][ $i ] ), \esc_html( $matches[1][ $i ] ) ),
909
  $text
910
  );
911
  }
inc/classes/debug.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
inc/classes/deprecated.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -247,7 +247,7 @@ final class Deprecated {
247
  * @since 2.7.0 No longer used for performance reasons.
248
  * @uses $this->exclude_search_ids()
249
  * @deprecated
250
- * @since 2.8.0
251
  *
252
  * @param array $query The possible search query.
253
  * @return void Early if no search query is found.
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
247
  * @since 2.7.0 No longer used for performance reasons.
248
  * @uses $this->exclude_search_ids()
249
  * @deprecated
250
+ * @since 2.8.0 deprecated.
251
  *
252
  * @param array $query The possible search query.
253
  * @return void Early if no search query is found.
inc/classes/detect.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -173,7 +173,7 @@ class Detect extends Render {
173
  *
174
  * @since 1.3.0
175
  * @since 2.8.0 : 1. Can now check for globals.
176
- * 2. Switched order from FAST to SLOW.
177
  *
178
  * @param array $plugins Array of array for constants, classes and / or functions to check for plugin existence.
179
  * @return boolean True if plugin exists or false if plugin constant, class or function not detected.
@@ -231,7 +231,8 @@ class Detect extends Render {
231
  * @staticvar array $cache
232
  * @uses $this->detect_plugin_multi()
233
  *
234
- * @param array $plugins Array of array for constants, classes and / or functions to check for plugin existence.
 
235
  * @param bool $use_cache Bypasses cache if false
236
  */
237
  public function can_i_use( array $plugins = array(), $use_cache = true ) {
@@ -518,6 +519,7 @@ class Detect extends Render {
518
  * @since 2.6.0
519
  * @since 2.8.0 Added check_option parameter.
520
  * @since 2.9.0 Now also checks for subdirectory installations.
 
521
  *
522
  * @param bool $check_option Whether to check for sitemap option.
523
  * @return bool True when no conflicting plugins are detected or when The SEO Framework's Sitemaps are output.
@@ -541,6 +543,9 @@ class Detect extends Render {
541
  if ( $this->is_subdirectory_installation() )
542
  return false;
543
 
 
 
 
544
  return true;
545
  }
546
 
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
173
  *
174
  * @since 1.3.0
175
  * @since 2.8.0 : 1. Can now check for globals.
176
+ * 2. Switched detection order from FAST to SLOW.
177
  *
178
  * @param array $plugins Array of array for constants, classes and / or functions to check for plugin existence.
179
  * @return boolean True if plugin exists or false if plugin constant, class or function not detected.
231
  * @staticvar array $cache
232
  * @uses $this->detect_plugin_multi()
233
  *
234
+ * @param array $plugins Array of array for globals, constants, classes
235
+ * and/or functions to check for plugin existence.
236
  * @param bool $use_cache Bypasses cache if false
237
  */
238
  public function can_i_use( array $plugins = array(), $use_cache = true ) {
519
  * @since 2.6.0
520
  * @since 2.8.0 Added check_option parameter.
521
  * @since 2.9.0 Now also checks for subdirectory installations.
522
+ * @since 2.9.2 Now also checks for permalinks.
523
  *
524
  * @param bool $check_option Whether to check for sitemap option.
525
  * @return bool True when no conflicting plugins are detected or when The SEO Framework's Sitemaps are output.
543
  if ( $this->is_subdirectory_installation() )
544
  return false;
545
 
546
+ if ( ! $this->pretty_permalinks )
547
+ return false;
548
+
549
  return true;
550
  }
551
 
inc/classes/doing-it-right.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -1048,10 +1048,10 @@ class Doing_It_Right extends Generate_Ldjson {
1048
  */
1049
  $desc_value = ctype_upper( $desc_value ) ? $desc_value : ucfirst( $desc_value );
1050
 
1051
- /* translators: 1: Word, 2: Occurences */
1052
  $notice .= sprintf( \esc_attr__( '%1$s is used %2$d times.', 'autodescription' ), '<span>' . $desc_value . '</span>', $desc_count );
1053
 
1054
- //* Don't add break at last occurence.
1055
  $notice .= $i === $count ? '' : '<br>';
1056
  $i++;
1057
  }
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
1048
  */
1049
  $desc_value = ctype_upper( $desc_value ) ? $desc_value : ucfirst( $desc_value );
1050
 
1051
+ /* translators: 1: Word, 2: Occurrences */
1052
  $notice .= sprintf( \esc_attr__( '%1$s is used %2$d times.', 'autodescription' ), '<span>' . $desc_value . '</span>', $desc_count );
1053
 
1054
+ //* Don't add break at last occurrence.
1055
  $notice .= $i === $count ? '' : '<br>';
1056
  $i++;
1057
  }
inc/classes/feed.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
inc/classes/generate-description.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -166,14 +166,15 @@ class Generate_Description extends Generate {
166
  /**
167
  * Reparses description args.
168
  *
169
- * @param array $args required The passed arguments.
170
- *
171
  * @since 2.6.0
 
 
 
172
  * @return array $args parsed args.
173
  */
174
  public function reparse_description_args( $args = array() ) {
175
 
176
- $default_args = $this->parse_description_args( '', '', true );
177
 
178
  if ( is_array( $args ) ) {
179
  if ( empty( $args ) ) {
@@ -651,6 +652,7 @@ class Generate_Description extends Generate {
651
  * Generates description additions.
652
  *
653
  * @since 2.6.0
 
654
  * @staticvar array $title string of titles.
655
  * @staticvar string $on
656
  * @access private
@@ -699,12 +701,38 @@ class Generate_Description extends Generate {
699
  $sep = '';
700
  }
701
 
702
- return array(
703
- 'title' => $title[ $id ],
704
- 'on' => $on,
705
- 'blogname' => $blogname,
706
- 'sep' => $sep,
707
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
708
  }
709
 
710
  /**
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
166
  /**
167
  * Reparses description args.
168
  *
 
 
169
  * @since 2.6.0
170
+ * @since 2.9.2 Now passes args to filter.
171
+ *
172
+ * @param array $args required The passed arguments.
173
  * @return array $args parsed args.
174
  */
175
  public function reparse_description_args( $args = array() ) {
176
 
177
+ $default_args = $this->parse_description_args( $args, '', true );
178
 
179
  if ( is_array( $args ) ) {
180
  if ( empty( $args ) ) {
652
  * Generates description additions.
653
  *
654
  * @since 2.6.0
655
+ * @since 2.9.2 Added filter.
656
  * @staticvar array $title string of titles.
657
  * @staticvar string $on
658
  * @access private
701
  $sep = '';
702
  }
703
 
704
+ if ( \has_filter( 'the_seo_framework_generated_description_additions' ) ) {
705
+ /**
706
+ * Applies filters 'the_seo_framework_generated_description_additions'
707
+ *
708
+ * @since 2.9.2
709
+ *
710
+ * @param array $data The description data.
711
+ * @param int $id The object ID.
712
+ * @param mixed $term The term object, or empty (falsy).
713
+ * @param bool $ignore Whether the settings have been ignored.
714
+ */
715
+ $data = \apply_filters_ref_array( 'the_seo_framework_generated_description_additions', array(
716
+ array(
717
+ 'title' => $title[ $id ],
718
+ 'on' => $on,
719
+ 'blogname' => $blogname,
720
+ 'sep' => $sep,
721
+ ),
722
+ $id,
723
+ $term,
724
+ $ignore,
725
+ ) );
726
+ } else {
727
+ $data = array(
728
+ 'title' => $title[ $id ],
729
+ 'on' => $on,
730
+ 'blogname' => $blogname,
731
+ 'sep' => $sep,
732
+ );
733
+ }
734
+
735
+ return $data;
736
  }
737
 
738
  /**
inc/classes/generate-image.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -221,13 +221,14 @@ class Generate_Image extends Generate_Url {
221
  * Reparses image args.
222
  *
223
  * @since 2.6.6
 
224
  *
225
  * @param array $args required The passed arguments.
226
  * @return array $args parsed args.
227
  */
228
  public function reparse_image_args( $args = array() ) {
229
 
230
- $default_args = $this->parse_image_args( '', '', true );
231
 
232
  if ( empty( $args ) ) {
233
  $args = $default_args;
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
221
  * Reparses image args.
222
  *
223
  * @since 2.6.6
224
+ * @since 2.9.2 Now passes args to filter.
225
  *
226
  * @param array $args required The passed arguments.
227
  * @return array $args parsed args.
228
  */
229
  public function reparse_image_args( $args = array() ) {
230
 
231
+ $default_args = $this->parse_image_args( $args, '', true );
232
 
233
  if ( empty( $args ) ) {
234
  $args = $default_args;
inc/classes/generate-ldjson.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -924,6 +924,7 @@ class Generate_Ldjson extends Generate_Image {
924
  * Return LD+Json Knowledge Graph helper.
925
  *
926
  * @since 2.2.8
 
927
  *
928
  * @return string LD+json Knowledge Graph helper.
929
  */
@@ -943,7 +944,7 @@ class Generate_Ldjson extends Generate_Image {
943
  $context = $this->schema_context();
944
  $type = json_encode( ucfirst( $knowledge_type ) );
945
  $name = json_encode( $knowledge_name );
946
- $url = json_encode( \esc_url( \home_url( '/' ) ) );
947
 
948
  $logo = '';
949
 
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
924
  * Return LD+Json Knowledge Graph helper.
925
  *
926
  * @since 2.2.8
927
+ * @since 2.9.2 : Now grabs home URL from cache.
928
  *
929
  * @return string LD+json Knowledge Graph helper.
930
  */
944
  $context = $this->schema_context();
945
  $type = json_encode( ucfirst( $knowledge_type ) );
946
  $name = json_encode( $knowledge_name );
947
+ $url = $this->schema_home_url();
948
 
949
  $logo = '';
950
 
inc/classes/generate-title.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -191,13 +191,14 @@ class Generate_Title extends Generate_Description {
191
  * Reparses title args.
192
  *
193
  * @since 2.6.0
 
194
  *
195
  * @param array $args required The passed arguments.
196
  * @return array $args parsed args.
197
  */
198
  public function reparse_title_args( $args = array() ) {
199
 
200
- $default_args = $this->parse_title_args( '', '', true );
201
 
202
  if ( is_array( $args ) ) {
203
  if ( empty( $args ) ) {
@@ -785,9 +786,11 @@ class Generate_Title extends Generate_Description {
785
 
786
  /**
787
  * Gets the archive Title, including filter. Also works in admin.
 
788
  * @NOTE Taken from WordPress core. Altered to work in the Admin area.
789
  *
790
  * @since 2.6.0
 
791
  *
792
  * @param object $term The Term object.
793
  * @param array $args The Title arguments.
@@ -822,7 +825,7 @@ class Generate_Title extends Generate_Description {
822
  $title = $use_prefix ? sprintf( \__( '%1$s: %2$s', 'autodescription' ), $this->get_the_term_name( $term ), $title ) : $title;
823
  } elseif ( $this->is_author() ) {
824
  $title = \get_the_author();
825
- /* translators: Front-end output. */
826
  $title = $use_prefix ? sprintf( \__( 'Author: %s', 'autodescription' ), $title ) : $title;
827
  } elseif ( $this->is_date() ) {
828
  if ( $this->is_year() ) {
@@ -886,7 +889,14 @@ class Generate_Title extends Generate_Description {
886
  $title = \__( 'Archives', 'autodescription' );
887
  }
888
 
889
- return $title;
 
 
 
 
 
 
 
890
  }
891
 
892
  /**
@@ -1268,9 +1278,9 @@ class Generate_Title extends Generate_Description {
1268
 
1269
  /**
1270
  * Applies filters the_seo_framework_use_archive_title_prefix : {
1271
- * @param bool true to add prefix.
1272
- * @param object $term The Term object.
1273
- * }
1274
  *
1275
  * @since 2.6.0
1276
  */
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
191
  * Reparses title args.
192
  *
193
  * @since 2.6.0
194
+ * @since 2.9.2 Now passes args to filter.
195
  *
196
  * @param array $args required The passed arguments.
197
  * @return array $args parsed args.
198
  */
199
  public function reparse_title_args( $args = array() ) {
200
 
201
+ $default_args = $this->parse_title_args( $args, '', true );
202
 
203
  if ( is_array( $args ) ) {
204
  if ( empty( $args ) ) {
786
 
787
  /**
788
  * Gets the archive Title, including filter. Also works in admin.
789
+ *
790
  * @NOTE Taken from WordPress core. Altered to work in the Admin area.
791
  *
792
  * @since 2.6.0
793
+ * @since 2.9.2 : Added WordPress core filter 'get_the_archive_title'
794
  *
795
  * @param object $term The Term object.
796
  * @param array $args The Title arguments.
825
  $title = $use_prefix ? sprintf( \__( '%1$s: %2$s', 'autodescription' ), $this->get_the_term_name( $term ), $title ) : $title;
826
  } elseif ( $this->is_author() ) {
827
  $title = \get_the_author();
828
+ /* translators: Front-end output. */
829
  $title = $use_prefix ? sprintf( \__( 'Author: %s', 'autodescription' ), $title ) : $title;
830
  } elseif ( $this->is_date() ) {
831
  if ( $this->is_year() ) {
889
  $title = \__( 'Archives', 'autodescription' );
890
  }
891
 
892
+ /**
893
+ * Filters the archive title.
894
+ *
895
+ * @since WordPress Core 4.1.0
896
+ *
897
+ * @param string $title Archive title to be displayed.
898
+ */
899
+ return \apply_filters( 'get_the_archive_title', $title );
900
  }
901
 
902
  /**
1278
 
1279
  /**
1280
  * Applies filters the_seo_framework_use_archive_title_prefix : {
1281
+ * @param bool true to add prefix.
1282
+ * @param object $term The Term object.
1283
+ * }
1284
  *
1285
  * @since 2.6.0
1286
  */
inc/classes/generate-url.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -66,6 +66,8 @@ class Generate_Url extends Generate_Title {
66
  * @since 2.4.2 : Refactored arguments
67
  * @since 2.8.0 : No longer tolerates $id as Post object.
68
  * @since 2.9.0 : When using 'home => true' args parameter, the home path is added when set.
 
 
69
  *
70
  * @param string $url the url
71
  * @param array $args : accepted args : {
@@ -126,32 +128,43 @@ class Generate_Url extends Generate_Title {
126
  $path = $this->get_home_path();
127
  }
128
 
129
- /**
130
- * Applies filters 'the_seo_framework_url_path' : array
131
- *
132
- * @since 2.8.0
133
- *
134
- * @param string $path the URL path.
135
- * @param int $id The current post, page or term ID.
136
- * @param bool $external Whether the call is made from outside the current ID scope. Like from the Sitemap.
137
- */
138
- $path = (string) \apply_filters( 'the_seo_framework_url_path', $path, $args['id'], $args['external'] );
139
 
140
- /**
141
- * Applies filters 'the_seo_framework_sanitize_redirect_url' : array
142
- *
143
- * @since 2.8.0
144
- *
145
- * @param array : { 'url' => The full URL built from $path, 'scheme' => The preferred scheme }
146
- * @param string $path the URL path.
147
- * @param int $id The current post, page or term ID.
148
- * @param bool $external Whether the call is made from outside the current ID scope. Like from the Sitemap.
149
- */
150
- $url_filter = (array) \apply_filters( 'the_seo_framework_url_output_args', array(), $path, $args['id'], $args['external'] );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
 
152
- if ( $url_filter ) {
153
- $url = $url_filter['url'];
154
- $scheme = $url_filter['scheme'];
 
155
  }
156
 
157
  //* Non-custom URL
@@ -194,6 +207,8 @@ class Generate_Url extends Generate_Title {
194
  * Parse and sanitize url args.
195
  *
196
  * @since 2.4.2
 
 
197
  *
198
  * @param array $args required The passed arguments.
199
  * @param array $defaults The default arguments.
@@ -203,7 +218,7 @@ class Generate_Url extends Generate_Title {
203
  public function parse_url_args( $args = array(), $defaults = array(), $get_defaults = false ) {
204
 
205
  //* Passing back the defaults reduces the memory usage.
206
- if ( empty( $defaults ) ) {
207
  $defaults = array(
208
  'paged' => false,
209
  'paged_plural' => true,
@@ -217,27 +232,33 @@ class Generate_Url extends Generate_Title {
217
  'id' => $this->get_the_real_ID(),
218
  );
219
 
220
- /**
221
- * @applies filters the_seo_framework_url_args : {
222
- * @param bool $paged Return current page URL without pagination if false
223
- * @param bool $paged_plural Whether to add pagination for the second or later page.
224
- * @param bool $from_option Get the canonical uri option
225
- * @param object $post The Post Object.
226
- * @param bool $external Whether to fetch the current WP Request or get the permalink by Post Object.
227
- * @param bool $is_term Fetch url for term.
228
- * @param object $term The term object.
229
- * @param bool $home Fetch home URL.
230
- * @param bool $forceslash Fetch home URL and slash it, always.
231
- * @param int $id The Page or Term ID.
232
- * }
233
- *
234
- * @since 2.5.0
235
- *
236
- * @param array $defaults The url defaults.
237
- * @param array $args The input args.
238
- */
239
- $defaults = (array) \apply_filters( 'the_seo_framework_url_args', $defaults, $args );
240
- }
 
 
 
 
 
 
241
 
242
  //* Return early if it's only a default args request.
243
  if ( $get_defaults )
@@ -261,14 +282,15 @@ class Generate_Url extends Generate_Title {
261
  /**
262
  * Reparse URL args.
263
  *
264
- * @param array $args required The passed arguments.
265
- *
266
  * @since 2.6.2
 
 
 
267
  * @return array $args parsed args.
268
  */
269
  public function reparse_url_args( $args = array() ) {
270
 
271
- $default_args = $this->parse_url_args( '', '', true );
272
 
273
  if ( is_array( $args ) ) {
274
  if ( empty( $args ) ) {
@@ -311,8 +333,8 @@ class Generate_Url extends Generate_Title {
311
  $path = $this->get_relative_term_url( $term, $args );
312
  } elseif ( ! $args['external'] && isset( $GLOBALS['wp']->request ) ) {
313
  //* Everything else.
314
- $path = \trailingslashit( \get_option( 'home' ) ) . $GLOBALS['wp']->request;
315
- $path = $this->set_url_scheme( $path, 'relative' );
316
  } else {
317
  //* Nothing to see here...
318
  $path = '';
@@ -369,7 +391,7 @@ class Generate_Url extends Generate_Title {
369
  $url = \get_home_url();
370
  } elseif ( ! $args['external'] ) {
371
  if ( isset( $GLOBALS['wp']->request ) )
372
- $url = \trailingslashit( \get_option( 'home' ) ) . $GLOBALS['wp']->request;
373
  }
374
 
375
  //* No permalink found.
@@ -521,7 +543,9 @@ class Generate_Url extends Generate_Title {
521
  * Can be automatically be detected.
522
  *
523
  * @since 2.8.0
 
524
  * @staticvar string $scheme
 
525
  *
526
  * @return string The preferred URl scheme.
527
  */
@@ -547,14 +571,23 @@ class Generate_Url extends Generate_Title {
547
  break;
548
  endswitch;
549
 
550
- /**
551
- * Applies filters 'the_seo_framework_preferred_url_scheme' : string
552
- *
553
- * @since 2.8.0
554
- *
555
- * @param string $scheme The current URL scheme.
556
- */
557
- return $scheme = (string) \apply_filters( 'the_seo_framework_preferred_url_scheme', $scheme );
 
 
 
 
 
 
 
 
 
558
  }
559
 
560
  /**
@@ -613,6 +646,8 @@ class Generate_Url extends Generate_Title {
613
  *
614
  * @since 2.6.0
615
  * @since 2.8.0 Deprecated.
 
 
616
  * @deprecated
617
  *
618
  * @param string $url The url with scheme.
@@ -621,36 +656,41 @@ class Generate_Url extends Generate_Title {
621
  */
622
  public function set_url_scheme_filter( $url, $current_scheme ) {
623
 
624
- /**
625
- * Applies filters the_seo_framework_canonical_force_scheme : Changes scheme.
626
- *
627
- * Accepted variables:
628
- * (string) 'https' : Force https
629
- * (bool) true : Force https
630
- * (bool) false : Force http
631
- * (string) 'http' : Force http
632
- * (string) 'relative' : Scheme relative
633
- * (void) null : Do nothing
634
- *
635
- *
636
- * @since 2.4.2
637
- * @since 2.8.0 Deprecated.
638
- * @deprecated
639
- *
640
- * @param string $current_scheme the current used scheme.
641
- */
642
- $scheme_settings = \apply_filters( 'the_seo_framework_canonical_force_scheme', null, $current_scheme );
643
 
644
- if ( isset( $scheme_settings ) ) {
645
 
646
  $this->_deprecated_filter( 'the_seo_framework_canonical_force_scheme', '2.8.0', 'the_seo_framework_preferred_url_scheme' );
647
 
648
- if ( 'https' === $scheme_settings || 'http' === $scheme_settings || 'relative' === $scheme_settings ) {
649
- $url = $this->set_url_scheme( $url, $scheme_settings, false );
650
- } elseif ( ! $scheme_settings ) {
651
- $url = $this->set_url_scheme( $url, 'http', false );
652
- } elseif ( $scheme_setting ) {
653
- $url = $this->set_url_scheme( $url, 'https', false );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
654
  }
655
  }
656
 
@@ -783,17 +823,16 @@ class Generate_Url extends Generate_Title {
783
  $prev = '';
784
  $next = '';
785
 
786
- if ( $this->is_singular() ) {
787
  if ( $this->is_real_front_page() || $this->is_front_page_by_id( $post_id ) ) {
788
  $output_singular_paged = $this->is_option_checked( 'prev_next_frontpage' );
789
  } else {
790
  $output_singular_paged = $this->is_option_checked( 'prev_next_posts' );
791
  }
792
 
793
- if ( $output_singular_paged ) {
794
 
795
  $page = $this->page();
796
- $numpages = substr_count( $this->get_post_content( $post_id ), '<!--nextpage-->' ) + 1;
797
 
798
  if ( ! $page )
799
  $page = 1;
@@ -801,10 +840,11 @@ class Generate_Url extends Generate_Title {
801
  if ( 'prev' === $prev_next ) {
802
  $prev = $page > 1 ? $this->get_paged_post_url( $page - 1, $post_id, 'prev' ) : '';
803
  } elseif ( 'next' === $prev_next ) {
804
- $next = $page < $numpages ? $this->get_paged_post_url( $page + 1, $post_id, 'next' ) : '';
 
805
  }
806
- }
807
- } elseif ( $this->is_archive() || $this->is_home() ) {
808
 
809
  $output_archive_paged = false;
810
  if ( $this->is_real_front_page() || $this->is_front_page_by_id( $post_id ) ) {
@@ -834,7 +874,7 @@ class Generate_Url extends Generate_Title {
834
  $next = \get_pagenum_link( $paged, false );
835
  }
836
  }
837
- }
838
 
839
  if ( $prev )
840
  return $this->set_preferred_url_scheme( \esc_url_raw( $prev ) );
@@ -881,17 +921,16 @@ class Generate_Url extends Generate_Title {
881
  if ( isset( $query_arg ) )
882
  $urlfromcache = str_replace( '?' . $query_arg, '', $urlfromcache );
883
 
884
- // Calculate current page number.
885
- $current = 'next' === $pos ? ( $i - 1 ) : ( $i + 1 );
886
- $current = (string) $current;
887
-
888
  //* Continue if still bigger than or equal to 2.
889
  if ( $i >= 2 ) {
 
 
 
890
  //* We're adding a page.
891
- $last_occurence = strrpos( $urlfromcache, '/' . $current . '/' );
892
 
893
- if ( false !== $last_occurence )
894
- $urlfromcache = substr_replace( $urlfromcache, '/', $last_occurence, strlen( '/' . $current . '/' ) );
895
  }
896
  }
897
 
@@ -1017,11 +1056,11 @@ class Generate_Url extends Generate_Title {
1017
  *
1018
  * @since 2.6.0
1019
  *
1020
- * @param int $paged
1021
  * @param bool $singular Whether to allow plural and singular.
1022
  * @param bool $plural Whether to allow plural regardless.
1023
  *
1024
- * @return int|bool $paged. False if not allowed. Int if allowed.
1025
  */
1026
  protected function maybe_get_paged( $paged = 0, $singular = false, $plural = true ) {
1027
 
@@ -1061,6 +1100,8 @@ class Generate_Url extends Generate_Title {
1061
  * If this fails, you're going to have a bad time.
1062
  *
1063
  * @since 2.7.0
 
 
1064
  * @staticvar string $cache
1065
  *
1066
  * @return string The home URL host.
@@ -1072,10 +1113,13 @@ class Generate_Url extends Generate_Title {
1072
  if ( isset( $cache ) )
1073
  return $cache;
1074
 
1075
- $parsed_url = \wp_parse_url( \get_option( 'home' ) );
1076
 
1077
  $host = isset( $parsed_url['host'] ) ? $parsed_url['host'] : '';
1078
 
 
 
 
1079
  return $cache = $host;
1080
  }
1081
 
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
66
  * @since 2.4.2 : Refactored arguments
67
  * @since 2.8.0 : No longer tolerates $id as Post object.
68
  * @since 2.9.0 : When using 'home => true' args parameter, the home path is added when set.
69
+ * @since 2.9.2 Added filter usage cache.
70
+ * @staticvar array $_has_filters
71
  *
72
  * @param string $url the url
73
  * @param array $args : accepted args : {
128
  $path = $this->get_home_path();
129
  }
130
 
131
+ static $_has_filters = null;
132
+ if ( null === $_has_filters ) {
133
+ $_has_filters = array();
134
+ $_has_filters['the_seo_framework_url_path'] = \has_filter( 'the_seo_framework_url_path' );
135
+ $_has_filters['the_seo_framework_url_output_args'] = \has_filter( 'the_seo_framework_url_output_args' );
136
+ }
 
 
 
 
137
 
138
+ if ( $_has_filters['the_seo_framework_url_path'] ) {
139
+ /**
140
+ * Applies filters 'the_seo_framework_url_path' : array
141
+ *
142
+ * @since 2.8.0
143
+ *
144
+ * @param string $path the URL path.
145
+ * @param int $id The current post, page or term ID.
146
+ * @param bool $external Whether the call is made from outside the current ID scope. Like from the Sitemap.
147
+ */
148
+ $path = (string) \apply_filters( 'the_seo_framework_url_path', $path, $args['id'], $args['external'] );
149
+ }
150
+
151
+ if ( $_has_filters['the_seo_framework_url_output_args'] ) {
152
+ /**
153
+ * Applies filters 'the_seo_framework_sanitize_redirect_url' : array
154
+ *
155
+ * @since 2.8.0
156
+ *
157
+ * @param array : { 'url' => The full URL built from $path, 'scheme' => The preferred scheme }
158
+ * @param string $path the URL path.
159
+ * @param int $id The current post, page or term ID.
160
+ * @param bool $external Whether the call is made from outside the current ID scope. Like from the Sitemap.
161
+ */
162
+ $url_filter = (array) \apply_filters( 'the_seo_framework_url_output_args', array(), $path, $args['id'], $args['external'] );
163
 
164
+ if ( $url_filter ) {
165
+ $url = $url_filter['url'];
166
+ $scheme = $url_filter['scheme'];
167
+ }
168
  }
169
 
170
  //* Non-custom URL
207
  * Parse and sanitize url args.
208
  *
209
  * @since 2.4.2
210
+ * @since 2.9.2 Added filter usage cache.
211
+ * @staticvar bool $_has_filter
212
  *
213
  * @param array $args required The passed arguments.
214
  * @param array $defaults The default arguments.
218
  public function parse_url_args( $args = array(), $defaults = array(), $get_defaults = false ) {
219
 
220
  //* Passing back the defaults reduces the memory usage.
221
+ if ( empty( $defaults ) ) :
222
  $defaults = array(
223
  'paged' => false,
224
  'paged_plural' => true,
232
  'id' => $this->get_the_real_ID(),
233
  );
234
 
235
+ static $_has_filter = null;
236
+ if ( null === $_has_filter )
237
+ $_has_filter = \has_filter( 'the_seo_framework_url_args' );
238
+
239
+ if ( $_has_filter ) {
240
+ /**
241
+ * @applies filters the_seo_framework_url_args : {
242
+ * @param bool $paged Return current page URL without pagination if false
243
+ * @param bool $paged_plural Whether to add pagination for the second or later page.
244
+ * @param bool $from_option Get the canonical uri option
245
+ * @param object $post The Post Object.
246
+ * @param bool $external Whether to fetch the current WP Request or get the permalink by Post Object.
247
+ * @param bool $is_term Fetch url for term.
248
+ * @param object $term The term object.
249
+ * @param bool $home Fetch home URL.
250
+ * @param bool $forceslash Fetch home URL and slash it, always.
251
+ * @param int $id The Page or Term ID.
252
+ * }
253
+ *
254
+ * @since 2.5.0
255
+ *
256
+ * @param array $defaults The url defaults.
257
+ * @param array $args The input args.
258
+ */
259
+ $defaults = (array) \apply_filters( 'the_seo_framework_url_args', $defaults, $args );
260
+ }
261
+ endif;
262
 
263
  //* Return early if it's only a default args request.
264
  if ( $get_defaults )
282
  /**
283
  * Reparse URL args.
284
  *
 
 
285
  * @since 2.6.2
286
+ * @since 2.9.2 Now passes args to filter.
287
+ *
288
+ * @param array $args required The passed arguments.
289
  * @return array $args parsed args.
290
  */
291
  public function reparse_url_args( $args = array() ) {
292
 
293
+ $default_args = $this->parse_url_args( $args, '', true );
294
 
295
  if ( is_array( $args ) ) {
296
  if ( empty( $args ) ) {
333
  $path = $this->get_relative_term_url( $term, $args );
334
  } elseif ( ! $args['external'] && isset( $GLOBALS['wp']->request ) ) {
335
  //* Everything else.
336
+ $_url = \trailingslashit( \get_option( 'home' ) ) . $GLOBALS['wp']->request;
337
+ $path = $this->set_url_scheme( $_url, 'relative' );
338
  } else {
339
  //* Nothing to see here...
340
  $path = '';
391
  $url = \get_home_url();
392
  } elseif ( ! $args['external'] ) {
393
  if ( isset( $GLOBALS['wp']->request ) )
394
+ $url = \trailingslashit( \get_home_url() ) . $GLOBALS['wp']->request;
395
  }
396
 
397
  //* No permalink found.
543
  * Can be automatically be detected.
544
  *
545
  * @since 2.8.0
546
+ * @since 2.9.2 Added filter usage cache.
547
  * @staticvar string $scheme
548
+ * @staticvar bool $_has_filter
549
  *
550
  * @return string The preferred URl scheme.
551
  */
571
  break;
572
  endswitch;
573
 
574
+ static $_has_filter = null;
575
+
576
+ if ( null === $_has_filter )
577
+ $_has_filter = \has_filter( 'the_seo_framework_preferred_url_scheme' );
578
+
579
+ if ( $_has_filter ) {
580
+ /**
581
+ * Applies filters 'the_seo_framework_preferred_url_scheme' : string
582
+ *
583
+ * @since 2.8.0
584
+ *
585
+ * @param string $scheme The current URL scheme.
586
+ */
587
+ $scheme = (string) \apply_filters( 'the_seo_framework_preferred_url_scheme', $scheme );
588
+ }
589
+
590
+ return $scheme;
591
  }
592
 
593
  /**
646
  *
647
  * @since 2.6.0
648
  * @since 2.8.0 Deprecated.
649
+ * @since 2.9.2 Added filter usage cache.
650
+ * @staticvar $_has_filter;
651
  * @deprecated
652
  *
653
  * @param string $url The url with scheme.
656
  */
657
  public function set_url_scheme_filter( $url, $current_scheme ) {
658
 
659
+ static $_has_filter = null;
660
+ if ( null === $_has_filter )
661
+ $_has_filter = \has_filter( 'the_seo_framework_canonical_force_scheme' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
662
 
663
+ if ( $_has_filter ) {
664
 
665
  $this->_deprecated_filter( 'the_seo_framework_canonical_force_scheme', '2.8.0', 'the_seo_framework_preferred_url_scheme' );
666
 
667
+ /**
668
+ * Applies filters the_seo_framework_canonical_force_scheme : Changes scheme.
669
+ *
670
+ * Accepted variables:
671
+ * (string) 'https' : Force https
672
+ * (bool) true : Force https
673
+ * (bool) false : Force http
674
+ * (string) 'http' : Force http
675
+ * (string) 'relative' : Scheme relative
676
+ * (void) null : Do nothing
677
+ *
678
+ * @since 2.4.2
679
+ * @since 2.8.0 Deprecated.
680
+ * @deprecated
681
+ *
682
+ * @param string $current_scheme the current used scheme.
683
+ */
684
+ $scheme_settings = \apply_filters( 'the_seo_framework_canonical_force_scheme', null, $current_scheme );
685
+
686
+ if ( null !== $scheme_settings ) {
687
+ if ( 'https' === $scheme_settings || 'http' === $scheme_settings || 'relative' === $scheme_settings ) {
688
+ $url = $this->set_url_scheme( $url, $scheme_settings, false );
689
+ } elseif ( ! $scheme_settings ) {
690
+ $url = $this->set_url_scheme( $url, 'http', false );
691
+ } elseif ( $scheme_setting ) {
692
+ $url = $this->set_url_scheme( $url, 'https', false );
693
+ }
694
  }
695
  }
696
 
823
  $prev = '';
824
  $next = '';
825
 
826
+ if ( $this->is_singular() ) :
827
  if ( $this->is_real_front_page() || $this->is_front_page_by_id( $post_id ) ) {
828
  $output_singular_paged = $this->is_option_checked( 'prev_next_frontpage' );
829
  } else {
830
  $output_singular_paged = $this->is_option_checked( 'prev_next_posts' );
831
  }
832
 
833
+ if ( $output_singular_paged ) :
834
 
835
  $page = $this->page();
 
836
 
837
  if ( ! $page )
838
  $page = 1;
840
  if ( 'prev' === $prev_next ) {
841
  $prev = $page > 1 ? $this->get_paged_post_url( $page - 1, $post_id, 'prev' ) : '';
842
  } elseif ( 'next' === $prev_next ) {
843
+ $_numpages = substr_count( $this->get_post_content( $post_id ), '<!--nextpage-->' ) + 1;
844
+ $next = $page < $_numpages ? $this->get_paged_post_url( $page + 1, $post_id, 'next' ) : '';
845
  }
846
+ endif;
847
+ elseif ( $this->is_archive() || $this->is_home() ) :
848
 
849
  $output_archive_paged = false;
850
  if ( $this->is_real_front_page() || $this->is_front_page_by_id( $post_id ) ) {
874
  $next = \get_pagenum_link( $paged, false );
875
  }
876
  }
877
+ endif;
878
 
879
  if ( $prev )
880
  return $this->set_preferred_url_scheme( \esc_url_raw( $prev ) );
921
  if ( isset( $query_arg ) )
922
  $urlfromcache = str_replace( '?' . $query_arg, '', $urlfromcache );
923
 
 
 
 
 
924
  //* Continue if still bigger than or equal to 2.
925
  if ( $i >= 2 ) {
926
+ // Calculate current page number.
927
+ $_current = 'next' === $pos ? (string) ( $i - 1 ) : (string) ( $i + 1 );
928
+
929
  //* We're adding a page.
930
+ $_last_occurrence = strrpos( $urlfromcache, '/' . $_current . '/' );
931
 
932
+ if ( false !== $_last_occurrence )
933
+ $urlfromcache = substr_replace( $urlfromcache, '/', $_last_occurrence, strlen( '/' . $_current . '/' ) );
934
  }
935
  }
936
 
1056
  *
1057
  * @since 2.6.0
1058
  *
1059
+ * @param int $paged The current page number.
1060
  * @param bool $singular Whether to allow plural and singular.
1061
  * @param bool $plural Whether to allow plural regardless.
1062
  *
1063
+ * @return int|bool $paged. False if not allowed or on page 0. int if allowed.
1064
  */
1065
  protected function maybe_get_paged( $paged = 0, $singular = false, $plural = true ) {
1066
 
1100
  * If this fails, you're going to have a bad time.
1101
  *
1102
  * @since 2.7.0
1103
+ * @since 2.9.2 : Now considers port too.
1104
+ * : Now uses get_home_url(), rather than get_option('home').
1105
  * @staticvar string $cache
1106
  *
1107
  * @return string The home URL host.
1113
  if ( isset( $cache ) )
1114
  return $cache;
1115
 
1116
+ $parsed_url = \wp_parse_url( \get_home_url() );
1117
 
1118
  $host = isset( $parsed_url['host'] ) ? $parsed_url['host'] : '';
1119
 
1120
+ if ( $host && isset( $parsed_url['port'] ) )
1121
+ $host .= ':' . $parsed_url['port'];
1122
+
1123
  return $cache = $host;
1124
  }
1125
 
inc/classes/generate.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
inc/classes/init.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -317,7 +317,7 @@ class Init extends Query {
317
  /**
318
  * @since 2.2.6
319
  *
320
- * Applies filters 'the_seo_framework_before_output' : array after functions output
321
  * Applies filters 'the_seo_framework_after_output' : array after functions output
322
  * @param array $functions {
323
  * 'callback' => string|array The function to call.
@@ -355,7 +355,7 @@ class Init extends Query {
355
  * Start the timer here. I know it doesn't calculate the initiation of
356
  * the plugin, but it will make the code smelly if I were to do so.
357
  * A static array cache counter function would make it possible, but meh.
358
- * This function takes the most time anyway.
359
  */
360
  $init_start = microtime( true );
361
 
@@ -439,60 +439,19 @@ class Init extends Query {
439
  $generator = (string) \apply_filters( 'the_seo_framework_generator_tag', '' );
440
 
441
  if ( $generator )
442
- $generator = '<meta name="generator" content="' . \esc_attr( $generator ) . '" />' . "\r\n";
443
 
444
  $output = $robots . $before . $before_actions . $output . $after_actions . $after . $generator;
445
 
446
  $this->use_object_cache and $this->object_cache_set( $cache_key, $output, DAY_IN_SECONDS );
447
  endif;
448
 
449
- /**
450
- * Applies filters 'the_seo_framework_indicator' : Boolean
451
- * Whether to show the indicator in HTML.
452
- * @since 2.0.0
453
- */
454
- $indicator = (bool) \apply_filters( 'the_seo_framework_indicator', true );
455
-
456
- $indicatorbefore = '';
457
- $indicatorafter = '';
458
-
459
- if ( $indicator ) :
460
-
461
- /**
462
- * Applies filters 'the_seo_framework_indicator_timing' : Boolean
463
- * Whether to show the hidden generation time in HTML.
464
- * @since 2.4.0
465
- */
466
- $timer = (bool) \apply_filters( 'the_seo_framework_indicator_timing', true );
467
-
468
- /**
469
- * Applies filters 'sybre_waaijer_<3' : Boolean
470
- * Whether to show the hidden author name in HTML.
471
- * @since 2.4.0
472
- */
473
- $sybre = (bool) \apply_filters( 'sybre_waaijer_<3', true );
474
-
475
- $start = \esc_html__( 'Start The SEO Framework', 'autodescription' );
476
- $end = \esc_html__( 'End The SEO Framework', 'autodescription' );
477
- $me = $sybre ? ' ' . \esc_html__( 'by Sybre Waaijer', 'autodescription' ) : '';
478
-
479
- $indicatorbefore = '<!-- ' . $start . $me . ' -->' . "\r\n";
480
-
481
- /**
482
- * Calculate the plugin load time.
483
- * @since 2.4.0
484
- */
485
- if ( $timer ) {
486
- $indicatorafter = '<!-- ' . $end . $me . ' | ' . number_format( microtime( true ) - $init_start, 5 ) . 's' . ' -->' . "\r\n";
487
- } else {
488
- $indicatorafter = '<!-- ' . $end . $me . ' -->' . "\r\n";
489
- }
490
- endif;
491
-
492
- $output = "\r\n" . $indicatorbefore . $output . $indicatorafter . "\r\n";
493
 
494
  //* Already escaped.
495
- echo $output;
496
 
497
  \do_action( 'the_seo_framework_do_after_output' );
498
 
@@ -563,6 +522,11 @@ class Init extends Query {
563
  * Edits the robots.txt output.
564
  * Requires not to have a robots.txt file in the root directory.
565
  *
 
 
 
 
 
566
  * @since 2.2.9
567
  * @uses robots_txt filter located at WP core
568
  *
@@ -573,7 +537,7 @@ class Init extends Query {
573
  public function robots_txt( $robots_txt = '', $public = '' ) {
574
 
575
  /**
576
- * Don't do anything if the blog isn't public
577
  */
578
  if ( '0' === $public )
579
  return $robots_txt;
@@ -588,6 +552,15 @@ class Init extends Query {
588
  if ( false === $output ) :
589
  $output = '';
590
 
 
 
 
 
 
 
 
 
 
591
  /**
592
  * Apply filters the_seo_framework_robots_txt_pre & the_seo_framework_robots_txt_pro : string
593
  * Adds custom cacheable lines.
@@ -599,36 +572,28 @@ class Init extends Query {
599
  $pro = (string) \apply_filters( 'the_seo_framework_robots_txt_pro', '' );
600
 
601
  $site_url = \wp_parse_url( \site_url() );
602
- $path = ( ! empty( $site_url['path'] ) ) ? $site_url['path'] : '';
603
 
604
  $output .= $pre;
605
  //* Output defaults
606
  $output .= "User-agent: *\r\n";
607
- $output .= "Disallow: $path/wp-admin/\r\n";
608
- $output .= "Allow: $path/wp-admin/admin-ajax.php\r\n";
609
 
610
  /**
611
- * Prevents query indexing
612
- * @since 2.2.9
613
- *
614
- * Applies filters the_seo_framework_robots_disallow_queries : Whether to allow queries for robots.
615
  * @since 2.5.0
616
  */
617
  if ( \apply_filters( 'the_seo_framework_robots_disallow_queries', false ) ) {
618
- $home_url = \wp_parse_url( rtrim( $this->the_home_url_from_cache(), ' /\\' ) );
619
- $home_path = ( ! empty( $home_url['path'] ) ) ? $home_url['path'] : '';
620
  $output .= "Disallow: $home_path/*?*\r\n";
621
  }
622
 
623
  $output .= $pro;
624
 
625
- if ( $this->get_option( 'sitemaps_robots' ) && $this->can_do_sitemap_robots() ) {
626
- //* Add whitespace before sitemap.
627
- $output .= "\r\n";
628
-
629
- //* Add sitemap full url
630
- $output .= 'Sitemap: ' . $this->the_home_url_from_cache( true ) . "sitemap.xml\r\n";
631
- }
632
 
633
  $this->use_object_cache and $this->object_cache_set( $cache_key, $output, 86400 );
634
  endif;
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
317
  /**
318
  * @since 2.2.6
319
  *
320
+ * Applies filters 'the_seo_framework_before_output' : array before functions output
321
  * Applies filters 'the_seo_framework_after_output' : array after functions output
322
  * @param array $functions {
323
  * 'callback' => string|array The function to call.
355
  * Start the timer here. I know it doesn't calculate the initiation of
356
  * the plugin, but it will make the code smelly if I were to do so.
357
  * A static array cache counter function would make it possible, but meh.
358
+ * This function presumably takes the most time anyway.
359
  */
360
  $init_start = microtime( true );
361
 
439
  $generator = (string) \apply_filters( 'the_seo_framework_generator_tag', '' );
440
 
441
  if ( $generator )
442
+ $generator = '<meta name="generator" content="' . \esc_attr( $generator ) . '" />' . PHP_EOL;
443
 
444
  $output = $robots . $before . $before_actions . $output . $after_actions . $after . $generator;
445
 
446
  $this->use_object_cache and $this->object_cache_set( $cache_key, $output, DAY_IN_SECONDS );
447
  endif;
448
 
449
+ $output = $this->get_plugin_indicator( 'before' )
450
+ . $output
451
+ . $this->get_plugin_indicator( 'after', $init_start );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
452
 
453
  //* Already escaped.
454
+ echo "\r\n" . $output . "\r\n";
455
 
456
  \do_action( 'the_seo_framework_do_after_output' );
457
 
522
  * Edits the robots.txt output.
523
  * Requires not to have a robots.txt file in the root directory.
524
  *
525
+ * This methods completely hijacks default output, intentionally.
526
+ * The robots.txt file should be left as default, so to improve SEO.
527
+ * The Robots Exclusion Protocol encourages you not to use this file for
528
+ * non-administrative endpoints.
529
+ *
530
  * @since 2.2.9
531
  * @uses robots_txt filter located at WP core
532
  *
537
  public function robots_txt( $robots_txt = '', $public = '' ) {
538
 
539
  /**
540
+ * Don't do anything if the blog isn't public.
541
  */
542
  if ( '0' === $public )
543
  return $robots_txt;
552
  if ( false === $output ) :
553
  $output = '';
554
 
555
+ $parsed_home_url = \wp_parse_url( rtrim( $this->the_home_url_from_cache(), ' /\\' ) );
556
+ $home_path = ! empty( $parsed_home_url['path'] ) ? \esc_attr( $parsed_home_url['path'] ) : '';
557
+
558
+ if ( $this->is_subdirectory_installation() || $home_path ) {
559
+ $output .= '# This is an invalid robots.txt location.' . "\r\n";
560
+ $output .= '# Please visit: ' . \esc_url( trailingslashit( $this->set_preferred_url_scheme( $this->get_home_host() ) ) . 'robots.txt' ) . "\r\n";
561
+ $output .= "\r\n";
562
+ }
563
+
564
  /**
565
  * Apply filters the_seo_framework_robots_txt_pre & the_seo_framework_robots_txt_pro : string
566
  * Adds custom cacheable lines.
572
  $pro = (string) \apply_filters( 'the_seo_framework_robots_txt_pro', '' );
573
 
574
  $site_url = \wp_parse_url( \site_url() );
575
+ $site_path = ( ! empty( $site_url['path'] ) ) ? \esc_attr( $site_url['path'] ) : '';
576
 
577
  $output .= $pre;
578
  //* Output defaults
579
  $output .= "User-agent: *\r\n";
580
+ $output .= "Disallow: $site_path/wp-admin/\r\n";
581
+ $output .= "Allow: $site_path/wp-admin/admin-ajax.php\r\n";
582
 
583
  /**
584
+ * Applies filters the_seo_framework_robots_disallow_queries : boolean
585
+ * Determines whether to allow queries for robots.
 
 
586
  * @since 2.5.0
587
  */
588
  if ( \apply_filters( 'the_seo_framework_robots_disallow_queries', false ) ) {
 
 
589
  $output .= "Disallow: $home_path/*?*\r\n";
590
  }
591
 
592
  $output .= $pro;
593
 
594
+ //* Add extra whitespace and sitemap full URL
595
+ if ( $this->can_do_sitemap_robots( true ) )
596
+ $output .= "\r\nSitemap: " . \esc_url( $this->get_sitemap_xml_url() ) . "\r\n";
 
 
 
 
597
 
598
  $this->use_object_cache and $this->object_cache_set( $cache_key, $output, 86400 );
599
  endif;
inc/classes/inpost.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
inc/classes/load.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
inc/classes/metaboxes.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
inc/classes/post-data.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
inc/classes/query.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -1153,6 +1153,28 @@ class Query extends Compat {
1153
  return $paged;
1154
  }
1155
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1156
  /**
1157
  * Handles object cache for the query class.
1158
  *
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
1153
  return $paged;
1154
  }
1155
 
1156
+ /**
1157
+ * Determines whether we're on The SEO Framework's sitemap or not.
1158
+ *
1159
+ * @since 2.9.2
1160
+ *
1161
+ * @return bool
1162
+ */
1163
+ public function is_sitemap() {
1164
+ return (bool) $this->doing_sitemap;
1165
+ }
1166
+
1167
+ /**
1168
+ * Determines whether we're on the robots.txt file output.
1169
+ *
1170
+ * @since 2.9.2
1171
+ *
1172
+ * @return bool
1173
+ */
1174
+ public function is_robots() {
1175
+ return \is_robots();
1176
+ }
1177
+
1178
  /**
1179
  * Handles object cache for the query class.
1180
  *
inc/classes/render.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -828,14 +828,20 @@ class Render extends Admin_Init {
828
  * @deprecated
829
  * @since 2.7.0
830
  */
831
- if ( true !== \apply_filters( 'the_seo_framework_output_canonical', true, $this->get_the_real_ID() ) ) {
832
  $this->_deprecated_filter( 'the_seo_framework_output_canonical', '2.7.0', "add_filter( 'the_seo_framework_rel_canonical_output', '__return_empty_string' );" );
833
- return '';
 
834
  }
835
 
836
  /**
837
- * Applies filters 'the_seo_framework_rel_canonical_output' : Change canonical URL output.
 
 
838
  * @since 2.6.5
 
 
 
839
  */
840
  $url = (string) \apply_filters( 'the_seo_framework_rel_canonical_output', $this->the_url_from_cache(), $this->get_the_real_ID() );
841
 
@@ -864,7 +870,11 @@ class Render extends Admin_Init {
864
 
865
  /**
866
  * Applies filters 'the_seo_framework_ldjson_scripts' : string
 
867
  * @since 2.6.0
 
 
 
868
  */
869
  $json = (string) \apply_filters( 'the_seo_framework_ldjson_scripts', $this->render_ld_json_scripts(), $this->get_the_real_ID() );
870
 
@@ -1038,6 +1048,74 @@ class Render extends Admin_Init {
1038
  return $output;
1039
  }
1040
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1041
  /**
1042
  * Determines whether we can use Open Graph tags.
1043
  *
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
828
  * @deprecated
829
  * @since 2.7.0
830
  */
831
+ if ( \has_filter( 'the_seo_framework_output_canonical' ) ) {
832
  $this->_deprecated_filter( 'the_seo_framework_output_canonical', '2.7.0', "add_filter( 'the_seo_framework_rel_canonical_output', '__return_empty_string' );" );
833
+ if ( true !== \apply_filters( 'the_seo_framework_output_canonical', true, $this->get_the_real_ID() ) )
834
+ return '';
835
  }
836
 
837
  /**
838
+ * Applies filters 'the_seo_framework_rel_canonical_output' : string
839
+ * Changes canonical URL output.
840
+ *
841
  * @since 2.6.5
842
+ *
843
+ * @param string $url The canonical URL. Must be escaped.
844
+ * @param int $id The current page or term ID.
845
  */
846
  $url = (string) \apply_filters( 'the_seo_framework_rel_canonical_output', $this->the_url_from_cache(), $this->get_the_real_ID() );
847
 
870
 
871
  /**
872
  * Applies filters 'the_seo_framework_ldjson_scripts' : string
873
+ *
874
  * @since 2.6.0
875
+ *
876
+ * @param string $json The JSON output. Must be escaped.
877
+ * @param int $id The current page or term ID.
878
  */
879
  $json = (string) \apply_filters( 'the_seo_framework_ldjson_scripts', $this->render_ld_json_scripts(), $this->get_the_real_ID() );
880
 
1048
  return $output;
1049
  }
1050
 
1051
+ /**
1052
+ * Returns the plugin hidden HTML indicators.
1053
+ *
1054
+ * @since 2.9.2
1055
+ *
1056
+ * @param string $where Determines the position of the indicator.
1057
+ * Accepts 'before' for before, anything else for after.
1058
+ * @param int $timing Determines when the output started.
1059
+ * @return string The SEO Framework's HTML plugin indicator.
1060
+ */
1061
+ public function get_plugin_indicator( $where = 'before', $timing = 0 ) {
1062
+
1063
+ static $run, $_cache = null;
1064
+
1065
+ if ( ! isset( $run ) ) {
1066
+ /**
1067
+ * Applies filters 'the_seo_framework_indicator' : Boolean
1068
+ * Whether to show the indicator in HTML.
1069
+ * @since 2.0.0
1070
+ */
1071
+ $run = (bool) \apply_filters( 'the_seo_framework_indicator', true );
1072
+ }
1073
+
1074
+ if ( false === $run )
1075
+ return '';
1076
+
1077
+ if ( null === $_cache ) {
1078
+
1079
+ $_cache = array();
1080
+
1081
+ /**
1082
+ * Applies filters 'sybre_waaijer_<3' : Boolean
1083
+ * Whether to show the hidden author name in HTML.
1084
+ * @since 2.4.0
1085
+ */
1086
+ $sybre = (bool) \apply_filters( 'sybre_waaijer_<3', true );
1087
+
1088
+ // Plugin name can't be translated. Yay.
1089
+ $tsf = 'The SEO Framework';
1090
+
1091
+ /**
1092
+ * Applies filters 'the_seo_framework_indicator_timing' : Boolean
1093
+ * Whether to show the hidden generation time in HTML.
1094
+ * @since 2.4.0
1095
+ */
1096
+ $_cache['show_timer'] = (bool) \apply_filters( 'the_seo_framework_indicator_timing', true );
1097
+
1098
+ /* translators: %s = 'The SEO Framework' */
1099
+ $_cache['start'] = sprintf( \esc_html__( 'Start %s', 'autodescription' ), $tsf );
1100
+ /* translators: %s = 'The SEO Framework' */
1101
+ $_cache['end'] = sprintf( \esc_html__( 'End %s', 'autodescription' ), $tsf );
1102
+ $_cache['author'] = $sybre ? ' ' . \esc_html__( 'by Sybre Waaijer', 'autodescription' ) : '';
1103
+ }
1104
+
1105
+ if ( 'before' === $where ) {
1106
+ $output = $_cache['start'] . $_cache['author'];
1107
+ } else {
1108
+ if ( $_cache['show_timer'] && $timing ) {
1109
+ $timer = ' | ' . number_format( microtime( true ) - $timing, 5 ) . 's';
1110
+ } else {
1111
+ $timer = '';
1112
+ }
1113
+ $output = $_cache['end'] . $_cache['author'] . $timer;
1114
+ }
1115
+
1116
+ return sprintf( '<!-- %s -->', $output ) . PHP_EOL;
1117
+ }
1118
+
1119
  /**
1120
  * Determines whether we can use Open Graph tags.
1121
  *
inc/classes/sanitize.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -1203,8 +1203,6 @@ class Sanitize extends Admin_Pages {
1203
  if ( '' === $color )
1204
  return '';
1205
 
1206
- $color = $color;
1207
-
1208
  if ( preg_match( '|^([A-Fa-f0-9]{3}){1,2}$|', $color ) )
1209
  return $color;
1210
 
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
1203
  if ( '' === $color )
1204
  return '';
1205
 
 
 
1206
  if ( preg_match( '|^([A-Fa-f0-9]{3}){1,2}$|', $color ) )
1207
  return $color;
1208
 
inc/classes/site-options.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -127,7 +127,7 @@ class Site_Options extends Sanitize {
127
  'description_separator' => 'pipe', // Description separator, dropdown
128
  'description_additions' => 1, // "Title on Blogname" within Description
129
  'description_blogname' => 1, // "on Blogname" within Description
130
- // 'description_custom' => '', // Custom prefix
131
 
132
  // Robots directory.
133
  'noodp' => 1, // Site noopd robots settings
@@ -456,17 +456,19 @@ class Site_Options extends Sanitize {
456
  * Return current option array.
457
  *
458
  * @since 2.6.0
459
- * @since 2.9.0 Added $use_cache parameter.
460
  * @staticvar array $cache The option cache.
461
  *
462
  * @param string $setting The setting key.
 
 
463
  * @return array Options.
464
  */
465
- public function get_all_options( $setting = null ) {
466
 
467
  static $cache = array();
468
 
469
- if ( isset( $cache[ $setting ] ) )
470
  return $cache[ $setting ];
471
 
472
  if ( is_null( $setting ) )
@@ -537,6 +539,9 @@ class Site_Options extends Sanitize {
537
  * @uses $this->the_seo_framework_get_option() Return option from the options table and cache result.
538
  * @uses THE_SEO_FRAMEWORK_NETWORK_OPTIONS
539
  *
 
 
 
540
  * @param string $key Option name.
541
  * @param boolean $use_cache Optional. Whether to use the cache value or not. Defaults to true.
542
  * @return mixed The value of this $key in the database.
@@ -921,6 +926,7 @@ class Site_Options extends Sanitize {
921
  *
922
  * @since 2.5.2
923
  * @see https://www.facebook.com/translations/FacebookLocales.xml
 
924
  *
925
  * @return array Valid Facebook locales
926
  */
@@ -1070,7 +1076,8 @@ class Site_Options extends Sanitize {
1070
  }
1071
 
1072
  /**
1073
- * Returns Facebook locales array keys.
 
1074
  * This is apart from the fb_locales array since there are "duplicated" keys.
1075
  * Use this to compare the numeric key position.
1076
  *
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
127
  'description_separator' => 'pipe', // Description separator, dropdown
128
  'description_additions' => 1, // "Title on Blogname" within Description
129
  'description_blogname' => 1, // "on Blogname" within Description
130
+ // 'description_custom' => '', // Custom prefix TODO
131
 
132
  // Robots directory.
133
  'noodp' => 1, // Site noopd robots settings
456
  * Return current option array.
457
  *
458
  * @since 2.6.0
459
+ * @since 2.9.2 Added $use_current parameter.
460
  * @staticvar array $cache The option cache.
461
  *
462
  * @param string $setting The setting key.
463
+ * @param bool $use_current Whether to use WordPress' version and update the cache
464
+ * or use locally the cached version.
465
  * @return array Options.
466
  */
467
+ public function get_all_options( $setting = null, $use_current = false ) {
468
 
469
  static $cache = array();
470
 
471
+ if ( ! $use_current && isset( $cache[ $setting ] ) )
472
  return $cache[ $setting ];
473
 
474
  if ( is_null( $setting ) )
539
  * @uses $this->the_seo_framework_get_option() Return option from the options table and cache result.
540
  * @uses THE_SEO_FRAMEWORK_NETWORK_OPTIONS
541
  *
542
+ * Unused.
543
+ * @todo deprecate.
544
+ *
545
  * @param string $key Option name.
546
  * @param boolean $use_cache Optional. Whether to use the cache value or not. Defaults to true.
547
  * @return mixed The value of this $key in the database.
926
  *
927
  * @since 2.5.2
928
  * @see https://www.facebook.com/translations/FacebookLocales.xml
929
+ * @see $this->language_keys() for the associative array keys.
930
  *
931
  * @return array Valid Facebook locales
932
  */
1076
  }
1077
 
1078
  /**
1079
+ * Returns Facebook locales' associative array keys.
1080
+ *
1081
  * This is apart from the fb_locales array since there are "duplicated" keys.
1082
  * Use this to compare the numeric key position.
1083
  *
inc/classes/sitemaps.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -67,9 +67,10 @@ class Sitemaps extends Metaboxes {
67
  }
68
 
69
  /**
70
- * Determines whether we can output sitemap or not based on options.
71
  *
72
  * @since 2.6.0
 
73
  * @staticvar bool $cache
74
  *
75
  * @return bool
@@ -82,10 +83,10 @@ class Sitemaps extends Metaboxes {
82
  return $cache;
83
 
84
  /**
85
- * Don't do anything on a deleted or spam blog.
86
- * There's nothing to find anyway. Multisite Only.
87
  */
88
- return $cache = $this->pretty_permalinks && $this->is_option_checked( 'sitemaps_output' ) && false === $this->current_blog_is_spam_or_deleted();
89
  }
90
 
91
  /**
@@ -246,7 +247,7 @@ class Sitemaps extends Metaboxes {
246
  protected function output_sitemap() {
247
 
248
  //* Remove output, if any.
249
- $this->clean_reponse_header();
250
 
251
  if ( ! headers_sent() )
252
  header( 'Content-type: text/xml; charset=utf-8' );
@@ -381,21 +382,92 @@ class Sitemaps extends Metaboxes {
381
  * Returns the stylesheet XSL location URL.
382
  *
383
  * @since 2.8.0
 
384
  *
385
  * @return string URL location of the XSL stylesheet. Unescaped.
386
  */
387
  public function get_sitemap_xsl_url() {
388
  global $wp_rewrite;
389
 
 
 
 
 
 
 
 
 
 
 
 
 
 
390
  if ( $wp_rewrite->using_index_permalinks() ) {
391
- $xsl = \home_url( '/index.php/sitemap.xsl' );
392
  } elseif ( $wp_rewrite->using_permalinks() ) {
393
- $xsl = \home_url( '/sitemap.xsl' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
394
  } else {
395
- $xsl = \home_url( '/?the_seo_framework_sitemap-xsl=true' );
396
  }
397
 
398
- return $xsl;
399
  }
400
 
401
  /**
@@ -405,7 +477,7 @@ class Sitemaps extends Metaboxes {
405
  */
406
  public function output_sitemap_xsl_stylesheet() {
407
 
408
- $this->clean_reponse_header();
409
 
410
  if ( ! headers_sent() ) {
411
  header( 'Content-type: text/xsl; charset=utf-8' );
@@ -424,7 +496,7 @@ class Sitemaps extends Metaboxes {
424
  * @param string|bool $content required The sitemap transient content.
425
  * @return string The sitemap content.
426
  */
427
- public function setup_sitemap( $sitemap_content ) {
428
 
429
  if ( false === $sitemap_content ) {
430
  //* Transient doesn't exist yet.
@@ -1023,7 +1095,7 @@ class Sitemaps extends Metaboxes {
1023
  * @since 2.2.9
1024
  */
1025
  public function ping_google() {
1026
- $pingurl = 'http://www.google.com/webmasters/sitemaps/ping?sitemap=' . urlencode( $this->the_home_url_from_cache( true ) . 'sitemap.xml' );
1027
  \wp_safe_remote_get( $pingurl, array( 'timeout' => 3 ) );
1028
  }
1029
 
@@ -1033,7 +1105,7 @@ class Sitemaps extends Metaboxes {
1033
  * @since 2.2.9
1034
  */
1035
  public function ping_bing() {
1036
- $pingurl = 'http://www.bing.com/webmaster/ping.aspx?siteMap=' . urlencode( $this->the_home_url_from_cache( true ) . 'sitemap.xml' );
1037
  \wp_safe_remote_get( $pingurl, array( 'timeout' => 3 ) );
1038
  }
1039
 
@@ -1043,7 +1115,7 @@ class Sitemaps extends Metaboxes {
1043
  * @since 2.6.0
1044
  */
1045
  public function ping_yandex() {
1046
- $pingurl = 'http://blogs.yandex.ru/pings/?status=success&url=' . urlencode( $this->the_home_url_from_cache( true ) . 'sitemap.xml' );
1047
  \wp_safe_remote_get( $pingurl, array( 'timeout' => 3 ) );
1048
  }
1049
 
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
67
  }
68
 
69
  /**
70
+ * Determines whether we can output sitemap or not based on options and blog status.
71
  *
72
  * @since 2.6.0
73
+ * @since 2.9.2 : Now returns true when using plain and ugly permalinks.
74
  * @staticvar bool $cache
75
  *
76
  * @return bool
83
  return $cache;
84
 
85
  /**
86
+ * Don't do anything on a deleted or spam blog on MultiSite.
87
+ * There's nothing to find anyway.
88
  */
89
+ return $cache = $this->is_option_checked( 'sitemaps_output' ) && false === $this->current_blog_is_spam_or_deleted();
90
  }
91
 
92
  /**
247
  protected function output_sitemap() {
248
 
249
  //* Remove output, if any.
250
+ $this->clean_response_header();
251
 
252
  if ( ! headers_sent() )
253
  header( 'Content-type: text/xml; charset=utf-8' );
382
  * Returns the stylesheet XSL location URL.
383
  *
384
  * @since 2.8.0
385
+ * @global object $wp_rewrite
386
  *
387
  * @return string URL location of the XSL stylesheet. Unescaped.
388
  */
389
  public function get_sitemap_xsl_url() {
390
  global $wp_rewrite;
391
 
392
+ $home = \trailingslashit( $this->set_url_scheme( $this->the_home_url_from_cache() ) );
393
+ /** Figure out if this is helpful...
394
+ if ( ! $this->is_subdirectory_installation() ) {
395
+ //= 1. $home = \trailingslashit( $this->set_url_scheme( $this->get_home_host() ) );
396
+
397
+ //= 2.:
398
+ $_path = $this->set_url_scheme( $home, 'relative' );
399
+ if ( false !== ( $_pos = strrpos( $home, $_path ) ) ) {
400
+ $home = \trailingslashit( substr_replace( $home, '', $_pos, strlen( $_path ) ) );
401
+ }
402
+ }
403
+ */
404
+
405
  if ( $wp_rewrite->using_index_permalinks() ) {
406
+ $loc = $home . 'index.php/sitemap.xsl';
407
  } elseif ( $wp_rewrite->using_permalinks() ) {
408
+ $loc = $home . 'sitemap.xsl';
409
+ } else {
410
+ $loc = $home . '?the_seo_framework_sitemap=xsl';
411
+ }
412
+
413
+ return $loc;
414
+ }
415
+
416
+ /**
417
+ * Returns the sitemap XML location URL.
418
+ *
419
+ * @since 2.9.2
420
+ * @global object $wp_rewrite
421
+ *
422
+ * @return string URL location of the XML sitemap. Unescaped.
423
+ */
424
+ public function get_sitemap_xml_url() {
425
+ global $wp_rewrite;
426
+
427
+ $home = \trailingslashit( $this->set_url_scheme( $this->the_home_url_from_cache() ) );
428
+ /** Figure out if this is helpful...
429
+ if ( ! $this->is_subdirectory_installation() ) {
430
+ //= 1. $home = \trailingslashit( $this->set_url_scheme( $this->get_home_host() ) );
431
+
432
+ //= 2.:
433
+ $_path = $this->set_url_scheme( $home, 'relative' );
434
+ if ( false !== ( $_pos = strrpos( $home, $_path ) ) ) {
435
+ $home = \trailingslashit( substr_replace( $home, '', $_pos, strlen( $_path ) ) );
436
+ }
437
+ }
438
+ */
439
+
440
+ if ( $wp_rewrite->using_index_permalinks() ) {
441
+ $loc = $home . 'index.php/sitemap.xml';
442
+ } elseif ( $wp_rewrite->using_permalinks() ) {
443
+ $loc = $home . 'sitemap.xml';
444
+ } else {
445
+ $loc = $home . '?the_seo_framework_sitemap=xml';
446
+ }
447
+
448
+ return $loc;
449
+ }
450
+
451
+ /**
452
+ * Returns the robots.txt location URL.
453
+ * Only allows root domains.
454
+ *
455
+ * @since 2.9.2
456
+ * @global object $wp_rewrite
457
+ *
458
+ * @return string URL location of robots.txt. Unescaped.
459
+ */
460
+ public function get_robots_txt_url() {
461
+ global $wp_rewrite;
462
+
463
+ if ( $wp_rewrite->using_permalinks() && ! $this->is_subdirectory_installation() ) {
464
+ $home = \trailingslashit( $this->set_url_scheme( $this->get_home_host() ) );
465
+ $loc = $home . 'robots.txt';
466
  } else {
467
+ $loc = '';
468
  }
469
 
470
+ return $loc;
471
  }
472
 
473
  /**
477
  */
478
  public function output_sitemap_xsl_stylesheet() {
479
 
480
+ $this->clean_response_header();
481
 
482
  if ( ! headers_sent() ) {
483
  header( 'Content-type: text/xsl; charset=utf-8' );
496
  * @param string|bool $content required The sitemap transient content.
497
  * @return string The sitemap content.
498
  */
499
+ public function setup_sitemap( $sitemap_content = false ) {
500
 
501
  if ( false === $sitemap_content ) {
502
  //* Transient doesn't exist yet.
1095
  * @since 2.2.9
1096
  */
1097
  public function ping_google() {
1098
+ $pingurl = 'http://www.google.com/webmasters/sitemaps/ping?sitemap=' . urlencode( $this->get_sitemap_xml_url() );
1099
  \wp_safe_remote_get( $pingurl, array( 'timeout' => 3 ) );
1100
  }
1101
 
1105
  * @since 2.2.9
1106
  */
1107
  public function ping_bing() {
1108
+ $pingurl = 'http://www.bing.com/webmaster/ping.aspx?siteMap=' . urlencode( $this->get_sitemap_xml_url() );
1109
  \wp_safe_remote_get( $pingurl, array( 'timeout' => 3 ) );
1110
  }
1111
 
1115
  * @since 2.6.0
1116
  */
1117
  public function ping_yandex() {
1118
+ $pingurl = 'http://blogs.yandex.ru/pings/?status=success&url=' . urlencode( $this->get_sitemap_xml_url() );
1119
  \wp_safe_remote_get( $pingurl, array( 'timeout' => 3 ) );
1120
  }
1121
 
inc/classes/term-data.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
inc/compat/php-mbstring.php CHANGED
@@ -16,7 +16,7 @@ defined( 'ABSPATH' ) or die;
16
  * @param string|null $encoding Optional. Character encoding to use. Default null.
17
  *
18
  * @license GLPv2 or later
19
- * @return int Position of first occurence found of $haystack of `$needle`.
20
  */
21
  if ( ! function_exists( 'mb_strpos' ) ) :
22
  function mb_strpos( $haystack, $needle, $offset = 0, $encoding = null ) {
@@ -40,7 +40,7 @@ endif;
40
  * @param string|null $encoding Optional. Character encoding to use. Default null.
41
  *
42
  * @license GLPv2 or later
43
- * @return int Position of first occurence found of $haystack of `$needle`.
44
  */
45
  if ( ! function_exists( '_mb_strpos' ) ) :
46
  function _mb_strpos( $haystack, $needle, $offset = 0, $encoding = null ) {
@@ -92,7 +92,7 @@ if ( ! function_exists( '_mb_strpos' ) ) :
92
  //* Prevent bugs, (re)assign var.
93
  $pos = null;
94
 
95
- // Find first occurence greater than or equal to offset
96
  foreach ( $inter as $key => $value ) {
97
  if ( $key >= $offset ) {
98
  $pos = $key;
@@ -174,7 +174,7 @@ if ( ! function_exists( '_mb_strpos' ) ) :
174
  //* Prevent bugs, (re)assign var.
175
  $pos = null;
176
 
177
- // Find first occurence greater than or equal to offset
178
  foreach ( $inter as $key => $value ) {
179
  if ( $key >= $offset ) {
180
  $pos = $key;
16
  * @param string|null $encoding Optional. Character encoding to use. Default null.
17
  *
18
  * @license GLPv2 or later
19
+ * @return int Position of first occurrence found of $haystack of `$needle`.
20
  */
21
  if ( ! function_exists( 'mb_strpos' ) ) :
22
  function mb_strpos( $haystack, $needle, $offset = 0, $encoding = null ) {
40
  * @param string|null $encoding Optional. Character encoding to use. Default null.
41
  *
42
  * @license GLPv2 or later
43
+ * @return int Position of first occurrence found of $haystack of `$needle`.
44
  */
45
  if ( ! function_exists( '_mb_strpos' ) ) :
46
  function _mb_strpos( $haystack, $needle, $offset = 0, $encoding = null ) {
92
  //* Prevent bugs, (re)assign var.
93
  $pos = null;
94
 
95
+ // Find first occurrence greater than or equal to offset
96
  foreach ( $inter as $key => $value ) {
97
  if ( $key >= $offset ) {
98
  $pos = $key;
174
  //* Prevent bugs, (re)assign var.
175
  $pos = null;
176
 
177
+ // Find first occurrence greater than or equal to offset
178
  foreach ( $inter as $key => $value ) {
179
  if ( $key >= $offset ) {
180
  $pos = $key;
inc/compat/plugin-polylang.php ADDED
@@ -0,0 +1,187 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @package The_SEO_Framework\Compat\Plugin\WPML
4
+ */
5
+ namespace The_SEO_Framework;
6
+
7
+ defined( 'ABSPATH' ) and $_this = \the_seo_framework_class() and $this instanceof $_this or die;
8
+
9
+ \add_filter( 'the_seo_framework_url_output_args', __NAMESPACE__ . '\\_polylang_filter_url_args', 10, 4 );
10
+ /**
11
+ * Filters the canonical generation URL and Scheme arguments.
12
+ *
13
+ * @since 2.9.2
14
+ * @access private
15
+ * @global object $polylang
16
+ *
17
+ * @param array $args the URL arguments to supply. : {
18
+ * 'url' => The full URL built from $path,
19
+ * 'scheme' => The preferred scheme
20
+ * }
21
+ * @param string $path the URL path.
22
+ * @param int $id The current post, page or term ID.
23
+ * @param bool $external Whether the call is made from outside the current ID scope. Like from the Sitemap.
24
+ * @return array { 'url' => The full URL built from $path, 'scheme' => The preferred scheme }
25
+ */
26
+ function _polylang_filter_url_args( $args = array(), $path = '', $id = 0, $external = false ) {
27
+ global $polylang;
28
+
29
+ if ( ! is_object( $polylang ) || ! ( isset( $polylang->filters_links ) && is_object( $polylang->filters_links ) ) )
30
+ return $args;
31
+
32
+ static $state = null;
33
+
34
+ if ( null === $state ) {
35
+ ( \the_seo_framework()->is_sitemap() || \the_seo_framework()->is_robots() ) and $state = 1
36
+ or \the_seo_framework()->is_admin() and $state = 2
37
+ or $state = 3;
38
+ }
39
+
40
+ if ( 1 === $state || $external )
41
+ return \The_SEO_Framework\_polylang_external_filter_url_args( $args, $path, $id, $external );
42
+
43
+ if ( 2 === $state )
44
+ return \The_SEO_Framework\_polylang_admin_filter_url_args( $args, $path, $id, $external );
45
+
46
+ return \The_SEO_Framework\_polylang_frontend_filter_url_args( $args, $path, $id, $external );
47
+ }
48
+
49
+ /**
50
+ * Filters the canonical generation URL and Scheme arguments for external parsing.
51
+ *
52
+ * @since 2.9.2
53
+ * @access private
54
+ * @staticvar string $home_url
55
+ * @global object $polylang
56
+ *
57
+ * @param array $args the URL arguments to supply. : {
58
+ * 'url' => The full URL built from $path,
59
+ * 'scheme' => The preferred scheme
60
+ * }
61
+ * @param string $path the URL path.
62
+ * @param int $id The current post, page or term ID.
63
+ * @param bool $external Whether the call is made from outside the current ID scope. Like from the Sitemap.
64
+ * @return array { 'url' => The full URL built from $path, 'scheme' => The preferred scheme }
65
+ */
66
+ function _polylang_external_filter_url_args( $args = array(), $path = '', $id = 0, $external = false ) {
67
+ global $polylang;
68
+
69
+ static $home_url = null;
70
+ //* We don't want to fire internal filters that lead to this function.
71
+ if ( null === $home_url )
72
+ $home_url = \untrailingslashit( \esc_url_raw( \the_seo_framework()->set_preferred_url_scheme( \the_seo_framework()->get_home_host() ) ) );
73
+
74
+ $_post = \get_post( $id );
75
+ $_link = $home_url . $path;
76
+
77
+ if ( null === $_post ) {
78
+ if ( method_exists( $polylang->filters_links, 'post_type_link' ) )
79
+ $args['url'] = $polylang->links->get_home_url( '' );
80
+ } elseif ( method_exists( $polylang->filters_links, 'post_type_link' ) ) {
81
+ $args['url'] = $polylang->filters_links->post_type_link( $_link, $_post );
82
+ }
83
+
84
+ if ( isset( $args['url'] ) ) {
85
+ $parsed_url = \wp_parse_url( $args['url'] );
86
+ $args['scheme'] = isset( $parsed_url['scheme'] ) ? $parsed_url['scheme'] : '';
87
+ }
88
+
89
+ return $args;
90
+ }
91
+
92
+ /**
93
+ * Filters the canonical generation URL and Scheme arguments for the admin side.
94
+ *
95
+ * @since 2.9.2
96
+ * @access private
97
+ * @global object $polylang
98
+ *
99
+ * @param array $args the URL arguments to supply. : {
100
+ * 'url' => The full URL built from $path,
101
+ * 'scheme' => The preferred scheme
102
+ * }
103
+ * @param string $path the URL path.
104
+ * @param int $id The current post, page or term ID.
105
+ * @param bool $external Whether the call is made from outside the current ID scope. Like from the Sitemap.
106
+ * @return array { 'url' => The full URL built from $path, 'scheme' => The preferred scheme }
107
+ */
108
+ function _polylang_admin_filter_url_args( $args = array(), $path = '', $id = 0, $external = false ) {
109
+ global $polylang;
110
+
111
+ //* We don't want to fire internal filters that lead to this function.
112
+ $home_url = \untrailingslashit( \esc_url_raw( \the_seo_framework()->set_preferred_url_scheme( \the_seo_framework()->get_home_host() ) ) );
113
+
114
+ if ( \the_seo_framework()->is_real_front_page() || \the_seo_framework()->is_front_page_by_id( $id ) || \the_seo_framework()->is_404() ) {
115
+ if ( isset( $polylang->links ) && method_exists( $polylang->links, 'get_home_url' ) ) {
116
+ if ( isset( $polylang->curlang ) && is_object( $polylang->curlang ) )
117
+ $args['url'] = $polylang->links->get_home_url( $polylang->curlang, false );
118
+ } else {
119
+ $args['url'] = $home_url;
120
+ }
121
+ } elseif ( $path ) {
122
+ $_post = \get_post( $id );
123
+ $_link = $home_url . $path;
124
+
125
+ if ( method_exists( $polylang->filters_links, 'post_type_link' ) ) {
126
+ $args['url'] = $polylang->filters_links->post_type_link( $_link, $_post );
127
+ }
128
+ }
129
+
130
+ if ( isset( $args['url'] ) ) {
131
+ $parsed_url = \wp_parse_url( $args['url'] );
132
+ $args['scheme'] = isset( $parsed_url['scheme'] ) ? $parsed_url['scheme'] : '';
133
+ }
134
+
135
+ return $args;
136
+ }
137
+
138
+ /**
139
+ * Filters the canonical generation URL and Scheme arguments for the frontend.
140
+ *
141
+ * @since 2.9.2
142
+ * @access private
143
+ * @global object $polylang
144
+ *
145
+ * @param array $args the URL arguments to supply. : {
146
+ * 'url' => The full URL built from $path,
147
+ * 'scheme' => The preferred scheme
148
+ * }
149
+ * @param string $path the URL path.
150
+ * @param int $id The current post, page or term ID.
151
+ * @param bool $external Whether the call is made from outside the current ID scope. Like from the Sitemap.
152
+ * @return array { 'url' => The full URL built from $path, 'scheme' => The preferred scheme }
153
+ */
154
+ function _polylang_frontend_filter_url_args( $args = array(), $path = '', $id = 0, $external = false ) {
155
+ global $polylang;
156
+
157
+ //* We don't want to fire internal filters that lead to this function.
158
+ $home_url = \untrailingslashit( \esc_url_raw( \the_seo_framework()->set_preferred_url_scheme( \the_seo_framework()->get_home_host() ) ) );
159
+
160
+ if ( \the_seo_framework()->is_real_front_page() || \the_seo_framework()->is_404() || \the_seo_framework()->is_search() ) {
161
+ if ( isset( $polylang->links ) && method_exists( $polylang->links, 'get_home_url' ) ) {
162
+ $_curlang = isset( $polylang->curlang ) ? $polylang->curlang : '';
163
+ $args['url'] = $polylang->links->get_home_url( $_curlang );
164
+ } else {
165
+ $args['url'] = $home_url;
166
+ }
167
+ } elseif ( $path ) {
168
+ $_requested_url = $home_url . $path;
169
+
170
+ // Only pass if it's not empty, otherwise we'll have XSS issues.
171
+ if ( $_requested_url ) {
172
+ if ( \is_post_type_archive() && isset( $polylang->links_model ) && method_exists( $polylang->links_model, 'switch_language_in_link' ) ) {
173
+ $_curlang = isset( $polylang->curlang ) ? $polylang->curlang : '';
174
+ $args['url'] = $polylang->links_model->switch_language_in_link( $_requested_url, $_curlang );
175
+ } elseif ( method_exists( $polylang->filters_links, 'check_canonical_url' ) ) {
176
+ $args['url'] = $polylang->filters_links->check_canonical_url( $_requested_url, false );
177
+ }
178
+ }
179
+ }
180
+
181
+ if ( isset( $args['url'] ) ) {
182
+ $parsed_url = \wp_parse_url( $args['url'] );
183
+ $args['scheme'] = isset( $parsed_url['scheme'] ) ? $parsed_url['scheme'] : '';
184
+ }
185
+
186
+ return $args;
187
+ }
inc/compat/plugin-wpforo.php ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @package The_SEO_Framework\Compat\Plugin\wpForo
4
+ */
5
+ namespace The_SEO_Framework;
6
+
7
+ defined( 'ABSPATH' ) and $_this = \the_seo_framework_class() and $this instanceof $_this or die;
8
+
9
+ add_action( 'init', __NAMESPACE__ . '\\_wpforo_fix_page' );
10
+ /**
11
+ * Initializes wpForo page fixes.
12
+ *
13
+ * @since 2.9.2
14
+ */
15
+ function _wpforo_fix_page() {
16
+
17
+ if ( function_exists( '\\is_wpforo_page' ) && \is_wpforo_page() ) {
18
+ \add_filter( 'the_seo_framework_pre_add_title', __NAMESPACE__ . '\\_wpforo_filter_pre_title', 10, 3 );
19
+ \add_filter( 'the_seo_framework_url_path', __NAMESPACE__ . '\\_wpforo_filter_url_path', 10, 3 );
20
+ \add_filter( 'the_seo_framework_description_args', __NAMESPACE__ . '\\_wpforo_filter_description_arguments', 10, 3 );
21
+
22
+ //* Remove wpforo SEO meta output.
23
+ \remove_action( 'wp_head', 'wpforo_add_meta_tags', 1 );
24
+ }
25
+ }
26
+
27
+ /**
28
+ * Fixes wpForo page Titles.
29
+ *
30
+ * @since 2.9.2
31
+ * @access private
32
+ *
33
+ * @param string $title The filter title.
34
+ * @param array $args The title arguments.
35
+ * @param bool $escape Whether the output will be sanitized.
36
+ * @return string $title The wpForo title.
37
+ */
38
+ function _wpforo_filter_pre_title( $title, $args, $escape ) {
39
+ $wpforo_title = \wpforo_meta_title( '' );
40
+ return $wpforo_title[0] ?: $title;
41
+ }
42
+
43
+ /**
44
+ * Fixes wpForo page URL paths.
45
+ *
46
+ * @since 2.9.2
47
+ * @access private
48
+ *
49
+ * @param string $path The current path.
50
+ * @param int $id The page/post ID.
51
+ * @param bool $external Whether the request is external (i.e. sitemap)
52
+ * @return string The URL path.
53
+ */
54
+ function _wpforo_filter_url_path( $path, $id, $external ) {
55
+
56
+ if ( $external )
57
+ return $path;
58
+
59
+ if ( '' === \the_seo_framework()->permalink_structure() )
60
+ return $path;
61
+
62
+ return \the_seo_framework()->set_url_scheme( \wpforo_get_request_uri(), 'relative' );
63
+ }
64
+
65
+ /**
66
+ * Fixes wpForo page descriptions.
67
+ *
68
+ * @since 2.9.2
69
+ * @access private
70
+ *
71
+ * @param array $defaults The default arguments.
72
+ * @param array $args The method caller arguments.
73
+ * @return array The description default arguments.
74
+ */
75
+ function _wpforo_filter_description_arguments( $defaults, $args ) {
76
+
77
+ //* Disable internal requests only. Magic variable (i.e. do overthink it, as it will loop).
78
+ if ( empty( $args['social'] ) && empty( $args['get_custom_field'] ) )
79
+ $defaults['get_custom_field'] = false;
80
+
81
+ return $defaults;
82
+ }
inc/compat/plugin-wpml.php CHANGED
@@ -7,7 +7,7 @@ namespace The_SEO_Framework;
7
  defined( 'ABSPATH' ) and $_this = \the_seo_framework_class() and $this instanceof $_this or die;
8
 
9
  /**
10
- * Warns homepage global title and description about recieving input.
11
  *
12
  * @since 1.0.0
13
  */
@@ -19,6 +19,7 @@ defined( 'ABSPATH' ) and $_this = \the_seo_framework_class() and $this instanceo
19
  * Filters the canonical URL path.
20
  *
21
  * @since 2.8.0
 
22
  * @access private
23
  *
24
  * @param string $path the URL path.
@@ -27,35 +28,48 @@ defined( 'ABSPATH' ) and $_this = \the_seo_framework_class() and $this instanceo
27
  * @return string The URL path.
28
  */
29
  function _wpml_filter_url_path( $path = '', $id = 0, $external = false ) {
30
- return \The_SEO_Framework\_wmpl_get_relative_url( $path, $id );
31
  }
32
 
33
  /**
34
  * Generate relative WPML url.
35
  *
36
  * @since 2.4.3
 
 
 
 
 
 
37
  * @staticvar bool $gli_exists
38
  * @staticvar string $default_lang
 
 
39
  * @global object $sitepress
40
  * @NOTE: Handles full path, including home directory.
41
  * @access private
42
  *
43
  * @param string $path The current path.
44
  * @param int $post_id The Post ID.
 
45
  * @return relative path for WPML urls.
46
  */
47
- function _wmpl_get_relative_url( $path = '', $post_id = '' ) {
48
  global $sitepress;
49
 
 
 
 
 
 
 
 
50
  //* Reset cache.
51
  \the_seo_framework()->url_slashit = true;
52
  \the_seo_framework()->unset_current_subdomain();
53
 
54
- if ( ! isset( $sitepress ) )
55
- return $path;
56
-
57
  static $gli_exists = null;
58
- if ( is_null( $gli_exists ) )
59
  $gli_exists = function_exists( 'wpml_get_language_information' );
60
 
61
  if ( false === $gli_exists )
@@ -66,44 +80,56 @@ function _wmpl_get_relative_url( $path = '', $post_id = '' ) {
66
 
67
  //* Cache default language.
68
  static $default_lang = null;
69
- if ( is_null( $default_lang ) )
70
- $default_lang = $sitepress->get_default_language();
71
-
72
- /**
73
- * Applies filters wpml_post_language_details : array|wp_error
74
- *
75
- * ... Somehow WPML thought this would be great and understandable.
76
- * This should be put inside a callable function.
77
- * @since 2.6.0
78
- */
79
- $lang_info = \apply_filters( 'wpml_post_language_details', null, $post_id );
80
-
81
- if ( \is_wp_error( $lang_info ) ) {
82
- //* Terms and Taxonomies.
83
- $lang_info = array();
84
-
85
- //* Cache the code.
86
- static $lang_code = null;
87
- if ( is_null( $lang_code ) && defined( 'ICL_LANGUAGE_CODE' ) )
88
- $lang_code = ICL_LANGUAGE_CODE;
89
-
90
- $lang_info['language_code'] = $lang_code;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
  }
92
 
93
- //* If filter isn't used, bail.
94
- if ( false === isset( $lang_info['language_code'] ) )
95
- return $path;
96
-
97
- $current_lang = $lang_info['language_code'];
98
-
99
  //* No need to alter URL if we're on default lang.
100
  if ( $current_lang === $default_lang )
101
  return $path;
102
 
103
  //* Cache negotiation type.
104
  static $negotiation_type = null;
105
- if ( is_null( $negotiation_type ) )
106
- $negotiation_type = $sitepress->get_setting( 'language_negotiation_type' );
107
 
108
  switch ( $negotiation_type ) :
109
  case '1' :
7
  defined( 'ABSPATH' ) and $_this = \the_seo_framework_class() and $this instanceof $_this or die;
8
 
9
  /**
10
+ * Warns homepage global title and description about receiving input.
11
  *
12
  * @since 1.0.0
13
  */
19
  * Filters the canonical URL path.
20
  *
21
  * @since 2.8.0
22
+ * @since 2.9.2 : Now passes $external paramerer
23
  * @access private
24
  *
25
  * @param string $path the URL path.
28
  * @return string The URL path.
29
  */
30
  function _wpml_filter_url_path( $path = '', $id = 0, $external = false ) {
31
+ return \The_SEO_Framework\_wmpl_get_relative_url( $path, $id, $external );
32
  }
33
 
34
  /**
35
  * Generate relative WPML url.
36
  *
37
  * @since 2.4.3
38
+ * @since 2.9.2 : 1. Added $is_external staticvar.
39
+ * : 2. Added $current_language staticvar.
40
+ * : 3. Cached $current_language through WPML determination, improving performance.
41
+ * : 4. Can now receive $external parameter.
42
+ *
43
+ * @staticvar bool $is_external
44
  * @staticvar bool $gli_exists
45
  * @staticvar string $default_lang
46
+ * @staticvar string $current_language
47
+ * @staticvar string $lang_code
48
  * @global object $sitepress
49
  * @NOTE: Handles full path, including home directory.
50
  * @access private
51
  *
52
  * @param string $path The current path.
53
  * @param int $post_id The Post ID.
54
+ * @param bool $external Whether the call is made from outside the current ID scope.
55
  * @return relative path for WPML urls.
56
  */
57
+ function _wmpl_get_relative_url( $path = '', $post_id = '', $external = false ) {
58
  global $sitepress;
59
 
60
+ if ( ! is_object( $sitepress ) )
61
+ return $path;
62
+
63
+ static $is_external = null;
64
+ if ( null === $is_external )
65
+ $is_external = \the_seo_framework()->is_sitemap() || \the_seo_framework()->is_robots();
66
+
67
  //* Reset cache.
68
  \the_seo_framework()->url_slashit = true;
69
  \the_seo_framework()->unset_current_subdomain();
70
 
 
 
 
71
  static $gli_exists = null;
72
+ if ( null === $gli_exists )
73
  $gli_exists = function_exists( 'wpml_get_language_information' );
74
 
75
  if ( false === $gli_exists )
80
 
81
  //* Cache default language.
82
  static $default_lang = null;
83
+ if ( null === $default_lang )
84
+ $default_lang = is_callable( array( $sitepress, 'get_default_language' ) ) ? $sitepress->get_default_language() : '';
85
+
86
+ //* Cache current language.
87
+ static $current_language = null;
88
+ if ( null === $current_language )
89
+ $current_language = ! ( $is_external || $external ) && is_callable( array( $sitepress, 'get_current_language' ) ) ? $sitepress->get_current_language() : '';
90
+
91
+ if ( empty( $current_language ) ) {
92
+ /**
93
+ * Applies filters 'wpml_post_language_details' : array|wp_error
94
+ *
95
+ * Only works for singular items.
96
+ *
97
+ * ... Somehow WPML thought this would be great and understandable.
98
+ * This should be put inside a callable function.
99
+ *
100
+ * @since 2.6.0
101
+ */
102
+ $lang_info = \apply_filters( 'wpml_post_language_details', null, $post_id );
103
+
104
+ if ( \is_wp_error( $lang_info ) ) {
105
+ //* Terms and Taxonomies.
106
+ $lang_info = array();
107
+
108
+ //* Cache the code.
109
+ static $lang_code = null;
110
+ if ( null === $lang_code )
111
+ $lang_code = defined( 'ICL_LANGUAGE_CODE' ) ? ICL_LANGUAGE_CODE : false;
112
+
113
+ $lang_info['language_code'] = $lang_code;
114
+ }
115
+
116
+ //* If filter isn't used, bail.
117
+ if ( empty( $lang_info['language_code'] ) )
118
+ return $path;
119
+
120
+ $current_lang = $lang_info['language_code'];
121
+ } else {
122
+ $current_lang = $current_language;
123
  }
124
 
 
 
 
 
 
 
125
  //* No need to alter URL if we're on default lang.
126
  if ( $current_lang === $default_lang )
127
  return $path;
128
 
129
  //* Cache negotiation type.
130
  static $negotiation_type = null;
131
+ if ( null === $negotiation_type )
132
+ $negotiation_type = is_callable( array( $sitepress, 'get_current_language' ) ) ? $sitepress->get_setting( 'language_negotiation_type' ) : '';
133
 
134
  switch ( $negotiation_type ) :
135
  case '1' :
inc/functions/deprecated.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /**
3
  * The SEO Framework plugin
4
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License version 3 as published
@@ -24,71 +24,5 @@ defined( 'ABSPATH' ) or die;
24
  * @since 2.1.6
25
  * @since 2.3.5 Emptied. (~2.5 months later)
26
  * @since 2.6.2 Emptied. (~6 months later)
 
27
  */
28
-
29
- /**
30
- * Fetch an option from The SEO Framework.
31
- *
32
- * @since 2.2.9
33
- *
34
- * @deprecated
35
- * @since 2.7.0
36
- *
37
- * @param string $key Option name.
38
- * @param boolean $use_cache Optional. Whether to use the cache value or not. Defaults to true.
39
- * @return mixed The option value.
40
- */
41
- function tsf_get_option( $key, $use_cache = true ) {
42
-
43
- $theseoframework = the_seo_framework();
44
-
45
- if ( isset( $theseoframework ) )
46
- $theseoframework->_deprecated_function( __FUNCTION__, '2.7.0', 'the_seo_framework_get_option()' );
47
-
48
- return the_seo_framework_get_option( $key, $use_cache );
49
- }
50
-
51
- /**
52
- * Fetch the The SEO Framework Options pagehook.
53
- *
54
- * @since 2.2.9
55
- *
56
- * @deprecated
57
- * @since 2.7.0
58
- *
59
- * @return string|null The pagehook.
60
- */
61
- function tsf_options_pagehook() {
62
-
63
- $theseoframework = the_seo_framework();
64
-
65
- if ( isset( $theseoframework ) )
66
- $theseoframework->_deprecated_function( __FUNCTION__, '2.7.0', 'the_seo_framework_options_pagehook()' );
67
-
68
- return the_seo_framework_options_pagehook();
69
- }
70
-
71
-
72
- /**
73
- * Compare the WordPress version to the input one.
74
- *
75
- * @since 2.2.9
76
- *
77
- * @deprecated
78
- * @since 2.7.0
79
- *
80
- * @param string $version The 3 point version compare
81
- * @param string $compare The PHP comparison operator.
82
- * @return bool true if Version passes comparison.
83
- */
84
- function tsf_wp_version( $version = '4.3.0', $compare = '>=' ) {
85
-
86
- $theseoframework = the_seo_framework();
87
-
88
- if ( isset( $theseoframework ) ) {
89
- $theseoframework->_deprecated_function( __FUNCTION__, '2.7.0', 'the_seo_framework()->wp_version()' );
90
- return $theseoframework->wp_version( $version, $compare );
91
- }
92
-
93
- return null;
94
- }
1
  <?php
2
  /**
3
  * The SEO Framework plugin
4
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License version 3 as published
24
  * @since 2.1.6
25
  * @since 2.3.5 Emptied. (~2.5 months later)
26
  * @since 2.6.2 Emptied. (~6 months later)
27
+ * @since 2.9.2 Emptied. (~8 months later)
28
  */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
inc/functions/optionsapi.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /**
3
  * The SEO Framework plugin
4
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License version 3 as published
1
  <?php
2
  /**
3
  * The SEO Framework plugin
4
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License version 3 as published
inc/functions/plugin-test-server.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /**
3
  * The SEO Framework plugin
4
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License version 3 as published
1
  <?php
2
  /**
3
  * The SEO Framework plugin
4
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License version 3 as published
inc/functions/upgrade.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /**
3
  * The SEO Framework plugin
4
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License version 3 as published
1
  <?php
2
  /**
3
  * The SEO Framework plugin
4
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License version 3 as published
inc/interfaces/debug.interface.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
inc/views/metaboxes/general-metabox.php CHANGED
@@ -14,16 +14,16 @@ switch ( $instance ) :
14
  // 'callback' => array( $this, 'general_metabox_general_tab' ),
15
  // 'dashicon' => 'admin-generic',
16
  // ),
17
- 'performance' => array(
18
- 'name' => __( 'Performance', 'autodescription' ),
19
- 'callback' => array( $this, 'general_metabox_performance_tab' ),
20
- 'dashicon' => 'performance',
21
- ),
22
  'layout' => array(
23
  'name' => __( 'Layout', 'autodescription' ),
24
  'callback' => array( $this, 'general_metabox_layout_tab' ),
25
  'dashicon' => 'screenoptions',
26
  ),
 
 
 
 
 
27
  'canonical' => array(
28
  'name' => __( 'Canonical', 'autodescription' ),
29
  'callback' => array( $this, 'general_metabox_canonical_tab' ),
@@ -47,6 +47,34 @@ switch ( $instance ) :
47
  echo 'Nothing to see here yet.';
48
  break;
49
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  case 'the_seo_framework_general_metabox_performance' :
51
 
52
  ?><h4><?php esc_html_e( 'Performance Settings', 'autodescription' ); ?></h4><?php
@@ -105,40 +133,12 @@ switch ( $instance ) :
105
  endif;
106
  break;
107
 
108
- case 'the_seo_framework_general_metabox_layout' :
109
- ?><h4><?php esc_html_e( 'Administrative Layout Settings', 'autodescription' ); ?></h4><?php
110
- $this->description( __( 'SEO hints can be visually displayed throughout the dashboard.', 'autodescription' ) );
111
-
112
- ?>
113
- <hr>
114
-
115
- <h4><?php esc_html_e( 'SEO Bar Settings', 'autodescription' ); ?></h4>
116
- <?php
117
- $this->wrap_fields(
118
- array(
119
- $this->make_checkbox(
120
- 'display_seo_bar_tables',
121
- esc_html__( 'Display the SEO Bar in overview tables?', 'autodescription' ),
122
- '',
123
- false
124
- ),
125
- $this->make_checkbox(
126
- 'display_seo_bar_metabox',
127
- esc_html__( 'Display the SEO Bar in the SEO Settings metabox?', 'autodescription' ),
128
- '',
129
- false
130
- ),
131
- ),
132
- true
133
- );
134
- break;
135
-
136
  case 'the_seo_framework_general_metabox_canonical' :
137
 
138
  ?><h4><?php esc_html_e( 'Canonical URL Settings', 'autodescription' ); ?></h4><?php
139
  $this->description( __( 'The canonical URL meta tag urges Search Engines to go to the outputted URL.', 'autodescription' ) );
140
  $this->description( __( 'If the canonical URL meta tag represents the visited page, then the Search Engine will crawl the visited page. Otherwise, the Search Engine might go to the outputted URL.', 'autodescription' ) );
141
- $this->description( __( 'Only adjust these options if you are aware of its SEO effects.', 'autodescription' ) );
142
  ?>
143
  <hr>
144
 
14
  // 'callback' => array( $this, 'general_metabox_general_tab' ),
15
  // 'dashicon' => 'admin-generic',
16
  // ),
 
 
 
 
 
17
  'layout' => array(
18
  'name' => __( 'Layout', 'autodescription' ),
19
  'callback' => array( $this, 'general_metabox_layout_tab' ),
20
  'dashicon' => 'screenoptions',
21
  ),
22
+ 'performance' => array(
23
+ 'name' => __( 'Performance', 'autodescription' ),
24
+ 'callback' => array( $this, 'general_metabox_performance_tab' ),
25
+ 'dashicon' => 'performance',
26
+ ),
27
  'canonical' => array(
28
  'name' => __( 'Canonical', 'autodescription' ),
29
  'callback' => array( $this, 'general_metabox_canonical_tab' ),
47
  echo 'Nothing to see here yet.';
48
  break;
49
 
50
+ case 'the_seo_framework_general_metabox_layout' :
51
+ ?><h4><?php esc_html_e( 'Administrative Layout Settings', 'autodescription' ); ?></h4><?php
52
+ $this->description( __( 'SEO hints can be visually displayed throughout the dashboard.', 'autodescription' ) );
53
+
54
+ ?>
55
+ <hr>
56
+
57
+ <h4><?php esc_html_e( 'SEO Bar Settings', 'autodescription' ); ?></h4>
58
+ <?php
59
+ $this->wrap_fields(
60
+ array(
61
+ $this->make_checkbox(
62
+ 'display_seo_bar_tables',
63
+ esc_html__( 'Display the SEO Bar in overview tables?', 'autodescription' ),
64
+ '',
65
+ false
66
+ ),
67
+ $this->make_checkbox(
68
+ 'display_seo_bar_metabox',
69
+ esc_html__( 'Display the SEO Bar in the SEO Settings metabox?', 'autodescription' ),
70
+ '',
71
+ false
72
+ ),
73
+ ),
74
+ true
75
+ );
76
+ break;
77
+
78
  case 'the_seo_framework_general_metabox_performance' :
79
 
80
  ?><h4><?php esc_html_e( 'Performance Settings', 'autodescription' ); ?></h4><?php
133
  endif;
134
  break;
135
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
  case 'the_seo_framework_general_metabox_canonical' :
137
 
138
  ?><h4><?php esc_html_e( 'Canonical URL Settings', 'autodescription' ); ?></h4><?php
139
  $this->description( __( 'The canonical URL meta tag urges Search Engines to go to the outputted URL.', 'autodescription' ) );
140
  $this->description( __( 'If the canonical URL meta tag represents the visited page, then the Search Engine will crawl the visited page. Otherwise, the Search Engine might go to the outputted URL.', 'autodescription' ) );
141
+ $this->description( __( 'Only adjust these options if you are aware of their SEO effects.', 'autodescription' ) );
142
  ?>
143
  <hr>
144
 
inc/views/metaboxes/schema-metabox.php CHANGED
@@ -186,7 +186,8 @@ switch ( $instance ) :
186
  ?>
187
  <hr>
188
 
189
- <h4><?php esc_html_e( 'Social Pages connected to this website', 'autodescription' ); ?></h4><?php
 
190
  $this->description( __( "Don't have a page at a site or is the profile only privately accessible? Leave that field empty. Unsure? Fill it in anyway.", 'autodescription' ) );
191
  $this->description( __( 'Add the link that leads directly to the social page of this website.', 'autodescription' ) );
192
 
@@ -201,14 +202,14 @@ switch ( $instance ) :
201
  'option' => 'knowledge_facebook',
202
  'dashicon' => 'dashicons-facebook',
203
  'desc' => 'Facebook ' . __( 'Page', 'autodescription' ),
204
- 'placeholder' => 'http://www.facebook.com/' . $connectedi18n,
205
- 'examplelink' => esc_url( 'https://facebook.com/me' ),
206
  ),
207
  'twitter' => array(
208
  'option' => 'knowledge_twitter',
209
  'dashicon' => 'dashicons-twitter',
210
  'desc' => 'Twitter ' . $profile18n,
211
- 'placeholder' => 'http://www.twitter.com/' . $connectedi18n,
212
  'examplelink' => esc_url( 'https://twitter.com/home' ), // No example link available.
213
  ),
214
  'gplus' => array(
@@ -222,22 +223,22 @@ switch ( $instance ) :
222
  'option' => 'knowledge_instagram',
223
  'dashicon' => 'genericon-instagram',
224
  'desc' => 'Instagram ' . $profile18n,
225
- 'placeholder' => 'http://instagram.com/' . $connectedi18n,
226
  'examplelink' => esc_url( 'https://instagram.com/' ), // No example link available.
227
  ),
228
  'youtube' => array(
229
  'option' => 'knowledge_youtube',
230
  'dashicon' => 'genericon-youtube',
231
  'desc' => 'Youtube ' . $profile18n,
232
- 'placeholder' => 'http://www.youtube.com/' . $connectedi18n,
233
  'examplelink' => esc_url( 'https://www.youtube.com/user/%2f' ), // Yes a double slash.
234
  ),
235
  'linkedin' => array(
236
  'option' => 'knowledge_linkedin',
237
  'dashicon' => 'genericon-linkedin-alt',
238
  'desc' => 'LinkedIn ' . $profile18n . ' ID',
239
- 'placeholder' => 'http://www.linkedin.com/profile/view?id=' . $connectedi18n,
240
- 'examplelink' => esc_url( 'https://www.linkedin.com/profile/view' ), // This generates a query arg. We should allow that.
241
  ),
242
  'pinterest' => array(
243
  'option' => 'knowledge_pinterest',
@@ -257,7 +258,7 @@ switch ( $instance ) :
257
  'option' => 'knowledge_tumblr',
258
  'dashicon' => 'genericon-tumblr',
259
  'desc' => 'Tumblr ' . __( 'Blog', 'autodescription' ),
260
- 'placeholder' => 'https://tumblr.com/blog/' . $connectedi18n,
261
  'examplelink' => esc_url( 'https://www.tumblr.com/dashboard' ), // No example link available.
262
  ),
263
  );
186
  ?>
187
  <hr>
188
 
189
+ <h4><?php esc_html_e( 'Social Pages connected to this website', 'autodescription' ); ?></h4>
190
+ <?php
191
  $this->description( __( "Don't have a page at a site or is the profile only privately accessible? Leave that field empty. Unsure? Fill it in anyway.", 'autodescription' ) );
192
  $this->description( __( 'Add the link that leads directly to the social page of this website.', 'autodescription' ) );
193
 
202
  'option' => 'knowledge_facebook',
203
  'dashicon' => 'dashicons-facebook',
204
  'desc' => 'Facebook ' . __( 'Page', 'autodescription' ),
205
+ 'placeholder' => 'https://www.facebook.com/' . $connectedi18n,
206
+ 'examplelink' => esc_url( 'https://www.facebook.com/me' ),
207
  ),
208
  'twitter' => array(
209
  'option' => 'knowledge_twitter',
210
  'dashicon' => 'dashicons-twitter',
211
  'desc' => 'Twitter ' . $profile18n,
212
+ 'placeholder' => 'https://twitter.com/' . $connectedi18n,
213
  'examplelink' => esc_url( 'https://twitter.com/home' ), // No example link available.
214
  ),
215
  'gplus' => array(
223
  'option' => 'knowledge_instagram',
224
  'dashicon' => 'genericon-instagram',
225
  'desc' => 'Instagram ' . $profile18n,
226
+ 'placeholder' => 'https://instagram.com/' . $connectedi18n,
227
  'examplelink' => esc_url( 'https://instagram.com/' ), // No example link available.
228
  ),
229
  'youtube' => array(
230
  'option' => 'knowledge_youtube',
231
  'dashicon' => 'genericon-youtube',
232
  'desc' => 'Youtube ' . $profile18n,
233
+ 'placeholder' => 'https://www.youtube.com/channel/' . $connectedi18n,
234
  'examplelink' => esc_url( 'https://www.youtube.com/user/%2f' ), // Yes a double slash.
235
  ),
236
  'linkedin' => array(
237
  'option' => 'knowledge_linkedin',
238
  'dashicon' => 'genericon-linkedin-alt',
239
  'desc' => 'LinkedIn ' . $profile18n . ' ID',
240
+ 'placeholder' => 'https://www.linkedin.com/in/' . $connectedi18n,
241
+ 'examplelink' => esc_url( 'https://www.linkedin.com/profile/view' ),
242
  ),
243
  'pinterest' => array(
244
  'option' => 'knowledge_pinterest',
258
  'option' => 'knowledge_tumblr',
259
  'dashicon' => 'genericon-tumblr',
260
  'desc' => 'Tumblr ' . __( 'Blog', 'autodescription' ),
261
+ 'placeholder' => 'https://www.tumblr.com/blog/' . $connectedi18n,
262
  'examplelink' => esc_url( 'https://www.tumblr.com/dashboard' ), // No example link available.
263
  ),
264
  );
inc/views/metaboxes/sitemaps-metabox.php CHANGED
@@ -8,92 +8,76 @@ $instance = $this->get_view_instance( 'the_seo_framework_sitemaps_metabox', $ins
8
  switch ( $instance ) :
9
  case 'the_seo_framework_sitemaps_metabox_main' :
10
 
11
- if ( ! $this->pretty_permalinks ) :
12
-
13
- $permalink_settings_url = admin_url( 'options-permalink.php' );
14
- $here = '<a href="' . esc_url( $permalink_settings_url ) . '" target="_blank" title="' . esc_attr__( 'Permalink Settings', 'autodescription' ) . '">' . esc_html_x( 'here', 'The sitemap can be found %s.', 'autodescription' ) . '</a>';
15
-
16
- ?><h4><?php esc_html_e( "You're using the plain permalink structure.", 'autodescription' ); ?></h4><?php
17
- $this->description( __( "This means we can't output the sitemap through the WordPress rewrite rules.", 'autodescription' ) );
18
- ?><hr><?php
19
- $this->description_noesc( sprintf( esc_html_x( "Change your Permalink Settings %s (Recommended: 'postname').", '%s = here', 'autodescription' ), $here ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
 
21
- else :
 
 
 
 
 
22
 
23
- /**
24
- * Parse tabs content
25
- *
26
- * @param array $default_tabs { 'id' = The identifier =>
27
- * array(
28
- * 'name' => The name
29
- * 'callback' => The callback function, use array for method calling
30
- * 'dashicon' => Desired dashicon
31
- * )
32
- * }
33
- *
34
- * @since 2.2.9
35
- */
36
- $default_tabs = array(
37
- 'general' => array(
38
- 'name' => __( 'General', 'autodescription' ),
39
- 'callback' => array( $this, 'sitemaps_metabox_general_tab' ),
40
- 'dashicon' => 'admin-generic',
41
- ),
42
- 'robots' => array(
43
- 'name' => 'Robots.txt',
44
- 'callback' => array( $this, 'sitemaps_metabox_robots_tab' ),
45
- 'dashicon' => 'share-alt2',
46
- ),
47
- 'timestamps' => array(
48
- 'name' => __( 'Timestamps', 'autodescription' ),
49
- 'callback' => array( $this, 'sitemaps_metabox_timestamps_tab' ),
50
- 'dashicon' => 'backup',
51
- ),
52
- 'notify' => array(
53
- 'name' => _x( 'Ping', 'Ping or notify Search Engine', 'autodescription' ),
54
- 'callback' => array( $this, 'sitemaps_metabox_notify_tab' ),
55
- 'dashicon' => 'megaphone',
56
- ),
57
- 'style' => array(
58
- 'name' => __( 'Style', 'autodescription' ),
59
- 'callback' => array( $this, 'sitemaps_metabox_style_tab' ),
60
- 'dashicon' => 'art',
61
- ),
62
- );
63
 
64
- /**
65
- * Applies filters the_seo_framework_sitemaps_settings_tabs : array see $default_tabs
66
- *
67
- * Used to extend Knowledge Graph tabs
68
- */
69
- $defaults = (array) apply_filters( 'the_seo_framework_sitemaps_settings_tabs', $default_tabs, $args );
70
-
71
- $tabs = wp_parse_args( $args, $defaults );
72
- $use_tabs = true;
73
-
74
- $has_sitemap_plugin = $this->detect_sitemap_plugin();
75
- $sitemap_detected = $this->has_sitemap_xml();
76
- $robots_detected = $this->has_robots_txt();
77
-
78
- /**
79
- * Remove the timestamps and notify submenus
80
- * @since 2.5.2
81
- */
82
- if ( $has_sitemap_plugin || $sitemap_detected ) {
83
- unset( $tabs['timestamps'] );
84
- unset( $tabs['notify'] );
85
- }
86
 
87
- $this->nav_tab_wrapper( 'sitemaps', $tabs, '2.2.8' );
 
 
 
 
 
 
 
88
 
89
- endif;
90
  break;
91
 
92
  case 'the_seo_framework_sitemaps_metabox_general' :
93
 
94
- $site_url = $this->the_home_url_from_cache( true );
95
-
96
- $sitemap_url = $site_url . 'sitemap.xml';
97
  $has_sitemap_plugin = $this->detect_sitemap_plugin();
98
  $sitemap_detected = $this->has_sitemap_xml();
99
 
@@ -142,6 +126,17 @@ switch ( $instance ) :
142
 
143
  if ( $this->has_robots_txt() ) :
144
  $this->description( __( 'A robots.txt file has been detected in the root folder of your website; therefore no settings are able to alter its output.', 'autodescription' ) );
 
 
 
 
 
 
 
 
 
 
 
145
  elseif ( $this->can_do_sitemap_robots( false ) ) :
146
  $this->description( __( 'The robots.txt file is the first thing Search Engines look for. If you add the sitemap location in the robots.txt file, then Search Engines will look for and index the sitemap.', 'autodescription' ) );
147
  $this->description( __( 'If you do not add the sitemap location to the robots.txt file, you will need to notify Search Engines manually through the Webmaster Console provided by the Search Engines.', 'autodescription' ) );
@@ -171,8 +166,7 @@ switch ( $instance ) :
171
  endif;
172
 
173
  if ( $locate_url ) {
174
- $site_url = $this->the_home_url_from_cache( true );
175
- $robots_url = trailingslashit( $site_url ) . 'robots.txt';
176
  $here = '<a href="' . esc_url( $robots_url ) . '" target="_blank" title="' . esc_attr__( 'View robots.txt', 'autodescription' ) . '">' . esc_html_x( 'here', 'The sitemap can be found %s.', 'autodescription' ) . '</a>';
177
 
178
  $this->description_noesc( sprintf( esc_html_x( 'The robots.txt file can be found %s.', '%s = here', 'autodescription' ), $here ) );
8
  switch ( $instance ) :
9
  case 'the_seo_framework_sitemaps_metabox_main' :
10
 
11
+ /**
12
+ * Parse tabs content
13
+ *
14
+ * @param array $default_tabs { 'id' = The identifier =>
15
+ * array(
16
+ * 'name' => The name
17
+ * 'callback' => The callback function, use array for method calling
18
+ * 'dashicon' => Desired dashicon
19
+ * )
20
+ * }
21
+ *
22
+ * @since 2.2.9
23
+ */
24
+ $default_tabs = array(
25
+ 'general' => array(
26
+ 'name' => __( 'General', 'autodescription' ),
27
+ 'callback' => array( $this, 'sitemaps_metabox_general_tab' ),
28
+ 'dashicon' => 'admin-generic',
29
+ ),
30
+ 'robots' => array(
31
+ 'name' => 'Robots.txt',
32
+ 'callback' => array( $this, 'sitemaps_metabox_robots_tab' ),
33
+ 'dashicon' => 'share-alt2',
34
+ ),
35
+ 'timestamps' => array(
36
+ 'name' => __( 'Timestamps', 'autodescription' ),
37
+ 'callback' => array( $this, 'sitemaps_metabox_timestamps_tab' ),
38
+ 'dashicon' => 'backup',
39
+ ),
40
+ 'notify' => array(
41
+ 'name' => _x( 'Ping', 'Ping or notify Search Engine', 'autodescription' ),
42
+ 'callback' => array( $this, 'sitemaps_metabox_notify_tab' ),
43
+ 'dashicon' => 'megaphone',
44
+ ),
45
+ 'style' => array(
46
+ 'name' => __( 'Style', 'autodescription' ),
47
+ 'callback' => array( $this, 'sitemaps_metabox_style_tab' ),
48
+ 'dashicon' => 'art',
49
+ ),
50
+ );
51
 
52
+ /**
53
+ * Applies filters the_seo_framework_sitemaps_settings_tabs : array see $default_tabs
54
+ *
55
+ * Used to extend Knowledge Graph tabs
56
+ */
57
+ $defaults = (array) apply_filters( 'the_seo_framework_sitemaps_settings_tabs', $default_tabs, $args );
58
 
59
+ $tabs = wp_parse_args( $args, $defaults );
60
+ $use_tabs = true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
 
62
+ $has_sitemap_plugin = $this->detect_sitemap_plugin();
63
+ $sitemap_detected = $this->has_sitemap_xml();
64
+ $robots_detected = $this->has_robots_txt();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
 
66
+ /**
67
+ * Remove the timestamps and notify submenus
68
+ * @since 2.5.2
69
+ */
70
+ if ( $has_sitemap_plugin || $sitemap_detected ) {
71
+ unset( $tabs['timestamps'] );
72
+ unset( $tabs['notify'] );
73
+ }
74
 
75
+ $this->nav_tab_wrapper( 'sitemaps', $tabs, '2.2.8' );
76
  break;
77
 
78
  case 'the_seo_framework_sitemaps_metabox_general' :
79
 
80
+ $sitemap_url = $this->get_sitemap_xml_url();
 
 
81
  $has_sitemap_plugin = $this->detect_sitemap_plugin();
82
  $sitemap_detected = $this->has_sitemap_xml();
83
 
126
 
127
  if ( $this->has_robots_txt() ) :
128
  $this->description( __( 'A robots.txt file has been detected in the root folder of your website; therefore no settings are able to alter its output.', 'autodescription' ) );
129
+ elseif ( ! $this->pretty_permalinks ) :
130
+
131
+ $permalink_settings_url = admin_url( 'options-permalink.php' );
132
+ $here = '<a href="' . esc_url( $permalink_settings_url ) . '" target="_blank" title="' . esc_attr__( 'Permalink Settings', 'autodescription' ) . '">' . esc_html_x( 'here', 'The sitemap can be found %s.', 'autodescription' ) . '</a>';
133
+
134
+ ?><h4><?php esc_html_e( "You're using the plain permalink structure.", 'autodescription' ); ?></h4><?php
135
+ $this->description( __( "This means the robots.txt file can't be outputted through the WordPress rewrite rules.", 'autodescription' ) );
136
+ ?><hr><?php
137
+ $this->description_noesc( sprintf( esc_html_x( 'Change your Permalink Settings %s (Recommended: "Post name").', '%s = here', 'autodescription' ), $here ) );
138
+
139
+ $locate_url = false;
140
  elseif ( $this->can_do_sitemap_robots( false ) ) :
141
  $this->description( __( 'The robots.txt file is the first thing Search Engines look for. If you add the sitemap location in the robots.txt file, then Search Engines will look for and index the sitemap.', 'autodescription' ) );
142
  $this->description( __( 'If you do not add the sitemap location to the robots.txt file, you will need to notify Search Engines manually through the Webmaster Console provided by the Search Engines.', 'autodescription' ) );
166
  endif;
167
 
168
  if ( $locate_url ) {
169
+ $robots_url = $this->get_robots_txt_url();
 
170
  $here = '<a href="' . esc_url( $robots_url ) . '" target="_blank" title="' . esc_attr__( 'View robots.txt', 'autodescription' ) . '">' . esc_html_x( 'here', 'The sitemap can be found %s.', 'autodescription' ) . '</a>';
171
 
172
  $this->description_noesc( sprintf( esc_html_x( 'The robots.txt file can be found %s.', '%s = here', 'autodescription' ), $here ) );
inc/views/sitemap/xsl-stylesheet.php CHANGED
@@ -45,7 +45,7 @@ $sitemap_color_accent = '#' . $this->s_color_hex( (string) apply_filters( 'the_s
45
  * Applies filters 'the_seo_framework_sitemap_relative_font_color' : string
46
  * @since 2.8.0
47
  */
48
- $relative_font_color = '#' . $this->s_color_hex( (string) apply_filters( 'the_seo_framework_sitemap_relative_font_color', $this->get_relatitve_fontcolor( $sitemap_color_main ) ) );
49
 
50
  /**
51
  * Applies filters 'the_seo_framework_indicator_sitemap' : boolean
@@ -53,6 +53,8 @@ $relative_font_color = '#' . $this->s_color_hex( (string) apply_filters( 'the_se
53
  */
54
  $indicator = (bool) apply_filters( 'the_seo_framework_indicator_sitemap', true );
55
 
 
 
56
  $xml = '<?xml version="1.0" encoding="UTF-8"?>
57
  <xsl:stylesheet version="2.0"
58
  xmlns:html="http://www.w3.org/TR/REC-html40"
@@ -102,7 +104,7 @@ $xml = '<?xml version="1.0" encoding="UTF-8"?>
102
  border-bottom: 1px solid;
103
  }
104
  table {
105
- min-width: 600px;
106
  border-spacing: 0;
107
  }
108
  th, td {
@@ -142,7 +144,7 @@ $xml = '<?xml version="1.0" encoding="UTF-8"?>
142
  wp_kses(
143
  ent2ncr(
144
  $this->convert_markdown(
145
- /* translators: URLs are in Markdown. */
146
  __( 'This is a generated XML Sitemap, meant to be consumed by search engines like [Google](https://www.google.com/) or [Bing](https://www.bing.com/).', 'autodescription' ),
147
  array( 'a' )
148
  )
@@ -158,7 +160,7 @@ $xml = '<?xml version="1.0" encoding="UTF-8"?>
158
  wp_kses(
159
  ent2ncr(
160
  $this->convert_markdown(
161
- /* translators: URLs are in Markdown. */
162
  __( 'You can find more information on XML sitemaps at [sitemaps.org](https://www.sitemaps.org/).', 'autodescription' ),
163
  array( 'a' )
164
  )
@@ -176,7 +178,7 @@ $xml = '<?xml version="1.0" encoding="UTF-8"?>
176
  <tr>
177
  <th>' . esc_html( ent2ncr( __( 'URL', 'autodescription' ) ) ) . '</th>';
178
 
179
- if ( $this->is_option_checked( 'sitemaps_modified' ) ) :
180
  $xml .= '
181
  <th>' . esc_html( ent2ncr( __( 'Last Updated', 'autodescription' ) ) ) . '</th>';
182
  endif;
@@ -202,7 +204,7 @@ $xml .= '
202
  </a>
203
  </td>';
204
 
205
- if ( $this->is_option_checked( 'sitemaps_modified' ) ) :
206
  $xml .= '
207
  <td>
208
  <xsl:value-of select="concat(substring(sitemap:lastmod,0,11),concat(\' \', substring(sitemap:lastmod,12,5)))"/>
45
  * Applies filters 'the_seo_framework_sitemap_relative_font_color' : string
46
  * @since 2.8.0
47
  */
48
+ $relative_font_color = '#' . $this->s_color_hex( (string) apply_filters( 'the_seo_framework_sitemap_relative_font_color', $this->get_relative_fontcolor( $sitemap_color_main ) ) );
49
 
50
  /**
51
  * Applies filters 'the_seo_framework_indicator_sitemap' : boolean
53
  */
54
  $indicator = (bool) apply_filters( 'the_seo_framework_indicator_sitemap', true );
55
 
56
+ $output_modified = $this->is_option_checked( 'sitemaps_modified' );
57
+
58
  $xml = '<?xml version="1.0" encoding="UTF-8"?>
59
  <xsl:stylesheet version="2.0"
60
  xmlns:html="http://www.w3.org/TR/REC-html40"
104
  border-bottom: 1px solid;
105
  }
106
  table {
107
+ min-width: ' . ( $output_modified ? '600' : '450' ) . 'px;
108
  border-spacing: 0;
109
  }
110
  th, td {
144
  wp_kses(
145
  ent2ncr(
146
  $this->convert_markdown(
147
+ /* translators: URLs are in Markdown. Don't forget to localize the URLs. */
148
  __( 'This is a generated XML Sitemap, meant to be consumed by search engines like [Google](https://www.google.com/) or [Bing](https://www.bing.com/).', 'autodescription' ),
149
  array( 'a' )
150
  )
160
  wp_kses(
161
  ent2ncr(
162
  $this->convert_markdown(
163
+ /* translators: URLs are in Markdown. Don't localize this URL. */
164
  __( 'You can find more information on XML sitemaps at [sitemaps.org](https://www.sitemaps.org/).', 'autodescription' ),
165
  array( 'a' )
166
  )
178
  <tr>
179
  <th>' . esc_html( ent2ncr( __( 'URL', 'autodescription' ) ) ) . '</th>';
180
 
181
+ if ( $output_modified ) :
182
  $xml .= '
183
  <th>' . esc_html( ent2ncr( __( 'Last Updated', 'autodescription' ) ) ) . '</th>';
184
  endif;
204
  </a>
205
  </td>';
206
 
207
+ if ( $output_modified ) :
208
  $xml .= '
209
  <td>
210
  <xsl:value-of select="concat(substring(sitemap:lastmod,0,11),concat(\' \', substring(sitemap:lastmod,12,5)))"/>
language/autodescription.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the The SEO Framework package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: The SEO Framework 2.9.0-RC-1-2017.03.25.1\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/autodescription\n"
7
- "POT-Creation-Date: 2017-03-25 04:37:16+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -12,30 +12,36 @@ msgstr ""
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
15
- #: inc/classes/admin-init.class.php:231
16
  msgid "Good"
17
  msgstr ""
18
 
19
- #: inc/classes/admin-init.class.php:232
20
  msgid "Okay"
21
  msgstr ""
22
 
23
- #: inc/classes/admin-init.class.php:233
24
  msgid "Bad"
25
  msgstr ""
26
 
27
- #: inc/classes/admin-init.class.php:234
28
  msgid "Unknown"
29
  msgstr ""
30
 
31
- #: inc/classes/admin-init.class.php:325
32
  msgid "The changes you made will be lost if you navigate away from this page."
33
  msgstr ""
34
 
35
- #: inc/classes/admin-init.class.php:326
36
  msgid "Are you sure you want to reset all SEO settings to their defaults?"
37
  msgstr ""
38
 
 
 
 
 
 
 
39
  #: inc/classes/admin-pages.class.php:82
40
  msgid "Save Settings"
41
  msgstr ""
@@ -60,97 +66,106 @@ msgstr ""
60
  msgid "New SEO Settings have been updated."
61
  msgstr ""
62
 
63
- #: inc/classes/admin-pages.class.php:102 inc/classes/core.class.php:251
64
  #: inc/classes/site-options.class.php:429
65
  msgid "SEO Settings"
66
  msgstr ""
67
 
68
- #: inc/classes/admin-pages.class.php:103
69
  msgid "SEO"
70
  msgstr ""
71
 
72
- #: inc/classes/admin-pages.class.php:235
73
  msgid "General Settings"
74
  msgstr ""
75
 
76
- #: inc/classes/admin-pages.class.php:246
77
  msgid "Title Settings"
78
  msgstr ""
79
 
80
- #: inc/classes/admin-pages.class.php:257
81
  msgid "Description Meta Settings"
82
  msgstr ""
83
 
84
- #: inc/classes/admin-pages.class.php:268
85
  msgid "Home Page Settings"
86
  msgstr ""
87
 
88
- #: inc/classes/admin-pages.class.php:279
89
  msgid "Social Meta Settings"
90
  msgstr ""
91
 
92
- #: inc/classes/admin-pages.class.php:290
93
  msgid "Schema Settings"
94
  msgstr ""
95
 
96
- #: inc/classes/admin-pages.class.php:301
97
  #: inc/views/inpost/seo-settings-singular.php:167
98
  #: inc/views/inpost/seo-settings-tt.php:119
99
  msgid "Robots Meta Settings"
100
  msgstr ""
101
 
102
- #: inc/classes/admin-pages.class.php:312
103
  msgid "Webmaster Meta Settings"
104
  msgstr ""
105
 
106
- #: inc/classes/admin-pages.class.php:323
107
  msgid "Sitemap Settings"
108
  msgstr ""
109
 
110
- #: inc/classes/admin-pages.class.php:334
111
  msgid "Feed Settings"
112
  msgstr ""
113
 
114
- #: inc/classes/admin-pages.class.php:838 inc/classes/admin-pages.class.php:845
115
  msgctxt "Button hover"
116
  msgid "Select social image"
117
  msgstr ""
118
 
119
- #: inc/classes/admin-pages.class.php:840 inc/classes/admin-pages.class.php:844
120
  msgid "Select Image"
121
  msgstr ""
122
 
123
- #: inc/classes/admin-pages.class.php:846
124
  msgid "Change Image"
125
  msgstr ""
126
 
127
- #: inc/classes/admin-pages.class.php:847
128
  msgid "Remove Image"
129
  msgstr ""
130
 
131
- #: inc/classes/admin-pages.class.php:848
132
  msgid "Remove selected social image"
133
  msgstr ""
134
 
135
- #: inc/classes/admin-pages.class.php:849
136
  msgctxt "Frame title"
137
  msgid "Select Social Image"
138
  msgstr ""
139
 
140
- #: inc/classes/admin-pages.class.php:850
141
  msgid "Use this image"
142
  msgstr ""
143
 
144
- #: inc/classes/core.class.php:253
145
  msgctxt "As in: The Plugin Home Page"
146
  msgid "Plugin Home"
147
  msgstr ""
148
 
149
- #: inc/classes/core.class.php:304
 
 
 
 
 
 
 
 
 
150
  msgid "Dismiss"
151
  msgstr ""
152
 
153
- #: inc/classes/core.class.php:401
154
  msgctxt "e.g. en for English, nl for Dutch, fi for Finish, de for German"
155
  msgid "en"
156
  msgstr ""
@@ -198,224 +213,224 @@ msgstr ""
198
  msgid "No Search"
199
  msgstr ""
200
 
201
- #: inc/classes/doing-it-right.class.php:293
202
  msgid "Refresh to see the SEO Bar status."
203
  msgstr ""
204
 
205
- #: inc/classes/doing-it-right.class.php:377
206
  msgid "Post"
207
  msgstr ""
208
 
209
- #: inc/classes/doing-it-right.class.php:381 inc/classes/inpost.class.php:379
210
  #: inc/classes/term-data.class.php:332
211
- #: inc/views/metaboxes/schema-metabox.php:203
212
  msgid "Page"
213
  msgstr ""
214
 
215
- #: inc/classes/doing-it-right.class.php:425
216
  msgid "Failed to fetch post ID."
217
  msgstr ""
218
 
219
  #. translators: %s = But or And
220
 
221
- #: inc/classes/doing-it-right.class.php:813
222
  msgid "%s the Title contains the Blogname multiple times."
223
  msgstr ""
224
 
225
- #. translators: 1: Word, 2: Occurences
226
 
227
- #: inc/classes/doing-it-right.class.php:984
228
  msgid "%1$s is used %2$d times."
229
  msgstr ""
230
 
231
  #. Translators: %s = Post / Page / Category, etc.
232
 
233
- #: inc/classes/doing-it-right.class.php:1029
234
  msgid "%s is being indexed."
235
  msgstr ""
236
 
237
- #: inc/classes/doing-it-right.class.php:1038
238
  msgid "But you've discouraged indexing for the whole site."
239
  msgstr ""
240
 
241
  #. translators: 1: But or And, 2: Current taxonomy term plural label
242
 
243
- #: inc/classes/doing-it-right.class.php:1062
244
  msgid "%1$s indexing for %2$s have been discouraged."
245
  msgstr ""
246
 
247
  #. translators: 1 = But or And, 1 = Post/Page
248
 
249
- #: inc/classes/doing-it-right.class.php:1075
250
  msgid "%1$s the %2$s is protected from public visibility. This means indexing is discouraged."
251
  msgstr ""
252
 
253
  #. translators: %s = But or And
254
 
255
- #: inc/classes/doing-it-right.class.php:1084
256
  msgid "%s the blog isn't set to public. This means WordPress discourages indexing."
257
  msgstr ""
258
 
259
  #. translators: %s = But or And
260
 
261
- #: inc/classes/doing-it-right.class.php:1098
262
  msgid "%s there are no posts in this term; therefore, indexing has been discouraged."
263
  msgstr ""
264
 
265
- #: inc/classes/doing-it-right.class.php:1182
266
  msgid "%s links aren't being followed."
267
  msgstr ""
268
 
269
- #: inc/classes/doing-it-right.class.php:1188
270
  msgid "%s links are being followed."
271
  msgstr ""
272
 
273
  #. translators: %s = But or And
274
 
275
- #: inc/classes/doing-it-right.class.php:1200
276
  msgid "%s you've discouraged the following of links for the whole site."
277
  msgstr ""
278
 
279
  #. translators: 1: But or And, 2: Current taxonomy term plural label
280
 
281
- #: inc/classes/doing-it-right.class.php:1226
282
  msgid "%1$s following for %2$s have been discouraged."
283
  msgstr ""
284
 
285
  #. translators: %s = But or And
286
 
287
- #: inc/classes/doing-it-right.class.php:1238
288
  msgid "%s the blog isn't set to public. This means WordPress allows the links to be followed regardless."
289
  msgstr ""
290
 
291
- #: inc/classes/doing-it-right.class.php:1290
292
  msgid "Search Engines aren't allowed to archive this %s."
293
  msgstr ""
294
 
295
- #: inc/classes/doing-it-right.class.php:1295
296
  msgid "Search Engines are allowed to archive this %s."
297
  msgstr ""
298
 
299
- #: inc/classes/doing-it-right.class.php:1307
300
  msgid "But you've discouraged archiving for the whole site."
301
  msgstr ""
302
 
303
  #. translators: 1: But or And, 2: Current taxonomy term plural label
304
 
305
- #: inc/classes/doing-it-right.class.php:1333
306
  msgid "%1$s archiving for %2$s have been discouraged."
307
  msgstr ""
308
 
309
  #. translators: %s = But or And
310
 
311
- #: inc/classes/doing-it-right.class.php:1346
312
  msgid "%s the blog isn't set to public. This means WordPress allows the blog to be archived regardless."
313
  msgstr ""
314
 
315
- #: inc/classes/doing-it-right.class.php:1392
316
  msgid "%s isn't being redirected."
317
  msgstr ""
318
 
319
- #: inc/classes/doing-it-right.class.php:1434
320
- #: inc/classes/doing-it-right.class.php:1463
321
  msgid "%s is being redirected. This means no SEO values have to be set."
322
  msgstr ""
323
 
324
- #: inc/classes/doing-it-right.class.php:1437
325
- #: inc/classes/doing-it-right.class.php:1479
326
  msgid "%s is not being indexed. This means no SEO values have to be set."
327
  msgstr ""
328
 
329
- #: inc/classes/doing-it-right.class.php:1593
330
  msgid "Title:"
331
  msgstr ""
332
 
333
- #: inc/classes/doing-it-right.class.php:1594
334
  msgid "Description:"
335
  msgstr ""
336
 
337
- #: inc/classes/doing-it-right.class.php:1595
338
  msgid "Index:"
339
  msgstr ""
340
 
341
- #: inc/classes/doing-it-right.class.php:1596
342
  msgid "Follow:"
343
  msgstr ""
344
 
345
- #: inc/classes/doing-it-right.class.php:1597
346
  msgid "Archive:"
347
  msgstr ""
348
 
349
- #: inc/classes/doing-it-right.class.php:1598
350
  msgid "Redirect:"
351
  msgstr ""
352
 
353
- #: inc/classes/doing-it-right.class.php:1600
354
  msgid "Generated: Automatically generated."
355
  msgstr ""
356
 
357
- #: inc/classes/doing-it-right.class.php:1602
358
  msgctxt "Generated"
359
  msgid "G"
360
  msgstr ""
361
 
362
- #: inc/classes/doing-it-right.class.php:1603
363
  msgctxt "Title"
364
  msgid "T"
365
  msgstr ""
366
 
367
- #: inc/classes/doing-it-right.class.php:1604
368
  msgctxt "Description"
369
  msgid "D"
370
  msgstr ""
371
 
372
- #: inc/classes/doing-it-right.class.php:1605
373
  msgctxt "no-Index"
374
  msgid "I"
375
  msgstr ""
376
 
377
- #: inc/classes/doing-it-right.class.php:1606
378
  msgctxt "no-Follow"
379
  msgid "F"
380
  msgstr ""
381
 
382
- #: inc/classes/doing-it-right.class.php:1607
383
  msgctxt "no-Archive"
384
  msgid "A"
385
  msgstr ""
386
 
387
- #: inc/classes/doing-it-right.class.php:1608
388
  msgctxt "Redirect"
389
  msgid "R"
390
  msgstr ""
391
 
392
- #: inc/classes/doing-it-right.class.php:1610
393
  msgctxt "But there are..."
394
  msgid "But"
395
  msgstr ""
396
 
397
- #: inc/classes/doing-it-right.class.php:1611
398
  msgctxt "And there are..."
399
  msgid "And"
400
  msgstr ""
401
 
402
- #: inc/classes/doing-it-right.class.php:1613
403
  msgid "Length is far too short."
404
  msgstr ""
405
 
406
- #: inc/classes/doing-it-right.class.php:1614
407
  msgid "Length is too short."
408
  msgstr ""
409
 
410
- #: inc/classes/doing-it-right.class.php:1615
411
  msgid "Length is too long."
412
  msgstr ""
413
 
414
- #: inc/classes/doing-it-right.class.php:1616
415
  msgid "Length is far too long."
416
  msgstr ""
417
 
418
- #: inc/classes/doing-it-right.class.php:1617
419
  msgid "Length is good."
420
  msgstr ""
421
 
@@ -426,21 +441,21 @@ msgstr ""
426
 
427
  #. translators: 1: Title, 2: Separator, 3: Excerpt
428
 
429
- #: inc/classes/generate-description.class.php:440
430
  msgctxt "1: Title, 2: Separator, 3: Excerpt"
431
  msgid "%1$s %2$s %3$s"
432
  msgstr ""
433
 
434
  #. translators: 1: Title, 2: on, 3: Blogname
435
 
436
- #: inc/classes/generate-description.class.php:647
437
  msgctxt "1: Title, 2: on, 3: Blogname"
438
  msgid "%1$s %2$s %3$s"
439
  msgstr ""
440
 
441
  #. translators: Front-end output.
442
 
443
- #: inc/classes/generate-description.class.php:683
444
  #: inc/views/metaboxes/description-metabox.php:18
445
  msgctxt "Placement. e.g. Post Title \"on\" Blog Name"
446
  msgid "on"
@@ -448,7 +463,7 @@ msgstr ""
448
 
449
  #. translators: Front-end output.
450
 
451
- #: inc/classes/generate-description.class.php:745
452
  msgid "Latest posts:"
453
  msgstr ""
454
 
@@ -462,175 +477,179 @@ msgstr ""
462
  #. translators: Front-end output. 1: Taxonomy singular name, 2: Current
463
  #. taxonomy term
464
 
465
- #: inc/classes/generate-title.class.php:822
466
- #: inc/classes/generate-title.class.php:882
467
  msgid "%1$s: %2$s"
468
  msgstr ""
469
 
470
  #. translators: Front-end output.
471
 
472
- #: inc/classes/generate-title.class.php:826
473
  msgid "Author: %s"
474
  msgstr ""
475
 
476
  #. translators: Front-end output.
477
 
478
- #: inc/classes/generate-title.class.php:830
479
  msgctxt "yearly archives date format"
480
  msgid "Y"
481
  msgstr ""
482
 
483
  #. translators: Front-end output.
484
 
485
- #: inc/classes/generate-title.class.php:832
486
  msgid "Year: %s"
487
  msgstr ""
488
 
489
  #. translators: Front-end output.
490
 
491
- #: inc/classes/generate-title.class.php:835
492
  msgctxt "monthly archives date format"
493
  msgid "F Y"
494
  msgstr ""
495
 
496
  #. translators: Front-end output.
497
 
498
- #: inc/classes/generate-title.class.php:837
499
  msgid "Month: %s"
500
  msgstr ""
501
 
502
  #. translators: Front-end output.
503
 
504
- #: inc/classes/generate-title.class.php:840
505
  msgctxt "daily archives date format"
506
  msgid "F j, Y"
507
  msgstr ""
508
 
509
  #. translators: Front-end output.
510
 
511
- #: inc/classes/generate-title.class.php:842
512
  msgid "Day: %s"
513
  msgstr ""
514
 
515
  #. translators: Front-end output.
516
 
517
- #: inc/classes/generate-title.class.php:847
518
  msgctxt "post format archive title"
519
  msgid "Asides"
520
  msgstr ""
521
 
522
  #. translators: Front-end output.
523
 
524
- #: inc/classes/generate-title.class.php:850
525
  msgctxt "post format archive title"
526
  msgid "Galleries"
527
  msgstr ""
528
 
529
  #. translators: Front-end output.
530
 
531
- #: inc/classes/generate-title.class.php:853
532
  msgctxt "post format archive title"
533
  msgid "Images"
534
  msgstr ""
535
 
536
  #. translators: Front-end output.
537
 
538
- #: inc/classes/generate-title.class.php:856
539
  msgctxt "post format archive title"
540
  msgid "Videos"
541
  msgstr ""
542
 
543
  #. translators: Front-end output.
544
 
545
- #: inc/classes/generate-title.class.php:859
546
  msgctxt "post format archive title"
547
  msgid "Quotes"
548
  msgstr ""
549
 
550
  #. translators: Front-end output.
551
 
552
- #: inc/classes/generate-title.class.php:862
553
  msgctxt "post format archive title"
554
  msgid "Links"
555
  msgstr ""
556
 
557
  #. translators: Front-end output.
558
 
559
- #: inc/classes/generate-title.class.php:865
560
  msgctxt "post format archive title"
561
  msgid "Statuses"
562
  msgstr ""
563
 
564
  #. translators: Front-end output.
565
 
566
- #: inc/classes/generate-title.class.php:868
567
  msgctxt "post format archive title"
568
  msgid "Audio"
569
  msgstr ""
570
 
571
  #. translators: Front-end output.
572
 
573
- #: inc/classes/generate-title.class.php:871
574
  msgctxt "post format archive title"
575
  msgid "Chats"
576
  msgstr ""
577
 
578
  #. translators: Front-end output.
579
 
580
- #: inc/classes/generate-title.class.php:876
581
  msgid "Archives: %s"
582
  msgstr ""
583
 
584
  #. translators: Front-end output.
585
 
586
- #: inc/classes/generate-title.class.php:886
587
  msgid "Archives"
588
  msgstr ""
589
 
590
  #. translators: Front-end output.
591
 
592
- #: inc/classes/generate-title.class.php:993
593
  msgid "Untitled"
594
  msgstr ""
595
 
596
  #. translators: Front-end output.
597
 
598
- #: inc/classes/generate-title.class.php:1028
599
  msgid "Search results for:"
600
  msgstr ""
601
 
602
  #. translators: Front-end output
603
 
604
- #: inc/classes/generate-title.class.php:1204
605
  msgid "Protected: %s"
606
  msgstr ""
607
 
608
  #. translators: Front-end output
609
 
610
- #: inc/classes/generate-title.class.php:1208
611
  msgid "Private: %s"
612
  msgstr ""
613
 
614
  #. translators: Front-end output.
615
 
616
- #: inc/classes/generate-title.class.php:1241
617
  msgid "Page %s"
618
  msgstr ""
619
 
620
- #: inc/classes/init.class.php:472
621
- msgid "Start The SEO Framework"
622
  msgstr ""
623
 
624
- #: inc/classes/init.class.php:473
625
- msgid "End The SEO Framework"
 
 
626
  msgstr ""
627
 
628
- #: inc/classes/init.class.php:474
629
- msgid "by Sybre Waaijer"
 
 
630
  msgstr ""
631
 
632
- #: inc/classes/inpost.class.php:302 inc/views/inpost/seo-settings-tt.php:70
633
- msgid "%s SEO Settings"
634
  msgstr ""
635
 
636
  #: inc/classes/site-options.class.php:429
@@ -642,15 +661,15 @@ msgctxt "%s = here"
642
  msgid "View the new options %s."
643
  msgstr ""
644
 
645
- #: inc/classes/sitemaps.class.php:296
646
  msgid "Sitemap is generated for this view"
647
  msgstr ""
648
 
649
- #: inc/classes/sitemaps.class.php:298
650
  msgid "Sitemap is served from cache"
651
  msgstr ""
652
 
653
- #: inc/classes/sitemaps.class.php:520
654
  msgid "Sitemap is generated on"
655
  msgstr ""
656
 
@@ -668,7 +687,7 @@ msgstr ""
668
  #: inc/views/metaboxes/homepage-metabox.php:32
669
  #: inc/views/metaboxes/robots-metabox.php:57
670
  #: inc/views/metaboxes/schema-metabox.php:37
671
- #: inc/views/metaboxes/sitemaps-metabox.php:38
672
  #: inc/views/metaboxes/social-metabox.php:25
673
  #: inc/views/metaboxes/title-metabox.php:61
674
  msgid "General"
@@ -928,93 +947,93 @@ msgid "The feed can be found %s."
928
  msgstr ""
929
 
930
  #: inc/views/metaboxes/general-metabox.php:18
931
- msgid "Performance"
932
  msgstr ""
933
 
934
  #: inc/views/metaboxes/general-metabox.php:23
935
- msgid "Layout"
936
  msgstr ""
937
 
938
  #: inc/views/metaboxes/general-metabox.php:28
939
  msgid "Canonical"
940
  msgstr ""
941
 
 
 
 
 
942
  #: inc/views/metaboxes/general-metabox.php:52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
943
  msgid "Performance Settings"
944
  msgstr ""
945
 
946
- #: inc/views/metaboxes/general-metabox.php:53
947
  msgid "In order to improve performance, generated SEO output can be stored in the database as transient cache."
948
  msgstr ""
949
 
950
- #: inc/views/metaboxes/general-metabox.php:54
951
  msgid "If your website has thousands of pages, or if other forms of caching are used, you might wish to adjust these options."
952
  msgstr ""
953
 
954
- #: inc/views/metaboxes/general-metabox.php:59
955
  msgid "Transient Cache Settings"
956
  msgstr ""
957
 
958
- #: inc/views/metaboxes/general-metabox.php:65
959
  msgid "Enable automated description output cache?"
960
  msgstr ""
961
 
962
- #: inc/views/metaboxes/general-metabox.php:66
963
  msgid "Description generation can use a lot of server resources when it reads the page content."
964
  msgstr ""
965
 
966
- #: inc/views/metaboxes/general-metabox.php:72
967
  msgid "Enable automated Schema output cache?"
968
  msgstr ""
969
 
970
- #: inc/views/metaboxes/general-metabox.php:73
971
  msgid "Schema.org output generally makes multiple calls to the database."
972
  msgstr ""
973
 
974
- #: inc/views/metaboxes/general-metabox.php:79
975
  msgid "Enable sitemap generation cache?"
976
  msgstr ""
977
 
978
- #: inc/views/metaboxes/general-metabox.php:80
979
  msgid "Generating the sitemap can use a lot of server resources."
980
  msgstr ""
981
 
982
- #: inc/views/metaboxes/general-metabox.php:92
983
  msgid "Object Cache Settings"
984
  msgstr ""
985
 
986
- #: inc/views/metaboxes/general-metabox.php:98
987
  msgid "Enable object cache?"
988
  msgstr ""
989
 
990
- #: inc/views/metaboxes/general-metabox.php:99
991
  msgid "Object cache generally works faster than transient cache"
992
  msgstr ""
993
 
994
- #: inc/views/metaboxes/general-metabox.php:100
995
  msgid "An object cache handler has been detected. If you enable this option, you might wish to disable description and Schema transient caching."
996
  msgstr ""
997
 
998
- #: inc/views/metaboxes/general-metabox.php:109
999
- msgid "Administrative Layout Settings"
1000
- msgstr ""
1001
-
1002
- #: inc/views/metaboxes/general-metabox.php:110
1003
- msgid "SEO hints can be visually displayed throughout the dashboard."
1004
- msgstr ""
1005
-
1006
- #: inc/views/metaboxes/general-metabox.php:115
1007
- msgid "SEO Bar Settings"
1008
- msgstr ""
1009
-
1010
- #: inc/views/metaboxes/general-metabox.php:121
1011
- msgid "Display the SEO Bar in overview tables?"
1012
- msgstr ""
1013
-
1014
- #: inc/views/metaboxes/general-metabox.php:127
1015
- msgid "Display the SEO Bar in the SEO Settings metabox?"
1016
- msgstr ""
1017
-
1018
  #: inc/views/metaboxes/general-metabox.php:138
1019
  msgid "Canonical URL Settings"
1020
  msgstr ""
@@ -1028,7 +1047,7 @@ msgid "If the canonical URL meta tag represents the visited page, then the Searc
1028
  msgstr ""
1029
 
1030
  #: inc/views/metaboxes/general-metabox.php:141
1031
- msgid "Only adjust these options if you are aware of its SEO effects."
1032
  msgstr ""
1033
 
1034
  #: inc/views/metaboxes/general-metabox.php:146
@@ -1478,240 +1497,240 @@ msgstr ""
1478
  msgid "Social Pages connected to this website"
1479
  msgstr ""
1480
 
1481
- #: inc/views/metaboxes/schema-metabox.php:190
1482
  msgid "Don't have a page at a site or is the profile only privately accessible? Leave that field empty. Unsure? Fill it in anyway."
1483
  msgstr ""
1484
 
1485
- #: inc/views/metaboxes/schema-metabox.php:191
1486
  msgid "Add the link that leads directly to the social page of this website."
1487
  msgstr ""
1488
 
1489
- #: inc/views/metaboxes/schema-metabox.php:193
1490
  msgctxt "No spaces. E.g. https://facebook.com/RelatedProfile"
1491
  msgid "RelatedProfile"
1492
  msgstr ""
1493
 
1494
- #: inc/views/metaboxes/schema-metabox.php:194
1495
  msgctxt "Social Profile"
1496
  msgid "Profile"
1497
  msgstr ""
1498
 
1499
- #: inc/views/metaboxes/schema-metabox.php:259
1500
  msgid "Blog"
1501
  msgstr ""
1502
 
1503
- #: inc/views/metaboxes/sitemaps-metabox.php:14
1504
- msgid "Permalink Settings"
1505
- msgstr ""
1506
-
1507
- #: inc/views/metaboxes/sitemaps-metabox.php:14
1508
- #: inc/views/metaboxes/sitemaps-metabox.php:130
1509
- #: inc/views/metaboxes/sitemaps-metabox.php:176
1510
- msgctxt "The sitemap can be found %s."
1511
- msgid "here"
1512
- msgstr ""
1513
-
1514
- #: inc/views/metaboxes/sitemaps-metabox.php:16
1515
- msgid "You're using the plain permalink structure."
1516
- msgstr ""
1517
-
1518
- #: inc/views/metaboxes/sitemaps-metabox.php:17
1519
- msgid "This means we can't output the sitemap through the WordPress rewrite rules."
1520
- msgstr ""
1521
-
1522
- #: inc/views/metaboxes/sitemaps-metabox.php:19
1523
- msgctxt "%s = here"
1524
- msgid "Change your Permalink Settings %s (Recommended: 'postname')."
1525
- msgstr ""
1526
-
1527
- #: inc/views/metaboxes/sitemaps-metabox.php:48
1528
  msgid "Timestamps"
1529
  msgstr ""
1530
 
1531
- #: inc/views/metaboxes/sitemaps-metabox.php:53
1532
  msgctxt "Ping or notify Search Engine"
1533
  msgid "Ping"
1534
  msgstr ""
1535
 
1536
- #: inc/views/metaboxes/sitemaps-metabox.php:58
1537
  msgid "Style"
1538
  msgstr ""
1539
 
1540
- #: inc/views/metaboxes/sitemaps-metabox.php:101
1541
  msgid "Sitemap Integration Settings"
1542
  msgstr ""
1543
 
1544
- #: inc/views/metaboxes/sitemaps-metabox.php:105
1545
  msgid "Another active sitemap plugin has been detected. This means that the sitemap functionality has been replaced."
1546
  msgstr ""
1547
 
1548
- #: inc/views/metaboxes/sitemaps-metabox.php:107
1549
  msgid "A sitemap has been detected in the root folder of your website. This means that the sitemap functionality has no effect."
1550
  msgstr ""
1551
 
1552
- #: inc/views/metaboxes/sitemaps-metabox.php:109
1553
  msgid "The Sitemap is an XML file that lists pages and posts for your website along with optional metadata about each post or page. This helps Search Engines crawl your website more easily."
1554
  msgstr ""
1555
 
1556
- #: inc/views/metaboxes/sitemaps-metabox.php:110
1557
  msgid "The optional metadata include the post and page modified time and a page priority indication, which is automated."
1558
  msgstr ""
1559
 
1560
- #: inc/views/metaboxes/sitemaps-metabox.php:115
1561
  msgid "Sitemap Output"
1562
  msgstr ""
1563
 
1564
- #: inc/views/metaboxes/sitemaps-metabox.php:122
1565
  msgid "Output Sitemap?"
1566
  msgstr ""
1567
 
1568
- #: inc/views/metaboxes/sitemaps-metabox.php:130
1569
  msgid "View sitemap"
1570
  msgstr ""
1571
 
1572
- #: inc/views/metaboxes/sitemaps-metabox.php:131
 
 
 
 
 
 
 
1573
  msgctxt "%s = here"
1574
  msgid "The sitemap can be found %s."
1575
  msgstr ""
1576
 
1577
- #: inc/views/metaboxes/sitemaps-metabox.php:140
1578
  msgid "Robots.txt Settings"
1579
  msgstr ""
1580
 
1581
- #: inc/views/metaboxes/sitemaps-metabox.php:144
1582
  msgid "A robots.txt file has been detected in the root folder of your website; therefore no settings are able to alter its output."
1583
  msgstr ""
1584
 
1585
- #: inc/views/metaboxes/sitemaps-metabox.php:146
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1586
  msgid "The robots.txt file is the first thing Search Engines look for. If you add the sitemap location in the robots.txt file, then Search Engines will look for and index the sitemap."
1587
  msgstr ""
1588
 
1589
- #: inc/views/metaboxes/sitemaps-metabox.php:147
1590
  msgid "If you do not add the sitemap location to the robots.txt file, you will need to notify Search Engines manually through the Webmaster Console provided by the Search Engines."
1591
  msgstr ""
1592
 
1593
- #: inc/views/metaboxes/sitemaps-metabox.php:152
1594
  msgid "Add sitemap location in robots.txt"
1595
  msgstr ""
1596
 
1597
- #: inc/views/metaboxes/sitemaps-metabox.php:159
1598
  msgid "Add sitemap location in robots?"
1599
  msgstr ""
1600
 
1601
- #: inc/views/metaboxes/sitemaps-metabox.php:159
1602
  msgid "This only has effect if the sitemap is active"
1603
  msgstr ""
1604
 
1605
- #: inc/views/metaboxes/sitemaps-metabox.php:166
1606
  msgid "No robots.txt file can be generated on subdirectory installations."
1607
  msgstr ""
1608
 
1609
- #: inc/views/metaboxes/sitemaps-metabox.php:169
1610
  msgid "Another robots.txt sitemap location addition has been detected."
1611
  msgstr ""
1612
 
1613
- #: inc/views/metaboxes/sitemaps-metabox.php:176
1614
  msgid "View robots.txt"
1615
  msgstr ""
1616
 
1617
- #: inc/views/metaboxes/sitemaps-metabox.php:178
1618
  msgctxt "%s = here"
1619
  msgid "The robots.txt file can be found %s."
1620
  msgstr ""
1621
 
1622
- #: inc/views/metaboxes/sitemaps-metabox.php:198
1623
  msgid "Timestamps Settings"
1624
  msgstr ""
1625
 
1626
- #: inc/views/metaboxes/sitemaps-metabox.php:199
1627
  msgid "The modified time suggests to Search Engines where to look for content changes. It has no impact on the SEO value unless you drastically change pages or posts. It then depends on how well your content is constructed."
1628
  msgstr ""
1629
 
1630
- #: inc/views/metaboxes/sitemaps-metabox.php:200
1631
  msgid "By default, the sitemap only outputs the modified date if you've enabled them within the Social Metabox. This setting overrides those settings for the Sitemap."
1632
  msgstr ""
1633
 
1634
- #: inc/views/metaboxes/sitemaps-metabox.php:205
1635
  msgid "Output Modified Date"
1636
  msgstr ""
1637
 
1638
- #: inc/views/metaboxes/sitemaps-metabox.php:212
1639
  msgid "Add %s to the sitemap?"
1640
  msgstr ""
1641
 
1642
- #: inc/views/metaboxes/sitemaps-metabox.php:222
1643
  msgid "Timestamp Format Settings"
1644
  msgstr ""
1645
 
1646
- #: inc/views/metaboxes/sitemaps-metabox.php:223
1647
  msgid "Determines how specific the modification timestamp is."
1648
  msgstr ""
1649
 
1650
- #: inc/views/metaboxes/sitemaps-metabox.php:229
1651
  msgid "Complete date"
1652
  msgstr ""
1653
 
1654
- #: inc/views/metaboxes/sitemaps-metabox.php:235
1655
  msgid "Complete date plus hours, minutes and timezone"
1656
  msgstr ""
1657
 
1658
- #: inc/views/metaboxes/sitemaps-metabox.php:245
1659
  msgid "Ping Settings"
1660
  msgstr ""
1661
 
1662
- #: inc/views/metaboxes/sitemaps-metabox.php:246
1663
  msgid "Notifying Search Engines of a sitemap change is helpful to get your content indexed as soon as possible."
1664
  msgstr ""
1665
 
1666
- #: inc/views/metaboxes/sitemaps-metabox.php:247
1667
  msgid "By default this will happen at most once an hour."
1668
  msgstr ""
1669
 
1670
- #: inc/views/metaboxes/sitemaps-metabox.php:252
1671
  msgid "Notify Search Engines"
1672
  msgstr ""
1673
 
1674
- #: inc/views/metaboxes/sitemaps-metabox.php:264
1675
  msgid "Notify %s about sitemap changes?"
1676
  msgstr ""
1677
 
1678
- #: inc/views/metaboxes/sitemaps-metabox.php:275
1679
  msgid "Sitemap Styling Settings"
1680
  msgstr ""
1681
 
1682
- #: inc/views/metaboxes/sitemaps-metabox.php:278
1683
  msgid "You can style the sitemap to give it a more personal look. Styling the sitemap has no SEO value whatsoever."
1684
  msgstr ""
1685
 
1686
- #: inc/views/metaboxes/sitemaps-metabox.php:283
1687
  msgid "Enable styling"
1688
  msgstr ""
1689
 
1690
- #: inc/views/metaboxes/sitemaps-metabox.php:290
1691
  msgid "Style Sitemap?"
1692
  msgstr ""
1693
 
1694
- #: inc/views/metaboxes/sitemaps-metabox.php:290
1695
  msgid "This makes the sitemap more readable for humans"
1696
  msgstr ""
1697
 
1698
- #: inc/views/metaboxes/sitemaps-metabox.php:299
1699
  msgid "Style configuration"
1700
  msgstr ""
1701
 
1702
- #: inc/views/metaboxes/sitemaps-metabox.php:307
1703
  msgid "Add site logo?"
1704
  msgstr ""
1705
 
1706
- #: inc/views/metaboxes/sitemaps-metabox.php:307
1707
  msgid "The logo is set in Customizer"
1708
  msgstr ""
1709
 
1710
- #: inc/views/metaboxes/sitemaps-metabox.php:320
1711
  msgid "Sitemap header background color"
1712
  msgstr ""
1713
 
1714
- #: inc/views/metaboxes/sitemaps-metabox.php:329
1715
  msgid "Sitemap title and lines color"
1716
  msgstr ""
1717
 
@@ -2029,37 +2048,37 @@ msgid "Get the Pinterest Verification Code"
2029
  msgstr ""
2030
 
2031
  #: inc/views/sitemap/xsl-stylesheet.php:8
2032
- #: inc/views/sitemap/xsl-stylesheet.php:140
2033
  msgid "XML Sitemap"
2034
  msgstr ""
2035
 
2036
- #. translators: URLs are in Markdown.
2037
 
2038
- #: inc/views/sitemap/xsl-stylesheet.php:146
2039
  msgid "This is a generated XML Sitemap, meant to be consumed by search engines like [Google](https://www.google.com/) or [Bing](https://www.bing.com/)."
2040
  msgstr ""
2041
 
2042
- #. translators: URLs are in Markdown.
2043
 
2044
- #: inc/views/sitemap/xsl-stylesheet.php:162
2045
  msgid "You can find more information on XML sitemaps at [sitemaps.org](https://www.sitemaps.org/)."
2046
  msgstr ""
2047
 
2048
- #: inc/views/sitemap/xsl-stylesheet.php:177
2049
  msgid "URL"
2050
  msgstr ""
2051
 
2052
- #: inc/views/sitemap/xsl-stylesheet.php:181
2053
  msgid "Last Updated"
2054
  msgstr ""
2055
 
2056
- #: inc/views/sitemap/xsl-stylesheet.php:185
2057
  msgid "Priority"
2058
  msgstr ""
2059
 
2060
  #. translators: URLs are in Markdown.
2061
 
2062
- #: inc/views/sitemap/xsl-stylesheet.php:229
2063
  msgid "Generated by [The SEO Framework](https://wordpress.org/plugins/autodescription/)"
2064
  msgstr ""
2065
  #. Plugin Name of the plugin/theme
@@ -2079,5 +2098,5 @@ msgid "Sybre Waaijer"
2079
  msgstr ""
2080
 
2081
  #. Author URI of the plugin/theme
2082
- msgid "https://cyberwire.nl/"
2083
  msgstr ""
2
  # This file is distributed under the same license as the The SEO Framework package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: The SEO Framework 2.9.2-dev-2017.05.05.2\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/autodescription\n"
7
+ "POT-Creation-Date: 2017-05-07 05:43:12+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
15
+ #: inc/classes/admin-init.class.php:233
16
  msgid "Good"
17
  msgstr ""
18
 
19
+ #: inc/classes/admin-init.class.php:234
20
  msgid "Okay"
21
  msgstr ""
22
 
23
+ #: inc/classes/admin-init.class.php:235
24
  msgid "Bad"
25
  msgstr ""
26
 
27
+ #: inc/classes/admin-init.class.php:236
28
  msgid "Unknown"
29
  msgstr ""
30
 
31
+ #: inc/classes/admin-init.class.php:327
32
  msgid "The changes you made will be lost if you navigate away from this page."
33
  msgstr ""
34
 
35
+ #: inc/classes/admin-init.class.php:328
36
  msgid "Are you sure you want to reset all SEO settings to their defaults?"
37
  msgstr ""
38
 
39
+ #. translators: %s = Redirect URL markdown
40
+
41
+ #: inc/classes/admin-init.class.php:593
42
+ msgid "There has been an error redirecting. Refresh the page or follow [this link](%s)."
43
+ msgstr ""
44
+
45
  #: inc/classes/admin-pages.class.php:82
46
  msgid "Save Settings"
47
  msgstr ""
66
  msgid "New SEO Settings have been updated."
67
  msgstr ""
68
 
69
+ #: inc/classes/admin-pages.class.php:109 inc/classes/core.class.php:253
70
  #: inc/classes/site-options.class.php:429
71
  msgid "SEO Settings"
72
  msgstr ""
73
 
74
+ #: inc/classes/admin-pages.class.php:110
75
  msgid "SEO"
76
  msgstr ""
77
 
78
+ #: inc/classes/admin-pages.class.php:243
79
  msgid "General Settings"
80
  msgstr ""
81
 
82
+ #: inc/classes/admin-pages.class.php:254
83
  msgid "Title Settings"
84
  msgstr ""
85
 
86
+ #: inc/classes/admin-pages.class.php:265
87
  msgid "Description Meta Settings"
88
  msgstr ""
89
 
90
+ #: inc/classes/admin-pages.class.php:276
91
  msgid "Home Page Settings"
92
  msgstr ""
93
 
94
+ #: inc/classes/admin-pages.class.php:287
95
  msgid "Social Meta Settings"
96
  msgstr ""
97
 
98
+ #: inc/classes/admin-pages.class.php:298
99
  msgid "Schema Settings"
100
  msgstr ""
101
 
102
+ #: inc/classes/admin-pages.class.php:309
103
  #: inc/views/inpost/seo-settings-singular.php:167
104
  #: inc/views/inpost/seo-settings-tt.php:119
105
  msgid "Robots Meta Settings"
106
  msgstr ""
107
 
108
+ #: inc/classes/admin-pages.class.php:320
109
  msgid "Webmaster Meta Settings"
110
  msgstr ""
111
 
112
+ #: inc/classes/admin-pages.class.php:331
113
  msgid "Sitemap Settings"
114
  msgstr ""
115
 
116
+ #: inc/classes/admin-pages.class.php:342
117
  msgid "Feed Settings"
118
  msgstr ""
119
 
120
+ #: inc/classes/admin-pages.class.php:846 inc/classes/admin-pages.class.php:853
121
  msgctxt "Button hover"
122
  msgid "Select social image"
123
  msgstr ""
124
 
125
+ #: inc/classes/admin-pages.class.php:848 inc/classes/admin-pages.class.php:852
126
  msgid "Select Image"
127
  msgstr ""
128
 
129
+ #: inc/classes/admin-pages.class.php:854
130
  msgid "Change Image"
131
  msgstr ""
132
 
133
+ #: inc/classes/admin-pages.class.php:855
134
  msgid "Remove Image"
135
  msgstr ""
136
 
137
+ #: inc/classes/admin-pages.class.php:856
138
  msgid "Remove selected social image"
139
  msgstr ""
140
 
141
+ #: inc/classes/admin-pages.class.php:857
142
  msgctxt "Frame title"
143
  msgid "Select Social Image"
144
  msgstr ""
145
 
146
+ #: inc/classes/admin-pages.class.php:858
147
  msgid "Use this image"
148
  msgstr ""
149
 
150
+ #: inc/classes/core.class.php:255
151
  msgctxt "As in: The Plugin Home Page"
152
  msgid "Plugin Home"
153
  msgstr ""
154
 
155
+ #: inc/classes/core.class.php:264
156
+ msgid "https://wordpress.org/plugins/the-seo-framework-extension-manager/"
157
+ msgstr ""
158
+
159
+ #: inc/classes/core.class.php:264
160
+ msgctxt "Plugin extensions"
161
+ msgid "Extensions"
162
+ msgstr ""
163
+
164
+ #: inc/classes/core.class.php:316
165
  msgid "Dismiss"
166
  msgstr ""
167
 
168
+ #: inc/classes/core.class.php:413
169
  msgctxt "e.g. en for English, nl for Dutch, fi for Finish, de for German"
170
  msgid "en"
171
  msgstr ""
213
  msgid "No Search"
214
  msgstr ""
215
 
216
+ #: inc/classes/doing-it-right.class.php:361
217
  msgid "Refresh to see the SEO Bar status."
218
  msgstr ""
219
 
220
+ #: inc/classes/doing-it-right.class.php:445
221
  msgid "Post"
222
  msgstr ""
223
 
224
+ #: inc/classes/doing-it-right.class.php:449 inc/classes/inpost.class.php:379
225
  #: inc/classes/term-data.class.php:332
226
+ #: inc/views/metaboxes/schema-metabox.php:204
227
  msgid "Page"
228
  msgstr ""
229
 
230
+ #: inc/classes/doing-it-right.class.php:493
231
  msgid "Failed to fetch post ID."
232
  msgstr ""
233
 
234
  #. translators: %s = But or And
235
 
236
+ #: inc/classes/doing-it-right.class.php:881
237
  msgid "%s the Title contains the Blogname multiple times."
238
  msgstr ""
239
 
240
+ #. translators: 1: Word, 2: Occurrences
241
 
242
+ #: inc/classes/doing-it-right.class.php:1052
243
  msgid "%1$s is used %2$d times."
244
  msgstr ""
245
 
246
  #. Translators: %s = Post / Page / Category, etc.
247
 
248
+ #: inc/classes/doing-it-right.class.php:1097
249
  msgid "%s is being indexed."
250
  msgstr ""
251
 
252
+ #: inc/classes/doing-it-right.class.php:1106
253
  msgid "But you've discouraged indexing for the whole site."
254
  msgstr ""
255
 
256
  #. translators: 1: But or And, 2: Current taxonomy term plural label
257
 
258
+ #: inc/classes/doing-it-right.class.php:1130
259
  msgid "%1$s indexing for %2$s have been discouraged."
260
  msgstr ""
261
 
262
  #. translators: 1 = But or And, 1 = Post/Page
263
 
264
+ #: inc/classes/doing-it-right.class.php:1143
265
  msgid "%1$s the %2$s is protected from public visibility. This means indexing is discouraged."
266
  msgstr ""
267
 
268
  #. translators: %s = But or And
269
 
270
+ #: inc/classes/doing-it-right.class.php:1152
271
  msgid "%s the blog isn't set to public. This means WordPress discourages indexing."
272
  msgstr ""
273
 
274
  #. translators: %s = But or And
275
 
276
+ #: inc/classes/doing-it-right.class.php:1166
277
  msgid "%s there are no posts in this term; therefore, indexing has been discouraged."
278
  msgstr ""
279
 
280
+ #: inc/classes/doing-it-right.class.php:1250
281
  msgid "%s links aren't being followed."
282
  msgstr ""
283
 
284
+ #: inc/classes/doing-it-right.class.php:1256
285
  msgid "%s links are being followed."
286
  msgstr ""
287
 
288
  #. translators: %s = But or And
289
 
290
+ #: inc/classes/doing-it-right.class.php:1268
291
  msgid "%s you've discouraged the following of links for the whole site."
292
  msgstr ""
293
 
294
  #. translators: 1: But or And, 2: Current taxonomy term plural label
295
 
296
+ #: inc/classes/doing-it-right.class.php:1294
297
  msgid "%1$s following for %2$s have been discouraged."
298
  msgstr ""
299
 
300
  #. translators: %s = But or And
301
 
302
+ #: inc/classes/doing-it-right.class.php:1306
303
  msgid "%s the blog isn't set to public. This means WordPress allows the links to be followed regardless."
304
  msgstr ""
305
 
306
+ #: inc/classes/doing-it-right.class.php:1358
307
  msgid "Search Engines aren't allowed to archive this %s."
308
  msgstr ""
309
 
310
+ #: inc/classes/doing-it-right.class.php:1363
311
  msgid "Search Engines are allowed to archive this %s."
312
  msgstr ""
313
 
314
+ #: inc/classes/doing-it-right.class.php:1375
315
  msgid "But you've discouraged archiving for the whole site."
316
  msgstr ""
317
 
318
  #. translators: 1: But or And, 2: Current taxonomy term plural label
319
 
320
+ #: inc/classes/doing-it-right.class.php:1401
321
  msgid "%1$s archiving for %2$s have been discouraged."
322
  msgstr ""
323
 
324
  #. translators: %s = But or And
325
 
326
+ #: inc/classes/doing-it-right.class.php:1414
327
  msgid "%s the blog isn't set to public. This means WordPress allows the blog to be archived regardless."
328
  msgstr ""
329
 
330
+ #: inc/classes/doing-it-right.class.php:1460
331
  msgid "%s isn't being redirected."
332
  msgstr ""
333
 
334
+ #: inc/classes/doing-it-right.class.php:1502
335
+ #: inc/classes/doing-it-right.class.php:1531
336
  msgid "%s is being redirected. This means no SEO values have to be set."
337
  msgstr ""
338
 
339
+ #: inc/classes/doing-it-right.class.php:1505
340
+ #: inc/classes/doing-it-right.class.php:1547
341
  msgid "%s is not being indexed. This means no SEO values have to be set."
342
  msgstr ""
343
 
344
+ #: inc/classes/doing-it-right.class.php:1661
345
  msgid "Title:"
346
  msgstr ""
347
 
348
+ #: inc/classes/doing-it-right.class.php:1662
349
  msgid "Description:"
350
  msgstr ""
351
 
352
+ #: inc/classes/doing-it-right.class.php:1663
353
  msgid "Index:"
354
  msgstr ""
355
 
356
+ #: inc/classes/doing-it-right.class.php:1664
357
  msgid "Follow:"
358
  msgstr ""
359
 
360
+ #: inc/classes/doing-it-right.class.php:1665
361
  msgid "Archive:"
362
  msgstr ""
363
 
364
+ #: inc/classes/doing-it-right.class.php:1666
365
  msgid "Redirect:"
366
  msgstr ""
367
 
368
+ #: inc/classes/doing-it-right.class.php:1668
369
  msgid "Generated: Automatically generated."
370
  msgstr ""
371
 
372
+ #: inc/classes/doing-it-right.class.php:1670
373
  msgctxt "Generated"
374
  msgid "G"
375
  msgstr ""
376
 
377
+ #: inc/classes/doing-it-right.class.php:1671
378
  msgctxt "Title"
379
  msgid "T"
380
  msgstr ""
381
 
382
+ #: inc/classes/doing-it-right.class.php:1672
383
  msgctxt "Description"
384
  msgid "D"
385
  msgstr ""
386
 
387
+ #: inc/classes/doing-it-right.class.php:1673
388
  msgctxt "no-Index"
389
  msgid "I"
390
  msgstr ""
391
 
392
+ #: inc/classes/doing-it-right.class.php:1674
393
  msgctxt "no-Follow"
394
  msgid "F"
395
  msgstr ""
396
 
397
+ #: inc/classes/doing-it-right.class.php:1675
398
  msgctxt "no-Archive"
399
  msgid "A"
400
  msgstr ""
401
 
402
+ #: inc/classes/doing-it-right.class.php:1676
403
  msgctxt "Redirect"
404
  msgid "R"
405
  msgstr ""
406
 
407
+ #: inc/classes/doing-it-right.class.php:1678
408
  msgctxt "But there are..."
409
  msgid "But"
410
  msgstr ""
411
 
412
+ #: inc/classes/doing-it-right.class.php:1679
413
  msgctxt "And there are..."
414
  msgid "And"
415
  msgstr ""
416
 
417
+ #: inc/classes/doing-it-right.class.php:1681
418
  msgid "Length is far too short."
419
  msgstr ""
420
 
421
+ #: inc/classes/doing-it-right.class.php:1682
422
  msgid "Length is too short."
423
  msgstr ""
424
 
425
+ #: inc/classes/doing-it-right.class.php:1683
426
  msgid "Length is too long."
427
  msgstr ""
428
 
429
+ #: inc/classes/doing-it-right.class.php:1684
430
  msgid "Length is far too long."
431
  msgstr ""
432
 
433
+ #: inc/classes/doing-it-right.class.php:1685
434
  msgid "Length is good."
435
  msgstr ""
436
 
441
 
442
  #. translators: 1: Title, 2: Separator, 3: Excerpt
443
 
444
+ #: inc/classes/generate-description.class.php:441
445
  msgctxt "1: Title, 2: Separator, 3: Excerpt"
446
  msgid "%1$s %2$s %3$s"
447
  msgstr ""
448
 
449
  #. translators: 1: Title, 2: on, 3: Blogname
450
 
451
+ #: inc/classes/generate-description.class.php:648
452
  msgctxt "1: Title, 2: on, 3: Blogname"
453
  msgid "%1$s %2$s %3$s"
454
  msgstr ""
455
 
456
  #. translators: Front-end output.
457
 
458
+ #: inc/classes/generate-description.class.php:684
459
  #: inc/views/metaboxes/description-metabox.php:18
460
  msgctxt "Placement. e.g. Post Title \"on\" Blog Name"
461
  msgid "on"
463
 
464
  #. translators: Front-end output.
465
 
466
+ #: inc/classes/generate-description.class.php:746
467
  msgid "Latest posts:"
468
  msgstr ""
469
 
477
  #. translators: Front-end output. 1: Taxonomy singular name, 2: Current
478
  #. taxonomy term
479
 
480
+ #: inc/classes/generate-title.class.php:825
481
+ #: inc/classes/generate-title.class.php:885
482
  msgid "%1$s: %2$s"
483
  msgstr ""
484
 
485
  #. translators: Front-end output.
486
 
487
+ #: inc/classes/generate-title.class.php:829
488
  msgid "Author: %s"
489
  msgstr ""
490
 
491
  #. translators: Front-end output.
492
 
493
+ #: inc/classes/generate-title.class.php:833
494
  msgctxt "yearly archives date format"
495
  msgid "Y"
496
  msgstr ""
497
 
498
  #. translators: Front-end output.
499
 
500
+ #: inc/classes/generate-title.class.php:835
501
  msgid "Year: %s"
502
  msgstr ""
503
 
504
  #. translators: Front-end output.
505
 
506
+ #: inc/classes/generate-title.class.php:838
507
  msgctxt "monthly archives date format"
508
  msgid "F Y"
509
  msgstr ""
510
 
511
  #. translators: Front-end output.
512
 
513
+ #: inc/classes/generate-title.class.php:840
514
  msgid "Month: %s"
515
  msgstr ""
516
 
517
  #. translators: Front-end output.
518
 
519
+ #: inc/classes/generate-title.class.php:843
520
  msgctxt "daily archives date format"
521
  msgid "F j, Y"
522
  msgstr ""
523
 
524
  #. translators: Front-end output.
525
 
526
+ #: inc/classes/generate-title.class.php:845
527
  msgid "Day: %s"
528
  msgstr ""
529
 
530
  #. translators: Front-end output.
531
 
532
+ #: inc/classes/generate-title.class.php:850
533
  msgctxt "post format archive title"
534
  msgid "Asides"
535
  msgstr ""
536
 
537
  #. translators: Front-end output.
538
 
539
+ #: inc/classes/generate-title.class.php:853
540
  msgctxt "post format archive title"
541
  msgid "Galleries"
542
  msgstr ""
543
 
544
  #. translators: Front-end output.
545
 
546
+ #: inc/classes/generate-title.class.php:856
547
  msgctxt "post format archive title"
548
  msgid "Images"
549
  msgstr ""
550
 
551
  #. translators: Front-end output.
552
 
553
+ #: inc/classes/generate-title.class.php:859
554
  msgctxt "post format archive title"
555
  msgid "Videos"
556
  msgstr ""
557
 
558
  #. translators: Front-end output.
559
 
560
+ #: inc/classes/generate-title.class.php:862
561
  msgctxt "post format archive title"
562
  msgid "Quotes"
563
  msgstr ""
564
 
565
  #. translators: Front-end output.
566
 
567
+ #: inc/classes/generate-title.class.php:865
568
  msgctxt "post format archive title"
569
  msgid "Links"
570
  msgstr ""
571
 
572
  #. translators: Front-end output.
573
 
574
+ #: inc/classes/generate-title.class.php:868
575
  msgctxt "post format archive title"
576
  msgid "Statuses"
577
  msgstr ""
578
 
579
  #. translators: Front-end output.
580
 
581
+ #: inc/classes/generate-title.class.php:871
582
  msgctxt "post format archive title"
583
  msgid "Audio"
584
  msgstr ""
585
 
586
  #. translators: Front-end output.
587
 
588
+ #: inc/classes/generate-title.class.php:874
589
  msgctxt "post format archive title"
590
  msgid "Chats"
591
  msgstr ""
592
 
593
  #. translators: Front-end output.
594
 
595
+ #: inc/classes/generate-title.class.php:879
596
  msgid "Archives: %s"
597
  msgstr ""
598
 
599
  #. translators: Front-end output.
600
 
601
+ #: inc/classes/generate-title.class.php:889
602
  msgid "Archives"
603
  msgstr ""
604
 
605
  #. translators: Front-end output.
606
 
607
+ #: inc/classes/generate-title.class.php:1003
608
  msgid "Untitled"
609
  msgstr ""
610
 
611
  #. translators: Front-end output.
612
 
613
+ #: inc/classes/generate-title.class.php:1038
614
  msgid "Search results for:"
615
  msgstr ""
616
 
617
  #. translators: Front-end output
618
 
619
+ #: inc/classes/generate-title.class.php:1214
620
  msgid "Protected: %s"
621
  msgstr ""
622
 
623
  #. translators: Front-end output
624
 
625
+ #: inc/classes/generate-title.class.php:1218
626
  msgid "Private: %s"
627
  msgstr ""
628
 
629
  #. translators: Front-end output.
630
 
631
+ #: inc/classes/generate-title.class.php:1251
632
  msgid "Page %s"
633
  msgstr ""
634
 
635
+ #: inc/classes/inpost.class.php:302 inc/views/inpost/seo-settings-tt.php:70
636
+ msgid "%s SEO Settings"
637
  msgstr ""
638
 
639
+ #. translators: %s = 'The SEO Framework'
640
+
641
+ #: inc/classes/render.class.php:1089
642
+ msgid "Start %s"
643
  msgstr ""
644
 
645
+ #. translators: %s = 'The SEO Framework'
646
+
647
+ #: inc/classes/render.class.php:1091
648
+ msgid "End %s"
649
  msgstr ""
650
 
651
+ #: inc/classes/render.class.php:1092
652
+ msgid "by Sybre Waaijer"
653
  msgstr ""
654
 
655
  #: inc/classes/site-options.class.php:429
661
  msgid "View the new options %s."
662
  msgstr ""
663
 
664
+ #: inc/classes/sitemaps.class.php:297
665
  msgid "Sitemap is generated for this view"
666
  msgstr ""
667
 
668
+ #: inc/classes/sitemaps.class.php:299
669
  msgid "Sitemap is served from cache"
670
  msgstr ""
671
 
672
+ #: inc/classes/sitemaps.class.php:592
673
  msgid "Sitemap is generated on"
674
  msgstr ""
675
 
687
  #: inc/views/metaboxes/homepage-metabox.php:32
688
  #: inc/views/metaboxes/robots-metabox.php:57
689
  #: inc/views/metaboxes/schema-metabox.php:37
690
+ #: inc/views/metaboxes/sitemaps-metabox.php:26
691
  #: inc/views/metaboxes/social-metabox.php:25
692
  #: inc/views/metaboxes/title-metabox.php:61
693
  msgid "General"
947
  msgstr ""
948
 
949
  #: inc/views/metaboxes/general-metabox.php:18
950
+ msgid "Layout"
951
  msgstr ""
952
 
953
  #: inc/views/metaboxes/general-metabox.php:23
954
+ msgid "Performance"
955
  msgstr ""
956
 
957
  #: inc/views/metaboxes/general-metabox.php:28
958
  msgid "Canonical"
959
  msgstr ""
960
 
961
+ #: inc/views/metaboxes/general-metabox.php:51
962
+ msgid "Administrative Layout Settings"
963
+ msgstr ""
964
+
965
  #: inc/views/metaboxes/general-metabox.php:52
966
+ msgid "SEO hints can be visually displayed throughout the dashboard."
967
+ msgstr ""
968
+
969
+ #: inc/views/metaboxes/general-metabox.php:57
970
+ msgid "SEO Bar Settings"
971
+ msgstr ""
972
+
973
+ #: inc/views/metaboxes/general-metabox.php:63
974
+ msgid "Display the SEO Bar in overview tables?"
975
+ msgstr ""
976
+
977
+ #: inc/views/metaboxes/general-metabox.php:69
978
+ msgid "Display the SEO Bar in the SEO Settings metabox?"
979
+ msgstr ""
980
+
981
+ #: inc/views/metaboxes/general-metabox.php:80
982
  msgid "Performance Settings"
983
  msgstr ""
984
 
985
+ #: inc/views/metaboxes/general-metabox.php:81
986
  msgid "In order to improve performance, generated SEO output can be stored in the database as transient cache."
987
  msgstr ""
988
 
989
+ #: inc/views/metaboxes/general-metabox.php:82
990
  msgid "If your website has thousands of pages, or if other forms of caching are used, you might wish to adjust these options."
991
  msgstr ""
992
 
993
+ #: inc/views/metaboxes/general-metabox.php:87
994
  msgid "Transient Cache Settings"
995
  msgstr ""
996
 
997
+ #: inc/views/metaboxes/general-metabox.php:93
998
  msgid "Enable automated description output cache?"
999
  msgstr ""
1000
 
1001
+ #: inc/views/metaboxes/general-metabox.php:94
1002
  msgid "Description generation can use a lot of server resources when it reads the page content."
1003
  msgstr ""
1004
 
1005
+ #: inc/views/metaboxes/general-metabox.php:100
1006
  msgid "Enable automated Schema output cache?"
1007
  msgstr ""
1008
 
1009
+ #: inc/views/metaboxes/general-metabox.php:101
1010
  msgid "Schema.org output generally makes multiple calls to the database."
1011
  msgstr ""
1012
 
1013
+ #: inc/views/metaboxes/general-metabox.php:107
1014
  msgid "Enable sitemap generation cache?"
1015
  msgstr ""
1016
 
1017
+ #: inc/views/metaboxes/general-metabox.php:108
1018
  msgid "Generating the sitemap can use a lot of server resources."
1019
  msgstr ""
1020
 
1021
+ #: inc/views/metaboxes/general-metabox.php:120
1022
  msgid "Object Cache Settings"
1023
  msgstr ""
1024
 
1025
+ #: inc/views/metaboxes/general-metabox.php:126
1026
  msgid "Enable object cache?"
1027
  msgstr ""
1028
 
1029
+ #: inc/views/metaboxes/general-metabox.php:127
1030
  msgid "Object cache generally works faster than transient cache"
1031
  msgstr ""
1032
 
1033
+ #: inc/views/metaboxes/general-metabox.php:128
1034
  msgid "An object cache handler has been detected. If you enable this option, you might wish to disable description and Schema transient caching."
1035
  msgstr ""
1036
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1037
  #: inc/views/metaboxes/general-metabox.php:138
1038
  msgid "Canonical URL Settings"
1039
  msgstr ""
1047
  msgstr ""
1048
 
1049
  #: inc/views/metaboxes/general-metabox.php:141
1050
+ msgid "Only adjust these options if you are aware of their SEO effects."
1051
  msgstr ""
1052
 
1053
  #: inc/views/metaboxes/general-metabox.php:146
1497
  msgid "Social Pages connected to this website"
1498
  msgstr ""
1499
 
1500
+ #: inc/views/metaboxes/schema-metabox.php:191
1501
  msgid "Don't have a page at a site or is the profile only privately accessible? Leave that field empty. Unsure? Fill it in anyway."
1502
  msgstr ""
1503
 
1504
+ #: inc/views/metaboxes/schema-metabox.php:192
1505
  msgid "Add the link that leads directly to the social page of this website."
1506
  msgstr ""
1507
 
1508
+ #: inc/views/metaboxes/schema-metabox.php:194
1509
  msgctxt "No spaces. E.g. https://facebook.com/RelatedProfile"
1510
  msgid "RelatedProfile"
1511
  msgstr ""
1512
 
1513
+ #: inc/views/metaboxes/schema-metabox.php:195
1514
  msgctxt "Social Profile"
1515
  msgid "Profile"
1516
  msgstr ""
1517
 
1518
+ #: inc/views/metaboxes/schema-metabox.php:260
1519
  msgid "Blog"
1520
  msgstr ""
1521
 
1522
+ #: inc/views/metaboxes/sitemaps-metabox.php:36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1523
  msgid "Timestamps"
1524
  msgstr ""
1525
 
1526
+ #: inc/views/metaboxes/sitemaps-metabox.php:41
1527
  msgctxt "Ping or notify Search Engine"
1528
  msgid "Ping"
1529
  msgstr ""
1530
 
1531
+ #: inc/views/metaboxes/sitemaps-metabox.php:46
1532
  msgid "Style"
1533
  msgstr ""
1534
 
1535
+ #: inc/views/metaboxes/sitemaps-metabox.php:85
1536
  msgid "Sitemap Integration Settings"
1537
  msgstr ""
1538
 
1539
+ #: inc/views/metaboxes/sitemaps-metabox.php:89
1540
  msgid "Another active sitemap plugin has been detected. This means that the sitemap functionality has been replaced."
1541
  msgstr ""
1542
 
1543
+ #: inc/views/metaboxes/sitemaps-metabox.php:91
1544
  msgid "A sitemap has been detected in the root folder of your website. This means that the sitemap functionality has no effect."
1545
  msgstr ""
1546
 
1547
+ #: inc/views/metaboxes/sitemaps-metabox.php:93
1548
  msgid "The Sitemap is an XML file that lists pages and posts for your website along with optional metadata about each post or page. This helps Search Engines crawl your website more easily."
1549
  msgstr ""
1550
 
1551
+ #: inc/views/metaboxes/sitemaps-metabox.php:94
1552
  msgid "The optional metadata include the post and page modified time and a page priority indication, which is automated."
1553
  msgstr ""
1554
 
1555
+ #: inc/views/metaboxes/sitemaps-metabox.php:99
1556
  msgid "Sitemap Output"
1557
  msgstr ""
1558
 
1559
+ #: inc/views/metaboxes/sitemaps-metabox.php:106
1560
  msgid "Output Sitemap?"
1561
  msgstr ""
1562
 
1563
+ #: inc/views/metaboxes/sitemaps-metabox.php:114
1564
  msgid "View sitemap"
1565
  msgstr ""
1566
 
1567
+ #: inc/views/metaboxes/sitemaps-metabox.php:114
1568
+ #: inc/views/metaboxes/sitemaps-metabox.php:132
1569
+ #: inc/views/metaboxes/sitemaps-metabox.php:170
1570
+ msgctxt "The sitemap can be found %s."
1571
+ msgid "here"
1572
+ msgstr ""
1573
+
1574
+ #: inc/views/metaboxes/sitemaps-metabox.php:115
1575
  msgctxt "%s = here"
1576
  msgid "The sitemap can be found %s."
1577
  msgstr ""
1578
 
1579
+ #: inc/views/metaboxes/sitemaps-metabox.php:124
1580
  msgid "Robots.txt Settings"
1581
  msgstr ""
1582
 
1583
+ #: inc/views/metaboxes/sitemaps-metabox.php:128
1584
  msgid "A robots.txt file has been detected in the root folder of your website; therefore no settings are able to alter its output."
1585
  msgstr ""
1586
 
1587
+ #: inc/views/metaboxes/sitemaps-metabox.php:132
1588
+ msgid "Permalink Settings"
1589
+ msgstr ""
1590
+
1591
+ #: inc/views/metaboxes/sitemaps-metabox.php:134
1592
+ msgid "You're using the plain permalink structure."
1593
+ msgstr ""
1594
+
1595
+ #: inc/views/metaboxes/sitemaps-metabox.php:135
1596
+ msgid "This means the robots.txt file can't be outputted through the WordPress rewrite rules."
1597
+ msgstr ""
1598
+
1599
+ #: inc/views/metaboxes/sitemaps-metabox.php:137
1600
+ msgctxt "%s = here"
1601
+ msgid "Change your Permalink Settings %s (Recommended: \"Post name\")."
1602
+ msgstr ""
1603
+
1604
+ #: inc/views/metaboxes/sitemaps-metabox.php:141
1605
  msgid "The robots.txt file is the first thing Search Engines look for. If you add the sitemap location in the robots.txt file, then Search Engines will look for and index the sitemap."
1606
  msgstr ""
1607
 
1608
+ #: inc/views/metaboxes/sitemaps-metabox.php:142
1609
  msgid "If you do not add the sitemap location to the robots.txt file, you will need to notify Search Engines manually through the Webmaster Console provided by the Search Engines."
1610
  msgstr ""
1611
 
1612
+ #: inc/views/metaboxes/sitemaps-metabox.php:147
1613
  msgid "Add sitemap location in robots.txt"
1614
  msgstr ""
1615
 
1616
+ #: inc/views/metaboxes/sitemaps-metabox.php:154
1617
  msgid "Add sitemap location in robots?"
1618
  msgstr ""
1619
 
1620
+ #: inc/views/metaboxes/sitemaps-metabox.php:154
1621
  msgid "This only has effect if the sitemap is active"
1622
  msgstr ""
1623
 
1624
+ #: inc/views/metaboxes/sitemaps-metabox.php:161
1625
  msgid "No robots.txt file can be generated on subdirectory installations."
1626
  msgstr ""
1627
 
1628
+ #: inc/views/metaboxes/sitemaps-metabox.php:164
1629
  msgid "Another robots.txt sitemap location addition has been detected."
1630
  msgstr ""
1631
 
1632
+ #: inc/views/metaboxes/sitemaps-metabox.php:170
1633
  msgid "View robots.txt"
1634
  msgstr ""
1635
 
1636
+ #: inc/views/metaboxes/sitemaps-metabox.php:172
1637
  msgctxt "%s = here"
1638
  msgid "The robots.txt file can be found %s."
1639
  msgstr ""
1640
 
1641
+ #: inc/views/metaboxes/sitemaps-metabox.php:192
1642
  msgid "Timestamps Settings"
1643
  msgstr ""
1644
 
1645
+ #: inc/views/metaboxes/sitemaps-metabox.php:193
1646
  msgid "The modified time suggests to Search Engines where to look for content changes. It has no impact on the SEO value unless you drastically change pages or posts. It then depends on how well your content is constructed."
1647
  msgstr ""
1648
 
1649
+ #: inc/views/metaboxes/sitemaps-metabox.php:194
1650
  msgid "By default, the sitemap only outputs the modified date if you've enabled them within the Social Metabox. This setting overrides those settings for the Sitemap."
1651
  msgstr ""
1652
 
1653
+ #: inc/views/metaboxes/sitemaps-metabox.php:199
1654
  msgid "Output Modified Date"
1655
  msgstr ""
1656
 
1657
+ #: inc/views/metaboxes/sitemaps-metabox.php:206
1658
  msgid "Add %s to the sitemap?"
1659
  msgstr ""
1660
 
1661
+ #: inc/views/metaboxes/sitemaps-metabox.php:216
1662
  msgid "Timestamp Format Settings"
1663
  msgstr ""
1664
 
1665
+ #: inc/views/metaboxes/sitemaps-metabox.php:217
1666
  msgid "Determines how specific the modification timestamp is."
1667
  msgstr ""
1668
 
1669
+ #: inc/views/metaboxes/sitemaps-metabox.php:223
1670
  msgid "Complete date"
1671
  msgstr ""
1672
 
1673
+ #: inc/views/metaboxes/sitemaps-metabox.php:229
1674
  msgid "Complete date plus hours, minutes and timezone"
1675
  msgstr ""
1676
 
1677
+ #: inc/views/metaboxes/sitemaps-metabox.php:239
1678
  msgid "Ping Settings"
1679
  msgstr ""
1680
 
1681
+ #: inc/views/metaboxes/sitemaps-metabox.php:240
1682
  msgid "Notifying Search Engines of a sitemap change is helpful to get your content indexed as soon as possible."
1683
  msgstr ""
1684
 
1685
+ #: inc/views/metaboxes/sitemaps-metabox.php:241
1686
  msgid "By default this will happen at most once an hour."
1687
  msgstr ""
1688
 
1689
+ #: inc/views/metaboxes/sitemaps-metabox.php:246
1690
  msgid "Notify Search Engines"
1691
  msgstr ""
1692
 
1693
+ #: inc/views/metaboxes/sitemaps-metabox.php:258
1694
  msgid "Notify %s about sitemap changes?"
1695
  msgstr ""
1696
 
1697
+ #: inc/views/metaboxes/sitemaps-metabox.php:269
1698
  msgid "Sitemap Styling Settings"
1699
  msgstr ""
1700
 
1701
+ #: inc/views/metaboxes/sitemaps-metabox.php:272
1702
  msgid "You can style the sitemap to give it a more personal look. Styling the sitemap has no SEO value whatsoever."
1703
  msgstr ""
1704
 
1705
+ #: inc/views/metaboxes/sitemaps-metabox.php:277
1706
  msgid "Enable styling"
1707
  msgstr ""
1708
 
1709
+ #: inc/views/metaboxes/sitemaps-metabox.php:284
1710
  msgid "Style Sitemap?"
1711
  msgstr ""
1712
 
1713
+ #: inc/views/metaboxes/sitemaps-metabox.php:284
1714
  msgid "This makes the sitemap more readable for humans"
1715
  msgstr ""
1716
 
1717
+ #: inc/views/metaboxes/sitemaps-metabox.php:293
1718
  msgid "Style configuration"
1719
  msgstr ""
1720
 
1721
+ #: inc/views/metaboxes/sitemaps-metabox.php:301
1722
  msgid "Add site logo?"
1723
  msgstr ""
1724
 
1725
+ #: inc/views/metaboxes/sitemaps-metabox.php:301
1726
  msgid "The logo is set in Customizer"
1727
  msgstr ""
1728
 
1729
+ #: inc/views/metaboxes/sitemaps-metabox.php:314
1730
  msgid "Sitemap header background color"
1731
  msgstr ""
1732
 
1733
+ #: inc/views/metaboxes/sitemaps-metabox.php:323
1734
  msgid "Sitemap title and lines color"
1735
  msgstr ""
1736
 
2048
  msgstr ""
2049
 
2050
  #: inc/views/sitemap/xsl-stylesheet.php:8
2051
+ #: inc/views/sitemap/xsl-stylesheet.php:142
2052
  msgid "XML Sitemap"
2053
  msgstr ""
2054
 
2055
+ #. translators: URLs are in Markdown. Don't forget to localize the URLs.
2056
 
2057
+ #: inc/views/sitemap/xsl-stylesheet.php:148
2058
  msgid "This is a generated XML Sitemap, meant to be consumed by search engines like [Google](https://www.google.com/) or [Bing](https://www.bing.com/)."
2059
  msgstr ""
2060
 
2061
+ #. translators: URLs are in Markdown. Don't localize this URL.
2062
 
2063
+ #: inc/views/sitemap/xsl-stylesheet.php:164
2064
  msgid "You can find more information on XML sitemaps at [sitemaps.org](https://www.sitemaps.org/)."
2065
  msgstr ""
2066
 
2067
+ #: inc/views/sitemap/xsl-stylesheet.php:179
2068
  msgid "URL"
2069
  msgstr ""
2070
 
2071
+ #: inc/views/sitemap/xsl-stylesheet.php:183
2072
  msgid "Last Updated"
2073
  msgstr ""
2074
 
2075
+ #: inc/views/sitemap/xsl-stylesheet.php:187
2076
  msgid "Priority"
2077
  msgstr ""
2078
 
2079
  #. translators: URLs are in Markdown.
2080
 
2081
+ #: inc/views/sitemap/xsl-stylesheet.php:231
2082
  msgid "Generated by [The SEO Framework](https://wordpress.org/plugins/autodescription/)"
2083
  msgstr ""
2084
  #. Plugin Name of the plugin/theme
2098
  msgstr ""
2099
 
2100
  #. Author URI of the plugin/theme
2101
+ msgid "https://theseoframework.com/"
2102
  msgstr ""
lib/css/tsf-rtl.css CHANGED
@@ -734,6 +734,8 @@ input[type="radio"].tsf-flex-nav-tab-radio {
734
  .tsf-flex-tab-content {
735
  -webkit-flex: 1 0 100%;
736
  flex: 1 0 100%;
 
 
737
  -webkit-flex-wrap: nowrap;
738
  -ms-flex-wrap: nowrap;
739
  flex-wrap: nowrap;
734
  .tsf-flex-tab-content {
735
  -webkit-flex: 1 0 100%;
736
  flex: 1 0 100%;
737
+ /* EdgeHTML overflow fix */
738
+ max-width: 100%;
739
  -webkit-flex-wrap: nowrap;
740
  -ms-flex-wrap: nowrap;
741
  flex-wrap: nowrap;
lib/css/tsf-rtl.min.css CHANGED
@@ -1 +1 @@
1
- #tsf-title-offset,#tsf-title-placeholder{right:0;white-space:pre;position:absolute}.tsf-metaboxes .tsf-top-buttons,.tsf-metaboxes .tsf-top-wrap>h1,.tsf-metaboxes .tsf-top-wrap>h2{float:left}.tsf-notice{position:relative;clear:both}.tsf-notice.tsf-show-icon p:before{content:'';margin-left:12px;background:0 0;display:inline-block;font:400 14px/16px dashicons;speak:none;height:16px;text-align:center;vertical-align:middle;width:16px;line-height:14px;-webkit-font-smoothing:antialiased}.error.tsf-notice.tsf-show-icon p:before{color:#dd3811;content:"\f534"}.notice-warning.tsf-notice.tsf-show-icon p:before{color:#ffa01b;content:"\f227"}.updated.tsf-notice.tsf-show-icon p:before{color:#0cc34b;font-size:16px;content:"\f147"}a.tsf-dismiss{position:absolute;top:0;left:1px;border:none;margin:0;padding:9px;background:0 0;color:#b4b9be;cursor:pointer;text-decoration:none}a.tsf-dismiss:before{background:0 0;content:"\f153";display:block;font:400 16px/20px dashicons;speak:none;height:20px;text-align:center;width:20px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a.tsf-dismiss:hover{color:#c00}table.wp-list-table .column-name{width:15%}table.wp-list-table .column-icl_translations,table.wp-list-table .column-is_in_stock,table.wp-list-table .column-price,table.wp-list-table .column-sku,th.column-tsf-seo-bar-wrap~th{width:8%}.tsf-seo-bar a{text-decoration:none;font-size:13px}#tsf-title-wrap{position:relative;display:block;padding:0;height:auto;width:auto;overflow:hidden}#tsf-title-offset{visibility:hidden;height:0;display:inline-block;color:transparent}#tsf-title-placeholder{color:#777;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-sizing:content-box;top:0;overflow:hidden;text-overflow:ellipsis}.tsf-counter{font-weight:600;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}span.tsf-count-bad{color:#dd3811}span.tsf-count-okay{color:#ffa700}span.tsf-count-good{color:#0cc34b}span.tsf-counter-one{color:#fff;border-radius:4em;padding:0 .5em;min-width:2em;display:inline-block;text-align:center;vertical-align:baseline}span.tsf-counter-one.tsf-count-bad{background-color:#dd3811}span.tsf-counter-one.tsf-count-okay{background-color:#ffa700}span.tsf-counter-one.tsf-count-good{background-color:#0cc34b}#tsf-seo-bar-wrap{width:18%}th:last-of-type#tsf-seo-bar-wrap{width:160px}span.tsf-seo-bar{display:block;width:95%;max-width:220px;border-radius:0;padding:3px;text-shadow:0 0 3px rgba(0,0,0,.3)}span.tsf-seo-bar.tsf-100{width:100%}span.tsf-seo-bar-inner-wrap{display:table;width:100%;border-radius:0;margin:0 auto;border-collapse:separate;border-spacing:0;vertical-align:middle;position:relative}span.tsf-seo-bar-section-wrap{display:table-cell;border-collapse:collapse}.tsf-seo-bar-inner-wrap a{display:table;width:100%;color:#fff;text-align:center;cursor:help;height:100%;min-width:12px;vertical-align:top;line-height:1.625em;box-shadow:2px 0 0 -1px rgba(0,0,0,.1) inset,-2px 0 0 -1px rgba(0,0,0,.1) inset}span.tsf-seo-bar.pill,span.tsf-seo-bar.pill span.tsf-seo-bar-inner-wrap{border-radius:30px}span.tsf-seo-bar.pill span.tsf-seo-bar-inner-wrap a{box-shadow:2px 6px 3px -2px rgba(255,255,255,.2) inset,-2px -6px 3px -2px rgba(41,41,41,.2) inset,0 0 1px rgba(41,41,41,.6)}.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:last-of-type,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:last-of-type a{border-top-left-radius:30px;border-bottom-left-radius:30px}.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:first-of-type,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:first-of-type a{border-top-right-radius:30px;border-bottom-right-radius:30px}.tsf-100{width:100%}.tsf-60{width:60%}.tsf-50{width:50%}.tsf-40{width:40%}.tsf-33{width:33.333%}.tsf-25{width:25%}.tsf-20{width:20%}.tsf-16{width:16.666%}.tsf-12-5{width:12.5%}.tsf-11{width:11.333%}.tsf-10{width:10%}.tsf-seo-bar-bad{background-color:#dd3811}.tsf-seo-bar-okay{background-color:#ffa700}.tsf-seo-bar-good{background-color:#0cc34b}.tsf-seo-bar-unknown{background-color:#007bd2}span.tsf-seo-bar .tsf-explanation-desc{position:absolute;width:auto;min-width:90%;max-width:220px;font-weight:600;background:#007bd2;padding:8px 12px;color:#fdfdfd;border-radius:0;z-index:900142;box-shadow:0 0 2px rgba(0,0,0,.6);left:0;right:0;text-align:left;pointer-events:none}span.tsf-seo-bar .tsf-explanation-desc span{text-decoration:underline}span.tsf-seo-bar .tsf-explanation-desc div{width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;border-top:12px solid #007bd2;position:absolute;bottom:-8px;z-index:9999999;left:0}.tsf-seo-bar-wrap.column-tsf-seo-bar-temp{overflow:initial!important;min-width:160px}#col-container,#col-right{overflow:initial}.tsf-metaboxes{box-sizing:border-box;max-width:690px;padding-bottom:20px}.tsf-metaboxes .tsf-top-wrap{width:100%;display:inline-block;vertical-align:top}.tsf-metaboxes .metabox-holder{clear:both}.tsf-metaboxes .tsf-bottom-buttons{text-align:left}.tsf-metaboxes .tsf-bottom-buttons input,.tsf-metaboxes .tsf-top-buttons input{margin-left:10px}.tsf-metaboxes #tsf-description-separator,.tsf-metaboxes #tsf-title-separator{display:table;width:100%;border-collapse:collapse;border-spacing:0}.tsf-metaboxes #tsf-description-separator input,.tsf-metaboxes #tsf-title-separator input{display:none;float:left;width:0;min-width:0;opacity:0}.tsf-metaboxes #tsf-description-separator label,.tsf-metaboxes #tsf-title-separator label{display:inline-block;width:auto;min-width:28px;min-height:28px;margin:3px;-moz-margin-end:1.5px;-moz-margin-start:1.5px;padding:0 4px;border:1px solid #ccc;line-height:28px;text-align:center;cursor:pointer;box-shadow:-1px -1px 1px #aaa inset;font-size:16px}.tsf-metaboxes #tsf-description-separator label.tsf-recommended,.tsf-metaboxes #tsf-title-separator label.tsf-recommended{border:1px solid #0cc34b;box-shadow:-1px -1px 1px #0cc34b inset}.tsf-metaboxes #tsf-description-separator input:hover+label,.tsf-metaboxes #tsf-description-separator label:hover,.tsf-metaboxes #tsf-title-separator input:hover+label,.tsf-metaboxes #tsf-title-separator label:hover{box-shadow:1px 1px 1px #aaa inset;background-color:#fff}.tsf-metaboxes #tsf-description-separator input:checked+label,.tsf-metaboxes #tsf-title-separator input:checked+label{box-shadow:1px 1px 1px #333 inset;background-color:#fff}.tsf-metaboxes #tsf-home-title-location,.tsf-metaboxes #tsf-title-location{display:block}.tsf-metaboxes #tsf-home-title-location label span,.tsf-metaboxes #tsf-title-location label span,.tsf-metaboxes #tsf-twitter-cards label span{display:inline-block;min-width:60px;vertical-align:baseline}.tsf-metaboxes #tsf-twitter-cards label span{min-width:150px}.tsf-metaboxes #tsf-home-title-location label .tsf-sep-js,.tsf-metaboxes #tsf-home-title-location label span.tsf-custom-blogname-js,.tsf-metaboxes #tsf-home-title-location label span.tsf-custom-tagline-js,.tsf-metaboxes #tsf-home-title-location label span.tsf-custom-title-js,.tsf-metaboxes #tsf-title-location label .tsf-sep-js{display:inline;min-width:0;white-space:pre}.tsf-metaboxes .tsf-nav-tab-wrapper,.tsf-metaboxes .tsf-tab-no-js{position:relative;clear:both;width:100%;display:inline-block;border-bottom:1px solid #ccc;line-height:inherit;padding:8px 12px 0;margin:-4px -12px}.tsf-metaboxes .tsf-nav-tab{float:right;border:1px solid #ccc;margin-right:.5em;margin-bottom:-1px;padding:5px 14px;font-size:12px;line-height:16px;background:#f1f1f1;color:#555;font-weight:600}.tsf-metaboxes .tsf-dashicons-tabs{font-size:initial;display:inline;vertical-align:text-bottom}.tsf-metaboxes .tsf-tabs-radio{display:none;width:0;height:0;position:absolute;left:-9001px}.tsf-metaboxes .tsf-active-tab,.tsf-metaboxes .tsf-tabs-radio:checked+label{background-color:inherit;border-bottom-color:#fff;color:#000}.tsf-metaboxes .tsf-tabs-content{margin:1.33em auto 0}.tsf-metaboxes .tsf-content-no-js{margin:1.33em auto}body.js .tsf-metaboxes .tsf-tabs-content{display:none}body.js .tsf-metaboxes .tsf-tabs-content.tsf-active-tab-content{display:block}#tsf-inpost-box .inside,.tsf-flex{box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 1 auto;flex:1 1 auto;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:flex-start;justify-content:flex-start}#tsf-inpost-box.closed .inside,body.js .tsf-flex-tab-content{display:none}#tsf-inpost-box .inside{margin:0;padding:0;-webkit-flex:1 0 100%;flex:1 0 100%;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.tsf-flex-inside-wrap{-webkit-flex-direction:row;flex-direction:row;-webkit-flex:1 1 auto;flex:1 1 auto}.tsf-flex-setting{width:100%;-webkit-flex-direction:row;flex-direction:row}.tsf-flex-setting-input,.tsf-flex-setting-label{background-color:#fff;padding:15px 12px;-webkit-flex:10 1 350px;flex:10 1 350px;box-shadow:0 0 0 1px #e9e9e9}.tsf-flex-setting-label{background-color:#f9f9f9;-webkit-flex:1 1 200px;flex:1 1 200px}.tsf-flex-setting-input{-webkit-justify-content:center;justify-content:center}.tsf-flex-setting-label-item{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-grow:0;flex-grow:0}.tsf-flex-setting-label-inner-wrap{-webkit-justify-content:center;justify-content:center}.tsf-flex-setting-label-item>*{margin-right:4px}.tsf-flex-setting-label-item>:last-child{margin-right:0}.tsf-flex-setting-label .tsf-counter{font-weight:400;color:#666;margin-top:15px}.tsf-social-image-buttons{margin-top:15px;margin-left:1px}.tsf-flex-setting-input textarea{max-height:250px}input[type=radio].tsf-flex-nav-tab-radio{display:none;width:0;height:0;margin:0;padding:0;position:absolute;left:-9001px}.tsf-flex-nav-tab-wrapper{background-color:#fcfcfc;border-bottom:2px solid #dadada;-webkit-align-items:baseline;align-items:baseline;-webkit-flex-direction:row;flex-direction:row;-webkit-flex:1 1 100%;flex:1 1 100%;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-width:100%}.tsf-flex-nav-tab-inner{-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex:1 0 auto;flex:1 0 auto}.tsf-flex-nav-tab{-webkit-flex-direction:row;flex-direction:row;-webkit-flex:1 1 auto;flex:1 1 auto;max-width:125px}.tsf-flex-nav-tab-label{padding:12px;text-align:center;-webkit-flex-direction:row;flex-direction:row;box-shadow:0 0 0 0 transparent inset;-webkit-transition:box-shadow .15s ease-out;-o-transition:box-shadow .15s ease-out;transition:box-shadow .15s ease-out;-webkit-align-items:center;align-items:center;-webkit-align-content:space-between;align-content:space-between}.tsf-flex-nav-dashicon,.tsf-flex-nav-name{-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.tsf-flex-nav-tab .tsf-flex-nav-tab-radio:checked+.tsf-flex-nav-tab-label{box-shadow:0 -2px 0 0 #007bd2 inset;-webkit-transition:box-shadow .25s ease-in;-o-transition:box-shadow .25s ease-in;transition:box-shadow .25s ease-in}.tsf-flex-tab-content{-webkit-flex:1 0 100%;flex:1 0 100%;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}body.js .tsf-flex-tab-content.tsf-flex-tab-content-active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tsf-flex-tabs-content-no-js{background-color:#f3f3f3;border-bottom:1px solid #dadada;box-shadow:0 2px 0 0 #dadada inset}.tsf-flex-tab-no-js{-webkit-align-items:baseline;align-items:baseline;-webkit-flex-direction:row;flex-direction:row;flex:1 1 100%}.tsf-flex-tab-no-js .tsf-flex-nav-tab{padding:12px;min-width:125px;box-shadow:0 -2px 0 0 #007bd2 inset;-webkit-flex-direction:row;flex-direction:row;-webkit-flex:0 1 auto;flex:0 1 auto}.tsf-metaboxes .tsf-default-selected{border-color:#1c9d38}.tsf-metaboxes .tsf-default-selected:checked:before{color:#1c9d38}.tsf-metaboxes .tsf-warning-selected{border-color:#dd3811}.tsf-metaboxes .tsf-warning-selected:checked:before{color:#dd3811}.tsf-fields{font-size:13px;line-height:1.5;margin:1em 0}.tsf-fields .tsf-toblock{display:block;width:100%;margin-bottom:4px}.tsf-fields p.description{margin:7px 0 5px;color:#666}.tsf-option-spacer{margin:1em 0}.tsf-checkbox-wrapper{margin-top:15px}.tsf-checkbox-wrapper:first-child{margin-top:0}.tsf-counter .tsf-ajax{margin-right:3px}.tsf-ajax:before{display:inline-block;line-height:1;font-family:dashicons;font-style:normal;font-weight:400;font-size:1.225em;vertical-align:middle;content:""}.tsf-ajax.tsf-loading:before{content:"\f463";color:#007bd2;-webkit-animation:tsf-spin 1.5s linear infinite;-moz-animation:tsf-spin 1.5s linear infinite;-o-animation:tsf-spin 1.5s linear infinite;animation:tsf-spin 1.5s linear infinite}.tsf-ajax.tsf-error:before{content:"\f158";color:#dd3811}.tsf-ajax.tsf-success:before{content:"\f147";color:#0cc34b}a.tsf-set-social-image.button{margin-left:7px}#tsf-inpost-box input[type=text]::-webkit-input-placeholder,#tsf-inpost-box textarea::-webkit-input-placeholder,.tsf-metaboxes input[type=text]::-webkit-input-placeholder,.tsf-metaboxes textarea::-webkit-input-placeholder{-webkit-transition:color .33s ease-in,text-shadow .33s ease-in;-o-transition:color .33s ease-in,text-shadow .33s ease-in;transition:color .33s ease-in,text-shadow .33s ease-in}#tsf-inpost-box input[type=text]::-moz-placeholder,#tsf-inpost-box textarea::-moz-placeholder,.tsf-metaboxes input[type=text]::-moz-placeholder,.tsf-metaboxes textarea::-moz-placeholder{-moz-transition:color .33s ease-in,text-shadow .33s ease-in;transition:color .33s ease-in,text-shadow .33s ease-in}#tsf-inpost-box input[type=text]:-ms-input-placeholder,#tsf-inpost-box textarea:-ms-input-placeholder,.tsf-metaboxes input[type=text]:-ms-input-placeholder,.tsf-metaboxes textarea:-ms-input-placeholder{transition:color .33s ease-in,text-shadow .33s ease-in}#tsf-inpost-box input[type=text]:focus::-webkit-input-placeholder,#tsf-inpost-box textarea:focus::-webkit-input-placeholder,.tsf-metaboxes input[type=text]:focus::-webkit-input-placeholder,.tsf-metaboxes textarea:focus::-webkit-input-placeholder{color:transparent;text-shadow:0 0 1px rgba(114,119,124,.75)}#tsf-inpost-box input[type=text]:focus::-moz-placeholder,#tsf-inpost-box textarea:focus::-moz-placeholder,.tsf-metaboxe textarea:focus::-moz-placeholder,.tsf-metaboxes input[type=text]:focus::-moz-placeholder{color:transparent;text-shadow:0 0 1px rgba(114,119,124,.75)}#tsf-inpost-box input[type=text]:focus:-ms-input-placeholder,#tsf-inpost-box textarea:focus:-ms-input-placeholder,.tsf-metaboxes input[type=text]:focus:-ms-input-placeholder,.tsf-metaboxes textarea:focus:-ms-input-placeholder{color:transparent;text-shadow:0 0 1px rgba(114,119,124,.75)}@-webkit-keyframes tsf-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes tsf-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@media screen and (max-width:782px){.tsf-inpost-box p.tsf-fields,.tsf-metaboxes p.tsf-fields{line-height:2.8}.tsf-metaboxes #tsf-home-title-location label span,.tsf-metaboxes #tsf-title-location label span{min-width:40px}.wp-list-table .is-expanded td.tsf-seo-bar-wrap:not(.hidden){overflow:initial!important}}@media screen and (max-width:642px){.tsf-metaboxes span.tsf-nav-desktop{display:none}}@media screen and (max-width:510px){span.tsf-seo-bar.tsf-100{width:inherit}}@-moz-document url-prefix(){.tsf-metaboxes #tsf-description-separator label,.tsf-metaboxes #tsf-title-separator label{margin:3px 1px}@media only screen and (min-width:768px){.widefat tr td.column-title:nth-child(2):nth-last-child(n+6),.widefat tr td.title:nth-child(2):nth-last-child(n+6),.widefat tr th.column-title:nth-child(2):nth-last-child(n+6),.widefat tr th.title:nth-child(2):nth-last-child(n+6){min-width:1em;width:25%;max-width:100%;white-space:unset}}.tsf-metaboxes .tsf-default-selected{box-shadow:0 0 2px 0 #1c9d38}.tsf-metaboxes .tsf-warning-selected{box-shadow:0 0 2px 0 #dd3811}.tsf-metaboxes legend h4{margin:2px 0}}.tsf-flex-hide-if-no-js,body.js .tsf-flex-hide-if-js{display:none}body.js .tsf-flex-hide-if-no-js{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}
1
+ #tsf-title-offset,#tsf-title-placeholder{right:0;white-space:pre;position:absolute}.tsf-metaboxes .tsf-top-buttons,.tsf-metaboxes .tsf-top-wrap>h1,.tsf-metaboxes .tsf-top-wrap>h2{float:left}.tsf-notice{position:relative;clear:both}.tsf-notice.tsf-show-icon p:before{content:'';margin-left:12px;background:0 0;display:inline-block;font:400 14px/16px dashicons;speak:none;height:16px;text-align:center;vertical-align:middle;width:16px;line-height:14px;-webkit-font-smoothing:antialiased}.error.tsf-notice.tsf-show-icon p:before{color:#dd3811;content:"\f534"}.notice-warning.tsf-notice.tsf-show-icon p:before{color:#ffa01b;content:"\f227"}.updated.tsf-notice.tsf-show-icon p:before{color:#0cc34b;font-size:16px;content:"\f147"}a.tsf-dismiss{position:absolute;top:0;left:1px;border:none;margin:0;padding:9px;background:0 0;color:#b4b9be;cursor:pointer;text-decoration:none}a.tsf-dismiss:before{background:0 0;content:"\f153";display:block;font:400 16px/20px dashicons;speak:none;height:20px;text-align:center;width:20px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a.tsf-dismiss:hover{color:#c00}table.wp-list-table .column-name{width:15%}table.wp-list-table .column-icl_translations,table.wp-list-table .column-is_in_stock,table.wp-list-table .column-price,table.wp-list-table .column-sku,th.column-tsf-seo-bar-wrap~th{width:8%}.tsf-seo-bar a{text-decoration:none;font-size:13px}#tsf-title-wrap{position:relative;display:block;padding:0;height:auto;width:auto;overflow:hidden}#tsf-title-offset{visibility:hidden;height:0;display:inline-block;color:transparent}#tsf-title-placeholder{color:#777;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-sizing:content-box;top:0;overflow:hidden;text-overflow:ellipsis}.tsf-counter{font-weight:600;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}span.tsf-count-bad{color:#dd3811}span.tsf-count-okay{color:#ffa700}span.tsf-count-good{color:#0cc34b}span.tsf-counter-one{color:#fff;border-radius:4em;padding:0 .5em;min-width:2em;display:inline-block;text-align:center;vertical-align:baseline}span.tsf-counter-one.tsf-count-bad{background-color:#dd3811}span.tsf-counter-one.tsf-count-okay{background-color:#ffa700}span.tsf-counter-one.tsf-count-good{background-color:#0cc34b}#tsf-seo-bar-wrap{width:18%}th:last-of-type#tsf-seo-bar-wrap{width:160px}span.tsf-seo-bar{display:block;width:95%;max-width:220px;border-radius:0;padding:3px;text-shadow:0 0 3px rgba(0,0,0,.3)}span.tsf-seo-bar.tsf-100{width:100%}span.tsf-seo-bar-inner-wrap{display:table;width:100%;border-radius:0;margin:0 auto;border-collapse:separate;border-spacing:0;vertical-align:middle;position:relative}span.tsf-seo-bar-section-wrap{display:table-cell;border-collapse:collapse}.tsf-seo-bar-inner-wrap a{display:table;width:100%;color:#fff;text-align:center;cursor:help;height:100%;min-width:12px;vertical-align:top;line-height:1.625em;box-shadow:2px 0 0 -1px rgba(0,0,0,.1) inset,-2px 0 0 -1px rgba(0,0,0,.1) inset}span.tsf-seo-bar.pill,span.tsf-seo-bar.pill span.tsf-seo-bar-inner-wrap{border-radius:30px}span.tsf-seo-bar.pill span.tsf-seo-bar-inner-wrap a{box-shadow:2px 6px 3px -2px rgba(255,255,255,.2) inset,-2px -6px 3px -2px rgba(41,41,41,.2) inset,0 0 1px rgba(41,41,41,.6)}.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:last-of-type,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:last-of-type a{border-top-left-radius:30px;border-bottom-left-radius:30px}.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:first-of-type,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:first-of-type a{border-top-right-radius:30px;border-bottom-right-radius:30px}.tsf-100{width:100%}.tsf-60{width:60%}.tsf-50{width:50%}.tsf-40{width:40%}.tsf-33{width:33.333%}.tsf-25{width:25%}.tsf-20{width:20%}.tsf-16{width:16.666%}.tsf-12-5{width:12.5%}.tsf-11{width:11.333%}.tsf-10{width:10%}.tsf-seo-bar-bad{background-color:#dd3811}.tsf-seo-bar-okay{background-color:#ffa700}.tsf-seo-bar-good{background-color:#0cc34b}.tsf-seo-bar-unknown{background-color:#007bd2}span.tsf-seo-bar .tsf-explanation-desc{position:absolute;width:auto;min-width:90%;max-width:220px;font-weight:600;background:#007bd2;padding:8px 12px;color:#fdfdfd;border-radius:0;z-index:900142;box-shadow:0 0 2px rgba(0,0,0,.6);left:0;right:0;text-align:left;pointer-events:none}span.tsf-seo-bar .tsf-explanation-desc span{text-decoration:underline}span.tsf-seo-bar .tsf-explanation-desc div{width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;border-top:12px solid #007bd2;position:absolute;bottom:-8px;z-index:9999999;left:0}.tsf-seo-bar-wrap.column-tsf-seo-bar-temp{overflow:initial!important;min-width:160px}#col-container,#col-right{overflow:initial}.tsf-metaboxes{box-sizing:border-box;max-width:690px;padding-bottom:20px}.tsf-metaboxes .tsf-top-wrap{width:100%;display:inline-block;vertical-align:top}.tsf-metaboxes .metabox-holder{clear:both}.tsf-metaboxes .tsf-bottom-buttons{text-align:left}.tsf-metaboxes .tsf-bottom-buttons input,.tsf-metaboxes .tsf-top-buttons input{margin-left:10px}.tsf-metaboxes #tsf-description-separator,.tsf-metaboxes #tsf-title-separator{display:table;width:100%;border-collapse:collapse;border-spacing:0}.tsf-metaboxes #tsf-description-separator input,.tsf-metaboxes #tsf-title-separator input{display:none;float:left;width:0;min-width:0;opacity:0}.tsf-metaboxes #tsf-description-separator label,.tsf-metaboxes #tsf-title-separator label{display:inline-block;width:auto;min-width:28px;min-height:28px;margin:3px;-moz-margin-end:1.5px;-moz-margin-start:1.5px;padding:0 4px;border:1px solid #ccc;line-height:28px;text-align:center;cursor:pointer;box-shadow:-1px -1px 1px #aaa inset;font-size:16px}.tsf-metaboxes #tsf-description-separator label.tsf-recommended,.tsf-metaboxes #tsf-title-separator label.tsf-recommended{border:1px solid #0cc34b;box-shadow:-1px -1px 1px #0cc34b inset}.tsf-metaboxes #tsf-description-separator input:hover+label,.tsf-metaboxes #tsf-description-separator label:hover,.tsf-metaboxes #tsf-title-separator input:hover+label,.tsf-metaboxes #tsf-title-separator label:hover{box-shadow:1px 1px 1px #aaa inset;background-color:#fff}.tsf-metaboxes #tsf-description-separator input:checked+label,.tsf-metaboxes #tsf-title-separator input:checked+label{box-shadow:1px 1px 1px #333 inset;background-color:#fff}.tsf-metaboxes #tsf-home-title-location,.tsf-metaboxes #tsf-title-location{display:block}.tsf-metaboxes #tsf-home-title-location label span,.tsf-metaboxes #tsf-title-location label span,.tsf-metaboxes #tsf-twitter-cards label span{display:inline-block;min-width:60px;vertical-align:baseline}.tsf-metaboxes #tsf-twitter-cards label span{min-width:150px}.tsf-metaboxes #tsf-home-title-location label .tsf-sep-js,.tsf-metaboxes #tsf-home-title-location label span.tsf-custom-blogname-js,.tsf-metaboxes #tsf-home-title-location label span.tsf-custom-tagline-js,.tsf-metaboxes #tsf-home-title-location label span.tsf-custom-title-js,.tsf-metaboxes #tsf-title-location label .tsf-sep-js{display:inline;min-width:0;white-space:pre}.tsf-metaboxes .tsf-nav-tab-wrapper,.tsf-metaboxes .tsf-tab-no-js{position:relative;clear:both;width:100%;display:inline-block;border-bottom:1px solid #ccc;line-height:inherit;padding:8px 12px 0;margin:-4px -12px}.tsf-metaboxes .tsf-nav-tab{float:right;border:1px solid #ccc;margin-right:.5em;margin-bottom:-1px;padding:5px 14px;font-size:12px;line-height:16px;background:#f1f1f1;color:#555;font-weight:600}.tsf-metaboxes .tsf-dashicons-tabs{font-size:initial;display:inline;vertical-align:text-bottom}.tsf-metaboxes .tsf-tabs-radio{display:none;width:0;height:0;position:absolute;left:-9001px}.tsf-metaboxes .tsf-active-tab,.tsf-metaboxes .tsf-tabs-radio:checked+label{background-color:inherit;border-bottom-color:#fff;color:#000}.tsf-metaboxes .tsf-tabs-content{margin:1.33em auto 0}.tsf-metaboxes .tsf-content-no-js{margin:1.33em auto}body.js .tsf-metaboxes .tsf-tabs-content{display:none}body.js .tsf-metaboxes .tsf-tabs-content.tsf-active-tab-content{display:block}#tsf-inpost-box .inside,.tsf-flex{box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 1 auto;flex:1 1 auto;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:flex-start;justify-content:flex-start}#tsf-inpost-box.closed .inside,body.js .tsf-flex-tab-content{display:none}#tsf-inpost-box .inside{margin:0;padding:0;-webkit-flex:1 0 100%;flex:1 0 100%;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.tsf-flex-inside-wrap{-webkit-flex-direction:row;flex-direction:row;-webkit-flex:1 1 auto;flex:1 1 auto}.tsf-flex-setting{width:100%;-webkit-flex-direction:row;flex-direction:row}.tsf-flex-setting-input,.tsf-flex-setting-label{background-color:#fff;padding:15px 12px;-webkit-flex:10 1 350px;flex:10 1 350px;box-shadow:0 0 0 1px #e9e9e9}.tsf-flex-setting-label{background-color:#f9f9f9;-webkit-flex:1 1 200px;flex:1 1 200px}.tsf-flex-setting-input{-webkit-justify-content:center;justify-content:center}.tsf-flex-setting-label-item{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-grow:0;flex-grow:0}.tsf-flex-setting-label-inner-wrap{-webkit-justify-content:center;justify-content:center}.tsf-flex-setting-label-item>*{margin-right:4px}.tsf-flex-setting-label-item>:last-child{margin-right:0}.tsf-flex-setting-label .tsf-counter{font-weight:400;color:#666;margin-top:15px}.tsf-social-image-buttons{margin-top:15px;margin-left:1px}.tsf-flex-setting-input textarea{max-height:250px}input[type=radio].tsf-flex-nav-tab-radio{display:none;width:0;height:0;margin:0;padding:0;position:absolute;left:-9001px}.tsf-flex-nav-tab-wrapper{background-color:#fcfcfc;border-bottom:2px solid #dadada;-webkit-align-items:baseline;align-items:baseline;-webkit-flex-direction:row;flex-direction:row;-webkit-flex:1 1 100%;flex:1 1 100%;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-width:100%}.tsf-flex-nav-tab-inner{-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex:1 0 auto;flex:1 0 auto}.tsf-flex-nav-tab{-webkit-flex-direction:row;flex-direction:row;-webkit-flex:1 1 auto;flex:1 1 auto;max-width:125px}.tsf-flex-nav-tab-label{padding:12px;text-align:center;-webkit-flex-direction:row;flex-direction:row;box-shadow:0 0 0 0 transparent inset;-webkit-transition:box-shadow .15s ease-out;-o-transition:box-shadow .15s ease-out;transition:box-shadow .15s ease-out;-webkit-align-items:center;align-items:center;-webkit-align-content:space-between;align-content:space-between}.tsf-flex-nav-dashicon,.tsf-flex-nav-name{-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.tsf-flex-nav-tab .tsf-flex-nav-tab-radio:checked+.tsf-flex-nav-tab-label{box-shadow:0 -2px 0 0 #007bd2 inset;-webkit-transition:box-shadow .25s ease-in;-o-transition:box-shadow .25s ease-in;transition:box-shadow .25s ease-in}.tsf-flex-tab-content{-webkit-flex:1 0 100%;flex:1 0 100%;max-width:100%;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}body.js .tsf-flex-tab-content.tsf-flex-tab-content-active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tsf-flex-tabs-content-no-js{background-color:#f3f3f3;border-bottom:1px solid #dadada;box-shadow:0 2px 0 0 #dadada inset}.tsf-flex-tab-no-js{-webkit-align-items:baseline;align-items:baseline;-webkit-flex-direction:row;flex-direction:row;flex:1 1 100%}.tsf-flex-tab-no-js .tsf-flex-nav-tab{padding:12px;min-width:125px;box-shadow:0 -2px 0 0 #007bd2 inset;-webkit-flex-direction:row;flex-direction:row;-webkit-flex:0 1 auto;flex:0 1 auto}.tsf-metaboxes .tsf-default-selected{border-color:#1c9d38}.tsf-metaboxes .tsf-default-selected:checked:before{color:#1c9d38}.tsf-metaboxes .tsf-warning-selected{border-color:#dd3811}.tsf-metaboxes .tsf-warning-selected:checked:before{color:#dd3811}.tsf-fields{font-size:13px;line-height:1.5;margin:1em 0}.tsf-fields .tsf-toblock{display:block;width:100%;margin-bottom:4px}.tsf-fields p.description{margin:7px 0 5px;color:#666}.tsf-option-spacer{margin:1em 0}.tsf-checkbox-wrapper{margin-top:15px}.tsf-checkbox-wrapper:first-child{margin-top:0}.tsf-counter .tsf-ajax{margin-right:3px}.tsf-ajax:before{display:inline-block;line-height:1;font-family:dashicons;font-style:normal;font-weight:400;font-size:1.225em;vertical-align:middle;content:""}.tsf-ajax.tsf-loading:before{content:"\f463";color:#007bd2;-webkit-animation:tsf-spin 1.5s linear infinite;-moz-animation:tsf-spin 1.5s linear infinite;-o-animation:tsf-spin 1.5s linear infinite;animation:tsf-spin 1.5s linear infinite}.tsf-ajax.tsf-error:before{content:"\f158";color:#dd3811}.tsf-ajax.tsf-success:before{content:"\f147";color:#0cc34b}a.tsf-set-social-image.button{margin-left:7px}#tsf-inpost-box input[type=text]::-webkit-input-placeholder,#tsf-inpost-box textarea::-webkit-input-placeholder,.tsf-metaboxes input[type=text]::-webkit-input-placeholder,.tsf-metaboxes textarea::-webkit-input-placeholder{-webkit-transition:color .33s ease-in,text-shadow .33s ease-in;-o-transition:color .33s ease-in,text-shadow .33s ease-in;transition:color .33s ease-in,text-shadow .33s ease-in}#tsf-inpost-box input[type=text]::-moz-placeholder,#tsf-inpost-box textarea::-moz-placeholder,.tsf-metaboxes input[type=text]::-moz-placeholder,.tsf-metaboxes textarea::-moz-placeholder{-moz-transition:color .33s ease-in,text-shadow .33s ease-in;transition:color .33s ease-in,text-shadow .33s ease-in}#tsf-inpost-box input[type=text]:-ms-input-placeholder,#tsf-inpost-box textarea:-ms-input-placeholder,.tsf-metaboxes input[type=text]:-ms-input-placeholder,.tsf-metaboxes textarea:-ms-input-placeholder{transition:color .33s ease-in,text-shadow .33s ease-in}#tsf-inpost-box input[type=text]:focus::-webkit-input-placeholder,#tsf-inpost-box textarea:focus::-webkit-input-placeholder,.tsf-metaboxes input[type=text]:focus::-webkit-input-placeholder,.tsf-metaboxes textarea:focus::-webkit-input-placeholder{color:transparent;text-shadow:0 0 1px rgba(114,119,124,.75)}#tsf-inpost-box input[type=text]:focus::-moz-placeholder,#tsf-inpost-box textarea:focus::-moz-placeholder,.tsf-metaboxe textarea:focus::-moz-placeholder,.tsf-metaboxes input[type=text]:focus::-moz-placeholder{color:transparent;text-shadow:0 0 1px rgba(114,119,124,.75)}#tsf-inpost-box input[type=text]:focus:-ms-input-placeholder,#tsf-inpost-box textarea:focus:-ms-input-placeholder,.tsf-metaboxes input[type=text]:focus:-ms-input-placeholder,.tsf-metaboxes textarea:focus:-ms-input-placeholder{color:transparent;text-shadow:0 0 1px rgba(114,119,124,.75)}@-webkit-keyframes tsf-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes tsf-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@media screen and (max-width:782px){.tsf-inpost-box p.tsf-fields,.tsf-metaboxes p.tsf-fields{line-height:2.8}.tsf-metaboxes #tsf-home-title-location label span,.tsf-metaboxes #tsf-title-location label span{min-width:40px}.wp-list-table .is-expanded td.tsf-seo-bar-wrap:not(.hidden){overflow:initial!important}}@media screen and (max-width:642px){.tsf-metaboxes span.tsf-nav-desktop{display:none}}@media screen and (max-width:510px){span.tsf-seo-bar.tsf-100{width:inherit}}@-moz-document url-prefix(){.tsf-metaboxes #tsf-description-separator label,.tsf-metaboxes #tsf-title-separator label{margin:3px 1px}@media only screen and (min-width:768px){.widefat tr td.column-title:nth-child(2):nth-last-child(n+6),.widefat tr td.title:nth-child(2):nth-last-child(n+6),.widefat tr th.column-title:nth-child(2):nth-last-child(n+6),.widefat tr th.title:nth-child(2):nth-last-child(n+6){min-width:1em;width:25%;max-width:100%;white-space:unset}}.tsf-metaboxes .tsf-default-selected{box-shadow:0 0 2px 0 #1c9d38}.tsf-metaboxes .tsf-warning-selected{box-shadow:0 0 2px 0 #dd3811}.tsf-metaboxes legend h4{margin:2px 0}}.tsf-flex-hide-if-no-js,body.js .tsf-flex-hide-if-js{display:none}body.js .tsf-flex-hide-if-no-js{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}
lib/css/tsf.css CHANGED
@@ -739,6 +739,8 @@ input[type="radio"].tsf-flex-nav-tab-radio {
739
  .tsf-flex-tab-content {
740
  -webkit-flex: 1 0 100%;
741
  flex: 1 0 100%;
 
 
742
  -webkit-flex-wrap: nowrap;
743
  -ms-flex-wrap: nowrap;
744
  flex-wrap: nowrap;
739
  .tsf-flex-tab-content {
740
  -webkit-flex: 1 0 100%;
741
  flex: 1 0 100%;
742
+ /* EdgeHTML overflow fix */
743
+ max-width: 100%;
744
  -webkit-flex-wrap: nowrap;
745
  -ms-flex-wrap: nowrap;
746
  flex-wrap: nowrap;
lib/css/tsf.min.css CHANGED
@@ -1 +1 @@
1
- .tsf-notice{position:relative;clear:both}.tsf-notice.tsf-show-icon p:before{content:'';margin-right:12px;background:0 0;display:inline-block;font:400 14px/16px dashicons;speak:none;height:16px;text-align:center;vertical-align:middle;width:16px;line-height:14px;-webkit-font-smoothing:antialiased}.error.tsf-notice.tsf-show-icon p:before{color:#dd3811;content:"\f534"}.notice-warning.tsf-notice.tsf-show-icon p:before{color:#ffa01b;content:"\f227"}.updated.tsf-notice.tsf-show-icon p:before{color:#0cc34b;font-size:16px;content:"\f147"}a.tsf-dismiss{position:absolute;top:0;right:1px;border:none;margin:0;padding:9px;background:0 0;color:#b4b9be;cursor:pointer;text-decoration:none}a.tsf-dismiss:before{background:0 0;content:"\f153";display:block;font:400 16px/20px dashicons;speak:none;height:20px;text-align:center;width:20px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a.tsf-dismiss:hover{color:#c00}table.wp-list-table .column-name{width:15%}table.wp-list-table .column-icl_translations,table.wp-list-table .column-is_in_stock,table.wp-list-table .column-price,table.wp-list-table .column-sku,th.column-tsf-seo-bar-wrap~th{width:8%}.tsf-seo-bar a{text-decoration:none;font-size:13px}#tsf-title-wrap{position:relative;display:block;padding:0;height:auto;width:auto;overflow:hidden}#tsf-title-offset{visibility:hidden;height:0;display:inline-block;position:absolute;left:0;color:transparent;white-space:pre}#tsf-title-placeholder{position:absolute;color:#777;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-sizing:content-box;top:0;left:0;overflow:hidden;white-space:pre;text-overflow:ellipsis}.tsf-counter{font-weight:600;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}span.tsf-count-bad{color:#dd3811}span.tsf-count-okay{color:#ffa700}span.tsf-count-good{color:#0cc34b}span.tsf-counter-one{color:#fff;border-radius:4em;padding:0 .5em;min-width:2em;display:inline-block;text-align:center;vertical-align:baseline}span.tsf-counter-one.tsf-count-bad{background-color:#dd3811}span.tsf-counter-one.tsf-count-okay{background-color:#ffa700}span.tsf-counter-one.tsf-count-good{background-color:#0cc34b}#tsf-seo-bar-wrap{width:18%}th:last-of-type#tsf-seo-bar-wrap{width:160px}span.tsf-seo-bar{display:block;width:95%;max-width:220px;border-radius:0;padding:3px;text-shadow:0 0 3px rgba(0,0,0,.3)}span.tsf-seo-bar.tsf-100{width:100%}span.tsf-seo-bar-inner-wrap{display:table;width:100%;border-radius:0;margin:0 auto;border-collapse:separate;border-spacing:0;vertical-align:middle;position:relative}span.tsf-seo-bar-section-wrap{display:table-cell;border-collapse:collapse}.tsf-seo-bar-inner-wrap a{display:table;width:100%;color:#fff;text-align:center;cursor:help;height:100%;min-width:12px;vertical-align:top;line-height:1.625em;box-shadow:2px 0 0 -1px rgba(0,0,0,.1) inset,-2px 0 0 -1px rgba(0,0,0,.1) inset}span.tsf-seo-bar.pill,span.tsf-seo-bar.pill span.tsf-seo-bar-inner-wrap{border-radius:30px}span.tsf-seo-bar.pill span.tsf-seo-bar-inner-wrap a{box-shadow:2px 6px 3px -2px rgba(255,255,255,.2) inset,-2px -6px 3px -2px rgba(41,41,41,.2) inset,0 0 1px rgba(41,41,41,.6)}.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:first-of-type,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:first-of-type a{border-top-left-radius:30px;border-bottom-left-radius:30px}.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:last-of-type,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:last-of-type a{border-top-right-radius:30px;border-bottom-right-radius:30px}.tsf-100{width:100%}.tsf-60{width:60%}.tsf-50{width:50%}.tsf-40{width:40%}.tsf-33{width:33.333%}.tsf-25{width:25%}.tsf-20{width:20%}.tsf-16{width:16.666%}.tsf-12-5{width:12.5%}.tsf-11{width:11.333%}.tsf-10{width:10%}.tsf-seo-bar-bad{background-color:#dd3811}.tsf-seo-bar-okay{background-color:#ffa700}.tsf-seo-bar-good{background-color:#0cc34b}.tsf-seo-bar-unknown{background-color:#007bd2}span.tsf-seo-bar .tsf-explanation-desc{position:absolute;width:auto;min-width:90%;max-width:220px;font-weight:600;background:#007bd2;padding:8px 12px;color:#fdfdfd;border-radius:0;z-index:900142;box-shadow:0 0 2px rgba(0,0,0,.6);left:0;right:0;text-align:left;pointer-events:none}span.tsf-seo-bar .tsf-explanation-desc span{text-decoration:underline}span.tsf-seo-bar .tsf-explanation-desc div{width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;border-top:12px solid #007bd2;position:absolute;bottom:-8px;z-index:9999999;left:0}.tsf-seo-bar-wrap.column-tsf-seo-bar-temp{overflow:initial!important;min-width:160px}#col-container,#col-right{overflow:initial}.tsf-metaboxes{box-sizing:border-box;max-width:690px;padding-bottom:20px}.tsf-metaboxes .tsf-top-wrap{width:100%;display:inline-block;vertical-align:top}.tsf-metaboxes .tsf-top-wrap>h1,.tsf-metaboxes .tsf-top-wrap>h2{float:left}.tsf-metaboxes .metabox-holder{clear:both}.tsf-metaboxes .tsf-top-buttons{float:right}.tsf-metaboxes .tsf-bottom-buttons{text-align:right}.tsf-metaboxes .tsf-bottom-buttons input,.tsf-metaboxes .tsf-top-buttons input{margin-left:10px}.tsf-metaboxes #tsf-description-separator,.tsf-metaboxes #tsf-title-separator{display:table;width:100%;border-collapse:collapse;border-spacing:0}.tsf-metaboxes #tsf-description-separator input,.tsf-metaboxes #tsf-title-separator input{display:none;float:left;width:0;min-width:0;opacity:0}.tsf-metaboxes #tsf-description-separator label,.tsf-metaboxes #tsf-title-separator label{display:inline-block;width:auto;min-width:28px;min-height:28px;margin:3px;-moz-margin-end:1.5px;-moz-margin-start:1.5px;padding:0 4px;border:1px solid #ccc;line-height:28px;text-align:center;cursor:pointer;box-shadow:-1px -1px 1px #aaa inset;font-size:16px}.tsf-metaboxes #tsf-description-separator label.tsf-recommended,.tsf-metaboxes #tsf-title-separator label.tsf-recommended{border:1px solid #0cc34b;box-shadow:-1px -1px 1px #0cc34b inset}.tsf-metaboxes #tsf-description-separator input:hover+label,.tsf-metaboxes #tsf-description-separator label:hover,.tsf-metaboxes #tsf-title-separator input:hover+label,.tsf-metaboxes #tsf-title-separator label:hover{box-shadow:1px 1px 1px #aaa inset;background-color:#fff}.tsf-metaboxes #tsf-description-separator input:checked+label,.tsf-metaboxes #tsf-title-separator input:checked+label{box-shadow:1px 1px 1px #333 inset;background-color:#fff}.tsf-metaboxes #tsf-home-title-location,.tsf-metaboxes #tsf-title-location{display:block}.tsf-metaboxes #tsf-home-title-location label span,.tsf-metaboxes #tsf-title-location label span,.tsf-metaboxes #tsf-twitter-cards label span{display:inline-block;min-width:60px;vertical-align:baseline}.tsf-metaboxes #tsf-twitter-cards label span{min-width:150px}.tsf-metaboxes #tsf-home-title-location label .tsf-sep-js,.tsf-metaboxes #tsf-home-title-location label span.tsf-custom-blogname-js,.tsf-metaboxes #tsf-home-title-location label span.tsf-custom-tagline-js,.tsf-metaboxes #tsf-home-title-location label span.tsf-custom-title-js,.tsf-metaboxes #tsf-title-location label .tsf-sep-js{display:inline;min-width:0;white-space:pre}.tsf-metaboxes .tsf-nav-tab-wrapper,.tsf-metaboxes .tsf-tab-no-js{position:relative;clear:both;width:100%;display:inline-block;border-bottom:1px solid #ccc;line-height:inherit;padding:8px 12px 0;margin:-4px -12px}.tsf-metaboxes .tsf-nav-tab{float:left;border:1px solid #ccc;margin-left:.5em;margin-bottom:-1px;padding:5px 14px;font-size:12px;line-height:16px;background:#f1f1f1;color:#555;font-weight:600}.tsf-metaboxes .tsf-dashicons-tabs{font-size:initial;display:inline;vertical-align:text-bottom}.tsf-metaboxes .tsf-tabs-radio{display:none;width:0;height:0;position:absolute;left:-9001px}.tsf-metaboxes .tsf-active-tab,.tsf-metaboxes .tsf-tabs-radio:checked+label{background-color:inherit;border-bottom-color:#fff;color:#000}.tsf-metaboxes .tsf-tabs-content{margin:1.33em auto 0}.tsf-metaboxes .tsf-content-no-js{margin:1.33em auto}body.js .tsf-metaboxes .tsf-tabs-content{display:none}body.js .tsf-metaboxes .tsf-tabs-content.tsf-active-tab-content{display:block}#tsf-inpost-box .inside,.tsf-flex{box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 1 auto;flex:1 1 auto;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:flex-start;justify-content:flex-start}#tsf-inpost-box.closed .inside,body.js .tsf-flex-tab-content{display:none}#tsf-inpost-box .inside{margin:0;padding:0;-webkit-flex:1 0 100%;flex:1 0 100%;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.tsf-flex-inside-wrap{-webkit-flex-direction:row;flex-direction:row;-webkit-flex:1 1 auto;flex:1 1 auto}.tsf-flex-setting{width:100%;-webkit-flex-direction:row;flex-direction:row}.tsf-flex-setting-input,.tsf-flex-setting-label{background-color:#fff;padding:15px 12px;-webkit-flex:10 1 350px;flex:10 1 350px;box-shadow:0 0 0 1px #e9e9e9}.tsf-flex-setting-label{background-color:#f9f9f9;-webkit-flex:1 1 200px;flex:1 1 200px}.tsf-flex-setting-input{-webkit-justify-content:center;justify-content:center}.tsf-flex-setting-label-item{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-grow:0;flex-grow:0}.tsf-flex-setting-label-inner-wrap{-webkit-justify-content:center;justify-content:center}.tsf-flex-setting-label-item>*{margin-right:4px}.tsf-flex-setting-label-item>:last-child{margin-right:0}.tsf-flex-setting-label .tsf-counter{font-weight:400;color:#666;margin-top:15px}.tsf-social-image-buttons{margin-top:15px;margin-left:1px}.tsf-flex-setting-input textarea{max-height:250px}input[type=radio].tsf-flex-nav-tab-radio{display:none;width:0;height:0;margin:0;padding:0;position:absolute;left:-9001px}.tsf-flex-nav-tab-wrapper{background-color:#fcfcfc;border-bottom:2px solid #dadada;-webkit-align-items:baseline;align-items:baseline;-webkit-flex-direction:row;flex-direction:row;-webkit-flex:1 1 100%;flex:1 1 100%;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-width:100%}.tsf-flex-nav-tab-inner{-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex:1 0 auto;flex:1 0 auto}.tsf-flex-nav-tab{-webkit-flex-direction:row;flex-direction:row;-webkit-flex:1 1 auto;flex:1 1 auto;max-width:125px}.tsf-flex-nav-tab-label{padding:12px;text-align:center;-webkit-flex-direction:row;flex-direction:row;box-shadow:0 0 0 0 transparent inset;-webkit-transition:box-shadow .15s ease-out;-o-transition:box-shadow .15s ease-out;transition:box-shadow .15s ease-out;-webkit-align-items:center;align-items:center;-webkit-align-content:space-between;align-content:space-between}.tsf-flex-nav-dashicon,.tsf-flex-nav-name{-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.tsf-flex-nav-tab .tsf-flex-nav-tab-radio:checked+.tsf-flex-nav-tab-label{box-shadow:0 -2px 0 0 #007bd2 inset;-webkit-transition:box-shadow .25s ease-in;-o-transition:box-shadow .25s ease-in;transition:box-shadow .25s ease-in}.tsf-flex-tab-content{-webkit-flex:1 0 100%;flex:1 0 100%;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}body.js .tsf-flex-tab-content.tsf-flex-tab-content-active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tsf-flex-tabs-content-no-js{background-color:#f3f3f3;border-bottom:1px solid #dadada;box-shadow:0 2px 0 0 #dadada inset}.tsf-flex-tab-no-js{-webkit-align-items:baseline;align-items:baseline;-webkit-flex-direction:row;flex-direction:row;flex:1 1 100%}.tsf-flex-tab-no-js .tsf-flex-nav-tab{padding:12px;min-width:125px;box-shadow:0 -2px 0 0 #007bd2 inset;-webkit-flex-direction:row;flex-direction:row;-webkit-flex:0 1 auto;flex:0 1 auto}.tsf-metaboxes .tsf-default-selected{border-color:#1c9d38}.tsf-metaboxes .tsf-default-selected:checked:before{color:#1c9d38}.tsf-metaboxes .tsf-warning-selected{border-color:#dd3811}.tsf-metaboxes .tsf-warning-selected:checked:before{color:#dd3811}.tsf-fields{font-size:13px;line-height:1.5;margin:1em 0}.tsf-fields .tsf-toblock{display:block;width:100%;margin-bottom:4px}.tsf-fields p.description{margin:7px 0 5px;color:#666}.tsf-option-spacer{margin:1em 0}.tsf-checkbox-wrapper{margin-top:15px}.tsf-checkbox-wrapper:first-child{margin-top:0}.tsf-counter .tsf-ajax{margin-left:3px}.tsf-ajax:before{display:inline-block;line-height:1;font-family:dashicons;font-style:normal;font-weight:400;font-size:1.225em;vertical-align:middle;content:""}.tsf-ajax.tsf-loading:before{content:"\f463";color:#007bd2;-webkit-animation:tsf-spin 1.5s linear infinite;-moz-animation:tsf-spin 1.5s linear infinite;-o-animation:tsf-spin 1.5s linear infinite;animation:tsf-spin 1.5s linear infinite}.tsf-ajax.tsf-error:before{content:"\f158";color:#dd3811}.tsf-ajax.tsf-success:before{content:"\f147";color:#0cc34b}a.tsf-set-social-image.button{margin-right:7px}#tsf-inpost-box input[type=text]::-webkit-input-placeholder,#tsf-inpost-box textarea::-webkit-input-placeholder,.tsf-metaboxes input[type=text]::-webkit-input-placeholder,.tsf-metaboxes textarea::-webkit-input-placeholder{-webkit-transition:color .33s ease-in,text-shadow .33s ease-in;-o-transition:color .33s ease-in,text-shadow .33s ease-in;transition:color .33s ease-in,text-shadow .33s ease-in}#tsf-inpost-box input[type=text]::-moz-placeholder,#tsf-inpost-box textarea::-moz-placeholder,.tsf-metaboxes input[type=text]::-moz-placeholder,.tsf-metaboxes textarea::-moz-placeholder{-moz-transition:color .33s ease-in,text-shadow .33s ease-in;transition:color .33s ease-in,text-shadow .33s ease-in}#tsf-inpost-box input[type=text]:-ms-input-placeholder,#tsf-inpost-box textarea:-ms-input-placeholder,.tsf-metaboxes input[type=text]:-ms-input-placeholder,.tsf-metaboxes textarea:-ms-input-placeholder{transition:color .33s ease-in,text-shadow .33s ease-in}#tsf-inpost-box input[type=text]:focus::-webkit-input-placeholder,#tsf-inpost-box textarea:focus::-webkit-input-placeholder,.tsf-metaboxes input[type=text]:focus::-webkit-input-placeholder,.tsf-metaboxes textarea:focus::-webkit-input-placeholder{color:transparent;text-shadow:0 0 1px rgba(114,119,124,.75)}#tsf-inpost-box input[type=text]:focus::-moz-placeholder,#tsf-inpost-box textarea:focus::-moz-placeholder,.tsf-metaboxe textarea:focus::-moz-placeholder,.tsf-metaboxes input[type=text]:focus::-moz-placeholder{color:transparent;text-shadow:0 0 1px rgba(114,119,124,.75)}#tsf-inpost-box input[type=text]:focus:-ms-input-placeholder,#tsf-inpost-box textarea:focus:-ms-input-placeholder,.tsf-metaboxes input[type=text]:focus:-ms-input-placeholder,.tsf-metaboxes textarea:focus:-ms-input-placeholder{color:transparent;text-shadow:0 0 1px rgba(114,119,124,.75)}@-webkit-keyframes tsf-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes tsf-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@media screen and (max-width:782px){.tsf-inpost-box p.tsf-fields,.tsf-metaboxes p.tsf-fields{line-height:2.8}.tsf-metaboxes #tsf-home-title-location label span,.tsf-metaboxes #tsf-title-location label span{min-width:40px}.wp-list-table .is-expanded td.tsf-seo-bar-wrap:not(.hidden){overflow:initial!important}}@media screen and (max-width:642px){.tsf-metaboxes span.tsf-nav-desktop{display:none}}@media screen and (max-width:510px){span.tsf-seo-bar.tsf-100{width:inherit}}@-moz-document url-prefix(){.tsf-metaboxes #tsf-description-separator label,.tsf-metaboxes #tsf-title-separator label{margin:3px 1px}@media only screen and (min-width:768px){.widefat tr td.column-title:nth-child(2):nth-last-child(n+6),.widefat tr td.title:nth-child(2):nth-last-child(n+6),.widefat tr th.column-title:nth-child(2):nth-last-child(n+6),.widefat tr th.title:nth-child(2):nth-last-child(n+6){min-width:1em;width:25%;max-width:100%;white-space:unset}}.tsf-metaboxes .tsf-default-selected{box-shadow:0 0 2px 0 #1c9d38}.tsf-metaboxes .tsf-warning-selected{box-shadow:0 0 2px 0 #dd3811}.tsf-metaboxes legend h4{margin:2px 0}}.tsf-flex-hide-if-no-js,body.js .tsf-flex-hide-if-js{display:none}body.js .tsf-flex-hide-if-no-js{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}
1
+ .tsf-notice{position:relative;clear:both}.tsf-notice.tsf-show-icon p:before{content:'';margin-right:12px;background:0 0;display:inline-block;font:400 14px/16px dashicons;speak:none;height:16px;text-align:center;vertical-align:middle;width:16px;line-height:14px;-webkit-font-smoothing:antialiased}.error.tsf-notice.tsf-show-icon p:before{color:#dd3811;content:"\f534"}.notice-warning.tsf-notice.tsf-show-icon p:before{color:#ffa01b;content:"\f227"}.updated.tsf-notice.tsf-show-icon p:before{color:#0cc34b;font-size:16px;content:"\f147"}a.tsf-dismiss{position:absolute;top:0;right:1px;border:none;margin:0;padding:9px;background:0 0;color:#b4b9be;cursor:pointer;text-decoration:none}a.tsf-dismiss:before{background:0 0;content:"\f153";display:block;font:400 16px/20px dashicons;speak:none;height:20px;text-align:center;width:20px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a.tsf-dismiss:hover{color:#c00}table.wp-list-table .column-name{width:15%}table.wp-list-table .column-icl_translations,table.wp-list-table .column-is_in_stock,table.wp-list-table .column-price,table.wp-list-table .column-sku,th.column-tsf-seo-bar-wrap~th{width:8%}.tsf-seo-bar a{text-decoration:none;font-size:13px}#tsf-title-wrap{position:relative;display:block;padding:0;height:auto;width:auto;overflow:hidden}#tsf-title-offset{visibility:hidden;height:0;display:inline-block;position:absolute;left:0;color:transparent;white-space:pre}#tsf-title-placeholder{position:absolute;color:#777;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-sizing:content-box;top:0;left:0;overflow:hidden;white-space:pre;text-overflow:ellipsis}.tsf-counter{font-weight:600;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}span.tsf-count-bad{color:#dd3811}span.tsf-count-okay{color:#ffa700}span.tsf-count-good{color:#0cc34b}span.tsf-counter-one{color:#fff;border-radius:4em;padding:0 .5em;min-width:2em;display:inline-block;text-align:center;vertical-align:baseline}span.tsf-counter-one.tsf-count-bad{background-color:#dd3811}span.tsf-counter-one.tsf-count-okay{background-color:#ffa700}span.tsf-counter-one.tsf-count-good{background-color:#0cc34b}#tsf-seo-bar-wrap{width:18%}th:last-of-type#tsf-seo-bar-wrap{width:160px}span.tsf-seo-bar{display:block;width:95%;max-width:220px;border-radius:0;padding:3px;text-shadow:0 0 3px rgba(0,0,0,.3)}span.tsf-seo-bar.tsf-100{width:100%}span.tsf-seo-bar-inner-wrap{display:table;width:100%;border-radius:0;margin:0 auto;border-collapse:separate;border-spacing:0;vertical-align:middle;position:relative}span.tsf-seo-bar-section-wrap{display:table-cell;border-collapse:collapse}.tsf-seo-bar-inner-wrap a{display:table;width:100%;color:#fff;text-align:center;cursor:help;height:100%;min-width:12px;vertical-align:top;line-height:1.625em;box-shadow:2px 0 0 -1px rgba(0,0,0,.1) inset,-2px 0 0 -1px rgba(0,0,0,.1) inset}span.tsf-seo-bar.pill,span.tsf-seo-bar.pill span.tsf-seo-bar-inner-wrap{border-radius:30px}span.tsf-seo-bar.pill span.tsf-seo-bar-inner-wrap a{box-shadow:2px 6px 3px -2px rgba(255,255,255,.2) inset,-2px -6px 3px -2px rgba(41,41,41,.2) inset,0 0 1px rgba(41,41,41,.6)}.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:first-of-type,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:first-of-type a{border-top-left-radius:30px;border-bottom-left-radius:30px}.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:last-of-type,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap span.tsf-seo-bar-section-wrap:last-of-type a{border-top-right-radius:30px;border-bottom-right-radius:30px}.tsf-100{width:100%}.tsf-60{width:60%}.tsf-50{width:50%}.tsf-40{width:40%}.tsf-33{width:33.333%}.tsf-25{width:25%}.tsf-20{width:20%}.tsf-16{width:16.666%}.tsf-12-5{width:12.5%}.tsf-11{width:11.333%}.tsf-10{width:10%}.tsf-seo-bar-bad{background-color:#dd3811}.tsf-seo-bar-okay{background-color:#ffa700}.tsf-seo-bar-good{background-color:#0cc34b}.tsf-seo-bar-unknown{background-color:#007bd2}span.tsf-seo-bar .tsf-explanation-desc{position:absolute;width:auto;min-width:90%;max-width:220px;font-weight:600;background:#007bd2;padding:8px 12px;color:#fdfdfd;border-radius:0;z-index:900142;box-shadow:0 0 2px rgba(0,0,0,.6);left:0;right:0;text-align:left;pointer-events:none}span.tsf-seo-bar .tsf-explanation-desc span{text-decoration:underline}span.tsf-seo-bar .tsf-explanation-desc div{width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;border-top:12px solid #007bd2;position:absolute;bottom:-8px;z-index:9999999;left:0}.tsf-seo-bar-wrap.column-tsf-seo-bar-temp{overflow:initial!important;min-width:160px}#col-container,#col-right{overflow:initial}.tsf-metaboxes{box-sizing:border-box;max-width:690px;padding-bottom:20px}.tsf-metaboxes .tsf-top-wrap{width:100%;display:inline-block;vertical-align:top}.tsf-metaboxes .tsf-top-wrap>h1,.tsf-metaboxes .tsf-top-wrap>h2{float:left}.tsf-metaboxes .metabox-holder{clear:both}.tsf-metaboxes .tsf-top-buttons{float:right}.tsf-metaboxes .tsf-bottom-buttons{text-align:right}.tsf-metaboxes .tsf-bottom-buttons input,.tsf-metaboxes .tsf-top-buttons input{margin-left:10px}.tsf-metaboxes #tsf-description-separator,.tsf-metaboxes #tsf-title-separator{display:table;width:100%;border-collapse:collapse;border-spacing:0}.tsf-metaboxes #tsf-description-separator input,.tsf-metaboxes #tsf-title-separator input{display:none;float:left;width:0;min-width:0;opacity:0}.tsf-metaboxes #tsf-description-separator label,.tsf-metaboxes #tsf-title-separator label{display:inline-block;width:auto;min-width:28px;min-height:28px;margin:3px;-moz-margin-end:1.5px;-moz-margin-start:1.5px;padding:0 4px;border:1px solid #ccc;line-height:28px;text-align:center;cursor:pointer;box-shadow:-1px -1px 1px #aaa inset;font-size:16px}.tsf-metaboxes #tsf-description-separator label.tsf-recommended,.tsf-metaboxes #tsf-title-separator label.tsf-recommended{border:1px solid #0cc34b;box-shadow:-1px -1px 1px #0cc34b inset}.tsf-metaboxes #tsf-description-separator input:hover+label,.tsf-metaboxes #tsf-description-separator label:hover,.tsf-metaboxes #tsf-title-separator input:hover+label,.tsf-metaboxes #tsf-title-separator label:hover{box-shadow:1px 1px 1px #aaa inset;background-color:#fff}.tsf-metaboxes #tsf-description-separator input:checked+label,.tsf-metaboxes #tsf-title-separator input:checked+label{box-shadow:1px 1px 1px #333 inset;background-color:#fff}.tsf-metaboxes #tsf-home-title-location,.tsf-metaboxes #tsf-title-location{display:block}.tsf-metaboxes #tsf-home-title-location label span,.tsf-metaboxes #tsf-title-location label span,.tsf-metaboxes #tsf-twitter-cards label span{display:inline-block;min-width:60px;vertical-align:baseline}.tsf-metaboxes #tsf-twitter-cards label span{min-width:150px}.tsf-metaboxes #tsf-home-title-location label .tsf-sep-js,.tsf-metaboxes #tsf-home-title-location label span.tsf-custom-blogname-js,.tsf-metaboxes #tsf-home-title-location label span.tsf-custom-tagline-js,.tsf-metaboxes #tsf-home-title-location label span.tsf-custom-title-js,.tsf-metaboxes #tsf-title-location label .tsf-sep-js{display:inline;min-width:0;white-space:pre}.tsf-metaboxes .tsf-nav-tab-wrapper,.tsf-metaboxes .tsf-tab-no-js{position:relative;clear:both;width:100%;display:inline-block;border-bottom:1px solid #ccc;line-height:inherit;padding:8px 12px 0;margin:-4px -12px}.tsf-metaboxes .tsf-nav-tab{float:left;border:1px solid #ccc;margin-left:.5em;margin-bottom:-1px;padding:5px 14px;font-size:12px;line-height:16px;background:#f1f1f1;color:#555;font-weight:600}.tsf-metaboxes .tsf-dashicons-tabs{font-size:initial;display:inline;vertical-align:text-bottom}.tsf-metaboxes .tsf-tabs-radio{display:none;width:0;height:0;position:absolute;left:-9001px}.tsf-metaboxes .tsf-active-tab,.tsf-metaboxes .tsf-tabs-radio:checked+label{background-color:inherit;border-bottom-color:#fff;color:#000}.tsf-metaboxes .tsf-tabs-content{margin:1.33em auto 0}.tsf-metaboxes .tsf-content-no-js{margin:1.33em auto}body.js .tsf-metaboxes .tsf-tabs-content{display:none}body.js .tsf-metaboxes .tsf-tabs-content.tsf-active-tab-content{display:block}#tsf-inpost-box .inside,.tsf-flex{box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 1 auto;flex:1 1 auto;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:flex-start;justify-content:flex-start}#tsf-inpost-box.closed .inside,body.js .tsf-flex-tab-content{display:none}#tsf-inpost-box .inside{margin:0;padding:0;-webkit-flex:1 0 100%;flex:1 0 100%;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.tsf-flex-inside-wrap{-webkit-flex-direction:row;flex-direction:row;-webkit-flex:1 1 auto;flex:1 1 auto}.tsf-flex-setting{width:100%;-webkit-flex-direction:row;flex-direction:row}.tsf-flex-setting-input,.tsf-flex-setting-label{background-color:#fff;padding:15px 12px;-webkit-flex:10 1 350px;flex:10 1 350px;box-shadow:0 0 0 1px #e9e9e9}.tsf-flex-setting-label{background-color:#f9f9f9;-webkit-flex:1 1 200px;flex:1 1 200px}.tsf-flex-setting-input{-webkit-justify-content:center;justify-content:center}.tsf-flex-setting-label-item{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-grow:0;flex-grow:0}.tsf-flex-setting-label-inner-wrap{-webkit-justify-content:center;justify-content:center}.tsf-flex-setting-label-item>*{margin-right:4px}.tsf-flex-setting-label-item>:last-child{margin-right:0}.tsf-flex-setting-label .tsf-counter{font-weight:400;color:#666;margin-top:15px}.tsf-social-image-buttons{margin-top:15px;margin-left:1px}.tsf-flex-setting-input textarea{max-height:250px}input[type=radio].tsf-flex-nav-tab-radio{display:none;width:0;height:0;margin:0;padding:0;position:absolute;left:-9001px}.tsf-flex-nav-tab-wrapper{background-color:#fcfcfc;border-bottom:2px solid #dadada;-webkit-align-items:baseline;align-items:baseline;-webkit-flex-direction:row;flex-direction:row;-webkit-flex:1 1 100%;flex:1 1 100%;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-width:100%}.tsf-flex-nav-tab-inner{-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex:1 0 auto;flex:1 0 auto}.tsf-flex-nav-tab{-webkit-flex-direction:row;flex-direction:row;-webkit-flex:1 1 auto;flex:1 1 auto;max-width:125px}.tsf-flex-nav-tab-label{padding:12px;text-align:center;-webkit-flex-direction:row;flex-direction:row;box-shadow:0 0 0 0 transparent inset;-webkit-transition:box-shadow .15s ease-out;-o-transition:box-shadow .15s ease-out;transition:box-shadow .15s ease-out;-webkit-align-items:center;align-items:center;-webkit-align-content:space-between;align-content:space-between}.tsf-flex-nav-dashicon,.tsf-flex-nav-name{-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.tsf-flex-nav-tab .tsf-flex-nav-tab-radio:checked+.tsf-flex-nav-tab-label{box-shadow:0 -2px 0 0 #007bd2 inset;-webkit-transition:box-shadow .25s ease-in;-o-transition:box-shadow .25s ease-in;transition:box-shadow .25s ease-in}.tsf-flex-tab-content{-webkit-flex:1 0 100%;flex:1 0 100%;max-width:100%;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}body.js .tsf-flex-tab-content.tsf-flex-tab-content-active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tsf-flex-tabs-content-no-js{background-color:#f3f3f3;border-bottom:1px solid #dadada;box-shadow:0 2px 0 0 #dadada inset}.tsf-flex-tab-no-js{-webkit-align-items:baseline;align-items:baseline;-webkit-flex-direction:row;flex-direction:row;flex:1 1 100%}.tsf-flex-tab-no-js .tsf-flex-nav-tab{padding:12px;min-width:125px;box-shadow:0 -2px 0 0 #007bd2 inset;-webkit-flex-direction:row;flex-direction:row;-webkit-flex:0 1 auto;flex:0 1 auto}.tsf-metaboxes .tsf-default-selected{border-color:#1c9d38}.tsf-metaboxes .tsf-default-selected:checked:before{color:#1c9d38}.tsf-metaboxes .tsf-warning-selected{border-color:#dd3811}.tsf-metaboxes .tsf-warning-selected:checked:before{color:#dd3811}.tsf-fields{font-size:13px;line-height:1.5;margin:1em 0}.tsf-fields .tsf-toblock{display:block;width:100%;margin-bottom:4px}.tsf-fields p.description{margin:7px 0 5px;color:#666}.tsf-option-spacer{margin:1em 0}.tsf-checkbox-wrapper{margin-top:15px}.tsf-checkbox-wrapper:first-child{margin-top:0}.tsf-counter .tsf-ajax{margin-left:3px}.tsf-ajax:before{display:inline-block;line-height:1;font-family:dashicons;font-style:normal;font-weight:400;font-size:1.225em;vertical-align:middle;content:""}.tsf-ajax.tsf-loading:before{content:"\f463";color:#007bd2;-webkit-animation:tsf-spin 1.5s linear infinite;-moz-animation:tsf-spin 1.5s linear infinite;-o-animation:tsf-spin 1.5s linear infinite;animation:tsf-spin 1.5s linear infinite}.tsf-ajax.tsf-error:before{content:"\f158";color:#dd3811}.tsf-ajax.tsf-success:before{content:"\f147";color:#0cc34b}a.tsf-set-social-image.button{margin-right:7px}#tsf-inpost-box input[type=text]::-webkit-input-placeholder,#tsf-inpost-box textarea::-webkit-input-placeholder,.tsf-metaboxes input[type=text]::-webkit-input-placeholder,.tsf-metaboxes textarea::-webkit-input-placeholder{-webkit-transition:color .33s ease-in,text-shadow .33s ease-in;-o-transition:color .33s ease-in,text-shadow .33s ease-in;transition:color .33s ease-in,text-shadow .33s ease-in}#tsf-inpost-box input[type=text]::-moz-placeholder,#tsf-inpost-box textarea::-moz-placeholder,.tsf-metaboxes input[type=text]::-moz-placeholder,.tsf-metaboxes textarea::-moz-placeholder{-moz-transition:color .33s ease-in,text-shadow .33s ease-in;transition:color .33s ease-in,text-shadow .33s ease-in}#tsf-inpost-box input[type=text]:-ms-input-placeholder,#tsf-inpost-box textarea:-ms-input-placeholder,.tsf-metaboxes input[type=text]:-ms-input-placeholder,.tsf-metaboxes textarea:-ms-input-placeholder{transition:color .33s ease-in,text-shadow .33s ease-in}#tsf-inpost-box input[type=text]:focus::-webkit-input-placeholder,#tsf-inpost-box textarea:focus::-webkit-input-placeholder,.tsf-metaboxes input[type=text]:focus::-webkit-input-placeholder,.tsf-metaboxes textarea:focus::-webkit-input-placeholder{color:transparent;text-shadow:0 0 1px rgba(114,119,124,.75)}#tsf-inpost-box input[type=text]:focus::-moz-placeholder,#tsf-inpost-box textarea:focus::-moz-placeholder,.tsf-metaboxe textarea:focus::-moz-placeholder,.tsf-metaboxes input[type=text]:focus::-moz-placeholder{color:transparent;text-shadow:0 0 1px rgba(114,119,124,.75)}#tsf-inpost-box input[type=text]:focus:-ms-input-placeholder,#tsf-inpost-box textarea:focus:-ms-input-placeholder,.tsf-metaboxes input[type=text]:focus:-ms-input-placeholder,.tsf-metaboxes textarea:focus:-ms-input-placeholder{color:transparent;text-shadow:0 0 1px rgba(114,119,124,.75)}@-webkit-keyframes tsf-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes tsf-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@media screen and (max-width:782px){.tsf-inpost-box p.tsf-fields,.tsf-metaboxes p.tsf-fields{line-height:2.8}.tsf-metaboxes #tsf-home-title-location label span,.tsf-metaboxes #tsf-title-location label span{min-width:40px}.wp-list-table .is-expanded td.tsf-seo-bar-wrap:not(.hidden){overflow:initial!important}}@media screen and (max-width:642px){.tsf-metaboxes span.tsf-nav-desktop{display:none}}@media screen and (max-width:510px){span.tsf-seo-bar.tsf-100{width:inherit}}@-moz-document url-prefix(){.tsf-metaboxes #tsf-description-separator label,.tsf-metaboxes #tsf-title-separator label{margin:3px 1px}@media only screen and (min-width:768px){.widefat tr td.column-title:nth-child(2):nth-last-child(n+6),.widefat tr td.title:nth-child(2):nth-last-child(n+6),.widefat tr th.column-title:nth-child(2):nth-last-child(n+6),.widefat tr th.title:nth-child(2):nth-last-child(n+6){min-width:1em;width:25%;max-width:100%;white-space:unset}}.tsf-metaboxes .tsf-default-selected{box-shadow:0 0 2px 0 #1c9d38}.tsf-metaboxes .tsf-warning-selected{box-shadow:0 0 2px 0 #dd3811}.tsf-metaboxes legend h4{margin:2px 0}}.tsf-flex-hide-if-no-js,body.js .tsf-flex-hide-if-js{display:none}body.js .tsf-flex-hide-if-no-js{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}
lib/js/tsf.externs.js CHANGED
@@ -8,7 +8,7 @@
8
 
9
  /**
10
  * The SEO Framework - Extension Manager plugin
11
- * Copyright (C) 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
8
 
9
  /**
10
  * The SEO Framework - Extension Manager plugin
11
+ * Copyright (C) 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
lib/js/tsf.externs.protected.js CHANGED
@@ -8,7 +8,7 @@
8
 
9
  /**
10
  * The SEO Framework - Extension Manager plugin
11
- * Copyright (C) 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
8
 
9
  /**
10
  * The SEO Framework - Extension Manager plugin
11
+ * Copyright (C) 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
lib/js/tsf.js CHANGED
@@ -8,7 +8,7 @@
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -1468,6 +1468,7 @@ window.tsf = {
1468
  async: true,
1469
  success: function( response ) {
1470
 
 
1471
  response = jQuery.parseJSON( response );
1472
 
1473
  //* I could do value check, but that will simply lag behind. Unless an annoying execution delay is added.
@@ -1693,47 +1694,53 @@ window.tsf = {
1693
  ],
1694
  } );
1695
 
1696
- frame.on( 'select', function() {
1697
- frame.setState( 'cropper' );
1698
- } );
1699
-
1700
- frame.on( 'cropped', function( croppedImage ) {
1701
-
1702
- // converted to var in compiler.
1703
- let url = croppedImage.url,
1704
- attachmentId = croppedImage.id,
1705
- w = croppedImage.width,
1706
- h = croppedImage.height;
1707
-
1708
- // Send the attachment id to our hidden input. URL to explicit output.
1709
- jQuery( '#' + inputID + '-url' ).val( url );
1710
- jQuery( '#' + inputID + '-id' ).val( attachmentId );
1711
- } );
1712
-
1713
- frame.on( 'skippedcrop', function( selection ) {
1714
 
1715
- // converted to var in compiler.
1716
- let url = selection.get( 'url' ),
1717
- attachmentId = selection.get( 'id' ),
1718
- w = selection.get( 'width' ),
1719
- h = selection.get( 'height' );
1720
-
1721
- // Send the attachment id to our hidden input. URL to explicit output.
1722
- jQuery( '#' + inputID + '-url' ).val( url );
1723
- jQuery( '#' + inputID + '-id' ).val( attachmentId );
1724
- } );
 
 
 
1725
 
1726
- frame.on( 'skippedcrop cropped', function( imageSelection ) {
1727
- jQuery( '#' + inputID + '-select' ).text( tsf.other[ inputID ]['change'] );
1728
- jQuery( '#' + inputID + '-url' ).prop( 'readonly', true ).css( 'opacity', 0 ).animate(
1729
- { 'opacity' : 1 },
1730
- { 'queue' : true, 'duration' : 1000 },
1731
- 'swing'
1732
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1733
 
1734
- tsf.appendRemoveButton( $target, inputID, true );
1735
- tsf.registerChange();
1736
- } );
 
 
1737
 
1738
  frame.open();
1739
  },
@@ -2012,6 +2019,7 @@ window.tsf = {
2012
  resetImageEditorActions: function() {
2013
  'use strict';
2014
 
 
2015
  jQuery( '.tsf-remove-social-image' ).on( 'click', tsf.removeEditorImage );
2016
  },
2017
 
@@ -2026,6 +2034,8 @@ window.tsf = {
2026
  setupImageEditorActions: function() {
2027
  'use strict';
2028
 
 
 
2029
  jQuery( '.tsf-set-social-image' ).on( 'click', tsf.openImageEditor );
2030
  jQuery( '.tsf-remove-social-image' ).on( 'click', tsf.removeEditorImage );
2031
  },
@@ -2216,9 +2226,7 @@ window.tsf = {
2216
  clearTimeout( resizeTimeout );
2217
 
2218
  // Onload delays are 0, after than it's 10, 20 and 30 respectively.
2219
- let _delay = 0,
2220
- __delay = 0,
2221
- ___delay = 0;
2222
 
2223
  resizeTimeout = setTimeout( function() {
2224
  if ( $tabWrapper.length ) {
@@ -2263,20 +2271,18 @@ window.tsf = {
2263
  $navName.fadeIn( 250 );
2264
  $lastWidth.tabWrapper.shown = 1;
2265
  }
2266
- }, __delay );
2267
 
2268
  // Wait for an additional 10 ms for slow browsers.
2269
  setTimeout( function() {
2270
  $lastWidth.tabWrapper.outer = outerWrapWidth;
2271
  $lastWidth.tabWrapper.inner = innerWrapWidth;
2272
- }, ___delay );
2273
  }
2274
  }, timeOut );
2275
 
2276
  // Update future timeouts.
2277
  _delay = 10;
2278
- __delay = 20;
2279
- ___delay = 30;
2280
  timeOut = 75;
2281
  } );
2282
 
@@ -2293,6 +2299,8 @@ window.tsf = {
2293
  * @return {(undefined|null)}
2294
  */
2295
  _setResizeListeners: function() {
 
 
2296
  jQuery( window ).on( 'resize orientationchange', tsf._triggerResize );
2297
  jQuery( '#collapse-menu' ).click( tsf._triggerResize );
2298
  jQuery( '.columns-prefs :input[type=radio]' ).change( tsf._triggerResize );
@@ -2308,6 +2316,8 @@ window.tsf = {
2308
  * @return {(undefined|null)}
2309
  */
2310
  _triggerResize: function() {
 
 
2311
  jQuery( window ).trigger( 'tsf-flex-resize' );
2312
  },
2313
 
@@ -2424,7 +2434,6 @@ window.tsf = {
2424
 
2425
  // AJAX counter
2426
  jQ( '.tsf-counter' ).on( 'click', tsf.counterUpdate );
2427
-
2428
  }
2429
  };
2430
  jQuery( tsf.ready );
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
1468
  async: true,
1469
  success: function( response ) {
1470
 
1471
+ // TODO convert to json header and/or test for availability of response.type before parsing?
1472
  response = jQuery.parseJSON( response );
1473
 
1474
  //* I could do value check, but that will simply lag behind. Unless an annoying execution delay is added.
1694
  ],
1695
  } );
1696
 
1697
+ let selectFunc = (function() {
1698
+ frame.setState( 'cropper' );
1699
+ } );
1700
+ frame.off( 'select', selectFunc );
1701
+ frame.on( 'select', selectFunc );
 
 
 
 
 
 
 
 
 
 
 
 
 
1702
 
1703
+ let croppedFunc = (function( croppedImage ) {
1704
+ // converted to var in compiler.
1705
+ let url = croppedImage.url,
1706
+ attachmentId = croppedImage.id,
1707
+ w = croppedImage.width,
1708
+ h = croppedImage.height;
1709
+
1710
+ // Send the attachment id to our hidden input. URL to explicit output.
1711
+ jQuery( '#' + inputID + '-url' ).val( url );
1712
+ jQuery( '#' + inputID + '-id' ).val( attachmentId );
1713
+ } );
1714
+ frame.off( 'cropped', croppedFunc );
1715
+ frame.on( 'cropped', croppedFunc );
1716
 
1717
+ let skippedcropFunc = (function( selection ) {
1718
+ // converted to var in compiler.
1719
+ let url = selection.get( 'url' ),
1720
+ attachmentId = selection.get( 'id' ),
1721
+ w = selection.get( 'width' ),
1722
+ h = selection.get( 'height' );
1723
+
1724
+ // Send the attachment id to our hidden input. URL to explicit output.
1725
+ jQuery( '#' + inputID + '-url' ).val( url );
1726
+ jQuery( '#' + inputID + '-id' ).val( attachmentId );
1727
+ } );
1728
+ frame.off( 'skippedcrop', skippedcropFunc );
1729
+ frame.on( 'skippedcrop', skippedcropFunc );
1730
+
1731
+ let doneFunc = (function( imageSelection ) {
1732
+ jQuery( '#' + inputID + '-select' ).text( tsf.other[ inputID ]['change'] );
1733
+ jQuery( '#' + inputID + '-url' ).prop( 'readonly', true ).css( 'opacity', 0 ).animate(
1734
+ { 'opacity' : 1 },
1735
+ { 'queue' : true, 'duration' : 1000 },
1736
+ 'swing'
1737
+ );
1738
 
1739
+ tsf.appendRemoveButton( $target, inputID, true );
1740
+ tsf.registerChange();
1741
+ } );
1742
+ frame.off( 'skippedcrop cropped', doneFunc );
1743
+ frame.on( 'skippedcrop cropped', doneFunc );
1744
 
1745
  frame.open();
1746
  },
2019
  resetImageEditorActions: function() {
2020
  'use strict';
2021
 
2022
+ jQuery( '.tsf-remove-social-image' ).off( 'click', tsf.removeEditorImage );
2023
  jQuery( '.tsf-remove-social-image' ).on( 'click', tsf.removeEditorImage );
2024
  },
2025
 
2034
  setupImageEditorActions: function() {
2035
  'use strict';
2036
 
2037
+ jQuery( '.tsf-set-social-image' ).off( 'click', tsf.openImageEditor );
2038
+ jQuery( '.tsf-remove-social-image' ).off( 'click', tsf.removeEditorImage );
2039
  jQuery( '.tsf-set-social-image' ).on( 'click', tsf.openImageEditor );
2040
  jQuery( '.tsf-remove-social-image' ).on( 'click', tsf.removeEditorImage );
2041
  },
2226
  clearTimeout( resizeTimeout );
2227
 
2228
  // Onload delays are 0, after than it's 10, 20 and 30 respectively.
2229
+ let _delay = 0;
 
 
2230
 
2231
  resizeTimeout = setTimeout( function() {
2232
  if ( $tabWrapper.length ) {
2271
  $navName.fadeIn( 250 );
2272
  $lastWidth.tabWrapper.shown = 1;
2273
  }
2274
+ }, _delay * 2 );
2275
 
2276
  // Wait for an additional 10 ms for slow browsers.
2277
  setTimeout( function() {
2278
  $lastWidth.tabWrapper.outer = outerWrapWidth;
2279
  $lastWidth.tabWrapper.inner = innerWrapWidth;
2280
+ }, _delay * 3 );
2281
  }
2282
  }, timeOut );
2283
 
2284
  // Update future timeouts.
2285
  _delay = 10;
 
 
2286
  timeOut = 75;
2287
  } );
2288
 
2299
  * @return {(undefined|null)}
2300
  */
2301
  _setResizeListeners: function() {
2302
+ 'use strict';
2303
+
2304
  jQuery( window ).on( 'resize orientationchange', tsf._triggerResize );
2305
  jQuery( '#collapse-menu' ).click( tsf._triggerResize );
2306
  jQuery( '.columns-prefs :input[type=radio]' ).change( tsf._triggerResize );
2316
  * @return {(undefined|null)}
2317
  */
2318
  _triggerResize: function() {
2319
+ 'use strict';
2320
+
2321
  jQuery( window ).trigger( 'tsf-flex-resize' );
2322
  },
2323
 
2434
 
2435
  // AJAX counter
2436
  jQ( '.tsf-counter' ).on( 'click', tsf.counterUpdate );
 
2437
  }
2438
  };
2439
  jQuery( tsf.ready );
lib/js/tsf.min.js CHANGED
@@ -1,37 +1,37 @@
1
- window.tsf={nonce:tsfL10n.nonce,nonces:tsfL10n.nonces,i18n:tsfL10n.i18n,states:tsfL10n.states,params:tsfL10n.params,other:tsfL10n.other,g:!1,m:!1,A:"",D:"",a:0,c:!1,f:"",cropper:{},h:function(){return jQuery("#autodescription_title, #autodescription-meta\\[doctitle\\], #autodescription-site-settings\\[homepage_title\\]")},F:function(){return jQuery("#autodescription_description, #autodescription-meta\\[description\\], #autodescription-site-settings\\[homepage_description\\]")},confirm:function(a){return confirm(a)},
2
- L:function(a){var b=jQuery(a.target),c=b.val().length;a=jQuery("#"+tsf.G(a.target.id)+"_chars");var d,e="";0===c&&(c=b.prop("placeholder").length);100>c||175<=c?(b="tsf-count-bad",d=tsf.i("bad")):137>c||155<c&&175>c?(b="tsf-count-okay",d=tsf.i("okay")):(b="tsf-count-good",d=tsf.i("good"));tsf.f&&(b+=" "+tsf.f);tsf.a&&1!=tsf.a?2==tsf.a?e=d:3==tsf.a&&(e=c.toString()+" - "+d):e=c.toString();a.html(e).removeClass().addClass(b)},s:function(a){var b=jQuery(a.target),c=tsf.params.titleAdditions.length,d=
3
- tsf.params.blogDescription.length,e=tsf.params.siteTitle.length,f=b.val().length,h=b.prop("placeholder").length,g=jQuery("#autodescription-site-settings\\[homepage_title_tagline\\]").val(),m=3;a=jQuery("#"+tsf.G(a.target.id)+"_chars");var k=0,b=tsf.f,l=tsf.a,n="";tsf.m||(m=c=0);0===f&&(0!==e?f=e:k=h);0!==f&&(0!==c&&"undefined"!==typeof g&&(c=g.length,c=0!==c?c:d),k=0===c?f:f+m+c);25>k||75<=k?(d="tsf-count-bad",f=tsf.i("bad")):42>k||55<k&&75>k?(d="tsf-count-okay",f=tsf.i("okay")):(d="tsf-count-good",
4
- f=tsf.i("good"));b&&(d+=" "+b);l&&1!=l?2==l?n=f:3==l&&(n=k.toString()+" - "+f):n=k.toString();a.html(n).removeClass().addClass(d)},G:function(a){return a?a.replace(/([\[\]\/])/g,"\\$1"):a},ja:function(a){var b=jQuery(".tsf-sep-js");a=jQuery(a.target).val();tsf.A=a;"pipe"===a?b.text(" | "):"dash"===a?b.text(" - "):b.html(" &"+a+"; ")},ia:function(a){var b=jQuery("#autodescription-descsep-js");a=jQuery(a.target).val();"pipe"===a?b.text(" | "):"dash"===a?b.text(" - "):b.html(" &"+a+"; ")},statusBarHover:function(){var a=
5
  jQuery(".tsf-seo-bar-inner-wrap").find("a");a.on("mouseenter",tsf.pa);a.on("mousemove",tsf.ra);a.on("mouseleave",tsf.qa)},pa:function(a){a=jQuery(a.target);var b=a.data("desc");void 0!==b&&0===a.find("div").length&&(a.append('<div class="tsf-explanation-desc">'+b+"<div></div></div>"),b=a.find("div.tsf-explanation-desc").height()+28,a.find("div.tsf-explanation-desc").css("top",a.position().top-b+"px"))},ra:function(a){var b=jQuery(a.target);a=a.pageX;var c=a-b.closest(".tsf-seo-bar-inner-wrap").offset().left-
6
  11,d=b.find(".tsf-explanation-desc"),b=d.find("div");if(1>c)b.css("left","0px");else if(void 0!==d.offset()){var e=d.width(),d=d.offset().left+e+11;a>d?b.css("left",e+"px"):b.css("left",c+"px")}},qa:function(a){jQuery(a.target).find("div.tsf-explanation-desc").remove()},fa:function(){var a=jQuery(document.body.target),b=jQuery(".tsf-seo-bar-inner-wrap a");a.closest(b).length||b.find("div.tsf-explanation-desc").remove()},sa:function(a){a=jQuery(a.target);if(a.is(":checked")){var b=a.prop("id");a=a.prop("name");
7
- if("undefined"!==typeof a){var c=jQuery("#"+b+"-content"),d=jQuery(".tsf-active-tab-content");c.is(d)||"undefined"===typeof c||(jQuery("."+a+"-content").fadeOut(150,function(){jQuery(this).removeClass("tsf-active-tab-content")}),setTimeout(function(){c.addClass("tsf-active-tab-content").fadeIn(250)},150),setTimeout(function(){jQuery("#"+b).trigger("tsf-tab-toggled")},175))}}},aa:function(a){a=jQuery(a.target);if(a.is(":checked")){var b=a.prop("id");a=a.prop("name");if("undefined"!==typeof a){var c=
8
  jQuery("#"+b+"-content"),d=jQuery(".tsf-flex-tab-content-active");c.is(d)||"undefined"===typeof c||(jQuery("."+a+"-content").fadeOut(150,function(){jQuery(this).removeClass("tsf-flex-tab-content-active")}),setTimeout(function(){c.addClass("tsf-flex-tab-content-active").fadeIn(250)},150),setTimeout(function(){jQuery("#"+b).trigger("tsf-flex-tab-toggled")},175))}}},ma:function(){if(tsf.c&&tsf.states.isSettingsPage){var a=jQuery(".tsf-nav-tab-wrapper .tsf-tab:nth-of-type(n+2) input:checked");a.length&&
9
  a.each(function(){var a=jQuery(this),c=a.prop("id"),a=a.prop("name");if("undefined"!==typeof a){var d=jQuery("#"+c+"-content");"undefined"!==typeof d&&(jQuery("."+a+"-content").removeClass("tsf-active-tab-content"),d.addClass("tsf-active-tab-content"),setTimeout(function(){jQuery("#"+c).trigger("tsf-tab-toggled")},20))}})}},wa:function(a){a=jQuery(a.target);var b=jQuery(".tsf-custom-blogname-js");a.is(":checked")?(b.css("display","inline"),tsf.m=!0):(b.css("display","none"),tsf.m=!1);tsf.h().trigger("keyup",
10
- tsf.s)},ua:function(a){a=jQuery(a.target);var b=jQuery("#tsf-on-blogname-js");a.is(":checked")?b.css("display","inline"):b.css("display","none")},xa:function(a){a=jQuery(a.target).val();var b=jQuery(".tsf-title-additions-example-left"),c=jQuery(".tsf-title-additions-example-right");"right"===a?(b.css("display","none"),c.css("display","inline")):(b.css("display","inline"),c.css("display","none"))},ya:function(a){a=jQuery(a.target);var b=jQuery(".tsf-title-prefix-example");a.is(":checked")?b.css("display",
11
- "none"):b.css("display","inline")},R:function(a){a=jQuery(a.target);var b=jQuery("#tsf-description-additions-js");a.is(":checked")?b.css("display","inline"):b.css("display","none")},va:function(){if(tsf.c){var a=jQuery("#tsf-title-tagline-toggle :input"),b=jQuery(".tsf-custom-blogname-js"),c=jQuery("#tsf-description-additions-toggle :input"),d=jQuery("#tsf-description-additions-js"),e=jQuery("#tsf-description-onblogname-toggle :input"),f=jQuery("#tsf-on-blogname-js"),h=jQuery("#tsf-title-additions-toggle :input"),
12
- g=jQuery(".tsf-title-additions-js");a.is(":checked")?b.css("display","inline"):b.css("display","none");c.is(":checked")?d.css("display","inline"):d.css("display","none");e.is(":checked")?f.css("display","inline"):f.css("display","none");h.is(":checked")?g.css("display","none"):g.css("display","inline")}},za:function(a){a=jQuery(a.target).val();var b=jQuery(".tsf-custom-title-js");0===a.length?b.text(tsf.params.siteTitle):b.text(a)},w:function(a){a=jQuery(a.target).val();var b=jQuery(".tsf-custom-tagline-js"),
13
- c=jQuery("#autodescription-site-settings\\[homepage_title\\]"),d=jQuery("#tsf-home-title-location input:checked").val(),e=jQuery("#autodescription-site-settings\\[homepage_tagline\\]"),f=tsf.params.siteTitle,h=f,g=tsf.params.blogDescription,m=tsf.H("title");e.is(":checked")&&(0!==a.length&&(g=a),h=0!==d.length&&"left"===d?f+" "+m+" "+g:g+" "+m+" "+f);b.text(g);c.prop("placeholder",h);tsf.h().trigger("input",tsf.s)},l:function(){var a=tsf.g;tsf.states.isSettingsPage?jQuery("#autodescription-site-settings\\[homepage_title_tagline\\]").trigger("input",
14
- tsf.w):jQuery("#autodescription_title").trigger("input",tsf.w);tsf.g=a},ta:function(){var a=0,b=0;jQuery(window).resize(function(){clearTimeout(a);a=setTimeout(function(){var a=jQuery(window).width();b<a?782>=b&&782<=a&&tsf.l():782<=b&&782>=a&&tsf.l();b=a},250)})},Aa:function(){var a=jQuery(event.target),b=jQuery(".tsf-title-additions-js");a.is(":checked")?b.css("display","none"):b.css("display","inline")},S:function(){tsf.c&&(jQuery(".tsf-metaboxes :input, #tsf-inpost-box .inside :input").not(".tsf-tab :input, .tsf-flex-nav-tab :input").change(function(){tsf.j()}),
15
  jQuery(".tsf-metaboxes input[type=text], .tsf-metaboxes textarea, #tsf-inpost-box .inside input[type=text], #tsf-inpost-box .inside textarea").not(".tsf-nav-tab-wrapper input, .tsf-flex-nav-tab-wrapper input").on("input",function(){tsf.j()}),window.onbeforeunload=function(){if(tsf.g)return tsf.i18n.saveAlert},jQuery('.tsf-metaboxes input[type="submit"], #publishing-action input[type="submit"], #save-action input[type="submit"], a.submitdelete').click(function(){window.onbeforeunload=null}))},j:function(){tsf.g=
16
- !0},U:function(){return confirm(tsf.i18n.confirmReset)},Y:function(a){var b=tsf.params.titleAdditions.length,c=jQuery("#tsf-title-placeholder");if(!b)return jQuery(a.target).css("text-indent","initial"),c.empty();var b=!1,d=jQuery("#tsf-home-title-location input:checked").val(),e=tsf.states.isRTL;"undefined"!==typeof d&&0!==d.length?e?"right"===d&&(b=!0):"left"===d&&(b=!0):(d=tsf.params.titleLocation,tsf.states.isHome?tsf.m&&(e?"right"===d&&(b=!0):"left"===d&&(b=!0)):e?"left"===d&&(b=!0):"right"===
17
- d&&(b=!0));d=jQuery("#tsf-title-tagline-toggle :input");if("undefined"!==typeof d&&0<d.length&&!d.is(":checked"))jQuery(a.target).css("text-indent","initial"),c.css("display","none");else{a=jQuery(a.target);var f=a.val(),h=jQuery("#tsf-title-offset"),g,m=a.outerWidth(),k=(a.outerHeight(!0)-a.height())/2,l=(m-a.innerWidth())/2,d=(a.outerWidth(!0)-a.width())/2;g=jQuery("#autodescription-site-settings\\[homepage_title_tagline\\]").val();var n="left",p=tsf.H("title");e&&(n="right");"undefined"!==typeof g&&
18
- 0===g.length&&(g=tsf.params.blogDescription);b?(e=" "+p+" "+tsf.params.titleAdditions,"undefined"!==typeof g&&0<g.length&&(e=" "+p+" "+g),a.css("text-indent","initial")):(e=tsf.params.titleAdditions+" "+p+" ","undefined"!==typeof g&&0<g.length&&(e=g+" "+p+" "));h.text(f);h.css({fontFamily:a.css("fontFamily"),fontWeight:a.css("fontWeight"),letterSpacing:a.css("letterSpacing"),fontSize:a.css("fontSize")});g=h.width();g=a.width()-l-g;0>g&&(g=0);c.css({display:a.css("display"),lineHeight:a.css("lineHeight"),
19
- paddingTop:k+"px",paddingBottom:k+"px",fontFamily:a.css("fontFamily"),fontWeight:a.css("fontWeight"),fontSize:a.css("fontSize"),letterSpacing:a.css("letterSpacing"),maxWidth:g+"px"});"undefined"===typeof f||1>f.length?(b||a.css("text-indent","initial"),c.empty()):(c.text(e),m>d&&(b?c.css(n,l+d+h.width()+"px"):(b=l+c.width(),0>b&&(b=0),c.css(n,d+"px"),a.css("text-indent",b+"px"))))}},ha:function(){var a=tsf.h();a.focus();if(a.setSelectionRange){var b=2*a.val().length;a.setSelectionRange(b,b)}else a.val(a.val()).focus()},
20
- Ba:function(){tsf.c&&tsf.F().trigger("input",tsf.L)},Ca:function(){tsf.c&&tsf.h().trigger("input",tsf.s)},da:function(){tsf.g=!1},X:function(a){var b=jQuery(a.target);b.parents(".tsf-notice").slideUp(200,function(){b.remove()})},ka:function(a){jQuery(a).toggleClass("tsf-loading")},K:function(a,b){var c="tsf-success",d=2500;b||(c="tsf-error",d=5E3);jQuery(a).removeClass("tsf-loading").addClass(c).fadeOut(d)},J:function(a){jQuery(a).stop().empty().prop("class","tsf-ajax").css("opacity","1").removeProp("style")},
21
- V:function(){tsf.a+=1;3<tsf.a&&(tsf.a=0);tsf.B();var a=0;tsf.J(".tsf-counter .tsf-ajax");tsf.ka(".tsf-counter .tsf-ajax");jQuery.ajax({method:"POST",url:ajaxurl,Fa:"json",data:{action:"the_seo_framework_update_counter",nonce:tsf.nonces.edit_posts,val:tsf.a},async:!0,success:function(b){b=jQuery.parseJSON(b);"success"===b.type&&(a=1);tsf.W(".tsf-counter .tsf-ajax",a)}})},W:function(a,b){switch(b){case 0:tsf.K(a,!1);break;case 1:tsf.K(a,!0);break;default:tsf.J(a)}},B:function(){if(tsf.c){var a=tsf.a,
22
- b=tsf.g;1==a?(tsf.f="tsf-counter-one",tsf.a=1):2==a?(tsf.f="tsf-counter-two",tsf.a=2):3==a?(tsf.f="tsf-counter-three",tsf.a=3):(tsf.f="tsf-counter-zero",tsf.a=0);tsf.Da();tsf.g=b}},Da:function(){tsf.Ca();tsf.Ba()},i:function(a){return tsf.i18n[a]},H:function(a){var b="";a="title"===a?tsf.A:tsf.D;"pipe"===a||"|"===a?b="|":"dash"===a||"-"===a?b="-":123>a.charCodeAt(0)&&("&"===a.charAt(0)&&";"===a.slice(-1)&&(a=a.substr(1).slice(0,-1)),b=jQuery("<div/>").html("&"+a+";").text());return b},ea:function(a){if(jQuery(a.target).prop("disabled")||
23
- "undefined"===typeof wp.media)a.preventDefault(),a.stopPropagation();else{var b=jQuery(a.target),c=b.data("inputid"),d;d||(a.preventDefault(),a.stopPropagation(),tsf.Z(),d=wp.media({button:{text:tsf.other[c].frame_button,close:!1},states:[new wp.media.controller.Library({title:tsf.other[c].frame_title,library:wp.media.query({type:"image"}),multiple:!1,date:!1,priority:20,suggestedWidth:1200,suggestedHeight:630}),new tsf.cropper({imgSelectOptions:tsf.calculateImageSelectOptions})]}),d.on("select",
24
- function(){d.setState("cropper")}),d.on("cropped",function(a){var b=a.url;a=a.id;jQuery("#"+c+"-url").val(b);jQuery("#"+c+"-id").val(a)}),d.on("skippedcrop",function(a){var b=a.get("url"),d=a.get("id");a.get("width");a.get("height");jQuery("#"+c+"-url").val(b);jQuery("#"+c+"-id").val(d)}),d.on("skippedcrop cropped",function(){jQuery("#"+c+"-select").text(tsf.other[c].change);jQuery("#"+c+"-url").prop("readonly",!0).css("opacity",0).animate({opacity:1},{queue:!0,duration:1E3},"swing");tsf.C(b,c,!0);
25
- tsf.j()}));d.open()}},C:function(a,b,c){a&&b&&!jQuery("#"+b+"-remove").length&&(a.after('<a href="javascript:void(0)" id="'+b+'-remove" class="tsf-remove-social-image button button-small" data-inputid="'+b+'" title="'+tsf.other[b].remove_title+'">'+tsf.other[b].remove+"</a>"),c&&jQuery("#"+b+"-remove").css("opacity",0).animate({opacity:1},{queue:!0,duration:1E3},"swing"));tsf.ga()},I:function(a){var b=jQuery(a.target).data("inputid");jQuery("#"+b+"-select").prop("disabled")||(jQuery("#"+b+"-select").addClass("disabled").prop("disabled",
26
- !0),jQuery("#"+b+"-remove").addClass("disabled").prop("disabled",!0).fadeOut(500,function(){jQuery(this).remove();jQuery("#"+b+"-select").text(tsf.other[b].select).removeClass("disabled").removeProp("disabled")}),jQuery("#"+b+"-url").val("").removeProp("readonly").css("opacity",0).animate({opacity:1},{queue:!0,duration:500},"swing"),jQuery("#"+b+"-id").val(""),tsf.j())},Z:function(){if("undefined"===typeof tsf.cropper.control){var a;a=wp.media.controller.Cropper.extend({doCrop:function(a){var b=a.get("cropDetails"),
27
- d=tsf.cropper.control;if(d.params.flex_width&&d.params.flex_height)if(b.width===b.height)b.width>d.params.flex_width&&(b.dst_width=b.dst_height=d.params.flex_width);else if(b.width>d.params.flex_width||b.height>d.params.flex_height)if(b.width>b.height){var e=b.width/d.params.flex_width;b.dst_width=d.params.flex_width;b.dst_height=Math.round(b.height/e)}else e=b.height/d.params.flex_height,b.dst_height=d.params.flex_height,b.dst_width=Math.round(b.width/e);"undefined"===typeof b.dst_width&&(b.dst_width=
28
- 0,b.dst_height=0);return wp.ajax.post("tsf-crop-image",{nonce:tsf.nonces.upload_files,id:a.get("id"),context:"tsf-image",cropDetails:b})}});a.prototype.control={};a.control={params:{flex_width:1500,flex_height:1500,width:1200,height:630}};tsf.cropper=a}},calculateImageSelectOptions:function(a,b){var c=tsf.cropper.control,d=!!parseInt(c.params.flex_width,10),e=!!parseInt(c.params.flex_height,10),f=parseInt(c.params.width,10),h=parseInt(c.params.height,10),g=a.get("width"),m=a.get("height"),k=f/h,l=
29
- f,n=h;b.set("control",c.params);b.set("canSkipCrop",!tsf.ca(c.params.flex_width,c.params.flex_height,g,m));g/m>k?(h=m,f=h*k):(f=g,h=f/k);c=(g-f)/2;k=(m-h)/2;l={handles:!0,keys:!0,instance:!0,persistent:!0,imageWidth:g,imageHeight:m,minWidth:l>f?f:l,minHeight:n>h?h:n,x1:c,y1:k,x2:f+c,y2:h+k};!1===e&&!1===d&&(l.Ea=f+":"+h);!0===e&&(l.minHeight=200,l.maxWidth=g);!0===d&&(l.minWidth=200,l.maxHeight=m);return l},ca:function(a,b,c,d){return c<=a&&d<=b?!1:!0},ga:function(){jQuery(".tsf-remove-social-image").on("click",
30
- tsf.I)},na:function(){jQuery(".tsf-set-social-image").on("click",tsf.ea);jQuery(".tsf-remove-social-image").on("click",tsf.I)},T:function(){var a=jQuery(".tsf-set-social-image");if(a.length){var b="",c="";jQuery.each(a,function(a,e){b=jQuery(e).data("inputid");c=jQuery("#"+b+"-id");c.length&&0<c.val()&&(jQuery("#"+b+"-url").prop("readonly",!0),tsf.C(jQuery(e),b,!1));jQuery("#"+b+"-url").val()&&jQuery("#"+b+"-select").text(tsf.other[b].change)})}},la:function(){var a=jQuery(".tsf-color-picker");a.length&&
31
- jQuery.each(a,function(a,c){var b=jQuery(c),e="",f=b.data("tsf-default-color");b.wpColorPicker({defaultColor:f,width:238,change:function(){e=b.wpColorPicker("color");""===e&&(e=f);b.val(e);tsf.j()},clear:function(){b.parent().siblings(".wp-color-result").css("backgroundColor",f);tsf.j()},palettes:!1})})},oa:function(){tsf.A=tsf.params.titleSeparator;tsf.D=tsf.params.descriptionSeparator;tsf.m=tsf.states.titleTagline;tsf.a=parseInt(tsf.states.counterType);tsf.c=tsf.states.hasInput},N:function(){if(tsf.c){var a=
32
- jQuery;a("#tsf-title-tagline-toggle :input").on("click",tsf.wa);a("#tsf-title-location input").on("click",tsf.xa);a("#title-prefixes-toggle :input").on("click",tsf.ya);a("#autodescription-site-settings\\[homepage_title\\]").on("input",tsf.za);a("#tsf-home-title-location :input, #tsf-title-tagline-toggle :input, #tsf-title-separator input").on("click",tsf.l);a("#autodescription-site-settings\\[homepage_title_tagline\\]").on("input",tsf.w);a("#homepage-tab-general").on("tsf-tab-toggled",tsf.l);a("#autodescription-homepage-settings > button").on("click",
33
- tsf.l);a("#tsf-inpost-box > button").on("click",tsf.l);a("#autodescription-site-settings\\[title_rem_additions\\]").on("click",tsf.Aa);tsf.h().on("input",tsf.Y);a("#tsf-title-placeholder").on("click",tsf.ha);a(window).resize(tsf.ta)}},M:function(){if(jQuery(".tsf-flex").length){tsf.O();var a=0,b={},c=0,d=jQuery(".tsf-flex-nav-tab-wrapper");jQuery(window).on("tsf-flex-resize",function(){clearTimeout(a);var e=0,f=0,h=0;a=setTimeout(function(){if(d.length){var a=jQuery(".tsf-flex-nav-tab-inner"),c=d.width(),
34
- k=a.width(),l=jQuery(".tsf-flex-nav-name");b.b||(b.b={},b.b.u=0,b.b.ba=0,b.b.v=1);!b.b.v&&b.b.u<c&&(l.fadeIn(250),setTimeout(function(){k=a.width()},e));setTimeout(function(){k>c?(l.hide(),b.b.v=0):b.b.u<c&&(l.fadeIn(250),b.b.v=1)},f);setTimeout(function(){b.b.u=c;b.b.ba=k},h)}},c);e=10;f=20;h=30;c=75});jQuery(window).trigger("tsf-flex-resize")}},O:function(){jQuery(window).on("resize orientationchange",tsf.o);jQuery("#collapse-menu").click(tsf.o);jQuery(".columns-prefs :input[type=radio]").change(tsf.o);
35
- jQuery(".meta-box-sortables").on("sortupdate",tsf.o)},o:function(){jQuery(window).trigger("tsf-flex-resize")},P:function(){jQuery(document.body).trigger("tsf-ready")},ready:function(a){tsf.oa();a("div.updated, div.error, div.notice-warning").insertAfter("div.tsf-top-wrap");a(document.body).ready(tsf.N);a(document.body).ready(tsf.ma);a(document.body).ready(tsf.B);a(document.body).ready(tsf.va);a(document.body).ready(tsf.statusBarHover);a(document.body).ready(tsf.na);a(document.body).ready(tsf.T);a(document.body).ready(tsf.la);
36
- a(document.body).ready(tsf.S);a(document.body).ready(tsf.da);a(document.body).ready(tsf.P);a(document.body).ready(tsf.M);a(document.body).on("click touchstart MSPointerDown",tsf.fa);tsf.F().on("input",tsf.L);tsf.h().on("input",tsf.s);a("#tsf-title-separator input").on("click",tsf.ja);a("#tsf-description-separator input").on("click",tsf.ia);a(".tsf-js-confirm-reset").on("click",tsf.U);a(".tsf-tabs-radio").on("change",tsf.sa);a(".tsf-flex-nav-tab-radio").on("change",tsf.aa);a("#tsf-description-onblogname-toggle :input").on("click",
37
- tsf.ua);a("#tsf-description-additions-toggle :input").on("click",tsf.R);a(".tsf-dismiss").on("click",tsf.X);a(".tsf-counter").on("click",tsf.V)}};jQuery(tsf.ready);
1
+ window.tsf={nonce:tsfL10n.nonce,nonces:tsfL10n.nonces,i18n:tsfL10n.i18n,states:tsfL10n.states,params:tsfL10n.params,other:tsfL10n.other,g:!1,m:!1,B:"",F:"",a:0,c:!1,f:"",cropper:{},h:function(){return jQuery("#autodescription_title, #autodescription-meta\\[doctitle\\], #autodescription-site-settings\\[homepage_title\\]")},G:function(){return jQuery("#autodescription_description, #autodescription-meta\\[description\\], #autodescription-site-settings\\[homepage_description\\]")},confirm:function(a){return confirm(a)},
2
+ M:function(a){var b=jQuery(a.target),c=b.val().length;a=jQuery("#"+tsf.H(a.target.id)+"_chars");var d="";0===c&&(c=b.prop("placeholder").length);if(100>c||175<=c){b="tsf-count-bad";var e=tsf.i("bad")}else 137>c||155<c&&175>c?(b="tsf-count-okay",e=tsf.i("okay")):(b="tsf-count-good",e=tsf.i("good"));tsf.f&&(b+=" "+tsf.f);tsf.a&&1!=tsf.a?2==tsf.a?d=e:3==tsf.a&&(d=c.toString()+" - "+e):d=c.toString();a.html(d).removeClass().addClass(b)},u:function(a){var b=jQuery(a.target),c=tsf.params.titleAdditions.length,
3
+ d=tsf.params.blogDescription.length,e=tsf.params.siteTitle.length,f=b.val().length,k=b.prop("placeholder").length,h=jQuery("#autodescription-site-settings\\[homepage_title_tagline\\]").val(),m=3;a=jQuery("#"+tsf.H(a.target.id)+"_chars");var l=0,b=tsf.f,g=tsf.a,n="";tsf.m||(m=c=0);0===f&&(0!==e?f=e:l=k);0!==f&&(0!==c&&"undefined"!==typeof h&&(c=h.length,c=0!==c?c:d),l=0===c?f:f+m+c);25>l||75<=l?(d="tsf-count-bad",f=tsf.i("bad")):42>l||55<l&&75>l?(d="tsf-count-okay",f=tsf.i("okay")):(d="tsf-count-good",
4
+ f=tsf.i("good"));b&&(d+=" "+b);g&&1!=g?2==g?n=f:3==g&&(n=l.toString()+" - "+f):n=l.toString();a.html(n).removeClass().addClass(d)},H:function(a){return a?a.replace(/([\[\]\/])/g,"\\$1"):a},ja:function(a){var b=jQuery(".tsf-sep-js");a=jQuery(a.target).val();tsf.B=a;"pipe"===a?b.text(" | "):"dash"===a?b.text(" - "):b.html(" &"+a+"; ")},ia:function(a){var b=jQuery("#autodescription-descsep-js");a=jQuery(a.target).val();"pipe"===a?b.text(" | "):"dash"===a?b.text(" - "):b.html(" &"+a+"; ")},statusBarHover:function(){var a=
5
  jQuery(".tsf-seo-bar-inner-wrap").find("a");a.on("mouseenter",tsf.pa);a.on("mousemove",tsf.ra);a.on("mouseleave",tsf.qa)},pa:function(a){a=jQuery(a.target);var b=a.data("desc");void 0!==b&&0===a.find("div").length&&(a.append('<div class="tsf-explanation-desc">'+b+"<div></div></div>"),b=a.find("div.tsf-explanation-desc").height()+28,a.find("div.tsf-explanation-desc").css("top",a.position().top-b+"px"))},ra:function(a){var b=jQuery(a.target);a=a.pageX;var c=a-b.closest(".tsf-seo-bar-inner-wrap").offset().left-
6
  11,d=b.find(".tsf-explanation-desc"),b=d.find("div");if(1>c)b.css("left","0px");else if(void 0!==d.offset()){var e=d.width(),d=d.offset().left+e+11;a>d?b.css("left",e+"px"):b.css("left",c+"px")}},qa:function(a){jQuery(a.target).find("div.tsf-explanation-desc").remove()},fa:function(){var a=jQuery(document.body.target),b=jQuery(".tsf-seo-bar-inner-wrap a");a.closest(b).length||b.find("div.tsf-explanation-desc").remove()},sa:function(a){a=jQuery(a.target);if(a.is(":checked")){var b=a.prop("id");a=a.prop("name");
7
+ if("undefined"!==typeof a){var c=jQuery("#"+b+"-content"),d=jQuery(".tsf-active-tab-content");c.is(d)||"undefined"===typeof c||(jQuery("."+a+"-content").fadeOut(150,function(){jQuery(this).removeClass("tsf-active-tab-content")}),setTimeout(function(){c.addClass("tsf-active-tab-content").fadeIn(250)},150),setTimeout(function(){jQuery("#"+b).trigger("tsf-tab-toggled")},175))}}},ba:function(a){a=jQuery(a.target);if(a.is(":checked")){var b=a.prop("id");a=a.prop("name");if("undefined"!==typeof a){var c=
8
  jQuery("#"+b+"-content"),d=jQuery(".tsf-flex-tab-content-active");c.is(d)||"undefined"===typeof c||(jQuery("."+a+"-content").fadeOut(150,function(){jQuery(this).removeClass("tsf-flex-tab-content-active")}),setTimeout(function(){c.addClass("tsf-flex-tab-content-active").fadeIn(250)},150),setTimeout(function(){jQuery("#"+b).trigger("tsf-flex-tab-toggled")},175))}}},ma:function(){if(tsf.c&&tsf.states.isSettingsPage){var a=jQuery(".tsf-nav-tab-wrapper .tsf-tab:nth-of-type(n+2) input:checked");a.length&&
9
  a.each(function(){var a=jQuery(this),c=a.prop("id"),a=a.prop("name");if("undefined"!==typeof a){var d=jQuery("#"+c+"-content");"undefined"!==typeof d&&(jQuery("."+a+"-content").removeClass("tsf-active-tab-content"),d.addClass("tsf-active-tab-content"),setTimeout(function(){jQuery("#"+c).trigger("tsf-tab-toggled")},20))}})}},wa:function(a){a=jQuery(a.target);var b=jQuery(".tsf-custom-blogname-js");a.is(":checked")?(b.css("display","inline"),tsf.m=!0):(b.css("display","none"),tsf.m=!1);tsf.h().trigger("keyup",
10
+ tsf.u)},ua:function(a){a=jQuery(a.target);var b=jQuery("#tsf-on-blogname-js");a.is(":checked")?b.css("display","inline"):b.css("display","none")},xa:function(a){a=jQuery(a.target).val();var b=jQuery(".tsf-title-additions-example-left"),c=jQuery(".tsf-title-additions-example-right");"right"===a?(b.css("display","none"),c.css("display","inline")):(b.css("display","inline"),c.css("display","none"))},ya:function(a){a=jQuery(a.target);var b=jQuery(".tsf-title-prefix-example");a.is(":checked")?b.css("display",
11
+ "none"):b.css("display","inline")},S:function(a){a=jQuery(a.target);var b=jQuery("#tsf-description-additions-js");a.is(":checked")?b.css("display","inline"):b.css("display","none")},va:function(){if(tsf.c){var a=jQuery("#tsf-title-tagline-toggle :input"),b=jQuery(".tsf-custom-blogname-js"),c=jQuery("#tsf-description-additions-toggle :input"),d=jQuery("#tsf-description-additions-js"),e=jQuery("#tsf-description-onblogname-toggle :input"),f=jQuery("#tsf-on-blogname-js"),k=jQuery("#tsf-title-additions-toggle :input"),
12
+ h=jQuery(".tsf-title-additions-js");a.is(":checked")?b.css("display","inline"):b.css("display","none");c.is(":checked")?d.css("display","inline"):d.css("display","none");e.is(":checked")?f.css("display","inline"):f.css("display","none");k.is(":checked")?h.css("display","none"):h.css("display","inline")}},za:function(a){a=jQuery(a.target).val();var b=jQuery(".tsf-custom-title-js");0===a.length?b.text(tsf.params.siteTitle):b.text(a)},A:function(a){a=jQuery(a.target).val();var b=jQuery(".tsf-custom-tagline-js"),
13
+ c=jQuery("#autodescription-site-settings\\[homepage_title\\]"),d=jQuery("#tsf-home-title-location input:checked").val(),e=jQuery("#autodescription-site-settings\\[homepage_tagline\\]"),f=tsf.params.siteTitle,k=f,h=tsf.params.blogDescription,m=tsf.I("title");e.is(":checked")&&(0!==a.length&&(h=a),k=0!==d.length&&"left"===d?f+" "+m+" "+h:h+" "+m+" "+f);b.text(h);c.prop("placeholder",k);tsf.h().trigger("input",tsf.u)},l:function(){var a=tsf.g;tsf.states.isSettingsPage?jQuery("#autodescription-site-settings\\[homepage_title_tagline\\]").trigger("input",
14
+ tsf.A):jQuery("#autodescription_title").trigger("input",tsf.A);tsf.g=a},ta:function(){var a=0,b=0;jQuery(window).resize(function(){clearTimeout(a);a=setTimeout(function(){var a=jQuery(window).width();b<a?782>=b&&782<=a&&tsf.l():782<=b&&782>=a&&tsf.l();b=a},250)})},Aa:function(){var a=jQuery(event.target),b=jQuery(".tsf-title-additions-js");a.is(":checked")?b.css("display","none"):b.css("display","inline")},T:function(){tsf.c&&(jQuery(".tsf-metaboxes :input, #tsf-inpost-box .inside :input").not(".tsf-tab :input, .tsf-flex-nav-tab :input").change(function(){tsf.j()}),
15
  jQuery(".tsf-metaboxes input[type=text], .tsf-metaboxes textarea, #tsf-inpost-box .inside input[type=text], #tsf-inpost-box .inside textarea").not(".tsf-nav-tab-wrapper input, .tsf-flex-nav-tab-wrapper input").on("input",function(){tsf.j()}),window.onbeforeunload=function(){if(tsf.g)return tsf.i18n.saveAlert},jQuery('.tsf-metaboxes input[type="submit"], #publishing-action input[type="submit"], #save-action input[type="submit"], a.submitdelete').click(function(){window.onbeforeunload=null}))},j:function(){tsf.g=
16
+ !0},V:function(){return confirm(tsf.i18n.confirmReset)},Z:function(a){var b=tsf.params.titleAdditions.length,c=jQuery("#tsf-title-placeholder");if(!b)return jQuery(a.target).css("text-indent","initial"),c.empty();var b=!1,d=jQuery("#tsf-home-title-location input:checked").val(),e=tsf.states.isRTL;"undefined"!==typeof d&&0!==d.length?e?"right"===d&&(b=!0):"left"===d&&(b=!0):(d=tsf.params.titleLocation,tsf.states.isHome?tsf.m&&(e?"right"===d&&(b=!0):"left"===d&&(b=!0)):e?"left"===d&&(b=!0):"right"===
17
+ d&&(b=!0));d=jQuery("#tsf-title-tagline-toggle :input");if("undefined"!==typeof d&&0<d.length&&!d.is(":checked"))jQuery(a.target).css("text-indent","initial"),c.css("display","none");else{a=jQuery(a.target);var f=a.val(),k=jQuery("#tsf-title-offset"),h=a.outerWidth(),m=(a.outerHeight(!0)-a.height())/2,l=(h-a.innerWidth())/2,d=(a.outerWidth(!0)-a.width())/2;var g=jQuery("#autodescription-site-settings\\[homepage_title_tagline\\]").val();var n="left",p=tsf.I("title");e&&(n="right");"undefined"!==typeof g&&
18
+ 0===g.length&&(g=tsf.params.blogDescription);b?(e=" "+p+" "+tsf.params.titleAdditions,"undefined"!==typeof g&&0<g.length&&(e=" "+p+" "+g),a.css("text-indent","initial")):(e=tsf.params.titleAdditions+" "+p+" ","undefined"!==typeof g&&0<g.length&&(e=g+" "+p+" "));k.text(f);k.css({fontFamily:a.css("fontFamily"),fontWeight:a.css("fontWeight"),letterSpacing:a.css("letterSpacing"),fontSize:a.css("fontSize")});g=k.width();g=a.width()-l-g;0>g&&(g=0);c.css({display:a.css("display"),lineHeight:a.css("lineHeight"),
19
+ paddingTop:m+"px",paddingBottom:m+"px",fontFamily:a.css("fontFamily"),fontWeight:a.css("fontWeight"),fontSize:a.css("fontSize"),letterSpacing:a.css("letterSpacing"),maxWidth:g+"px"});"undefined"===typeof f||1>f.length?(b||a.css("text-indent","initial"),c.empty()):(c.text(e),h>d&&(b?c.css(n,l+d+k.width()+"px"):(b=l+c.width(),0>b&&(b=0),c.css(n,d+"px"),a.css("text-indent",b+"px"))))}},ha:function(){var a=tsf.h();a.focus();if(a.setSelectionRange){var b=2*a.val().length;a.setSelectionRange(b,b)}else a.val(a.val()).focus()},
20
+ Ba:function(){tsf.c&&tsf.G().trigger("input",tsf.M)},Ca:function(){tsf.c&&tsf.h().trigger("input",tsf.u)},ea:function(){tsf.g=!1},Y:function(a){var b=jQuery(a.target);b.parents(".tsf-notice").slideUp(200,function(){b.remove()})},ka:function(a){jQuery(a).toggleClass("tsf-loading")},L:function(a,b){var c="tsf-success",d=2500;b||(c="tsf-error",d=5E3);jQuery(a).removeClass("tsf-loading").addClass(c).fadeOut(d)},K:function(a){jQuery(a).stop().empty().prop("class","tsf-ajax").css("opacity","1").removeProp("style")},
21
+ W:function(){tsf.a+=1;3<tsf.a&&(tsf.a=0);tsf.C();var a=0;tsf.K(".tsf-counter .tsf-ajax");tsf.ka(".tsf-counter .tsf-ajax");jQuery.ajax({method:"POST",url:ajaxurl,Fa:"json",data:{action:"the_seo_framework_update_counter",nonce:tsf.nonces.edit_posts,val:tsf.a},async:!0,success:function(b){b=jQuery.parseJSON(b);"success"===b.type&&(a=1);tsf.X(".tsf-counter .tsf-ajax",a)}})},X:function(a,b){switch(b){case 0:tsf.L(a,!1);break;case 1:tsf.L(a,!0);break;default:tsf.K(a)}},C:function(){if(tsf.c){var a=tsf.a,
22
+ b=tsf.g;1==a?(tsf.f="tsf-counter-one",tsf.a=1):2==a?(tsf.f="tsf-counter-two",tsf.a=2):3==a?(tsf.f="tsf-counter-three",tsf.a=3):(tsf.f="tsf-counter-zero",tsf.a=0);tsf.Da();tsf.g=b}},Da:function(){tsf.Ca();tsf.Ba()},i:function(a){return tsf.i18n[a]},I:function(a){var b="";a="title"===a?tsf.B:tsf.F;"pipe"===a||"|"===a?b="|":"dash"===a||"-"===a?b="-":123>a.charCodeAt(0)&&("&"===a.charAt(0)&&";"===a.slice(-1)&&(a=a.substr(1).slice(0,-1)),b=jQuery("<div/>").html("&"+a+";").text());return b},J:function(a){if(jQuery(a.target).prop("disabled")||
23
+ "undefined"===typeof wp.media)a.preventDefault(),a.stopPropagation();else{var b=jQuery(a.target),c=b.data("inputid");if(!d){a.preventDefault();a.stopPropagation();tsf.aa();var d=wp.media({button:{text:tsf.other[c].frame_button,close:!1},states:[new wp.media.controller.Library({title:tsf.other[c].frame_title,library:wp.media.query({type:"image"}),multiple:!1,date:!1,priority:20,suggestedWidth:1200,suggestedHeight:630}),new tsf.cropper({imgSelectOptions:tsf.calculateImageSelectOptions})]});a=function(){d.setState("cropper")};
24
+ d.off("select",a);d.on("select",a);a=function(a){var b=a.url;a=a.id;jQuery("#"+c+"-url").val(b);jQuery("#"+c+"-id").val(a)};d.off("cropped",a);d.on("cropped",a);a=function(a){var b=a.get("url"),d=a.get("id");a.get("width");a.get("height");jQuery("#"+c+"-url").val(b);jQuery("#"+c+"-id").val(d)};d.off("skippedcrop",a);d.on("skippedcrop",a);a=function(){jQuery("#"+c+"-select").text(tsf.other[c].change);jQuery("#"+c+"-url").prop("readonly",!0).css("opacity",0).animate({opacity:1},{queue:!0,duration:1E3},
25
+ "swing");tsf.D(b,c,!0);tsf.j()};d.off("skippedcrop cropped",a);d.on("skippedcrop cropped",a)}d.open()}},D:function(a,b,c){a&&b&&!jQuery("#"+b+"-remove").length&&(a.after('<a href="javascript:void(0)" id="'+b+'-remove" class="tsf-remove-social-image button button-small" data-inputid="'+b+'" title="'+tsf.other[b].remove_title+'">'+tsf.other[b].remove+"</a>"),c&&jQuery("#"+b+"-remove").css("opacity",0).animate({opacity:1},{queue:!0,duration:1E3},"swing"));tsf.ga()},s:function(a){var b=jQuery(a.target).data("inputid");
26
+ jQuery("#"+b+"-select").prop("disabled")||(jQuery("#"+b+"-select").addClass("disabled").prop("disabled",!0),jQuery("#"+b+"-remove").addClass("disabled").prop("disabled",!0).fadeOut(500,function(){jQuery(this).remove();jQuery("#"+b+"-select").text(tsf.other[b].select).removeClass("disabled").removeProp("disabled")}),jQuery("#"+b+"-url").val("").removeProp("readonly").css("opacity",0).animate({opacity:1},{queue:!0,duration:500},"swing"),jQuery("#"+b+"-id").val(""),tsf.j())},aa:function(){if("undefined"===
27
+ typeof tsf.cropper.control){var a=wp.media.controller.Cropper.extend({doCrop:function(a){var b=a.get("cropDetails"),d=tsf.cropper.control;if(d.params.flex_width&&d.params.flex_height)if(b.width===b.height)b.width>d.params.flex_width&&(b.dst_width=b.dst_height=d.params.flex_width);else if(b.width>d.params.flex_width||b.height>d.params.flex_height)if(b.width>b.height){var e=b.width/d.params.flex_width;b.dst_width=d.params.flex_width;b.dst_height=Math.round(b.height/e)}else e=b.height/d.params.flex_height,
28
+ b.dst_height=d.params.flex_height,b.dst_width=Math.round(b.width/e);"undefined"===typeof b.dst_width&&(b.dst_width=0,b.dst_height=0);return wp.ajax.post("tsf-crop-image",{nonce:tsf.nonces.upload_files,id:a.get("id"),context:"tsf-image",cropDetails:b})}});a.prototype.control={};a.control={params:{flex_width:1500,flex_height:1500,width:1200,height:630}};tsf.cropper=a}},calculateImageSelectOptions:function(a,b){var c=tsf.cropper.control,d=!!parseInt(c.params.flex_width,10),e=!!parseInt(c.params.flex_height,
29
+ 10),f=parseInt(c.params.width,10),k=parseInt(c.params.height,10),h=a.get("width"),m=a.get("height"),l=f/k,g=f,n=k;b.set("control",c.params);b.set("canSkipCrop",!tsf.da(c.params.flex_width,c.params.flex_height,h,m));h/m>l?(k=m,f=k*l):(f=h,k=f/l);c=(h-f)/2;l=(m-k)/2;g={handles:!0,keys:!0,instance:!0,persistent:!0,imageWidth:h,imageHeight:m,minWidth:g>f?f:g,minHeight:n>k?k:n,x1:c,y1:l,x2:f+c,y2:k+l};!1===e&&!1===d&&(g.Ea=f+":"+k);!0===e&&(g.minHeight=200,g.maxWidth=h);!0===d&&(g.minWidth=200,g.maxHeight=
30
+ m);return g},da:function(a,b,c,d){return c<=a&&d<=b?!1:!0},ga:function(){jQuery(".tsf-remove-social-image").off("click",tsf.s);jQuery(".tsf-remove-social-image").on("click",tsf.s)},na:function(){jQuery(".tsf-set-social-image").off("click",tsf.J);jQuery(".tsf-remove-social-image").off("click",tsf.s);jQuery(".tsf-set-social-image").on("click",tsf.J);jQuery(".tsf-remove-social-image").on("click",tsf.s)},U:function(){var a=jQuery(".tsf-set-social-image");if(a.length){var b="",c="";jQuery.each(a,function(a,
31
+ e){b=jQuery(e).data("inputid");c=jQuery("#"+b+"-id");c.length&&0<c.val()&&(jQuery("#"+b+"-url").prop("readonly",!0),tsf.D(jQuery(e),b,!1));jQuery("#"+b+"-url").val()&&jQuery("#"+b+"-select").text(tsf.other[b].change)})}},la:function(){var a=jQuery(".tsf-color-picker");a.length&&jQuery.each(a,function(a,c){var b=jQuery(c),e="",f=b.data("tsf-default-color");b.wpColorPicker({defaultColor:f,width:238,change:function(){e=b.wpColorPicker("color");""===e&&(e=f);b.val(e);tsf.j()},clear:function(){b.parent().siblings(".wp-color-result").css("backgroundColor",
32
+ f);tsf.j()},palettes:!1})})},oa:function(){tsf.B=tsf.params.titleSeparator;tsf.F=tsf.params.descriptionSeparator;tsf.m=tsf.states.titleTagline;tsf.a=parseInt(tsf.states.counterType);tsf.c=tsf.states.hasInput},O:function(){if(tsf.c){var a=jQuery;a("#tsf-title-tagline-toggle :input").on("click",tsf.wa);a("#tsf-title-location input").on("click",tsf.xa);a("#title-prefixes-toggle :input").on("click",tsf.ya);a("#autodescription-site-settings\\[homepage_title\\]").on("input",tsf.za);a("#tsf-home-title-location :input, #tsf-title-tagline-toggle :input, #tsf-title-separator input").on("click",
33
+ tsf.l);a("#autodescription-site-settings\\[homepage_title_tagline\\]").on("input",tsf.A);a("#homepage-tab-general").on("tsf-tab-toggled",tsf.l);a("#autodescription-homepage-settings > button").on("click",tsf.l);a("#tsf-inpost-box > button").on("click",tsf.l);a("#autodescription-site-settings\\[title_rem_additions\\]").on("click",tsf.Aa);tsf.h().on("input",tsf.Z);a("#tsf-title-placeholder").on("click",tsf.ha);a(window).resize(tsf.ta)}},N:function(){if(jQuery(".tsf-flex").length){tsf.P();var a=0,b=
34
+ {},c=0,d=jQuery(".tsf-flex-nav-tab-wrapper");jQuery(window).on("tsf-flex-resize",function(){clearTimeout(a);var e=0;a=setTimeout(function(){if(d.length){var a=jQuery(".tsf-flex-nav-tab-inner"),c=d.width(),h=a.width(),m=jQuery(".tsf-flex-nav-name");b.b||(b.b={},b.b.v=0,b.b.ca=0,b.b.w=1);!b.b.w&&b.b.v<c&&(m.fadeIn(250),setTimeout(function(){h=a.width()},e));setTimeout(function(){h>c?(m.hide(),b.b.w=0):b.b.v<c&&(m.fadeIn(250),b.b.w=1)},2*e);setTimeout(function(){b.b.v=c;b.b.ca=h},3*e)}},c);e=10;c=75});
35
+ jQuery(window).trigger("tsf-flex-resize")}},P:function(){jQuery(window).on("resize orientationchange",tsf.o);jQuery("#collapse-menu").click(tsf.o);jQuery(".columns-prefs :input[type=radio]").change(tsf.o);jQuery(".meta-box-sortables").on("sortupdate",tsf.o)},o:function(){jQuery(window).trigger("tsf-flex-resize")},R:function(){jQuery(document.body).trigger("tsf-ready")},ready:function(a){tsf.oa();a("div.updated, div.error, div.notice-warning").insertAfter("div.tsf-top-wrap");a(document.body).ready(tsf.O);
36
+ a(document.body).ready(tsf.ma);a(document.body).ready(tsf.C);a(document.body).ready(tsf.va);a(document.body).ready(tsf.statusBarHover);a(document.body).ready(tsf.na);a(document.body).ready(tsf.U);a(document.body).ready(tsf.la);a(document.body).ready(tsf.T);a(document.body).ready(tsf.ea);a(document.body).ready(tsf.R);a(document.body).ready(tsf.N);a(document.body).on("click touchstart MSPointerDown",tsf.fa);tsf.G().on("input",tsf.M);tsf.h().on("input",tsf.u);a("#tsf-title-separator input").on("click",
37
+ tsf.ja);a("#tsf-description-separator input").on("click",tsf.ia);a(".tsf-js-confirm-reset").on("click",tsf.V);a(".tsf-tabs-radio").on("change",tsf.sa);a(".tsf-flex-nav-tab-radio").on("change",tsf.ba);a("#tsf-description-onblogname-toggle :input").on("click",tsf.ua);a("#tsf-description-additions-toggle :input").on("click",tsf.S);a(".tsf-dismiss").on("click",tsf.Y);a(".tsf-counter").on("click",tsf.W)}};jQuery(tsf.ready);
load.php CHANGED
@@ -8,7 +8,7 @@ defined( 'THE_SEO_FRAMEWORK_DIR_PATH' ) or die;
8
 
9
  /**
10
  * The SEO Framework plugin
11
- * Copyright (C) 2015 - 2016 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
@@ -161,6 +161,7 @@ function _autoload_classes( $class ) {
161
  function _do_plugin_activation() {
162
 
163
  \The_SEO_Framework\_activation_setup_sitemap();
 
164
  }
165
 
166
  \add_action( 'deactivate_' . THE_SEO_FRAMEWORK_PLUGIN_BASENAME, __NAMESPACE__ . '\\_do_plugin_deactivation' );
@@ -173,6 +174,7 @@ function _do_plugin_activation() {
173
  */
174
  function _do_plugin_deactivation() {
175
 
 
176
  \The_SEO_Framework\_deactivation_unset_sitemap();
177
  }
178
 
@@ -213,3 +215,53 @@ function _deactivation_unset_sitemap() {
213
 
214
  \add_action( 'shutdown', 'flush_rewrite_rules' );
215
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2017 Sybre Waaijer, CyberWire (https://cyberwire.nl/)
12
  *
13
  * This program is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License version 3 as published
161
  function _do_plugin_activation() {
162
 
163
  \The_SEO_Framework\_activation_setup_sitemap();
164
+ \The_SEO_Framework\_activation_set_options_autoload();
165
  }
166
 
167
  \add_action( 'deactivate_' . THE_SEO_FRAMEWORK_PLUGIN_BASENAME, __NAMESPACE__ . '\\_do_plugin_deactivation' );
174
  */
175
  function _do_plugin_deactivation() {
176
 
177
+ \The_SEO_Framework\_deactivation_unset_options_autoload();
178
  \The_SEO_Framework\_deactivation_unset_sitemap();
179
  }
180
 
215
 
216
  \add_action( 'shutdown', 'flush_rewrite_rules' );
217
  }
218
+
219
+ /**
220
+ * Turns on autoloading for The SEO Framework main options.
221
+ *
222
+ * @since 2.9.2
223
+ * @access private
224
+ */
225
+ function _activation_set_options_autoload() {
226
+
227
+ $the_seo_framework = \the_seo_framework();
228
+
229
+ if ( isset( $the_seo_framework ) ) {
230
+ $options = $the_seo_framework->get_all_options();
231
+ $setting = THE_SEO_FRAMEWORK_SITE_OPTIONS;
232
+
233
+ \remove_all_filters( "pre_update_option_{$setting}" );
234
+ \remove_all_actions( "update_option_{$setting}" );
235
+ \remove_all_filters( "sanitize_option_{$setting}" );
236
+
237
+ // Set to false, so we can reset the options.
238
+ $_success = \update_option( $setting, false );
239
+ if ( $_success )
240
+ \update_option( $setting, $options, 'yes' );
241
+ }
242
+ }
243
+
244
+ /**
245
+ * Turns off autoloading for The SEO Framework main options.
246
+ *
247
+ * @since 2.9.2
248
+ * @access private
249
+ */
250
+ function _deactivation_unset_options_autoload() {
251
+
252
+ $the_seo_framework = \the_seo_framework();
253
+
254
+ if ( isset( $the_seo_framework ) ) {
255
+ $options = $the_seo_framework->get_all_options();
256
+ $setting = THE_SEO_FRAMEWORK_SITE_OPTIONS;
257
+
258
+ \remove_all_filters( "pre_update_option_{$setting}" );
259
+ \remove_all_actions( "update_option_{$setting}" );
260
+ \remove_all_filters( "sanitize_option_{$setting}" );
261
+
262
+ // Set to false, so we can reset the options.
263
+ $_success = \update_option( $setting, false );
264
+ if ( $_success )
265
+ \update_option( $setting, $options, 'no' );
266
+ }
267
+ }
readme.txt CHANGED
@@ -1,10 +1,10 @@
1
  === The SEO Framework ===
2
  Contributors: Cybr
3
  Donate link: https://theseoframework.com/donate/
4
- Tags: google, bing, open graph, seo, xml sitemap, breadcrumbs, meta, search engine, pagerank, serp, facebook, twitter
5
  Requires at least: 4.4.0
6
  Tested up to: 4.8.0
7
- Stable tag: 2.9.1
8
  License: GPLv3
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
@@ -12,9 +12,10 @@ The SEO Framework plugin provides an automated and advanced SEO solution for you
12
 
13
  == Description ==
14
 
15
- **Easy SEO for beginners, an awesome API for experts. WordPress SEO for everyone.**
 
16
 
17
- An accessible, unbranded and extremely fast SEO solution for any WordPress website.
18
 
19
  For optional advanced SEO options and output, check out our free companion plugin [Extension Manager](https://wordpress.org/plugins/the-seo-framework-extension-manager/).
20
 
@@ -24,69 +25,67 @@ For optional advanced SEO options and output, check out our free companion plugi
24
  > No SEO plugin does the magic thing to be found instantly. But doing it right helps a lot.<br>
25
  > The SEO Framework helps you doing it right. Give it a try!
26
  >
27
- > The Default Settings are recommended within the SEO Settings page. If you know what you're doing, go ahead and change them! Each option is also documented.
28
-
29
- = What this plugin does, in a few lines =
30
-
31
- * Automatically configures SEO for every page, post, taxonomy and term.
32
- * Allows you to adjust the SEO globally.
33
- * Allows you to adjust the SEO for every applicable page, post, taxonomy and term.
34
- * Shows you how to improve your SEO with a beautiful SEO bar for each supported Post, Page and Taxonomy.
35
- * Helps your pages get ranked distinctively through various Metatag and scripting techniques.
36
- * Helps your pages get shared more beautiful through Facebook, Twitter and other social sites.
37
- * Allows plugin authors to easily extend this plugin.
 
38
  * Supports custom post types, like WooCommerce and bbPress.
39
- * Automatically upgrades itself from Genesis Framework SEO.
40
  * Allows for easy SEO plugin switch using a tool.
41
 
42
- *Read [this guide](https://theseoframework.com/docs/seo-data-migration/) for transferring SEO Content using SEO Data Transporter.
43
 
44
  = Unbranded, Free and for the Professional =
45
  This plugin is unbranded! This means that we don't even put the name "The SEO Framework" anywhere within the WordPress interface, aside from the plugin activation page.
46
  This plugin makes great use of the default WordPress interface elements, like as if this plugin is part of WordPress. No ads, no nags.
47
- The small and hidden HTML comment can easily be disabled with the use of a filter or extension.
48
 
49
  Nobody has to know about the tools you've used to create your or someone else's website. A clean interface, for everyone.
50
 
51
  = Completely automated =
52
  **By default, this plugin automatically generates:**
53
 
54
- * Title, with super-fast 'wrong themes' support.
55
- * Description, with anti-spam techniques.
56
- * A canonical URL, with full Domain Mapping, subdomain and HTTPS support to prevent duplicated content.
57
  * Various Open Graph, Facebook and Twitter tags.
58
- * Special Open Graph description, which organically integrates with the Facebook and Twitter snippets.
59
- * Extended Open Graph Images support, including automated image manipulation.
60
- * Schema.org JSON-LD script that adds extended search support for Google Search and Chrome.
61
- * Schema.org JSON-LD script for Knowledge Graph (Personal/Business site relations, name and logo).
62
- * Advanced Schema.org JSON-LD script for Breadcrumbs (just like the visual one) which extends page relation support in Google Search.
63
- * Schema.org JSON-LD script to show the correct site name in Google Breadcrumbs.
64
- * Publishing and editing dates, accurate to the day.
65
- * Link relationships, with full Domain Mapping and HTTPS support.
66
- * Simple Sitemap with Pages, Posts and Custom Post Types (CPT), which listens to the in-post settings.
67
- * Feed excerpts and backlinks to prevent content scraping.
68
 
69
  **This plugin goes further, behind the screens it:**
70
 
71
  * Prevents canonical errors with categories, pages, subdomains and Multisite Domain Mapping.
72
  * Discourages 404 pages and empty categories from being indexed, even if they don't send a 404 response.
73
- * Automatically notifies Google, Bing and Yandex on Post or Page update and deletion when sitemaps are enabled.
74
 
75
  = Generously personal =
76
- **This plugin allows you to manually set various values for each post, page, public CPT and term.**
77
 
78
- **This plugin allows you to adjust over 90 site settings, including:**
79
 
80
- * Title and Description Separators and additions.
81
- * Automated description output.
82
- * Schema.org output, including Knowledge Graph options.
83
- * Various robots' options.
84
  * Many home page specific options.
85
- * Facebook, Twitter and Pinterest social integration
86
- * Shortlink tag output.
87
- * Link relationships
88
- * Google, Bing, Pinterest and Yandex Webmaster verification
89
- * Sitemap integration.
90
  * Robots.txt sitemap integration.
91
  * Feed anti-scraper options.
92
  * And many, many more settings.
@@ -102,53 +101,74 @@ Take a look at the API documentation located at [The SEO Framework API Docs](htt
102
  * If the description is too long, too short, duplicated, has too many repeated words and/or automatically generated.
103
  * If the page is indexed, redirected, followed and/or archived, while looking at other WordPress settings.
104
 
105
- **We call this The SEO Bar. Check out the [Screenshots](https://wordpress.org/plugins/autodescription/screenshots/#plugin-info) to see how it helps you!**
106
 
107
  = Hardcore caching =
108
- This plugin's code is highly optimized on PHP-level and uses variable, object and transient caching. This means that there's little extra page load time from this plugin, even with more Meta tags used.
109
- A caching plugin isn't even needed for this plugin as you won't notice a difference, however it's supported wherever best suited.
110
 
111
  = Compatibility =
 
112
 
113
- * PHP 5.3 and later
114
- * WordPress 4.4 and later
115
- * Full internationalization support through WordPress.org.
116
- * Extended Multibyte support (CJK).
117
- * Full Right to Left (RTL) language support.
118
  * Extended Color vision deficiency accessibility.
119
  * Screen reader accessibility.
120
- * Full MultiSite support, this plugin is in fact built upon one.
121
  * Detection of robots.txt and sitemap.xml files.
122
- * Detection of theme Title output "doing it right" (or wrong).
123
- * Automatic detection of various other popular SEO tools.
124
-
125
- **If you have other popular SEO plugins activated, this plugin will automatically prevent SEO mistakes by deactivating itself on almost every part.**
126
 
127
  = An additional sitemap =
128
- The Sitemap generated with The SEO Framework is sufficient for Search Engines to find Posts, Pages and supported Custom Post Types throughout your website.
129
- It also listens to the noindex settings on each of the items.
130
- If you however require a more expanded Sitemap, feel free to activate a dedicated Sitemap plugin. The SEO Framework will automatically deactivate its Sitemap functionality when another (known) Sitemap plugin is found.
131
- If it is not automatically detected and no notification has been provided on the Sitemap Settings, feel free to open a support ticket and it will be addressed carefully.
132
 
133
  = Hidden breadcrumbs =
134
- The Breadcrumb script generated by this plugin on Posts will also make sure Google easily finds related categories which aren't included within the Sitemap of this plugin.
135
 
136
  == Installation ==
137
 
138
- 1. Install The SEO Framework either via the WordPress.org plugin directory, or by uploading the files to your server.
 
 
 
 
 
 
 
139
  1. Either Network Activate this plugin or activate it on a single site.
140
  1. That's it!
141
- 1. Let the plugin automatically work or fine-tune each page with the metaboxes beneath the content or on the taxonomy pages.
142
- 1. Adjust the SEO settings through the SEO settings page if desired. Red checkboxes are rather left unchecked. Green checkboxes are default enabled.
143
- 1. Optionally, also install the [Extension Manager](https://wordpress.org/plugins/the-seo-framework-extension-manager/) for additional SEO solutions.
 
 
 
 
 
 
 
 
 
 
 
 
 
144
 
145
  == Screenshots ==
146
 
147
- 1. (version 2.7+) This plugin shows you what you can improve, at a glance. With full color vision deficiency support.
148
- 2. (version 2.7+) Hover over any of the SEO Bar's items to see how you can improve the page's SEO. Red is bad, orange is okay, green is good. Blue is situational.
149
- 3. (version 2.9+) The dynamic Post/Page SEO settings Metabox. Another version of this box is also implemented for Categories and Tags.
150
- 4. (version 2.9+) The dynamic Post/Page SEO settings Metabox also fits neatly in the sidebar. For when you want to work faster.
151
- 5. (version 2.7+) The SEO Settings Page. With over 90 settings, you are in full control. Using the Default Settings and filling in the Knowledge Graph Settings and Social Meta Settings is recommended to do.
152
 
153
  == Frequently Asked Questions ==
154
 
@@ -170,32 +190,31 @@ Please visit [the support forums](https://wordpress.org/support/plugin/autodescr
170
 
171
  = Is this really a Framework? =
172
 
173
- This plugin is not in particular a framework in a technical sense, but it is built with a framework's mindset. It is however a framework for your website's SEO, a building block that keeps everything together.
174
- This means that this plugin will do all the great Search Engine Optimization, and also allows for extensions and real-time alterations. For when you really want or need to change something.
175
- Extensions built for this plugin might just as well work as a standalone. The SEO Framework provides an easier and cached way of doing so, however.
176
 
177
  = I am a developer; how can I help? =
178
 
179
  The SEO Framework is currently a one-man project. However, any input is greatly appreciated and everything will be considered.
180
  Please visit the [GitHub project page](https://github.com/sybrew/the-seo-framework) to submit issues or even pull requests.
181
 
182
- = I want to remove or change stuff, but I can't find an option! =
183
 
184
- The SEO Framework is very pluggable on many fields. Please refer to the [Other Notes](https://wordpress.org/plugins/autodescription/other_notes/).
185
- Please note that a free plugin is underway which will allow you to change all scalar filters from the dashboard. No ETA yet.
186
 
187
  = The sitemap doesn't contain categories, images, news, etc. is this OK? =
188
 
189
  This is not an issue. Search Engines love crawling WordPress because its structure is consistent and well known.
190
  If a visitor can't find a page, then why would a Search Engine? Don't rely on your sitemap, but on your content and website's usability.
191
 
192
- = What's does the application/ld+json script do? =
193
 
194
  The JSON-LD scripts are Search Engine helpers which tell Search Engines how to connect and index the site.
195
  They can tell the Search Engine if your site contains an internal search engine, what sites you're socially connected to and what page structure you're using.
196
  This is also referred to as Structured Data.
197
 
198
- = The meta data is not being updated, and I'm using a caching plugin. =
199
 
200
  All The SEO Framework's metadata is put into Object cache when a caching plugin is available. The descriptions and Schema.org scripts are put into Transients. Please be sure to clear your cache.
201
 
@@ -206,11 +225,43 @@ Transporting Terms and Taxonomies SEO data isn't supported.
206
 
207
  == Changelog ==
208
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
209
  = 2.9.1 - Sovereign Comprehension =
210
 
211
  **Release date:**
212
 
213
- * 27th March 2017
214
 
215
  **Summarized:**
216
 
@@ -227,12 +278,12 @@ Transporting Terms and Taxonomies SEO data isn't supported.
227
 
228
  **Release date:**
229
 
230
- * 25th March 2017
231
 
232
  **Summarized:**
233
 
234
  * This update focuses on fixing bugs and expanding the API for developers.
235
- * To expand the API for per page (in-post) SEO settings, tabs had to be added in the SEO settings metabox.
236
  * The JavaScript code has also been overhauled to improve performance and allow third party implementation.
237
  * Moreover, the home page settings now allow you to upload a social image.
238
  * Structured data markup has also been improved, like the inclusion of an alternative Sitename and fixes for Breadcrumb images.
@@ -254,12 +305,12 @@ Transporting Terms and Taxonomies SEO data isn't supported.
254
  * This release brings tabbed layout to the in-post SEO settings.
255
  * With this change I've also altered the overall looks, with the help from [Daniel](https://github.com/danielpost).
256
  * This layout allows extensions from the [Extension Manager](https://wordpress.org/plugins/the-seo-framework-extension-manager/) to be implemented much easier.
257
- * This layout is self-responsive! This means it's not dependent on the browser-size, but on how much content will fit.
258
- * This layout therefore allows the SEO settings to be placed in the right sidebar! Take a look at the [new screenshots](https://wordpress.org/plugins/autodescription/screenshots/).
259
 
260
  **For everyone: Browser support**
261
 
262
- * This release brings [CSS Flexbox](https://www.w3.org/TR/css-flexbox-1/) to the new in-post SEO settings metabox.
263
  * The flexbox module is still experimental, in a way that not all browsers correctly support this to the fullest extend.
264
  * However, support for as many browsers feasible has been implemented. Check out [the list](https://theseoframework.com/?p=1903#browser-support). Enjoy!
265
  * The gist is that Chrome, Firefox, IE10 and Safari 6 or later are supported.
@@ -289,27 +340,3 @@ In the 2.8.0 update WordPress 4.3 and PHP 5.2 support have been dropped for bett
289
  The 2.7.0 update is required for the upcoming Extension Manager plugin and includes many improvements.
290
 
291
  == Other Notes ==
292
-
293
- = Filters =
294
-
295
- = Add any of the filters to your theme's functions.php or a plugin to change this plugin's output. =
296
-
297
- Learn about them here: [The SEO Framework filters](http://theseoframework.com/docs/api/filters/)
298
-
299
- = Actions =
300
-
301
- = Use any of these actions to add your own output. =
302
-
303
- They are found here: [The SEO Framework actions](http://theseoframework.com/docs/api/actions/)
304
-
305
- = Settings API =
306
-
307
- = Add settings to and interact with The SEO Framework. =
308
-
309
- Read how to here: [The SEO Framework Settings API](http://theseoframework.com/docs/api/settings/)
310
-
311
- = Beta Version =
312
-
313
- = Want to test the latest version before it's released? =
314
-
315
- If there's a beta, it will be available [on GitHub](https://github.com/sybrew/the-seo-framework). Please note that changes there might not reflect the final outcome of the full version release. Use at own risk.
1
  === The SEO Framework ===
2
  Contributors: Cybr
3
  Donate link: https://theseoframework.com/donate/
4
+ Tags: google, bing, open graph, seo, xml sitemap, breadcrumbs, meta, search engine, woocommerce, cpt, facebook, twitter
5
  Requires at least: 4.4.0
6
  Tested up to: 4.8.0
7
+ Stable tag: 2.9.2
8
  License: GPLv3
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
12
 
13
  == Description ==
14
 
15
+ **Easy SEO for beginners, an awesome API for experts.**
16
+ **WordPress SEO for everyone.**
17
 
18
+ This plugin provides an automated, accessible, unbranded and extremely fast SEO solution for any WordPress website.
19
 
20
  For optional advanced SEO options and output, check out our free companion plugin [Extension Manager](https://wordpress.org/plugins/the-seo-framework-extension-manager/).
21
 
25
  > No SEO plugin does the magic thing to be found instantly. But doing it right helps a lot.<br>
26
  > The SEO Framework helps you doing it right. Give it a try!
27
  >
28
+ > The default settings are recommended within the SEO Settings page. If you know what you're doing, go ahead and change them! Each option is also vastly documented.
29
+ > Don't forget to set up the social meta settings and a home page description; those can greatly increase conversion.
30
+
31
+ = This plugin: =
32
+
33
+ * Improves search presence by ranking your website distinctively.
34
+ * Is preconfigured, providing a suitable starting point for most websites.
35
+ * Listens to all WordPress gives to automatically configure SEO.
36
+ * Allows you to adjust the SEO through global options.
37
+ * Allows you to SEO every public page, post, taxonomy, and term.
38
+ * Shows you how to improve SEO with a beautiful SEO bar.
39
+ * Helps your pages get shared more beautiful through Facebook, Twitter, and other social sites.
40
  * Supports custom post types, like WooCommerce and bbPress.
 
41
  * Allows for easy SEO plugin switch using a tool.
42
 
43
+ *Read [this guide](https://theseoframework.com/docs/seo-data-migration/) on transferring SEO Content using SEO Data Transporter.*
44
 
45
  = Unbranded, Free and for the Professional =
46
  This plugin is unbranded! This means that we don't even put the name "The SEO Framework" anywhere within the WordPress interface, aside from the plugin activation page.
47
  This plugin makes great use of the default WordPress interface elements, like as if this plugin is part of WordPress. No ads, no nags.
48
+ The small and hidden HTML comments can easily be disabled with the use of a filter or extension.
49
 
50
  Nobody has to know about the tools you've used to create your or someone else's website. A clean interface, for everyone.
51
 
52
  = Completely automated =
53
  **By default, this plugin automatically generates:**
54
 
55
+ * Titles according to your settings with archive prefixes.
56
+ * Descriptions with anti-spam techniques and detection that informs you when it can be improved.
57
+ * A canonical URL to prevent duplicated content; with full Domain Mapping, subdomain, and HTTPS support.
58
  * Various Open Graph, Facebook and Twitter tags.
59
+ * Special Open Graph descriptions, which organically integrates within the Facebook and Twitter snippets.
60
+ * Open Graph images, they are automatically resized and optimized when needed.
61
+ * Structured Data for Google Search and Chromium that adds extended on-site search support.
62
+ * Structured Data for Google's Knowledge Graph; like Personal/Business site relations, names, and logos.
63
+ * Structured Data for Breadcrumbs that extend pages and categories relationship support in Google Search.
64
+ * Structured Data for Google Search that lets it know your preferred site name.
65
+ * Publishing and editing dates for Social Sites and Search Engines alike.
66
+ * Paginated content relationship links, to help visitors going to the right page.
67
+ * A sitemap with all your pages, posts and CPT, which listens to their set settings.
68
+ * Feed excerpts and backlinks within, to prevent automated content theft.
69
 
70
  **This plugin goes further, behind the screens it:**
71
 
72
  * Prevents canonical errors with categories, pages, subdomains and Multisite Domain Mapping.
73
  * Discourages 404 pages and empty categories from being indexed, even if they don't send a 404 response.
74
+ * Automatically notifies Google, Bing, and Yandex on website updates when sitemaps are enabled.
75
 
76
  = Generously personal =
77
+ **This plugin allows you to manually set various values for each post, page, public CPT, and term.**
78
 
79
+ **This plugin allows you to adjust over 100 site settings, including:**
80
 
81
+ * Automated title output options; they encourage you to follow the guidelines.
82
+ * Automated description output options.
83
+ * Schema.org Structured Data output options.
84
+ * Various robots meta output options.
85
  * Many home page specific options.
86
+ * Facebook, Twitter, and Pinterest social integration options.
87
+ * Google, Bing, Pinterest and Yandex Webmaster verification codes.
88
+ * Sitemap integration with personalization.
 
 
89
  * Robots.txt sitemap integration.
90
  * Feed anti-scraper options.
91
  * And many, many more settings.
101
  * If the description is too long, too short, duplicated, has too many repeated words and/or automatically generated.
102
  * If the page is indexed, redirected, followed and/or archived, while looking at other WordPress settings.
103
 
104
+ **We call this The SEO Bar. Check out the [Screenshots](https://wordpress.org/plugins/autodescription/#screenshots) to see how it helps you!**
105
 
106
  = Hardcore caching =
107
+ This plugin's code is highly optimized on PHP-level and uses variable, object and transient caching. This means that there's little extra page load time from this plugin, even with more meta tags used.
108
+ A caching plugin isn't even needed for this plugin as you won't notice a difference; however, it's supported wherever best suited.
109
 
110
  = Compatibility =
111
+ **This plugin supports:**
112
 
113
+ * PHP 5.3 and higher.
114
+ * WordPress 4.4 and higher.
115
+ * Internationalization through WordPress.org.
116
+ * Multibyte calculation and rendering, including Emoji and CJK.
117
+ * Right to Left (RTL) languages, through its interface and generation.
118
  * Extended Color vision deficiency accessibility.
119
  * Screen reader accessibility.
120
+ * MultiSite, this plugin is in fact built upon one.
121
  * Detection of robots.txt and sitemap.xml files.
122
+ * Both up-to-date and outdated themes.
123
+ * Detection of various other popular SEO tools to prevent duplicated output.
124
+ * Translation plugins WPML, Polylang and qTranslate X.
125
+ * WooCommerce, for free, in all its glory.
126
 
127
  = An additional sitemap =
128
+ The sitemap generated with The SEO Framework is sufficient for Search Engines to find posts, pages and supported custom post types throughout your website.
129
+ It also listens to the "noindex" settings on each of the items and works great with various translation plugins.
130
+ However, if you require a more expanded sitemap, feel free to activate a dedicated Sitemap plugin. The SEO Framework will automatically deactivate its Sitemap functionality when another (known) sitemap plugin is found.
131
+ If it is not automatically detected and no notification has been provided in the Sitemap Settings, feel free to open a support ticket and it will be addressed carefully.
132
 
133
  = Hidden breadcrumbs =
134
+ The Breadcrumb script generated by this plugin on Posts will also make sure Google easily finds related categories which aren't included in the Sitemap of this plugin.
135
 
136
  == Installation ==
137
 
138
+ = This plugin requires: =
139
+
140
+ * PHP 5.3 or later.
141
+ * WordPress 4.4 or later.
142
+
143
+ = Installation instructions: =
144
+
145
+ 1. Install The SEO Framework either via the WordPress.org plugin directory or by uploading the files to your server.
146
  1. Either Network Activate this plugin or activate it on a single site.
147
  1. That's it!
148
+
149
+ = This plugin auto-configures its global settings, but: =
150
+
151
+ * Check out the SEO settings page to fine-tune your settings.
152
+ * Do fill in the Schema "General" and "Presence" settings.
153
+ * Do fill in the Home Page "General" settings.
154
+ * Do fill in the Social Meta "General", "Facebook" and "Twitter" settings.
155
+ * Notice that red checkboxes are recommended to be left unchecked. And green checkboxes are recommended to be checked.
156
+
157
+ = This plugin auto-configures SEO meta settings, and: =
158
+
159
+ * You can fine-tune each page with the provided meta box.
160
+
161
+ = Get more SEO power =
162
+
163
+ * Optionally, also install the [Extension Manager](https://wordpress.org/plugins/the-seo-framework-extension-manager/) for additional SEO solutions.
164
 
165
  == Screenshots ==
166
 
167
+ 1. This plugin shows you what you can improve, at a glance. With complete color vision deficiency support.
168
+ 2. Hover over any of the SEO Bar's items to see how you can improve the page's SEO. Red is bad, orange is okay, green is good. Blue is situational.
169
+ 3. The dynamic Post/Page SEO settings meta box. Another version of this box is also implemented for Categories and Tags.
170
+ 4. The dynamic Post/Page SEO settings meta box also fits neatly in the sidebar. For when you want to work faster.
171
+ 5. The SEO Settings Page. With over 100 settings, you are in full control.
172
 
173
  == Frequently Asked Questions ==
174
 
190
 
191
  = Is this really a Framework? =
192
 
193
+ The SEO Framework is its own self-serving technical framework. It keeps track of everything WordPress and SEO while it allows other plugins to interact with it easily.
194
+ Through its framework it allows you to SEO your complete website. It also allows for extensions and real-time alterations; for when you really want or need to change something.
195
+ Extensions built for this plugin might just as well work as a standalone; however, The SEO Framework provides an easier and faster way of doing so.
196
 
197
  = I am a developer; how can I help? =
198
 
199
  The SEO Framework is currently a one-man project. However, any input is greatly appreciated and everything will be considered.
200
  Please visit the [GitHub project page](https://github.com/sybrew/the-seo-framework) to submit issues or even pull requests.
201
 
202
+ = I want to modify how this plugin works =
203
 
204
+ The SEO Framework is very pluggable in many fields. Please refer to the [API documentation](https://theseoframework.com/docs/api/).
 
205
 
206
  = The sitemap doesn't contain categories, images, news, etc. is this OK? =
207
 
208
  This is not an issue. Search Engines love crawling WordPress because its structure is consistent and well known.
209
  If a visitor can't find a page, then why would a Search Engine? Don't rely on your sitemap, but on your content and website's usability.
210
 
211
+ = What's do the application/ld+json scripts do? =
212
 
213
  The JSON-LD scripts are Search Engine helpers which tell Search Engines how to connect and index the site.
214
  They can tell the Search Engine if your site contains an internal search engine, what sites you're socially connected to and what page structure you're using.
215
  This is also referred to as Structured Data.
216
 
217
+ = The metadata is not being updated, and I'm using a caching plugin. =
218
 
219
  All The SEO Framework's metadata is put into Object cache when a caching plugin is available. The descriptions and Schema.org scripts are put into Transients. Please be sure to clear your cache.
220
 
225
 
226
  == Changelog ==
227
 
228
+ = 2.9.2 - Diminutive Consolidation =
229
+
230
+ **Release date:**
231
+
232
+ * May 8th, 2017
233
+
234
+ **Summarized:**
235
+
236
+ * Now, Polylang is officially supported by The SEO Framework.
237
+ * The sitemap now supports plain permalinks. That means it now literally works for every website.
238
+ * The robots.txt file has been enhanced, so it now informs you when the output location is incorrect.
239
+ * Moreover, various bugs have been fixed, mainly concerning third party plugins.
240
+
241
+ **We're looking for translation editors:**
242
+
243
+ * First, thank you so much to all the translation [contributors](https://translate.wordpress.org/projects/wp-plugins/autodescription/contributors).
244
+ * Now, if you want to see The SEO Framework in your language, head over to [this page](https://translate.wordpress.org/projects/wp-plugins/autodescription) and feel free to contribute.
245
+ * If you wish to easily maintain and keep a close eye on all the contributions for your language, [ask us](https://theseoframework.com/contact/) to ask WordPress Polyglots to add you as a contributor.
246
+ * Ultimately, it's up to the WordPress Polyglots team to fulfill your request. It generally depends on how well you've submitted translations for you to be accepted.
247
+
248
+ **A few notes about translations:**
249
+
250
+ * If you use a machine to translate for you, note that they can generate out-of-context strings. So keep an eye out for those!
251
+ * If you notice that strings are very hard to translate, e.g. because of grammatical gender, [let us know](https://github.com/sybrew/the-seo-framework/issues/new)!
252
+ * Please don't translate "The SEO Framework", it's a registered brand-name.
253
+ * Be sure not to add spaces if you see backticks, asterisks, or brackets. They're used for Markdown language construction.
254
+ * In TSF, you generally can't use UTF character codes like `&#38;#x2661;`, as they're automatically removed or rendered unreadable for added security. Add them as displayed instead: **♡**.
255
+
256
+ **Detailed log:**
257
+
258
+ ***If you are a friend, speak the password, and the doors will open, and [you can enter](https://theseoframework.com/?p=1982#detailed).***
259
+
260
  = 2.9.1 - Sovereign Comprehension =
261
 
262
  **Release date:**
263
 
264
+ * March 27th, 2017
265
 
266
  **Summarized:**
267
 
278
 
279
  **Release date:**
280
 
281
+ * March 25th, 2017
282
 
283
  **Summarized:**
284
 
285
  * This update focuses on fixing bugs and expanding the API for developers.
286
+ * To expand the API for per page (in-post) SEO settings, tabs had to be added in the SEO settings meta box.
287
  * The JavaScript code has also been overhauled to improve performance and allow third party implementation.
288
  * Moreover, the home page settings now allow you to upload a social image.
289
  * Structured data markup has also been improved, like the inclusion of an alternative Sitename and fixes for Breadcrumb images.
305
  * This release brings tabbed layout to the in-post SEO settings.
306
  * With this change I've also altered the overall looks, with the help from [Daniel](https://github.com/danielpost).
307
  * This layout allows extensions from the [Extension Manager](https://wordpress.org/plugins/the-seo-framework-extension-manager/) to be implemented much easier.
308
+ * This layout is self-responsive! This means it's not dependent on the browser size, but on how much content will fit.
309
+ * Therefore, this layout allows the SEO settings to be placed in the right sidebar! Take a look at the [new screenshots](https://wordpress.org/plugins/autodescription/#screenshots).
310
 
311
  **For everyone: Browser support**
312
 
313
+ * This release brings [CSS Flexbox](https://www.w3.org/TR/css-flexbox-1/) to the new in-post SEO settings meta box.
314
  * The flexbox module is still experimental, in a way that not all browsers correctly support this to the fullest extend.
315
  * However, support for as many browsers feasible has been implemented. Check out [the list](https://theseoframework.com/?p=1903#browser-support). Enjoy!
316
  * The gist is that Chrome, Firefox, IE10 and Safari 6 or later are supported.
340
  The 2.7.0 update is required for the upcoming Extension Manager plugin and includes many improvements.
341
 
342
  == Other Notes ==