The SEO Framework - Version 4.0.3

Version Description

Google Search has a new bug in their parser, which causes pages to be deindexed unintentionally when a specific combination of robots-settings are used. To work around this bug, we changed how the recently introduced copyright directive settings work.

For more information, see our KB entry on why the Maximum Image Preview Size setting may now be ignored.

We also fixed three bugs and added minor improvements.

Download this release

Release Info

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

Code changes from version 4.0.2 to 4.0.3

autodescription.php CHANGED
@@ -3,7 +3,7 @@
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 your WordPress website.
6
- * Version: 4.0.2
7
  * Author: The SEO Framework Team
8
  * Author URI: https://theseoframework.com/
9
  * License: GPLv3
@@ -64,7 +64,7 @@ defined( 'ABSPATH' ) or die;
64
  *
65
  * @since 2.3.5
66
  */
67
- define( 'THE_SEO_FRAMEWORK_VERSION', '4.0.2' );
68
 
69
  /**
70
  * The plugin Database version.
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 your WordPress website.
6
+ * Version: 4.0.3
7
  * Author: The SEO Framework Team
8
  * Author URI: https://theseoframework.com/
9
  * License: GPLv3
64
  *
65
  * @since 2.3.5
66
  */
67
+ define( 'THE_SEO_FRAMEWORK_VERSION', '4.0.3' );
68
 
69
  /**
70
  * The plugin Database version.
bootstrap/envtest.php CHANGED
@@ -70,13 +70,13 @@ function the_seo_framework_pre_boot_test() {
70
  }
71
 
72
  $requirements = array(
73
- 'php' => '50600',
74
- 'wp' => '37965',
75
  );
76
 
77
  // phpcs:disable, Generic.Formatting.MultipleStatementAlignment, WordPress.WhiteSpace.PrecisionAlignment
78
  ! defined( 'PHP_VERSION_ID' ) || PHP_VERSION_ID < $requirements['php'] and $test = 1
79
- or $GLOBALS['wp_db_version'] < $requirements['wp'] and $test = 2
80
  or $test = true;
81
  // phpcs:enable, Generic.Formatting.MultipleStatementAlignment, WordPress.WhiteSpace.PrecisionAlignment
82
 
70
  }
71
 
72
  $requirements = array(
73
+ 'php' => 50600,
74
+ 'wp' => '4.9-dev',
75
  );
76
 
77
  // phpcs:disable, Generic.Formatting.MultipleStatementAlignment, WordPress.WhiteSpace.PrecisionAlignment
78
  ! defined( 'PHP_VERSION_ID' ) || PHP_VERSION_ID < $requirements['php'] and $test = 1
79
+ or version_compare( $GLOBALS['wp_version'], $requirements['wp'], '<' ) and $test = 2
80
  or $test = true;
81
  // phpcs:enable, Generic.Formatting.MultipleStatementAlignment, WordPress.WhiteSpace.PrecisionAlignment
82
 
bootstrap/upgrade.php CHANGED
@@ -273,7 +273,7 @@ function _do_upgrade_notice() {
273
  [ 'a' ],
274
  [ 'a_internal' => false ]
275
  ),
276
- 'updated',
277
  false,
278
  false
279
  );
@@ -344,7 +344,7 @@ function _output_upgrade_notices() {
344
 
345
  foreach ( $notices as $notice ) {
346
  //* @TODO rtl?
347
- \the_seo_framework()->do_dismissible_notice( 'SEO: ' . $notice, 'updated' );
348
  }
349
  }
350
 
273
  [ 'a' ],
274
  [ 'a_internal' => false ]
275
  ),
276
+ 'info',
277
  false,
278
  false
279
  );
344
 
345
  foreach ( $notices as $notice ) {
346
  //* @TODO rtl?
347
+ \the_seo_framework()->do_dismissible_notice( 'SEO: ' . $notice, 'info' );
348
  }
349
  }
350
 
inc/classes/admin-init.class.php CHANGED
@@ -59,7 +59,7 @@ class Admin_Init extends Init {
59
  }
60
 
61
  /**
62
- * Adds post states in post/page edit.php query
63
  *
64
  * @since 4.0.0
65
  *
59
  }
60
 
61
  /**
62
+ * Adds post states for the post/page edit.php query.
63
  *
64
  * @since 4.0.0
65
  *
inc/classes/admin-pages.class.php CHANGED
@@ -202,7 +202,7 @@ class Admin_Pages extends Profile {
202
 
203
  case 'unchanged':
204
  $message = \__( 'No SEO settings were changed, but the caches have been flushed.', 'autodescription' );
205
- $type = 'warning';
206
  break;
207
 
208
  case 'reset':
@@ -353,6 +353,8 @@ class Admin_Pages extends Profile {
353
  * @since 2.6.0
354
  * @since 3.0.6 The messages are no longer auto-styled to "strong".
355
  * @since 4.0.0 Added a tabindex, so keyboard navigation is possible on the "empty" dashicon.
 
 
356
  *
357
  * @param string $message The notice message. Expected to be escaped if $escape is false.
358
  * @param string $type The notice type : 'updated', 'error', 'warning'. Expected to be escaped.
@@ -372,6 +374,9 @@ class Admin_Pages extends Profile {
372
  if ( 'warning' === $type )
373
  $type = 'notice-warning';
374
 
 
 
 
375
  $a11y = $a11y ? 'tsf-show-icon' : '';
376
 
377
  return vsprintf(
@@ -381,7 +386,7 @@ class Admin_Pages extends Profile {
381
  ( $a11y ? 'tsf-show-icon' : '' ),
382
  ( $escape ? \esc_html( $message ) : $message ),
383
  sprintf(
384
- '<a class="hide-if-no-tsf-js tsf-dismiss" title="%s" tabindex=0></a>',
385
  \esc_attr__( 'Dismiss this notice', 'autodescription' )
386
  ),
387
  ]
202
 
203
  case 'unchanged':
204
  $message = \__( 'No SEO settings were changed, but the caches have been flushed.', 'autodescription' );
205
+ $type = 'info';
206
  break;
207
 
208
  case 'reset':
353
  * @since 2.6.0
354
  * @since 3.0.6 The messages are no longer auto-styled to "strong".
355
  * @since 4.0.0 Added a tabindex, so keyboard navigation is possible on the "empty" dashicon.
356
+ * @since 4.0.3 1. Keyboard navigation is now supported on the dismiss icon.
357
+ * 2. The info notice type is now supported.
358
  *
359
  * @param string $message The notice message. Expected to be escaped if $escape is false.
360
  * @param string $type The notice type : 'updated', 'error', 'warning'. Expected to be escaped.
374
  if ( 'warning' === $type )
375
  $type = 'notice-warning';
376
 
377
+ if ( 'info' === $type )
378
+ $type = 'notice-info';
379
+
380
  $a11y = $a11y ? 'tsf-show-icon' : '';
381
 
382
  return vsprintf(
386
  ( $a11y ? 'tsf-show-icon' : '' ),
387
  ( $escape ? \esc_html( $message ) : $message ),
388
  sprintf(
389
+ '<a class="hide-if-no-tsf-js tsf-dismiss" href="javascript:;" title="%s"></a>',
390
  \esc_attr__( 'Dismiss this notice', 'autodescription' )
391
  ),
392
  ]
inc/classes/bridges/ping.class.php CHANGED
@@ -103,10 +103,11 @@ final class Ping {
103
  * @since 2.2.9
104
  * @since 3.1.0 Updated ping URL. Old one still worked, too.
105
  * @since 4.0.0 Moved to \The_SEO_Framework\Bridges\Ping
 
106
  * @link https://support.google.com/webmasters/answer/6065812?hl=en
107
  */
108
  public static function ping_google() {
109
- $pingurl = 'http://www.google.com/ping?sitemap=' . rawurlencode(
110
  \The_SEO_Framework\Bridges\Sitemap::get_instance()->get_expected_sitemap_endpoint_url()
111
  );
112
  \wp_safe_remote_get( $pingurl, [ 'timeout' => 3 ] );
@@ -118,10 +119,11 @@ final class Ping {
118
  * @since 2.2.9
119
  * @since 3.2.3 Updated ping URL. Old one still worked, too.
120
  * @since 4.0.0 Moved to \The_SEO_Framework\Bridges\Ping
 
121
  * @link https://www.bing.com/webmaster/help/how-to-submit-sitemaps-82a15bd4
122
  */
123
  public static function ping_bing() {
124
- $pingurl = 'http://www.bing.com/ping?sitemap=' . rawurlencode(
125
  \The_SEO_Framework\Bridges\Sitemap::get_instance()->get_expected_sitemap_endpoint_url()
126
  );
127
  \wp_safe_remote_get( $pingurl, [ 'timeout' => 3 ] );
103
  * @since 2.2.9
104
  * @since 3.1.0 Updated ping URL. Old one still worked, too.
105
  * @since 4.0.0 Moved to \The_SEO_Framework\Bridges\Ping
106
+ * @since 4.0.3 Google now redirects to HTTPS. Updated URL scheme to accomodate.
107
  * @link https://support.google.com/webmasters/answer/6065812?hl=en
108
  */
109
  public static function ping_google() {
110
+ $pingurl = 'https://www.google.com/ping?sitemap=' . rawurlencode(
111
  \The_SEO_Framework\Bridges\Sitemap::get_instance()->get_expected_sitemap_endpoint_url()
112
  );
113
  \wp_safe_remote_get( $pingurl, [ 'timeout' => 3 ] );
119
  * @since 2.2.9
120
  * @since 3.2.3 Updated ping URL. Old one still worked, too.
121
  * @since 4.0.0 Moved to \The_SEO_Framework\Bridges\Ping
122
+ * @since 4.0.3 Bing now redirects to HTTPS. Updated URL scheme to accomodate.
123
  * @link https://www.bing.com/webmaster/help/how-to-submit-sitemaps-82a15bd4
124
  */
125
  public static function ping_bing() {
126
+ $pingurl = 'https://www.bing.com/ping?sitemap=' . rawurlencode(
127
  \The_SEO_Framework\Bridges\Sitemap::get_instance()->get_expected_sitemap_endpoint_url()
128
  );
129
  \wp_safe_remote_get( $pingurl, [ 'timeout' => 3 ] );
inc/classes/builders/sitemap-base.class.php CHANGED
@@ -334,7 +334,7 @@ class Sitemap_Base extends Sitemap {
334
  }
335
 
336
  /**
337
- * Generates front-and blog page sitemap URL item values.
338
  *
339
  * @since 4.0.0
340
  * @generator
334
  }
335
 
336
  /**
337
+ * Generates sitemap URL item values.
338
  *
339
  * @since 4.0.0
340
  * @generator
inc/classes/core.class.php CHANGED
@@ -771,10 +771,11 @@ class Core {
771
  * Note: This code has been rightfully stolen from the Extension Manager plugin (sorry Sybre!).
772
  *
773
  * @since 2.8.0
774
- * @since 2.9.0 : 1. Removed word boundary requirement for strong.
775
- * 2. Now accepts regex count their numeric values in string.
776
- * 3. Fixed header 1~6 calculation.
777
- * @since 2.9.3 : Added $args parameter.
 
778
  * @link https://wordpress.org/plugins/about/readme.txt
779
  *
780
  * @param string $text The text that might contain markdown. Expected to be escaped.
@@ -816,6 +817,17 @@ class Core {
816
 
817
  $md_types = empty( $convert ) ? $conversions : array_intersect( $conversions, $convert );
818
 
 
 
 
 
 
 
 
 
 
 
 
819
  foreach ( $md_types as $type ) :
820
  switch ( $type ) :
821
  case 'strong':
771
  * Note: This code has been rightfully stolen from the Extension Manager plugin (sorry Sybre!).
772
  *
773
  * @since 2.8.0
774
+ * @since 2.9.0 1. Removed word boundary requirement for strong.
775
+ * 2. Now accepts regex count their numeric values in string.
776
+ * 3. Fixed header 1~6 calculation.
777
+ * @since 2.9.3 Added $args parameter.
778
+ * @since 4.0.3 Added a workaround for connected em/strong elements.
779
  * @link https://wordpress.org/plugins/about/readme.txt
780
  *
781
  * @param string $text The text that might contain markdown. Expected to be escaped.
817
 
818
  $md_types = empty( $convert ) ? $conversions : array_intersect( $conversions, $convert );
819
 
820
+ if ( 2 === count( array_intersect( $md_types, [ 'em', 'strong' ] ) ) ) :
821
+ $count = preg_match_all( '/(?:\*{3})([^\*{\3}]+)(?:\*{3})/', $text, $matches, PREG_PATTERN_ORDER );
822
+ for ( $i = 0; $i < $count; $i++ ) {
823
+ $text = str_replace(
824
+ $matches[0][ $i ],
825
+ sprintf( '<strong><em>%s</em></strong>', \esc_html( $matches[1][ $i ] ) ),
826
+ $text
827
+ );
828
+ }
829
+ endif;
830
+
831
  foreach ( $md_types as $type ) :
832
  switch ( $type ) :
833
  case 'strong':
inc/classes/deprecated.class.php CHANGED
@@ -37,11 +37,6 @@ defined( 'THE_SEO_FRAMEWORK_PRESENT' ) or die;
37
  */
38
  final class Deprecated {
39
 
40
- /**
41
- * Constructor. Does nothing.
42
- */
43
- public function __construct() { }
44
-
45
  /**
46
  * Returns a filterable sequential array of default scripts.
47
  *
37
  */
38
  final class Deprecated {
39
 
 
 
 
 
 
40
  /**
41
  * Returns a filterable sequential array of default scripts.
42
  *
inc/classes/detect.class.php CHANGED
@@ -680,6 +680,7 @@ class Detect extends Render {
680
  * Detect if the current screen type is a page or taxonomy.
681
  *
682
  * @since 2.3.1
 
683
  * @staticvar array $is_page
684
  *
685
  * @param string $type the Screen type
@@ -708,6 +709,7 @@ class Detect extends Render {
708
  *
709
  * @since 4.0.0
710
  * @since 4.0.2 Now tests for an existing post/term ID when on singular/term pages.
 
711
  *
712
  * @return bool
713
  */
@@ -731,7 +733,10 @@ class Detect extends Render {
731
  break;
732
 
733
  case $this->is_term_meta_capable():
734
- $supported = $this->is_post_type_supported() && $this->get_the_real_ID();
 
 
 
735
  break;
736
 
737
  default:
680
  * Detect if the current screen type is a page or taxonomy.
681
  *
682
  * @since 2.3.1
683
+ * @TODO unused... deprecate me.
684
  * @staticvar array $is_page
685
  *
686
  * @param string $type the Screen type
709
  *
710
  * @since 4.0.0
711
  * @since 4.0.2 Now tests for an existing post/term ID when on singular/term pages.
712
+ * @since 4.0.3 Can now assert empty categories again by checking for taxonomy support.
713
  *
714
  * @return bool
715
  */
733
  break;
734
 
735
  case $this->is_term_meta_capable():
736
+ // When a term has no posts attached, it'll not return a post type, and it returns a 404 late in the loop.
737
+ // This is because get_post_type() tries to assert the first post in the loop here.
738
+ // Thus, we test for is_taxonomy_supported() instead.
739
+ $supported = $this->is_taxonomy_supported() && $this->get_the_real_ID();
740
  break;
741
 
742
  default:
inc/classes/generate-url.class.php CHANGED
@@ -779,14 +779,20 @@ class Generate_Url extends Generate_Title {
779
  * Adjusts category post link.
780
  *
781
  * @since 3.0.0
 
782
  * @access private
783
  *
784
  * @param \WP_Term $term The category to use in the permalink.
785
- * @param array $terms Array of all categories (WP_Term objects) associated with the post.
786
  * @param \WP_Post $post The post in question.
787
  * @return \WP_Term The primary term.
788
  */
789
  public function _adjust_post_link_category( $term, $terms = null, $post = null ) {
 
 
 
 
 
790
  return $this->get_primary_term( $post->ID, $term->taxonomy ) ?: $term;
791
  }
792
 
779
  * Adjusts category post link.
780
  *
781
  * @since 3.0.0
782
+ * @since 4.0.3 Now fills in a fallback $post object when null.
783
  * @access private
784
  *
785
  * @param \WP_Term $term The category to use in the permalink.
786
+ * @param array $terms Array of all categories (WP_Term objects) associated with the post. Unused.
787
  * @param \WP_Post $post The post in question.
788
  * @return \WP_Term The primary term.
789
  */
790
  public function _adjust_post_link_category( $term, $terms = null, $post = null ) {
791
+
792
+ if ( null === $post ) {
793
+ $post = \get_post( $this->get_the_real_ID() );
794
+ }
795
+
796
  return $this->get_primary_term( $post->ID, $term->taxonomy ) ?: $term;
797
  }
798
 
inc/classes/generate.class.php CHANGED
@@ -78,6 +78,8 @@ class Generate extends User_Data {
78
  * 3. Added two parameters.
79
  * @since 4.0.2 1. Added new copyright directive tags.
80
  * 2. Now strictly parses the validity of robots directives via a boolean check.
 
 
81
  * @global \WP_Query $wp_query
82
  *
83
  * @param array|null $args The query arguments. Accepts 'id' and 'taxonomy'.
@@ -101,12 +103,12 @@ class Generate extends User_Data {
101
  }
102
 
103
  $meta = [
104
- 'noindex' => '',
105
- 'nofollow' => '',
106
- 'noarchive' => '',
107
- 'max_snippet_length' => '',
108
- 'max_image_preview' => '',
109
- 'max_video_preview' => '',
110
  ];
111
 
112
  foreach (
@@ -115,15 +117,34 @@ class Generate extends User_Data {
115
  ) $v and $meta[ $k ] = $k;
116
 
117
  foreach (
118
- array_intersect_key( $_meta, array_flip( [ 'max_snippet_length', 'max_image_preview', 'max_video_preview' ] ) )
119
  as $k => $v
120
- ) false !== $v and $meta[ $k ] = str_replace( '_', '-', $k ) . "=$v";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
 
122
  /**
123
  * Filters the front-end robots array, and strips empty indexes thereafter.
124
  *
125
  * @since 2.6.0
126
  * @since 4.0.0 Added two parameters ($args and $ignore).
 
 
127
  *
128
  * @param array $meta The current robots meta.
129
  * @param array|null $args The query arguments. Contains 'id' and 'taxonomy'.
@@ -152,6 +173,7 @@ class Generate extends User_Data {
152
  *
153
  * @since 4.0.0
154
  * @since 4.0.2 Added new copyright directive tags.
 
155
  * @global \WP_Query $wp_query
156
  *
157
  * @param int <bit> $ignore The ignore level. {
@@ -164,7 +186,7 @@ class Generate extends User_Data {
164
  * bool 'noindex'
165
  * bool 'nofollow'
166
  * bool 'noarchive'
167
- * false|int <R>=-1> 'max_snippet_length'
168
  * false|string 'max_image_preview'
169
  * fasle|int <R>=-1> 'max_video_preview'
170
  * }
@@ -175,12 +197,12 @@ class Generate extends User_Data {
175
  $nofollow = (bool) $this->get_option( 'site_nofollow' );
176
  $noarchive = (bool) $this->get_option( 'site_noarchive' );
177
 
178
- $max_snippet_length = $max_image_preview = $max_video_preview = false;
179
 
180
  if ( $this->get_option( 'set_copyright_directives' ) ) {
181
- $max_snippet_length = $this->get_option( 'max_snippet_length' );
182
- $max_image_preview = $this->get_option( 'max_image_preview' );
183
- $max_video_preview = $this->get_option( 'max_video_preview' );
184
  }
185
 
186
  //* Check homepage SEO settings, set noindex, nofollow and noarchive
@@ -305,7 +327,7 @@ class Generate extends User_Data {
305
  }
306
  }
307
 
308
- return compact( 'noindex', 'nofollow', 'noarchive', 'max_snippet_length', 'max_image_preview', 'max_video_preview' );
309
  }
310
 
311
  /**
@@ -315,6 +337,7 @@ class Generate extends User_Data {
315
  *
316
  * @since 4.0.0
317
  * @since 4.0.2 Added new copyright directive tags.
 
318
  *
319
  * @param array|null $args The query arguments. Accepts 'id' and 'taxonomy'.
320
  * @param int <bit> $ignore The ignore level. {
@@ -327,7 +350,7 @@ class Generate extends User_Data {
327
  * bool 'noindex'
328
  * bool 'nofollow'
329
  * bool 'noarchive'
330
- * false|int <R>=-1> 'max_snippet_length'
331
  * false|string 'max_image_preview'
332
  * fasle|int <R>=-1> 'max_video_preview'
333
  * }
@@ -338,12 +361,12 @@ class Generate extends User_Data {
338
  $nofollow = (bool) $this->get_option( 'site_nofollow' );
339
  $noarchive = (bool) $this->get_option( 'site_noarchive' );
340
 
341
- $max_snippet_length = $max_image_preview = $max_video_preview = false;
342
 
343
  if ( $this->get_option( 'set_copyright_directives' ) ) {
344
- $max_snippet_length = $this->get_option( 'max_snippet_length' );
345
- $max_image_preview = $this->get_option( 'max_image_preview' );
346
- $max_video_preview = $this->get_option( 'max_video_preview' );
347
  }
348
 
349
  if ( $args['taxonomy'] ) {
@@ -422,7 +445,7 @@ class Generate extends User_Data {
422
  endif;
423
  }
424
 
425
- return compact( 'noindex', 'nofollow', 'noarchive', 'max_snippet_length', 'max_image_preview', 'max_video_preview' );
426
  }
427
 
428
  /**
78
  * 3. Added two parameters.
79
  * @since 4.0.2 1. Added new copyright directive tags.
80
  * 2. Now strictly parses the validity of robots directives via a boolean check.
81
+ * @since 4.0.3 1. Changed `max_snippet_length` to `max_snippet`
82
+ * 2. Changed the copyright directive's spacer from `=` to `:`.
83
  * @global \WP_Query $wp_query
84
  *
85
  * @param array|null $args The query arguments. Accepts 'id' and 'taxonomy'.
103
  }
104
 
105
  $meta = [
106
+ 'noindex' => '',
107
+ 'nofollow' => '',
108
+ 'noarchive' => '',
109
+ 'max_snippet' => '',
110
+ 'max_image_preview' => '',
111
+ 'max_video_preview' => '',
112
  ];
113
 
114
  foreach (
117
  ) $v and $meta[ $k ] = $k;
118
 
119
  foreach (
120
+ array_intersect_key( $_meta, array_flip( [ 'max_snippet', 'max_image_preview', 'max_video_preview' ] ) )
121
  as $k => $v
122
+ ) false !== $v and $meta[ $k ] = str_replace( '_', '-', $k ) . ":$v";
123
+
124
+ /**
125
+ * Drop-in Google Search bug patch.
126
+ * "When you combine "max-image-preview:none" with either "nofollow" or "noarchive", the page is marked as "noindex"!"
127
+ *
128
+ * (It's probably defined as `<meta name=robots content=none/>` due to a regex bug at Google)
129
+ *
130
+ * @link <https://twitter.com/SybreWaaijer/status/1192017921553375232>
131
+ * @link <https://kb.theseoframework.com/?p=82>
132
+ * @since 4.0.3
133
+ * @ignore Do not fix me. Do not place after the filter either; that's redundant, because there are more filters trickling down.
134
+ * @TEMP
135
+ */
136
+ if ( 'max-image-preview:none' === $meta['max_image_preview'] ) {
137
+ if ( $meta['nofollow'] || $meta['noarchive'] )
138
+ $meta['max_image_preview'] = '';
139
+ }
140
 
141
  /**
142
  * Filters the front-end robots array, and strips empty indexes thereafter.
143
  *
144
  * @since 2.6.0
145
  * @since 4.0.0 Added two parameters ($args and $ignore).
146
+ * @since 4.0.2 Now contains the copyright diretive values.
147
+ * @since 4.0.3 Changed `$meta` key `max_snippet_length` to `max_snippet`
148
  *
149
  * @param array $meta The current robots meta.
150
  * @param array|null $args The query arguments. Contains 'id' and 'taxonomy'.
173
  *
174
  * @since 4.0.0
175
  * @since 4.0.2 Added new copyright directive tags.
176
+ * @since 4.0.3 Changed `max_snippet_length` to `max_snippet`
177
  * @global \WP_Query $wp_query
178
  *
179
  * @param int <bit> $ignore The ignore level. {
186
  * bool 'noindex'
187
  * bool 'nofollow'
188
  * bool 'noarchive'
189
+ * false|int <R>=-1> 'max_snippet'
190
  * false|string 'max_image_preview'
191
  * fasle|int <R>=-1> 'max_video_preview'
192
  * }
197
  $nofollow = (bool) $this->get_option( 'site_nofollow' );
198
  $noarchive = (bool) $this->get_option( 'site_noarchive' );
199
 
200
+ $max_snippet = $max_image_preview = $max_video_preview = false;
201
 
202
  if ( $this->get_option( 'set_copyright_directives' ) ) {
203
+ $max_snippet = $this->get_option( 'max_snippet_length' );
204
+ $max_image_preview = $this->get_option( 'max_image_preview' );
205
+ $max_video_preview = $this->get_option( 'max_video_preview' );
206
  }
207
 
208
  //* Check homepage SEO settings, set noindex, nofollow and noarchive
327
  }
328
  }
329
 
330
+ return compact( 'noindex', 'nofollow', 'noarchive', 'max_snippet', 'max_image_preview', 'max_video_preview' );
331
  }
332
 
333
  /**
337
  *
338
  * @since 4.0.0
339
  * @since 4.0.2 Added new copyright directive tags.
340
+ * @since 4.0.3 Changed `max_snippet_length` to `max_snippet`
341
  *
342
  * @param array|null $args The query arguments. Accepts 'id' and 'taxonomy'.
343
  * @param int <bit> $ignore The ignore level. {
350
  * bool 'noindex'
351
  * bool 'nofollow'
352
  * bool 'noarchive'
353
+ * false|int <R>=-1> 'max_snippet'
354
  * false|string 'max_image_preview'
355
  * fasle|int <R>=-1> 'max_video_preview'
356
  * }
361
  $nofollow = (bool) $this->get_option( 'site_nofollow' );
362
  $noarchive = (bool) $this->get_option( 'site_noarchive' );
363
 
364
+ $max_snippet = $max_image_preview = $max_video_preview = false;
365
 
366
  if ( $this->get_option( 'set_copyright_directives' ) ) {
367
+ $max_snippet = $this->get_option( 'max_snippet_length' );
368
+ $max_image_preview = $this->get_option( 'max_image_preview' );
369
+ $max_video_preview = $this->get_option( 'max_video_preview' );
370
  }
371
 
372
  if ( $args['taxonomy'] ) {
445
  endif;
446
  }
447
 
448
+ return compact( 'noindex', 'nofollow', 'noarchive', 'max_snippet', 'max_image_preview', 'max_video_preview' );
449
  }
450
 
451
  /**
inc/classes/init.class.php CHANGED
@@ -476,7 +476,7 @@ class Init extends Query {
476
  $url = '';
477
 
478
  if ( $this->is_singular() ) {
479
- // TODO excluse is_singular_archive()? Those can create issues...
480
 
481
  $url = $this->get_post_meta_item( 'redirect' ) ?: '';
482
  } elseif ( $this->is_term_meta_capable() ) {
476
  $url = '';
477
 
478
  if ( $this->is_singular() ) {
479
+ // TODO exclude is_singular_archive()? Those can create issues...
480
 
481
  $url = $this->get_post_meta_item( 'redirect' ) ?: '';
482
  } elseif ( $this->is_term_meta_capable() ) {
inc/classes/sanitize.class.php CHANGED
@@ -1759,7 +1759,7 @@ class Sanitize extends Admin_Pages {
1759
  foreach ( [ 'clear', 'space' ] as $type ) {
1760
  if ( empty( $args[ $type ] ) ) continue;
1761
 
1762
- $_regex = sprintf( '<(%s)[^>]*?>((.*?)(<\/\1>))?', implode( $args[ $type ], '|' ) );
1763
  $_replace = 'space' === $type ? ' $2 ' : ' ';
1764
 
1765
  $input = preg_replace( "/$_regex/si", $_replace, $input );
1759
  foreach ( [ 'clear', 'space' ] as $type ) {
1760
  if ( empty( $args[ $type ] ) ) continue;
1761
 
1762
+ $_regex = sprintf( '<(%s)[^>]*?>((.*?)(<\/\1>))?', implode( '|', $args[ $type ] ) );
1763
  $_replace = 'space' === $type ? ' $2 ' : ' ';
1764
 
1765
  $input = preg_replace( "/$_regex/si", $_replace, $input );
inc/compat/plugin-woocommerce.php CHANGED
@@ -15,6 +15,7 @@ defined( 'THE_SEO_FRAMEWORK_PRESENT' ) and $_this = \the_seo_framework_class() a
15
  * Initializes WooCommerce compatibility.
16
  *
17
  * @since 3.1.0
 
18
  * @access private
19
  * @uses \is_product()
20
  */
@@ -30,6 +31,14 @@ function _init_wc_compat() {
30
  }
31
  }
32
  );
 
 
 
 
 
 
 
 
33
  }
34
 
35
  \add_filter( 'the_seo_framework_image_generation_params', __NAMESPACE__ . '\\_adjust_image_generation_params', 10, 2 );
15
  * Initializes WooCommerce compatibility.
16
  *
17
  * @since 3.1.0
18
+ * @since 4.0.3 Added primary term support to products.
19
  * @access private
20
  * @uses \is_product()
21
  */
31
  }
32
  }
33
  );
34
+
35
+ $tsf = \the_seo_framework();
36
+
37
+ // Adjust the product link acknowledging the primary category.
38
+ \add_filter( 'wc_product_post_type_link_product_cat', [ $tsf, '_adjust_post_link_category' ], 10, 3 );
39
+
40
+ // Adjust the structured-data breadcrumb primary term. Coincidentally(?), it uses the same filter structure; although, it misses the $post object.
41
+ \add_filter( 'woocommerce_breadcrumb_main_term', [ $tsf, '_adjust_post_link_category' ], 10, 2 );
42
  }
43
 
44
  \add_filter( 'the_seo_framework_image_generation_params', __NAMESPACE__ . '\\_adjust_image_generation_params', 10, 2 );
inc/functions/upgrade-suggestion.php CHANGED
@@ -121,7 +121,7 @@ function _suggest_extension_manager() {
121
  [ 'a', 'strong' ],
122
  [ 'a_internal' => false ]
123
  ),
124
- 'updated',
125
  false,
126
  false
127
  );
121
  [ 'a', 'strong' ],
122
  [ 'a_internal' => false ]
123
  ),
124
+ 'info',
125
  false,
126
  false
127
  );
inc/views/admin/metaboxes/robots-metabox.php CHANGED
@@ -150,7 +150,8 @@ switch ( $instance ) :
150
  $this->wrap_fields(
151
  vsprintf(
152
  '<p><label for="%1$s"><strong>%2$s</strong> %5$s</label></p>
153
- <p><select name="%3$s" id="%1$s">%4$s</select></p>',
 
154
  [
155
  $this->get_field_id( 'max_snippet_length' ),
156
  esc_html__( 'Maximum text snippet length', 'autodescription' ),
@@ -161,6 +162,7 @@ switch ( $instance ) :
161
  '',
162
  false
163
  ),
 
164
  ]
165
  ),
166
  true
@@ -186,7 +188,8 @@ switch ( $instance ) :
186
  $this->wrap_fields(
187
  vsprintf(
188
  '<p><label for="%1$s"><strong>%2$s</strong> %5$s</label></p>
189
- <p><select name="%3$s" id="%1$s">%4$s</select></p>',
 
190
  [
191
  $this->get_field_id( 'max_image_preview' ),
192
  esc_html__( 'Maximum image preview size', 'autodescription' ),
@@ -197,6 +200,15 @@ switch ( $instance ) :
197
  '',
198
  false
199
  ),
 
 
 
 
 
 
 
 
 
200
  ]
201
  ),
202
  true
@@ -204,7 +216,7 @@ switch ( $instance ) :
204
 
205
  $_video_snippet_types['default'] = [
206
  -1 => __( 'Full video preview', 'autodescription' ),
207
- 0 => _x( 'None, disallow preview', 'quanity: zero', 'autodescription' ),
208
  ];
209
  foreach ( range( 1, 600, 1 ) as $_n ) {
210
  /* translators: %d = number */
150
  $this->wrap_fields(
151
  vsprintf(
152
  '<p><label for="%1$s"><strong>%2$s</strong> %5$s</label></p>
153
+ <p><select name="%3$s" id="%1$s">%4$s</select></p>
154
+ <p class=description>%6$s</p>',
155
  [
156
  $this->get_field_id( 'max_snippet_length' ),
157
  esc_html__( 'Maximum text snippet length', 'autodescription' ),
162
  '',
163
  false
164
  ),
165
+ esc_html__( "This directive also imposes a limit on meta descriptions and structured data, which unintentionally restricts the amount of information you can share. Therefore, it's best to use at least a 320 character limit.", 'autodescription' ),
166
  ]
167
  ),
168
  true
188
  $this->wrap_fields(
189
  vsprintf(
190
  '<p><label for="%1$s"><strong>%2$s</strong> %5$s</label></p>
191
+ <p><select name="%3$s" id="%1$s">%4$s</select></p>
192
+ <p class=description>%6$s</p>',
193
  [
194
  $this->get_field_id( 'max_image_preview' ),
195
  esc_html__( 'Maximum image preview size', 'autodescription' ),
200
  '',
201
  false
202
  ),
203
+ $this->convert_markdown(
204
+ sprintf(
205
+ /* translators: Backticks and hyperlink are Markdown! %s = link to documentation. */
206
+ esc_html__( 'The "None, disallow preview" setting will not be used when `nofollow` or `noarchive` are set for a page. This is to work around unexpected deindexing behavior in Google Search. [Learn more](%s).', 'autodescription' ),
207
+ 'https://kb.theseoframework.com/kb/why-is-max-image-preview-none-purged/'
208
+ ),
209
+ [ 'code', 'a' ],
210
+ [ 'a_external' => true ]
211
+ ),
212
  ]
213
  ),
214
  true
216
 
217
  $_video_snippet_types['default'] = [
218
  -1 => __( 'Full video preview', 'autodescription' ),
219
+ 0 => _x( 'None, still image only', 'quanity: zero', 'autodescription' ),
220
  ];
221
  foreach ( range( 1, 600, 1 ) as $_n ) {
222
  /* translators: %d = number */
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 4.0.2\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/autodescription\n"
7
- "POT-Creation-Date: 2019-10-15 01:19:53+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -164,33 +164,33 @@ msgstr ""
164
  msgid "Multiple SEO tools have been detected. You should only use one."
165
  msgstr ""
166
 
167
- #: inc/classes/admin-pages.class.php:385
168
  msgid "Dismiss this notice"
169
  msgstr ""
170
 
171
- #: inc/classes/admin-pages.class.php:1036
172
  #: inc/classes/bridges/scripts.class.php:621
173
  msgctxt "Button hover"
174
  msgid "Select social image"
175
  msgstr ""
176
 
177
- #: inc/classes/admin-pages.class.php:1047
178
  #: inc/classes/bridges/scripts.class.php:620
179
  msgid "Select Image"
180
  msgstr ""
181
 
182
- #: inc/classes/admin-pages.class.php:1093
183
  #: inc/classes/bridges/scripts.class.php:629
184
  msgid "Select Logo"
185
  msgstr ""
186
 
187
- #: inc/classes/admin-pages.class.php:1143
188
  msgid "Click to change the counter type"
189
  msgstr ""
190
 
191
  #. translators: %s = number
192
 
193
- #: inc/classes/admin-pages.class.php:1146
194
  msgid "Characters Used: %s"
195
  msgstr ""
196
 
@@ -1550,7 +1550,7 @@ msgid "This outputs the complete date including hours, minutes, and timezone."
1550
  msgstr ""
1551
 
1552
  #: inc/views/admin/metaboxes/general-metabox.php:429
1553
- #: inc/views/admin/metaboxes/robots-metabox.php:301
1554
  msgid "Post Type Settings"
1555
  msgstr ""
1556
 
@@ -1567,7 +1567,7 @@ msgid "Select post types which should not receive any SEO optimization whatsoeve
1567
  msgstr ""
1568
 
1569
  #: inc/views/admin/metaboxes/general-metabox.php:439
1570
- #: inc/views/admin/metaboxes/robots-metabox.php:303
1571
  msgid "These settings are applied to the post type pages and their terms. When terms are shared between post types, all their post types should be checked for this to have an effect."
1572
  msgstr ""
1573
 
@@ -1854,81 +1854,96 @@ msgstr[0] ""
1854
  msgstr[1] ""
1855
 
1856
  #: inc/views/admin/metaboxes/robots-metabox.php:133
1857
- #: inc/views/admin/metaboxes/robots-metabox.php:217
1858
  msgid "Standard directive"
1859
  msgstr ""
1860
 
1861
  #: inc/views/admin/metaboxes/robots-metabox.php:134
1862
- #: inc/views/admin/metaboxes/robots-metabox.php:218
1863
  msgid "Granular directive"
1864
  msgstr ""
1865
 
1866
- #: inc/views/admin/metaboxes/robots-metabox.php:156
1867
  msgid "Maximum text snippet length"
1868
  msgstr ""
1869
 
1870
- #: inc/views/admin/metaboxes/robots-metabox.php:160
1871
  msgid "This may limit the text snippet length for all pages on this site."
1872
  msgstr ""
1873
 
1874
- #: inc/views/admin/metaboxes/robots-metabox.php:172
1875
- #: inc/views/admin/metaboxes/robots-metabox.php:207
 
 
 
1876
  msgctxt "quanity: zero"
1877
  msgid "None, disallow preview"
1878
  msgstr ""
1879
 
1880
- #: inc/views/admin/metaboxes/robots-metabox.php:173
1881
  msgid "Thumbnail or standard size"
1882
  msgstr ""
1883
 
1884
- #: inc/views/admin/metaboxes/robots-metabox.php:174
1885
  msgid "Large or full size"
1886
  msgstr ""
1887
 
1888
- #: inc/views/admin/metaboxes/robots-metabox.php:192
1889
  msgid "Maximum image preview size"
1890
  msgstr ""
1891
 
1892
- #: inc/views/admin/metaboxes/robots-metabox.php:196
1893
  msgid "This may limit the image preview size for all images from this site."
1894
  msgstr ""
1895
 
 
 
 
1896
  #: inc/views/admin/metaboxes/robots-metabox.php:206
 
 
 
 
1897
  msgid "Full video preview"
1898
  msgstr ""
1899
 
 
 
 
 
 
1900
  #. translators: %d = number
1901
 
1902
- #: inc/views/admin/metaboxes/robots-metabox.php:211
1903
  msgid "%d second"
1904
  msgid_plural "%d seconds"
1905
  msgstr[0] ""
1906
  msgstr[1] ""
1907
 
1908
- #: inc/views/admin/metaboxes/robots-metabox.php:240
1909
  msgid "Maximum video preview length"
1910
  msgstr ""
1911
 
1912
- #: inc/views/admin/metaboxes/robots-metabox.php:244
1913
  msgid "This may limit the video preview length for all videos on this site."
1914
  msgstr ""
1915
 
1916
  #. translators: 1 = noindex/nofollow/noarchive, 2 = Post, Post type, Category
1917
  #. archives, the entire site, etc.
1918
 
1919
- #: inc/views/admin/metaboxes/robots-metabox.php:259
1920
  msgid "Apply %1$s to %2$s?"
1921
  msgstr ""
1922
 
1923
- #: inc/views/admin/metaboxes/robots-metabox.php:264
1924
  msgid "Robots Settings"
1925
  msgstr ""
1926
 
1927
- #: inc/views/admin/metaboxes/robots-metabox.php:289
1928
  msgid "Warning: No public site should ever enable this option."
1929
  msgstr ""
1930
 
1931
- #: inc/views/admin/metaboxes/robots-metabox.php:308
1932
  msgid "Warning: No site should enable these options for Posts and Pages."
1933
  msgstr ""
1934
 
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 4.0.3\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/autodescription\n"
7
+ "POT-Creation-Date: 2019-11-11 17:46:56+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
164
  msgid "Multiple SEO tools have been detected. You should only use one."
165
  msgstr ""
166
 
167
+ #: inc/classes/admin-pages.class.php:390
168
  msgid "Dismiss this notice"
169
  msgstr ""
170
 
171
+ #: inc/classes/admin-pages.class.php:1041
172
  #: inc/classes/bridges/scripts.class.php:621
173
  msgctxt "Button hover"
174
  msgid "Select social image"
175
  msgstr ""
176
 
177
+ #: inc/classes/admin-pages.class.php:1052
178
  #: inc/classes/bridges/scripts.class.php:620
179
  msgid "Select Image"
180
  msgstr ""
181
 
182
+ #: inc/classes/admin-pages.class.php:1098
183
  #: inc/classes/bridges/scripts.class.php:629
184
  msgid "Select Logo"
185
  msgstr ""
186
 
187
+ #: inc/classes/admin-pages.class.php:1148
188
  msgid "Click to change the counter type"
189
  msgstr ""
190
 
191
  #. translators: %s = number
192
 
193
+ #: inc/classes/admin-pages.class.php:1151
194
  msgid "Characters Used: %s"
195
  msgstr ""
196
 
1550
  msgstr ""
1551
 
1552
  #: inc/views/admin/metaboxes/general-metabox.php:429
1553
+ #: inc/views/admin/metaboxes/robots-metabox.php:313
1554
  msgid "Post Type Settings"
1555
  msgstr ""
1556
 
1567
  msgstr ""
1568
 
1569
  #: inc/views/admin/metaboxes/general-metabox.php:439
1570
+ #: inc/views/admin/metaboxes/robots-metabox.php:315
1571
  msgid "These settings are applied to the post type pages and their terms. When terms are shared between post types, all their post types should be checked for this to have an effect."
1572
  msgstr ""
1573
 
1854
  msgstr[1] ""
1855
 
1856
  #: inc/views/admin/metaboxes/robots-metabox.php:133
1857
+ #: inc/views/admin/metaboxes/robots-metabox.php:229
1858
  msgid "Standard directive"
1859
  msgstr ""
1860
 
1861
  #: inc/views/admin/metaboxes/robots-metabox.php:134
1862
+ #: inc/views/admin/metaboxes/robots-metabox.php:230
1863
  msgid "Granular directive"
1864
  msgstr ""
1865
 
1866
+ #: inc/views/admin/metaboxes/robots-metabox.php:157
1867
  msgid "Maximum text snippet length"
1868
  msgstr ""
1869
 
1870
+ #: inc/views/admin/metaboxes/robots-metabox.php:161
1871
  msgid "This may limit the text snippet length for all pages on this site."
1872
  msgstr ""
1873
 
1874
+ #: inc/views/admin/metaboxes/robots-metabox.php:165
1875
+ msgid "This directive also imposes a limit on meta descriptions and structured data, which unintentionally restricts the amount of information you can share. Therefore, it's best to use at least a 320 character limit."
1876
+ msgstr ""
1877
+
1878
+ #: inc/views/admin/metaboxes/robots-metabox.php:174
1879
  msgctxt "quanity: zero"
1880
  msgid "None, disallow preview"
1881
  msgstr ""
1882
 
1883
+ #: inc/views/admin/metaboxes/robots-metabox.php:175
1884
  msgid "Thumbnail or standard size"
1885
  msgstr ""
1886
 
1887
+ #: inc/views/admin/metaboxes/robots-metabox.php:176
1888
  msgid "Large or full size"
1889
  msgstr ""
1890
 
1891
+ #: inc/views/admin/metaboxes/robots-metabox.php:195
1892
  msgid "Maximum image preview size"
1893
  msgstr ""
1894
 
1895
+ #: inc/views/admin/metaboxes/robots-metabox.php:199
1896
  msgid "This may limit the image preview size for all images from this site."
1897
  msgstr ""
1898
 
1899
+ #. translators: Backticks and hyperlink are Markdown! %s = link to
1900
+ #. documentation.
1901
+
1902
  #: inc/views/admin/metaboxes/robots-metabox.php:206
1903
+ msgid "The \"None, disallow preview\" setting will not be used when `nofollow` or `noarchive` are set for a page. This is to work around unexpected deindexing behavior in Google Search. [Learn more](%s)."
1904
+ msgstr ""
1905
+
1906
+ #: inc/views/admin/metaboxes/robots-metabox.php:218
1907
  msgid "Full video preview"
1908
  msgstr ""
1909
 
1910
+ #: inc/views/admin/metaboxes/robots-metabox.php:219
1911
+ msgctxt "quanity: zero"
1912
+ msgid "None, still image only"
1913
+ msgstr ""
1914
+
1915
  #. translators: %d = number
1916
 
1917
+ #: inc/views/admin/metaboxes/robots-metabox.php:223
1918
  msgid "%d second"
1919
  msgid_plural "%d seconds"
1920
  msgstr[0] ""
1921
  msgstr[1] ""
1922
 
1923
+ #: inc/views/admin/metaboxes/robots-metabox.php:252
1924
  msgid "Maximum video preview length"
1925
  msgstr ""
1926
 
1927
+ #: inc/views/admin/metaboxes/robots-metabox.php:256
1928
  msgid "This may limit the video preview length for all videos on this site."
1929
  msgstr ""
1930
 
1931
  #. translators: 1 = noindex/nofollow/noarchive, 2 = Post, Post type, Category
1932
  #. archives, the entire site, etc.
1933
 
1934
+ #: inc/views/admin/metaboxes/robots-metabox.php:271
1935
  msgid "Apply %1$s to %2$s?"
1936
  msgstr ""
1937
 
1938
+ #: inc/views/admin/metaboxes/robots-metabox.php:276
1939
  msgid "Robots Settings"
1940
  msgstr ""
1941
 
1942
+ #: inc/views/admin/metaboxes/robots-metabox.php:301
1943
  msgid "Warning: No public site should ever enable this option."
1944
  msgstr ""
1945
 
1946
+ #: inc/views/admin/metaboxes/robots-metabox.php:320
1947
  msgid "Warning: No site should enable these options for Posts and Pages."
1948
  msgstr ""
1949
 
lib/css/settings.css CHANGED
@@ -26,7 +26,7 @@ body.rtl .tsf-top-wrap > h1 {
26
  float: right;
27
  }
28
 
29
- body.rtl .tsf-top-button {
30
  float: left;
31
  }
32
 
@@ -145,6 +145,7 @@ body.rtl .tsf-bottom-buttons {
145
  background: #f1f1f1;
146
  color: #555;
147
  font-weight: 600;
 
148
  }
149
 
150
  body.rtl .tsf-nav-tab {
26
  float: right;
27
  }
28
 
29
+ body.rtl .tsf-top-buttons {
30
  float: left;
31
  }
32
 
145
  background: #f1f1f1;
146
  color: #555;
147
  font-weight: 600;
148
+ border-radius: 3px 3px 0 0;
149
  }
150
 
151
  body.rtl .tsf-nav-tab {
lib/css/settings.min.css CHANGED
@@ -1 +1 @@
1
- .tsf-metaboxes{box-sizing:border-box;max-width:690px;padding-bottom:20px}.tsf-top-wrap{width:100%;display:inline-block;vertical-align:top}.tsf-top-wrap>h1{float:left}body.rtl .tsf-top-wrap>h1{float:right}.tsf-metaboxes .metabox-holder{clear:both}.tsf-top-buttons{float:right}body.rtl .tsf-top-button{float:left}.tsf-bottom-buttons{text-align:right}body.rtl .tsf-bottom-buttons{text-align:left}.tsf-metaboxes .tsf-bottom-buttons input,.tsf-metaboxes .tsf-top-buttons input{margin-left:10px}#tsf-description-separator,#tsf-title-separator{display:table;width:100%;border-collapse:collapse;border-spacing:0}#tsf-description-separator{margin-bottom:0}#tsf-description-separator input,#tsf-title-separator input{display:none;float:left;width:0;min-width:0;opacity:0}#tsf-description-separator label,#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-description-separator input:hover+label,#tsf-description-separator label:hover,#tsf-title-separator input:hover+label,#tsf-title-separator label:hover{box-shadow:1px 1px 1px #aaa inset;background-color:#fff}#tsf-description-separator input:checked+label,#tsf-title-separator input:checked+label{box-shadow:1px 1px 1px #333 inset;background-color:#fff}#tsf-home-title-location,#tsf-title-location{display:block}#tsf-home-title-location label span,#tsf-title-location label span{display:inline-block;min-width:60px;vertical-align:baseline}#tsf-home-title-location label .tsf-custom-blogname-js,#tsf-home-title-location label .tsf-custom-tagline-js,#tsf-home-title-location label .tsf-custom-title-js,#tsf-home-title-location label .tsf-sep-js,#tsf-title-location label .tsf-sep-js,#tsf-title-location label .tsf-title-additions-js{display:inline;min-width:0;white-space:pre}.tsf-nav-tab-wrapper,.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-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}body.rtl .tsf-nav-tab{float:right;margin-left:0;margin-right:.5em}.tsf-nav-desktop{margin-left:7px}.tsf-dashicons-tabs{font-size:initial;display:inline;vertical-align:text-bottom}input.tsf-tabs-radio{position:absolute;width:0;height:0;opacity:0;margin:0;padding:0;border:0;z-index:-1;-webkit-appearance:none;-moz-appearance:none;appearance:none}.tsf-active-tab,.tsf-tabs-radio:checked+label{background-color:inherit;border-bottom-color:#fff;color:#000}.tsf-tabs-radio:focus+label:not(.tsf-no-focus-ring){box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);border-color:#fff}.tsf-tabs-content{margin:1.33em auto 0}.tsf-tabs-content select{width:100%;max-width:max-content;text-overflow:ellipsis}.tsf-content-no-js{margin:1.33em auto}body.js .tsf-tabs-content{display:none}body.js .tsf-tabs-content.tsf-active-tab-content{display:block}
1
+ .tsf-metaboxes{box-sizing:border-box;max-width:690px;padding-bottom:20px}.tsf-top-wrap{width:100%;display:inline-block;vertical-align:top}.tsf-top-wrap>h1{float:left}body.rtl .tsf-top-wrap>h1{float:right}.tsf-metaboxes .metabox-holder{clear:both}.tsf-top-buttons{float:right}body.rtl .tsf-top-buttons{float:left}.tsf-bottom-buttons{text-align:right}body.rtl .tsf-bottom-buttons{text-align:left}.tsf-metaboxes .tsf-bottom-buttons input,.tsf-metaboxes .tsf-top-buttons input{margin-left:10px}#tsf-description-separator,#tsf-title-separator{display:table;width:100%;border-collapse:collapse;border-spacing:0}#tsf-description-separator{margin-bottom:0}#tsf-description-separator input,#tsf-title-separator input{display:none;float:left;width:0;min-width:0;opacity:0}#tsf-description-separator label,#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-description-separator input:hover+label,#tsf-description-separator label:hover,#tsf-title-separator input:hover+label,#tsf-title-separator label:hover{box-shadow:1px 1px 1px #aaa inset;background-color:#fff}#tsf-description-separator input:checked+label,#tsf-title-separator input:checked+label{box-shadow:1px 1px 1px #333 inset;background-color:#fff}#tsf-home-title-location,#tsf-title-location{display:block}#tsf-home-title-location label span,#tsf-title-location label span{display:inline-block;min-width:60px;vertical-align:baseline}#tsf-home-title-location label .tsf-custom-blogname-js,#tsf-home-title-location label .tsf-custom-tagline-js,#tsf-home-title-location label .tsf-custom-title-js,#tsf-home-title-location label .tsf-sep-js,#tsf-title-location label .tsf-sep-js,#tsf-title-location label .tsf-title-additions-js{display:inline;min-width:0;white-space:pre}.tsf-nav-tab-wrapper,.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-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;border-radius:3px 3px 0 0}body.rtl .tsf-nav-tab{float:right;margin-left:0;margin-right:.5em}.tsf-nav-desktop{margin-left:7px}.tsf-dashicons-tabs{font-size:initial;display:inline;vertical-align:text-bottom}input.tsf-tabs-radio{position:absolute;width:0;height:0;opacity:0;margin:0;padding:0;border:0;z-index:-1;-webkit-appearance:none;-moz-appearance:none;appearance:none}.tsf-active-tab,.tsf-tabs-radio:checked+label{background-color:inherit;border-bottom-color:#fff;color:#000}.tsf-tabs-radio:focus+label:not(.tsf-no-focus-ring){box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);border-color:#fff}.tsf-tabs-content{margin:1.33em auto 0}.tsf-tabs-content select{width:100%;max-width:max-content;text-overflow:ellipsis}.tsf-content-no-js{margin:1.33em auto}body.js .tsf-tabs-content{display:none}body.js .tsf-tabs-content.tsf-active-tab-content{display:block}
lib/css/tsf.css CHANGED
@@ -42,17 +42,23 @@ body.rtl .tsf-notice.tsf-show-icon p:before {
42
  }
43
 
44
  .error.tsf-notice.tsf-show-icon p:before {
45
- color: #dd3811;
46
  content: "\f534";
47
  }
48
 
49
  .notice-warning.tsf-notice.tsf-show-icon p:before {
50
- color: #ffa01b;
51
  content: "\f227";
52
  }
53
 
 
 
 
 
 
 
54
  .updated.tsf-notice.tsf-show-icon p:before {
55
- color: #0cc34b;
56
  font-size: 16px;
57
  content: "\f147";
58
  }
@@ -60,10 +66,10 @@ body.rtl .tsf-notice.tsf-show-icon p:before {
60
  a.tsf-dismiss {
61
  position: absolute;
62
  top: 0;
63
- right: 1px;
64
  border: none;
65
  margin: 0;
66
- padding: 9px;
67
  background: 0 0;
68
  color: #72777c;
69
  cursor: pointer;
@@ -72,7 +78,7 @@ a.tsf-dismiss {
72
 
73
  body.rtl a.tsf-dismiss {
74
  right: initial;
75
- left: 1px;
76
  }
77
 
78
  a.tsf-dismiss:before {
@@ -160,7 +166,6 @@ body.rtl #tsf-title-placeholder-prefix {
160
  display: block;
161
  width: 95%;
162
  max-width: 190px;
163
- border-radius: 0;
164
  padding: 0;
165
  }
166
 
@@ -185,6 +190,11 @@ body.rtl #tsf-title-placeholder-prefix {
185
  text-shadow: 0 0 3px rgba(0,0,0,0.5);
186
  }
187
 
 
 
 
 
 
188
  body.no-js .tsf-seo-bar-item {
189
  cursor: default;
190
  }
42
  }
43
 
44
  .error.tsf-notice.tsf-show-icon p:before {
45
+ color: #dc3232;
46
  content: "\f534";
47
  }
48
 
49
  .notice-warning.tsf-notice.tsf-show-icon p:before {
50
+ color: #ffb900;
51
  content: "\f227";
52
  }
53
 
54
+ .notice-info.tsf-notice.tsf-show-icon p:before {
55
+ color: #00a0d2;
56
+ font-size: 16px;
57
+ content: "\f223";
58
+ }
59
+
60
  .updated.tsf-notice.tsf-show-icon p:before {
61
+ color: #46b450;
62
  font-size: 16px;
63
  content: "\f147";
64
  }
66
  a.tsf-dismiss {
67
  position: absolute;
68
  top: 0;
69
+ right: 0;
70
  border: none;
71
  margin: 0;
72
+ padding: 10px;
73
  background: 0 0;
74
  color: #72777c;
75
  cursor: pointer;
78
 
79
  body.rtl a.tsf-dismiss {
80
  right: initial;
81
+ left: 0;
82
  }
83
 
84
  a.tsf-dismiss:before {
166
  display: block;
167
  width: 95%;
168
  max-width: 190px;
 
169
  padding: 0;
170
  }
171
 
190
  text-shadow: 0 0 3px rgba(0,0,0,0.5);
191
  }
192
 
193
+ .tsf-seo-bar-item:focus {
194
+ outline: none;
195
+ box-shadow: 0 0 0 1px currentColor inset;
196
+ }
197
+
198
  body.no-js .tsf-seo-bar-item {
199
  cursor: default;
200
  }
lib/css/tsf.min.css CHANGED
@@ -1 +1 @@
1
- .tsf-js .hide-if-tsf-js,.tsf-no-js .hide-if-no-tsf-js{display:none}.notice.tsf-notice{position:relative;padding-right:38px}body.rtl .notice.tsf-notice{padding-right:12px;padding-left:38px}.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}body.rtl .tsf-notice.tsf-show-icon p:before{margin-right:0;margin-left:12px}.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:#72777c;cursor:pointer;text-decoration:none}body.rtl a.tsf-dismiss{right:initial;left:1px}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}.tsf-seo-bar-item{text-decoration:none;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#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}body.rtl #sf-title-offset{left:initial;right:0}#tsf-title-placeholder,#tsf-title-placeholder-prefix{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;will-change:left,right}body.rtl #tsf-title-placeholder,body.rtl #tsf-title-placeholder-prefix{left:initial;right:0}#tsf-title-placeholder{display:none}.fixed .column-tsf-seo-bar-wrap{width:11%}.tsf-seo-bar{display:block;width:95%;max-width:190px;border-radius:0;padding:0}.tsf-seo-bar-inner-wrap{display:flex;flex-direction:row;flex:1 1 auto;flex-wrap:wrap;justify-content:flex-start}.tsf-seo-bar-section-wrap{min-width:2em;flex:1 1 auto}.tsf-seo-bar-item{display:block;color:#fff;text-align:center;border:1px solid rgba(0,0,0,.1);text-shadow:0 0 3px rgba(0,0,0,.5)}body.no-js .tsf-seo-bar-item{cursor:default}.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}.tsf-seo-bar-wrap.column-tsf-seo-bar-temp{overflow:initial!important;min-width:160px}#col-container,#col-right{overflow:initial}.tsf-help{font-weight:400}.tsf-notice{clear:both}.tsf-flex{box-sizing:border-box;display:flex;flex:1 1 auto;flex-flow:column wrap;justify-content:flex-start}input.tsf-default-selected{border-color:#1c9d38}input.tsf-default-selected:checked:before{color:#1c9d38}input.tsf-warning-selected{border-color:#dd3811}input.tsf-warning-selected:checked:before{color:#dd3811}label.tsf-disabled{color:#999}input.tsf-disabled,label.tsf-disabled{cursor:default}.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-select-wrap{margin-top:7px;margin-bottom:14px}.tsf-select-wrap:last-of-type{margin-bottom:0}.tsf-select-block>select{margin-top:7px;margin-bottom:14px;display:block}.tsf-select-block:last-of-type>select{margin-bottom:0}.tsf-checkbox-wrapper{margin-top:15px}.tsf-checkbox-wrapper:first-child{margin-top:0}.tsf-metaboxes legend h4{margin:2px 0}.tsf-metaboxes legend p:last-of-type{margin-bottom:0}.tsf-counter .tsf-ajax{margin-left:3px}body.rtl .tsf-counter .tsf-aja{margin-left:0;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}.tsf-remove-image-button.button,.tsf-set-image-button.button{margin-right:8px}body.rtl .tsf-remove-image-button.button,body.rtl .tsf-set-image-button.button{margin-right:0;margin-left:8px}.tsf-image-preview{line-height:inherit;vertical-align:text-bottom}#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{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{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){.notice.tsf-notice,.wp-core-ui .notice.tsf-notice{padding-right:46px}body.rtl .notice.tsf-notice,body.rtl.wp-core-ui .notice.tsf-notice{padding-right:10px;padding-left:46px}.tsf-inpost-box p.tsf-fields,.tsf-metaboxes p.tsf-fields{line-height:2.8}#tsf-home-title-location label span,#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-nav-desktop{display:none}}@-moz-document url-prefix(){input.tsf-default-selected{box-shadow:0 0 0 1px #1c9d38}input.tsf-warning-selected{box-shadow:0 0 0 1px #dd3811}}
1
+ .tsf-js .hide-if-tsf-js,.tsf-no-js .hide-if-no-tsf-js{display:none}.notice.tsf-notice{position:relative;padding-right:38px}body.rtl .notice.tsf-notice{padding-right:12px;padding-left:38px}.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}body.rtl .tsf-notice.tsf-show-icon p:before{margin-right:0;margin-left:12px}.error.tsf-notice.tsf-show-icon p:before{color:#dc3232;content:"\f534"}.notice-warning.tsf-notice.tsf-show-icon p:before{color:#ffb900;content:"\f227"}.notice-info.tsf-notice.tsf-show-icon p:before{color:#00a0d2;font-size:16px;content:"\f223"}.updated.tsf-notice.tsf-show-icon p:before{color:#46b450;font-size:16px;content:"\f147"}a.tsf-dismiss{position:absolute;top:0;right:0;border:none;margin:0;padding:10px;background:0 0;color:#72777c;cursor:pointer;text-decoration:none}body.rtl a.tsf-dismiss{right:initial;left:0}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}.tsf-seo-bar-item{text-decoration:none;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#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}body.rtl #sf-title-offset{left:initial;right:0}#tsf-title-placeholder,#tsf-title-placeholder-prefix{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;will-change:left,right}body.rtl #tsf-title-placeholder,body.rtl #tsf-title-placeholder-prefix{left:initial;right:0}#tsf-title-placeholder{display:none}.fixed .column-tsf-seo-bar-wrap{width:11%}.tsf-seo-bar{display:block;width:95%;max-width:190px;padding:0}.tsf-seo-bar-inner-wrap{display:flex;flex-direction:row;flex:1 1 auto;flex-wrap:wrap;justify-content:flex-start}.tsf-seo-bar-section-wrap{min-width:2em;flex:1 1 auto}.tsf-seo-bar-item{display:block;color:#fff;text-align:center;border:1px solid rgba(0,0,0,.1);text-shadow:0 0 3px rgba(0,0,0,.5)}.tsf-seo-bar-item:focus{outline:0;box-shadow:0 0 0 1px currentColor inset}body.no-js .tsf-seo-bar-item{cursor:default}.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}.tsf-seo-bar-wrap.column-tsf-seo-bar-temp{overflow:initial!important;min-width:160px}#col-container,#col-right{overflow:initial}.tsf-help{font-weight:400}.tsf-notice{clear:both}.tsf-flex{box-sizing:border-box;display:flex;flex:1 1 auto;flex-flow:column wrap;justify-content:flex-start}input.tsf-default-selected{border-color:#1c9d38}input.tsf-default-selected:checked:before{color:#1c9d38}input.tsf-warning-selected{border-color:#dd3811}input.tsf-warning-selected:checked:before{color:#dd3811}label.tsf-disabled{color:#999}input.tsf-disabled,label.tsf-disabled{cursor:default}.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-select-wrap{margin-top:7px;margin-bottom:14px}.tsf-select-wrap:last-of-type{margin-bottom:0}.tsf-select-block>select{margin-top:7px;margin-bottom:14px;display:block}.tsf-select-block:last-of-type>select{margin-bottom:0}.tsf-checkbox-wrapper{margin-top:15px}.tsf-checkbox-wrapper:first-child{margin-top:0}.tsf-metaboxes legend h4{margin:2px 0}.tsf-metaboxes legend p:last-of-type{margin-bottom:0}.tsf-counter .tsf-ajax{margin-left:3px}body.rtl .tsf-counter .tsf-aja{margin-left:0;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}.tsf-remove-image-button.button,.tsf-set-image-button.button{margin-right:8px}body.rtl .tsf-remove-image-button.button,body.rtl .tsf-set-image-button.button{margin-right:0;margin-left:8px}.tsf-image-preview{line-height:inherit;vertical-align:text-bottom}#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{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{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){.notice.tsf-notice,.wp-core-ui .notice.tsf-notice{padding-right:46px}body.rtl .notice.tsf-notice,body.rtl.wp-core-ui .notice.tsf-notice{padding-right:10px;padding-left:46px}.tsf-inpost-box p.tsf-fields,.tsf-metaboxes p.tsf-fields{line-height:2.8}#tsf-home-title-location label span,#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-nav-desktop{display:none}}@-moz-document url-prefix(){input.tsf-default-selected{box-shadow:0 0 0 1px #1c9d38}input.tsf-warning-selected{box-shadow:0 0 0 1px #dd3811}}
lib/js/media.js CHANGED
@@ -113,7 +113,7 @@ window.tsfMedia = function( $ ) {
113
  };
114
 
115
  cropper.control = {
116
- 'params' : {
117
  flex_width: _states.isFlex ? 4096 : 0,
118
  flex_height: _states.isFlex ? 4096 : 0,
119
  width: _states.suggestedWidth,
@@ -185,7 +185,7 @@ window.tsfMedia = function( $ ) {
185
  'swing'
186
  );
187
 
188
- _appendRemoveButton( $button, { 'id': inputID, 'type': inputType }, true );
189
  tsfAys && tsfAys.registerChange();
190
  };
191
  frame.off( 'skippedcrop cropped', onDone );
@@ -600,6 +600,8 @@ window.tsfMedia = function( $ ) {
600
  * Sets up jQuery image editor cache.
601
  *
602
  * @since 3.1.0
 
 
603
  * @access private
604
  *
605
  * @function
113
  };
114
 
115
  cropper.control = {
116
+ params: {
117
  flex_width: _states.isFlex ? 4096 : 0,
118
  flex_height: _states.isFlex ? 4096 : 0,
119
  width: _states.suggestedWidth,
185
  'swing'
186
  );
187
 
188
+ _appendRemoveButton( $button, { id: inputID, type: inputType }, true );
189
  tsfAys && tsfAys.registerChange();
190
  };
191
  frame.off( 'skippedcrop cropped', onDone );
600
  * Sets up jQuery image editor cache.
601
  *
602
  * @since 3.1.0
603
+ * TODO set a callback.
604
+ * @see tsfemMedia.setupImageEditorActions() (Extension Manager plugin)
605
  * @access private
606
  *
607
  * @function
lib/js/settings.js CHANGED
@@ -755,13 +755,14 @@ window.tsfSettings = function( $ ) {
755
  * You shouldn't call this.
756
  *
757
  * @since 4.0.0
 
758
  * @access protected
759
  *
760
  * @function
761
  * @return {undefined}
762
  */
763
  load: () => {
764
- $( 'div.updated, div.error, div.notice, .notice-error, .notice-warning' ).insertAfter( '.tsf-top-wrap' )
765
 
766
  $( document.body ).on( 'tsf-onload', _loadSettings );
767
  $( document.body ).on( 'tsf-ready', _readySettings );
755
  * You shouldn't call this.
756
  *
757
  * @since 4.0.0
758
+ * @since 4.0.3 Now also displaces notice-info.
759
  * @access protected
760
  *
761
  * @function
762
  * @return {undefined}
763
  */
764
  load: () => {
765
+ $( 'div.updated, div.error, div.notice, .notice-error, .notice-warning, .notice-info' ).insertAfter( '.tsf-top-wrap' )
766
 
767
  $( document.body ).on( 'tsf-onload', _loadSettings );
768
  $( document.body ).on( 'tsf-ready', _readySettings );
lib/js/settings.min.js CHANGED
@@ -1 +1 @@
1
- 'use strict';window.tsfSettings=function(a){const b="undefined"!=typeof tsfSettingsL10n&&tsfSettingsL10n,c=()=>{const b=b=>{a(b.target).is(":checked")?(a(".tsf-pixel-counter-wrap").show(),tsfC.triggerCounterUpdate()):a(".tsf-pixel-counter-wrap").hide()};a("#autodescription-site-settings\\[display_character_counter\\]").on("click",b),a("#autodescription-site-settings\\[display_pixel_counter\\]").on("click",b)},d=()=>{let b=a(".tsf-color-picker");b.length&&a.each(b,(b,c)=>{let d=a(c),e="",f=d.data("tsf-default-color");d.wpColorPicker({defaultColor:f,width:238,change:()=>{e=d.wpColorPicker("color"),""===e&&(e=f),d.val(e),tsfAys.registerChange()},clear:()=>{f.length&&(d.val(f),d.closest(".wp-picker-container").find(".wp-color-result").css("backgroundColor",f)),tsfAys.registerChange()},palettes:!1})})},e=()=>{let b=document.getElementById("#autodescription-site-settings[title_rem_additions]");a(b).on("change",()=>{let c=a(".tsf-title-additions-js");a(b).is(":checked")?c.css("display","none"):c.css("display","inline")}),a(b).trigger("change");a("#tsf-title-location input").on("click",b=>{let c=a(".tsf-title-additions-example-left"),d=a(".tsf-title-additions-example-right");"right"===a(b.target).val()?(c.css("display","none"),d.css("display","inline")):(c.css("display","inline"),d.css("display","none"))});a("#tsf-title-prefixes-toggle :input").on("click",b=>{let c=a(b.target),d=a(".tsf-title-prefix-example");c.is(":checked")?d.css("display","none"):d.css("display","inline")});a("#tsf-title-separator :input").on("click",b=>{let c=b.target.value,d="";switch(c){case"pipe":d="|";break;default:d=a("<div/>").html("&"+c+";").text();}a(".tsf-sep-js").text(" "+d+" "),a(window).trigger("tsf-title-sep-updated",[d])})},f=()=>{const c=document.getElementById("autodescription-site-settings[homepage_title]"),d=document.getElementById("autodescription-site-settings[homepage_title_tagline]"),e=document.getElementById("autodescription-site-settings[homepage_tagline]"),f=tsf.escapeString(b.i18n.protectedTitle),g=tsf.escapeString(b.i18n.privateTitle);tsfTitle.setInputElement(c);const h=()=>{let b=tsfTitle.getState("additionPlacement"),c="after";tsf.l10n.states.isRTL?"right"===a("#tsf-home-title-location input:checked").val()&&(c="before"):"left"===a("#tsf-home-title-location input:checked").val()&&(c="before"),c!==b&&tsfTitle.updateState("additionPlacement",c)};h(),a("#tsf-home-title-location").on("click",":input",h);const i=a=>{let b=tsfTitle.getState("prefixValue"),c="";switch(a){case"password":c=f;break;case"private":c=g;break;default:case"public":c="";}c!==b&&tsfTitle.updateState("prefixValue",c)};b.states.isFrontPrivate?i("private"):b.states.isFrontProtected&&i("password");a(c).on("input.tsfInputTitle",b=>{let c=a(".tsf-custom-title-js"),d=tsf.decodeEntities(tsf.sDoubleSpace(b.target.value.trim()));d.length?c.html(tsf.escapeString(d)):c.html(tsf.escapeString(tsf.decodeEntities(tsfTitle.getState("defaultTitle"))))}),a(c).trigger("input.tsfInputTitle");let j,k=a(".tsf-custom-tagline-js");const l=()=>{clearTimeout(j),j=setTimeout(()=>{let b=tsfTitle.getState("additionValue");b=tsf.decodeEntities(tsf.sDoubleSpace(b.trim())),b.length&&tsfTitle.getState("useTagline")?(k.html(tsf.escapeString(b)),a(".tsf-custom-blogname-js").show()):a(".tsf-custom-blogname-js").hide()})};a(d).on("input.tsfInputTagline",()=>{let a=tsfTitle.getState("additionValue"),b=d.value.trim();b.length||(b=d.placeholder||""),b=tsf.escapeString(tsf.decodeEntities(b.trim())),a!==b&&(tsfTitle.updateState("additionValue",b),l())}),a(d).trigger("input.tsfInputTagline");a(e).on("change.tsfToggleTagline",a=>{let b=!1;a.target.checked?(b=!0,d.readOnly=!1):(b=!1,d.readOnly=!0),tsfTitle.updateState("useTagline",b),l()}),a(e).trigger("change.tsfToggleTagline");a(window).on("tsf-title-sep-updated",(a,b)=>{tsfTitle.updateState("separator",b)}),tsfTitle.enqueueUnregisteredInputTrigger()},g=()=>{tsfDescription.setInputElement(document.getElementById("autodescription-site-settings[homepage_description]")),tsfDescription.enqueueUnregisteredInputTrigger()},h=()=>{const b=()=>{tsfTitle.enqueueUnregisteredInputTrigger(),tsfDescription.enqueueUnregisteredInputTrigger()};a(document).on("postbox-toggled",function(a,c){if("autodescription-homepage-settings"===c.id){let a=c.querySelector(".inside");0<a.offsetHeight&&0<a.offsetWidth&&b()}}),a("#tsf-homepage-tab-general").on("tsf-tab-toggled",tsfTitle.enqueueUnregisteredInputTrigger)},i=()=>{const b=a("#autodescription-site-settings\\[set_copyright_directives\\]"),c=a("#autodescription-site-settings\\[max_snippet_length\\], #autodescription-site-settings\\[max_image_preview\\], #autodescription-site-settings\\[max_video_preview\\]");if(b.length&&c.length){b.on("change.tsfToggleDirectives",b=>{b.target.checked?(c.prop("disabled",!1),a(".tsf-toggle-directives-surrogate").remove()):(c.prop("disabled",!0),c.each((b,c)=>{a("<input />").attr("type","hidden").attr("name",c.name||"").val(c.value||0).addClass("tsf-toggle-directives-surrogate").insertAfter(c)}))}),b.trigger("change.tsfToggleDirectives")}},j=()=>{const b=a("#autodescription-site-settings\\[google_verification\\], #autodescription-site-settings\\[bing_verification\\], #autodescription-site-settings\\[yandex_verification\\], #autodescription-site-settings\\[pint_verification\\]");if(b.length){const a=a=>{let b=a.originalEvent.clipboardData&&a.originalEvent.clipboardData.getData("text")||void 0;if(b){let c=/<meta[^>]+content=(\"|\')?([^\"\'>\s]+)\1?.*?>/i.exec(b);c&&2 in c&&"string"==typeof c[2]&&c[2].length&&(a.stopPropagation(),a.preventDefault(),a.target.value=c[2],tsfAys.registerChange())}};b.on("paste",a)}},k=()=>{c(),e(),f(),g(),h(),i(),j(),d()},l=()=>{tsfSocial.initTitleInputs({ref:document.getElementById("tsf-title-reference"),meta:document.getElementById("autodescription-site-settings[homepage_title]"),og:document.getElementById("autodescription-site-settings[homepage_og_title]"),tw:document.getElementById("autodescription-site-settings[homepage_twitter_title]")}),tsfSocial.initDescriptionInputs({ref:document.getElementById("tsf-description-reference"),meta:document.getElementById("autodescription-site-settings[homepage_description]"),og:document.getElementById("autodescription-site-settings[homepage_og_description]"),tw:document.getElementById("autodescription-site-settings[homepage_twitter_description]")})},m=()=>confirm(b.i18n.confirmReset),n=()=>{a(".tsf-tabs-radio").on("change",(b,c)=>{let d=a(b.target);if(!d.is(":checked"))return;c="boolean"==typeof c&&c;let e=b.target.id,f=b.target.name,g="tsf-active-tab-content",h="tsf-tab-active",i=a("."+g),j=d.closest(".tsf-nav-tab-wrapper").find("."+h),k=i.find("input:invalid, select:invalid, textarea:invalid");if(k.length)return k[0].reportValidity(),j.prop("checked",!0),d.prop("checked",!1),b.stopPropagation(),b.preventDefault(),!1;let l=a("#"+e+"-content");if(j.removeClass(h),j.siblings("label").removeClass("tsf-no-focus-ring"),d.addClass(h),c){let b=a("."+f+"-content");b.removeClass(g).hide(),l.addClass(g).show(),a("#"+e).trigger("tsf-tab-toggled")}else if(l.length&&!l.is(i)){let b=a("."+f+"-content");b.fadeOut(150,function(){a(this).removeClass(g)}),setTimeout(()=>{l.addClass(g).fadeIn(250)},150),setTimeout(()=>{a("#"+e).trigger("tsf-tab-toggled")},175)}});a(".tsf-nav-tab-wrapper").on("click.tsfNavTab",".tsf-nav-tab",a=>{a.currentTarget.classList.add("tsf-no-focus-ring")});a(document.body).on("tsf-ready",()=>{a(".tsf-tabs-radio:checked").each((b,c)=>{a(c).trigger("change",[!0])})})};return Object.assign({load:()=>{a("div.updated, div.error, div.notice, .notice-error, .notice-warning").insertAfter(".tsf-top-wrap"),a(document.body).on("tsf-onload",k),a(document.body).on("tsf-ready",l),a(".tsf-js-confirm-reset").on("click",m),n()}},{},{l10n:b})}(jQuery),jQuery(window.tsfSettings.load);
1
+ 'use strict';window.tsfSettings=function(a){const b="undefined"!=typeof tsfSettingsL10n&&tsfSettingsL10n,c=()=>{const b=b=>{a(b.target).is(":checked")?(a(".tsf-pixel-counter-wrap").show(),tsfC.triggerCounterUpdate()):a(".tsf-pixel-counter-wrap").hide()};a("#autodescription-site-settings\\[display_character_counter\\]").on("click",b),a("#autodescription-site-settings\\[display_pixel_counter\\]").on("click",b)},d=()=>{let b=a(".tsf-color-picker");b.length&&a.each(b,(b,c)=>{let d=a(c),e="",f=d.data("tsf-default-color");d.wpColorPicker({defaultColor:f,width:238,change:()=>{e=d.wpColorPicker("color"),""===e&&(e=f),d.val(e),tsfAys.registerChange()},clear:()=>{f.length&&(d.val(f),d.closest(".wp-picker-container").find(".wp-color-result").css("backgroundColor",f)),tsfAys.registerChange()},palettes:!1})})},e=()=>{let b=document.getElementById("#autodescription-site-settings[title_rem_additions]");a(b).on("change",()=>{let c=a(".tsf-title-additions-js");a(b).is(":checked")?c.css("display","none"):c.css("display","inline")}),a(b).trigger("change");a("#tsf-title-location input").on("click",b=>{let c=a(".tsf-title-additions-example-left"),d=a(".tsf-title-additions-example-right");"right"===a(b.target).val()?(c.css("display","none"),d.css("display","inline")):(c.css("display","inline"),d.css("display","none"))});a("#tsf-title-prefixes-toggle :input").on("click",b=>{let c=a(b.target),d=a(".tsf-title-prefix-example");c.is(":checked")?d.css("display","none"):d.css("display","inline")});a("#tsf-title-separator :input").on("click",b=>{let c=b.target.value,d="";switch(c){case"pipe":d="|";break;default:d=a("<div/>").html("&"+c+";").text();}a(".tsf-sep-js").text(" "+d+" "),a(window).trigger("tsf-title-sep-updated",[d])})},f=()=>{const c=document.getElementById("autodescription-site-settings[homepage_title]"),d=document.getElementById("autodescription-site-settings[homepage_title_tagline]"),e=document.getElementById("autodescription-site-settings[homepage_tagline]"),f=tsf.escapeString(b.i18n.protectedTitle),g=tsf.escapeString(b.i18n.privateTitle);tsfTitle.setInputElement(c);const h=()=>{let b=tsfTitle.getState("additionPlacement"),c="after";tsf.l10n.states.isRTL?"right"===a("#tsf-home-title-location input:checked").val()&&(c="before"):"left"===a("#tsf-home-title-location input:checked").val()&&(c="before"),c!==b&&tsfTitle.updateState("additionPlacement",c)};h(),a("#tsf-home-title-location").on("click",":input",h);const i=a=>{let b=tsfTitle.getState("prefixValue"),c="";switch(a){case"password":c=f;break;case"private":c=g;break;default:case"public":c="";}c!==b&&tsfTitle.updateState("prefixValue",c)};b.states.isFrontPrivate?i("private"):b.states.isFrontProtected&&i("password");a(c).on("input.tsfInputTitle",b=>{let c=a(".tsf-custom-title-js"),d=tsf.decodeEntities(tsf.sDoubleSpace(b.target.value.trim()));d.length?c.html(tsf.escapeString(d)):c.html(tsf.escapeString(tsf.decodeEntities(tsfTitle.getState("defaultTitle"))))}),a(c).trigger("input.tsfInputTitle");let j,k=a(".tsf-custom-tagline-js");const l=()=>{clearTimeout(j),j=setTimeout(()=>{let b=tsfTitle.getState("additionValue");b=tsf.decodeEntities(tsf.sDoubleSpace(b.trim())),b.length&&tsfTitle.getState("useTagline")?(k.html(tsf.escapeString(b)),a(".tsf-custom-blogname-js").show()):a(".tsf-custom-blogname-js").hide()})};a(d).on("input.tsfInputTagline",()=>{let a=tsfTitle.getState("additionValue"),b=d.value.trim();b.length||(b=d.placeholder||""),b=tsf.escapeString(tsf.decodeEntities(b.trim())),a!==b&&(tsfTitle.updateState("additionValue",b),l())}),a(d).trigger("input.tsfInputTagline");a(e).on("change.tsfToggleTagline",a=>{let b=!1;a.target.checked?(b=!0,d.readOnly=!1):(b=!1,d.readOnly=!0),tsfTitle.updateState("useTagline",b),l()}),a(e).trigger("change.tsfToggleTagline");a(window).on("tsf-title-sep-updated",(a,b)=>{tsfTitle.updateState("separator",b)}),tsfTitle.enqueueUnregisteredInputTrigger()},g=()=>{tsfDescription.setInputElement(document.getElementById("autodescription-site-settings[homepage_description]")),tsfDescription.enqueueUnregisteredInputTrigger()},h=()=>{const b=()=>{tsfTitle.enqueueUnregisteredInputTrigger(),tsfDescription.enqueueUnregisteredInputTrigger()};a(document).on("postbox-toggled",function(a,c){if("autodescription-homepage-settings"===c.id){let a=c.querySelector(".inside");0<a.offsetHeight&&0<a.offsetWidth&&b()}}),a("#tsf-homepage-tab-general").on("tsf-tab-toggled",tsfTitle.enqueueUnregisteredInputTrigger)},i=()=>{const b=a("#autodescription-site-settings\\[set_copyright_directives\\]"),c=a("#autodescription-site-settings\\[max_snippet_length\\], #autodescription-site-settings\\[max_image_preview\\], #autodescription-site-settings\\[max_video_preview\\]");if(b.length&&c.length){b.on("change.tsfToggleDirectives",b=>{b.target.checked?(c.prop("disabled",!1),a(".tsf-toggle-directives-surrogate").remove()):(c.prop("disabled",!0),c.each((b,c)=>{a("<input />").attr("type","hidden").attr("name",c.name||"").val(c.value||0).addClass("tsf-toggle-directives-surrogate").insertAfter(c)}))}),b.trigger("change.tsfToggleDirectives")}},j=()=>{const b=a("#autodescription-site-settings\\[google_verification\\], #autodescription-site-settings\\[bing_verification\\], #autodescription-site-settings\\[yandex_verification\\], #autodescription-site-settings\\[pint_verification\\]");if(b.length){const a=a=>{let b=a.originalEvent.clipboardData&&a.originalEvent.clipboardData.getData("text")||void 0;if(b){let c=/<meta[^>]+content=(\"|\')?([^\"\'>\s]+)\1?.*?>/i.exec(b);c&&2 in c&&"string"==typeof c[2]&&c[2].length&&(a.stopPropagation(),a.preventDefault(),a.target.value=c[2],tsfAys.registerChange())}};b.on("paste",a)}},k=()=>{c(),e(),f(),g(),h(),i(),j(),d()},l=()=>{tsfSocial.initTitleInputs({ref:document.getElementById("tsf-title-reference"),meta:document.getElementById("autodescription-site-settings[homepage_title]"),og:document.getElementById("autodescription-site-settings[homepage_og_title]"),tw:document.getElementById("autodescription-site-settings[homepage_twitter_title]")}),tsfSocial.initDescriptionInputs({ref:document.getElementById("tsf-description-reference"),meta:document.getElementById("autodescription-site-settings[homepage_description]"),og:document.getElementById("autodescription-site-settings[homepage_og_description]"),tw:document.getElementById("autodescription-site-settings[homepage_twitter_description]")})},m=()=>confirm(b.i18n.confirmReset),n=()=>{a(".tsf-tabs-radio").on("change",(b,c)=>{let d=a(b.target);if(!d.is(":checked"))return;c="boolean"==typeof c&&c;let e=b.target.id,f=b.target.name,g="tsf-active-tab-content",h="tsf-tab-active",i=a("."+g),j=d.closest(".tsf-nav-tab-wrapper").find("."+h),k=i.find("input:invalid, select:invalid, textarea:invalid");if(k.length)return k[0].reportValidity(),j.prop("checked",!0),d.prop("checked",!1),b.stopPropagation(),b.preventDefault(),!1;let l=a("#"+e+"-content");if(j.removeClass(h),j.siblings("label").removeClass("tsf-no-focus-ring"),d.addClass(h),c){let b=a("."+f+"-content");b.removeClass(g).hide(),l.addClass(g).show(),a("#"+e).trigger("tsf-tab-toggled")}else if(l.length&&!l.is(i)){let b=a("."+f+"-content");b.fadeOut(150,function(){a(this).removeClass(g)}),setTimeout(()=>{l.addClass(g).fadeIn(250)},150),setTimeout(()=>{a("#"+e).trigger("tsf-tab-toggled")},175)}});a(".tsf-nav-tab-wrapper").on("click.tsfNavTab",".tsf-nav-tab",a=>{a.currentTarget.classList.add("tsf-no-focus-ring")});a(document.body).on("tsf-ready",()=>{a(".tsf-tabs-radio:checked").each((b,c)=>{a(c).trigger("change",[!0])})})};return Object.assign({load:()=>{a("div.updated, div.error, div.notice, .notice-error, .notice-warning, .notice-info").insertAfter(".tsf-top-wrap"),a(document.body).on("tsf-onload",k),a(document.body).on("tsf-ready",l),a(".tsf-js-confirm-reset").on("click",m),n()}},{},{l10n:b})}(jQuery),jQuery(window.tsfSettings.load);
readme.txt CHANGED
@@ -1,10 +1,10 @@
1
  === The SEO Framework ===
2
  Contributors: Cybr
3
- Tags: SEO, XML Sitemap, Google, Open Graph, Schema.org, Twitter
4
  Requires at least: 4.9.0
5
- Tested up to: 5.2
6
  Requires PHP: 5.6.0
7
- Stable tag: 4.0.2
8
  License: GPLv3
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
@@ -126,7 +126,7 @@ The SEO Framework works on many things without notifying you, because the best s
126
 
127
  In a few words: The SEO Framework allows search engines to do what they've been doing for the past 20 years.
128
 
129
- When you activate The SEO Framework on any site, you automatically grant rights to content aggregators, among which are Google, Bing, and Yandex, to obtain information from the site, including written work, images, audio, and video. You can control these rights via the robots-meta settings brought by this plugin. Your rights and the effectiveness of these settings are subject to the region and language of your website, and the physical or virtual origin of the platform and their potential users through which your website's information is obtained and shared. It is up to the aggregator to honor your rights and the requests brought via The SEO Framework.
130
 
131
  If you wish to learn more, please refer to the website of the [EU commission on copyright](https://ec.europa.eu/digital-single-market/en/modernisation-eu-copyright-rules). These rulings may propagate its effects through regions outside the EU.
132
 
@@ -173,7 +173,7 @@ This plugin is all-inclusive. It's 100% freeware; not crippleware.
173
 
174
  = Is there a premium version? =
175
 
176
- No.
177
 
178
  However, we do offer many free and paid extensions that help support this free plugin. We provide these via our free [Extension Manager plugin](https://theseoframework.com/?p=2760).
179
 
@@ -188,7 +188,7 @@ We'll try to get back to you within 72 hours. Typically, we reply within a day.
188
  Any input is much appreciated, and everything will be considered.
189
  Please visit the [GitHub project page](https://github.com/sybrew/the-seo-framework) to submit issues or even pull requests.
190
 
191
- Feel free to [contribute](https://tsf.fyi/contributing)!
192
 
193
  = What do the colors tell me? =
194
 
@@ -227,6 +227,14 @@ If you wish to display breadcrumbs, then your theme should provide this. Alterna
227
 
228
  == Changelog ==
229
 
 
 
 
 
 
 
 
 
230
  = 4.0.2 =
231
 
232
  France recently amended its [copyright laws](https://www.legifrance.gouv.fr/eli/loi/2019/7/24/MICX1902858L/jo/texte). In short, in France, it's now forbidden for content aggregators to display excerpts and previews of your content when no consent is given.
1
  === The SEO Framework ===
2
  Contributors: Cybr
3
+ Tags: seo, xml sitemap, google search, open graph, schema.org, twitter card, performance
4
  Requires at least: 4.9.0
5
+ Tested up to: 5.3
6
  Requires PHP: 5.6.0
7
+ Stable tag: 4.0.3
8
  License: GPLv3
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
126
 
127
  In a few words: The SEO Framework allows search engines to do what they've been doing for the past 20 years.
128
 
129
+ When you activate The SEO Framework on any site, you automatically grant rights to content aggregators, among which are Google, Bing, and Yandex, to obtain and use information from the site, including written work, images, audio, and video. You can control these rights via the robots-meta settings brought by this plugin. Your rights and the effectiveness of these settings are subject to the region and language of your website, and the physical or virtual origin of the platform and their potential users through which your website's information is obtained and shared. It is up to the aggregator to honor your rights and the requests brought via The SEO Framework.
130
 
131
  If you wish to learn more, please refer to the website of the [EU commission on copyright](https://ec.europa.eu/digital-single-market/en/modernisation-eu-copyright-rules). These rulings may propagate its effects through regions outside the EU.
132
 
173
 
174
  = Is there a premium version? =
175
 
176
+ No. We treat this plugin as a premium plugin already.
177
 
178
  However, we do offer many free and paid extensions that help support this free plugin. We provide these via our free [Extension Manager plugin](https://theseoframework.com/?p=2760).
179
 
188
  Any input is much appreciated, and everything will be considered.
189
  Please visit the [GitHub project page](https://github.com/sybrew/the-seo-framework) to submit issues or even pull requests.
190
 
191
+ Learn more [about contributing](https://tsf.fyi/contributing).
192
 
193
  = What do the colors tell me? =
194
 
227
 
228
  == Changelog ==
229
 
230
+ = 4.0.3 =
231
+
232
+ Google Search has a new bug in their parser, which causes pages to be deindexed unintentionally when a specific combination of robots-settings are used. To work around this bug, we changed how the recently introduced copyright directive settings work.
233
+
234
+ For more information, see our KB entry on why the [Maximum Image Preview Size setting may now be ignored](https://kb.theseoframework.com/?p=82).
235
+
236
+ We also fixed three bugs and added [minor improvements](https://theseoframework.com/?p=3379#detailed).
237
+
238
  = 4.0.2 =
239
 
240
  France recently amended its [copyright laws](https://www.legifrance.gouv.fr/eli/loi/2019/7/24/MICX1902858L/jo/texte). In short, in France, it's now forbidden for content aggregators to display excerpts and previews of your content when no consent is given.